← Назад к вопросам
Какие знаешь метрики качества логистической регрессии?
2.0 Middle🔥 121 комментариев
#Метрики и оценка моделей
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Какие знаешь метрики качества логистической регрессии
Метрики для логистической регрессии — это ключевой инструмент для оценки качества бинарной классификации. Различные метрики отвечают на разные вопросы о производительности модели.
1. МАТРИЦА ОШИБОК (Confusion Matrix)
from sklearn.metrics import confusion_matrix, classification_report
import numpy as np
# Матрица ошибок содержит 4 значения:
# TN (True Negatives): правильно классифицировано как 0
# FP (False Positives): ошибочно классифицировано как 1
# FN (False Negatives): ошибочно классифицировано как 0
# TP (True Positives): правильно классифицировано как 1
y_true = np.array([0, 0, 1, 1, 1, 0, 1, 0, 0, 1])
y_pred = np.array([0, 0, 1, 1, 0, 0, 1, 1, 0, 1])
cm = confusion_matrix(y_true, y_pred)
print("Confusion Matrix:")
print(cm)
print()
print(f"TN (True Negatives): {cm[0, 0]}")
print(f"FP (False Positives): {cm[0, 1]}")
print(f"FN (False Negatives): {cm[1, 0]}")
print(f"TP (True Positives): {cm[1, 1]}")
2. БАЗОВЫЕ МЕТРИКИ
Accuracy (точность)
from sklearn.metrics import accuracy_score
# Accuracy = (TP + TN) / (TP + TN + FP + FN)
# Вопрос: какая доля предсказаний верна?
accuracy = accuracy_score(y_true, y_pred)
print(f"Accuracy: {accuracy:.3f}")
print(f"Интерпретация: {accuracy*100:.1f}% предсказаний верны")
# Недостаток: не учитывает дисбаланс классов
# Пример: если 95% класса 0 и 5% класса 1,
# модель может просто все предсказать как 0 и получить 95% accuracy
Precision (точность на положительном классе)
from sklearn.metrics import precision_score
# Precision = TP / (TP + FP)
# Вопрос: из всех предсказанных как 1, сколько действительно 1?
precision = precision_score(y_true, y_pred)
print(f"Precision: {precision:.3f}")
print(f"Интерпретация: {precision*100:.1f}% положительных предсказаний верны")
# Когда использовать:
# - Spam detection: важнее не заблокировать легитимное письмо
# - Medical diagnosis: когда false positive дорогостоящий
Recall (полнота)
from sklearn.metrics import recall_score
# Recall = TP / (TP + FN)
# Вопрос: из всех действительно положительных, сколько мы нашли?
recall = recall_score(y_true, y_pred)
print(f"Recall: {recall:.3f}")
print(f"Интерпретация: {recall*100:.1f}% положительных примеров найдено")
# Когда использовать:
# - Disease diagnosis: важнее найти все болезни
# - Fraud detection: найти все мошенничества
F1-Score (гармоническое среднее)
from sklearn.metrics import f1_score
# F1 = 2 * (Precision * Recall) / (Precision + Recall)
# Балансирует precision и recall
f1 = f1_score(y_true, y_pred)
print(f"F1-Score: {f1:.3f}")
print(f"Интерпретация: сбалансированное качество модели")
# Когда использовать:
# - Когда нужен баланс между precision и recall
# - Несбалансированные датасеты
3. ПОРОГОВЫЕ МЕТРИКИ
ROC-AUC (Receiver Operating Characteristic)
from sklearn.metrics import roc_curve, auc, roc_auc_score
import matplotlib.pyplot as plt
# ROC кривая показывает TPR vs FPR при разных порогах
# AUC = площадь под кривой (0 до 1)
y_pred_proba = np.array([0.1, 0.2, 0.8, 0.9, 0.3, 0.15, 0.85, 0.6, 0.25, 0.92])
fpr, tpr, thresholds = roc_curve(y_true, y_pred_proba)
roc_auc = auc(fpr, tpr)
print(f"ROC-AUC: {roc_auc:.3f}")
print(f"Интерпретация: вероятность того, что модель предпочтет случайный положительный пример случайному отрицательному")
# Визуализация
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, label=f'ROC curve (AUC = {roc_auc:.3f})')
plt.plot([0, 1], [0, 1], 'k--', label='Random')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend()
plt.grid()
plt.show()
# Интерпретация AUC:
# 0.5: случайная модель
# 0.7-0.8: хорошая модель
# 0.8-0.9: очень хорошая модель
# > 0.9: отличная модель
PR-AUC (Precision-Recall AUC)
from sklearn.metrics import precision_recall_curve, auc
# Для несбалансированных датасетов PR-AUC часто лучше ROC-AUC
precision, recall, _ = precision_recall_curve(y_true, y_pred_proba)
pr_auc = auc(recall, precision)
print(f"PR-AUC: {pr_auc:.3f}")
# Визуализация
plt.figure(figsize=(8, 6))
plt.plot(recall, precision, label=f'PR curve (AUC = {pr_auc:.3f})')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend()
plt.grid()
plt.show()
4. СПЕЦИАЛЬНЫЕ МЕТРИКИ
Specificity (специфичность)
from sklearn.metrics import confusion_matrix
# Specificity = TN / (TN + FP)
# Вопрос: из всех отрицательных примеров, сколько мы правильно определили?
tn, fp, fn, tp = cm.ravel()
specificity = tn / (tn + fp)
print(f"Specificity: {specificity:.3f}")
print(f"Интерпретация: доля правильно определенных отрицательных примеров")
Sensitivity (чувствительность) = Recall
# Sensitivity = TP / (TP + FN) = Recall
sensitivity = tp / (tp + fn)
print(f"Sensitivity: {sensitivity:.3f}")
False Positive Rate (FPR)
# FPR = FP / (FP + TN) = 1 - Specificity
fpr_value = fp / (fp + tn)
print(f"FPR: {fpr_value:.3f}")
print(f"Интерпретация: доля ошибочно положительных классификаций")
False Negative Rate (FNR)
# FNR = FN / (FN + TP) = 1 - Recall
fnr_value = fn / (fn + tp)
print(f"FNR: {fnr_value:.3f}")
print(f"Интерпретация: доля пропущенных положительных примеров")
5. ПОТЕРЯ (Loss Function)
Log Loss (Cross-Entropy)
from sklearn.metrics import log_loss
# Log Loss = -1/n * Σ(y*log(p) + (1-y)*log(1-p))
# Штрафует за уверенные неправильные предсказания
logloss = log_loss(y_true, y_pred_proba)
print(f"Log Loss: {logloss:.3f}")
print(f"Интерпретация: ниже = лучше, штрафует неправильные вероятности")
6. ПОЛНЫЙ ОТЧЕТ
from sklearn.metrics import classification_report
# Полный отчет с основными метриками
report = classification_report(y_true, y_pred, output_dict=True)
print(classification_report(y_true, y_pred))
print(f"\nМакрос-среднее F1: {report['macro avg']['f1-score']:.3f}")
print(f"Взвешенное F1: {report['weighted avg']['f1-score']:.3f}")
print(f"Micro F1: {report['micro avg']['f1-score']:.3f}")
7. ПРАКТИЧЕСКИЙ ВЫБОР МЕТРИКИ
def choose_metric(problem_type):
"""
Рекомендует метрику в зависимости от задачи
"""
recommendations = {
'balanced_data': {
'primary': 'Accuracy',
'secondary': ['Precision', 'Recall', 'F1'],
'reason': 'Классы примерно сбалансированы'
},
'imbalanced_data': {
'primary': 'F1-Score или PR-AUC',
'secondary': ['Precision', 'Recall', 'Specificity'],
'reason': 'Дисбаланс классов требует сбалансированной метрики'
},
'minimize_false_positives': {
'primary': 'Precision',
'secondary': ['Specificity', 'FPR'],
'reason': 'Важнее не ошибиться на положительных'
},
'minimize_false_negatives': {
'primary': 'Recall',
'secondary': ['Sensitivity', 'FNR'],
'reason': 'Важнее найти все положительные примеры'
},
'ranking_or_probability': {
'primary': 'ROC-AUC или PR-AUC',
'secondary': ['Log Loss'],
'reason': 'Когда важны вероятности, а не бинарные предсказания'
},
'general_performance': {
'primary': 'ROC-AUC',
'secondary': ['F1-Score', 'Accuracy'],
'reason': 'Универсальная метрика для сравнения моделей'
}
}
if problem_type in recommendations:
rec = recommendations[problem_type]
print(f"\n=== {problem_type.upper()} ===")
print(f"Primary metric: {rec['primary']}")
print(f"Secondary: {', '.join(rec['secondary'])}")
print(f"Reason: {rec['reason']}")
# Примеры
for problem in [
'balanced_data',
'imbalanced_data',
'minimize_false_positives',
'minimize_false_negatives',
'ranking_or_probability'
]:
choose_metric(problem)
8. СРАВНЕНИЕ МЕТРИК
| Метрика | Вопрос | Когда использовать | Диапазон |
|---|---|---|---|
| Accuracy | Какой % предсказаний верны? | Сбалансированные данные | 0-1 |
| Precision | Из предсказанных 1, сколько верны? | Минимизировать FP | 0-1 |
| Recall | Из реальных 1, сколько найдено? | Минимизировать FN | 0-1 |
| F1-Score | Баланс Precision и Recall | Несбалансированные данные | 0-1 |
| ROC-AUC | Ранжирование положительного класса | Общая производительность | 0-1 |
| PR-AUC | Precision-Recall компромисс | Несбалансированные данные | 0-1 |
| Specificity | Из реальных 0, сколько найдено? | Минимизировать FP | 0-1 |
| Log Loss | Качество вероятностей | Вероятностные предсказания | 0-∞ |
Итоги
Основные метрики для логистической регрессии:
- Для сбалансированных данных: Accuracy, Precision, Recall, F1
- Для несбалансированных данных: F1-Score, ROC-AUC, PR-AUC
- Для вероятностей: Log Loss, ROC-AUC
- Для интерпретации: Confusion Matrix, Classification Report
- Для сравнения моделей: ROC-AUC (универсально)
Практическая рекомендация:
- Всегда смотри Confusion Matrix
- Используй несколько метрик для полной картины
- Выбирай метрику в зависимости от бизнес-задачи
- Валидируй на independent test set