← Назад к вопросам

Какие знаешь метрики качества логистической регрессии?

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, сколько верны?Минимизировать FP0-1
RecallИз реальных 1, сколько найдено?Минимизировать FN0-1
F1-ScoreБаланс Precision и RecallНесбалансированные данные0-1
ROC-AUCРанжирование положительного классаОбщая производительность0-1
PR-AUCPrecision-Recall компромиссНесбалансированные данные0-1
SpecificityИз реальных 0, сколько найдено?Минимизировать FP0-1
Log LossКачество вероятностейВероятностные предсказания0-∞

Итоги

Основные метрики для логистической регрессии:

  1. Для сбалансированных данных: Accuracy, Precision, Recall, F1
  2. Для несбалансированных данных: F1-Score, ROC-AUC, PR-AUC
  3. Для вероятностей: Log Loss, ROC-AUC
  4. Для интерпретации: Confusion Matrix, Classification Report
  5. Для сравнения моделей: ROC-AUC (универсально)

Практическая рекомендация:

  • Всегда смотри Confusion Matrix
  • Используй несколько метрик для полной картины
  • Выбирай метрику в зависимости от бизнес-задачи
  • Валидируй на independent test set
Какие знаешь метрики качества логистической регрессии? | PrepBro