Как рассчитать точность прогноза, используя матрицу ошибок?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Матрица ошибок (Confusion Matrix) и расчёт метрик точности
Матрица ошибок — это таблица, которая показывает, как хорошо модель классификации работает. Она содержит информацию о правильных и неправильных предсказаниях, разделённые по классам.
Структура матрицы ошибок (бинарная классификация)
Для задачи с двумя классами (позитивный/негативный):
Предсказано
Положит. Отрицат.
Положит. TP FN
Реально
Отрицат. FP TN
Обозначения:
- TP (True Positive) — корректно предсказано положительное (привычно говорить: истинно положительное)
- FP (False Positive) — неверно предсказано положительное (ложные срабатывания)
- TN (True Negative) — корректно предсказано отрицательное
- FN (False Negative) — неверно предсказано отрицательное (пропуски)
Пример с реальными числами
Предположим, модель классифицирует 100 писем как спам или не спам:
Предсказано
Спам Не спам
Спам 50 5 (55 спамных писем)
Реально
Не спам 3 42 (45 легитимных)
Основные метрики
1. Accuracy (Точность) — доля правильных предсказаний
Accuracy = (TP + TN) / (TP + TN + FP + FN)
Accuracy = (50 + 42) / (50 + 42 + 3 + 5) = 92 / 100 = 0.92
Это самая простая метрика, но может быть обманчивой при дисбалансе классов.
2. Precision (Точность класса) — доля правильных предсказаний положительного класса
Precision = TP / (TP + FP)
Precision = 50 / (50 + 3) = 50 / 53 ≈ 0.94
Отвечает на вопрос: "Из всех предсказанных спамов, сколько на самом деле спам?"
Важно при: когда ошибочное предсказание положительного класса дорого стоит (например, отклонить хорошего клиента).
3. Recall (Полнота) — доля обнаруженных положительных примеров
Recall = TP / (TP + FN)
Recall = 50 / (50 + 5) = 50 / 55 ≈ 0.91
Отвечает на вопрос: "Из всех спамных писем, сколько модель обнаружила?"
Важно при: когда пропустить положительный класс дорого стоит (например, пропустить спам).
4. F1-Score — гармоническое среднее Precision и Recall
F1 = 2 * (Precision * Recall) / (Precision + Recall)
F1 = 2 * (0.94 * 0.91) / (0.94 + 0.91) ≈ 0.92
Объединяет обе метрики в одно число, полезна при дисбалансе классов.
5. Specificity (Специфичность) — доля корректно классифицированных отрицательных
Specificity = TN / (TN + FP)
Specificity = 42 / (42 + 3) = 42 / 45 ≈ 0.93
Реализация на Python
from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.metrics import precision_score, recall_score, f1_score
import numpy as np
y_true = [0, 1, 1, 0, 1, 1, 0, 0, 1, 0]
y_pred = [0, 1, 0, 0, 1, 1, 0, 1, 1, 0]
# Матрица ошибок
cm = confusion_matrix(y_true, y_pred)
print("Матрица ошибок:")
print(cm)
# Метрики
acc = accuracy_score(y_true, y_pred)
prec = precision_score(y_true, y_pred)
rec = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
print(f"Accuracy: {acc:.3f}")
print(f"Precision: {prec:.3f}")
print(f"Recall: {rec:.3f}")
print(f"F1-Score: {f1:.3f}")
Расчёт вручную из матрицы
from sklearn.metrics import confusion_matrix
y_true = [0, 1, 1, 0, 1, 1, 0, 0, 1, 0]
y_pred = [0, 1, 0, 0, 1, 1, 0, 1, 1, 0]
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
accuracy = (tp + tn) / (tp + tn + fp + fn)
precision = tp / (tp + fp) if (tp + fp) > 0 else 0
recall = tp / (tp + fn) if (tp + fn) > 0 else 0
f1 = 2 * (precision * recall) / (precision + recall) if (precision + recall) > 0 else 0
print(f"Accuracy: {accuracy:.3f}")
print(f"Precision: {precision:.3f}")
print(f"Recall: {recall:.3f}")
print(f"F1-Score: {f1:.3f}")
Когда использовать какую метрику
Accuracy:
- Когда классы сбалансированы
- Когда оба типа ошибок одинаково важны
Precision:
- Когда важно избежать ложных срабатываний (spam detection, fraud)
- Медицина: диагностика редкого заболевания
Recall:
- Когда важно не пропустить положительные примеры
- Безопасность: обнаружение угроз
- Медицина: скрининг болезней
F1-Score:
- Когда нужен баланс между Precision и Recall
- При дисбалансе классов
- Общая оценка производительности
Многоклассовая классификация
Для более чем 2 классов матрица становится NxN, и метрики рассчитываются усреднением:
# Micro: усредняем результаты по всем классам
f1_micro = f1_score(y_true, y_pred, average='micro')
# Macro: усредняем метрики каждого класса
f1_macro = f1_score(y_true, y_pred, average='macro')
# Weighted: усредняем с учётом количества примеров
f1_weighted = f1_score(y_true, y_pred, average='weighted')
Матрица ошибок и соответствующие метрики — фундамент для оценки качества модели классификации.