На этом занятии мы разберем фундаментальную тему машинного обучения — оценку качества моделей классификации. Мы выясним, почему интуитивно понятная метрика Accuracy (доля правильных ответов) может оказаться фатально обманчивой на несбалансированных данных, детально изучим матрицу ошибок (Confusion Matrix), разберем физический смысл и формулы метрик Precision (точность) и Recall (полнота), поймем концепцию гармонического среднего в F1-score, а также научимся строить и интерпретировать сводный отчет classification_report в библиотеке scikit-learn.
В задачах классификации с учителем базовой метрикой традиционно считается Accuracy — общая доля правильных ответов модели. Она рассчитывается как отношение числа верно предсказанных объектов к общему объему тестовой выборки:
$$ \text{Accuracy} = \frac{\text{Количество верных предсказаний}}{\text{Общее количество объектов}} $$
При использовании этой метрики в русскоязычной литературе возникает серьезная путаница терминов: и Accuracy, и Precision часто переводят одним словом — «точность». Однако за ними стоят принципиально разные математические сущности: Accuracy оценивает долю правильных ответов среди всех объектов, а Precision оценивает надежность положительных срабатываний модели.
Главный недостаток Accuracy проявляется при работе с несбалансированными выборками — ситуацией, когда один класс существенно преобладает над другим по численности.
Пример (Диагностика редкого заболевания): Представим выборку из \(1000\) пациентов. Из них \(990\) человек здоровы (Класс 0), а \(10\) имеют диагностированное редкое заболевание (Класс 1). Тривиальная «глупая» модель, которая просто присваивает всем подряд диагноз «здоров» (всегда выдает Класс 0), покажет потрясающую точность:
$$ \text{Accuracy} = \frac{990}{1000} = 99\% $$
С формальной точки зрения показатель идеален, но на практике такая модель абсолютно бесполезна и опасна, поскольку она не выявила ни одного реального больного.
Метрика Accuracy объективна только тогда, когда классы в обучающей, тестовой и реальной выборках идеально сбалансированы. Как только возникает перекос (в бинарных данных или многоклассовой классификации с редкими категориями), Accuracy теряет всякий практический смысл.
Чтобы детально увидеть, где именно ошибается модель, используется инструмент под названием матрица ошибок (Confusion Matrix). Для бинарной классификации она представляет собой таблицу \(2 \times 2\), сопоставляющую фактические значения целевого признака с предсказаниями модели.
В задачах классификации всегда существует нулевая гипотеза (\(H_0\)) — предположение о том, что объект относится к фоновому, наиболее часто встречающемуся в жизни классу (пациент здоров, письмо не является спамом). Класс, который мы целенаправленно ищем, считается положительным сигналом (Positive).
| Фактический класс (Actual) | Предсказанный класс (Predicted) | |
|---|---|---|
| Положительный (1) | Отрицательный (0) | |
| Положительный (1) | TP (True Positive) Истинно положительный |
FN (False Negative) Ошибка II рода (Пропуск цели) |
| Отрицательный (0) | FP (False Positive) Ошибка I рода (Ложная тревога) |
TN (True Negative) Истинно отрицательный |
Исходя из матрицы ошибок, модель классификации генерирует четыре базовых исхода:
В терминах матрицы ошибок формула Accuracy записывается как сумма верных решений, деленная на сумму всех исходов:
$$ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} $$
Поскольку идеальных алгоритмов не существует, модель всегда будет совершать ошибки как первого, так и второго рода. Главная мысль машинного обучения: цена этих ошибок в реальном бизнесе категорически неравнозначна. Чтобы независимо оценивать способность модели избегать ошибок I или II рода, вводятся две метрики — Precision и Recall.
Метрика оценивает: какая доля среди объектов, которые модель назвала положительными, реально относится к положительному классу?
$$ \text{Precision} = \frac{TP}{TP + FP} $$
Precision штрафуется за ложные срабатывания (FP). Чем меньше модель поднимает ложных тревог, тем выше Precision.
Метрика оценивает: какую долю реальных объектов целевого класса модель сумела обнаружить и извлечь?
$$ \text{Recall} = \frac{TP}{TP + FN} $$
Recall штрафуется за пропуски целевых объектов (FN). Чем меньше реальных случаев модель упустила, тем выше Recall.
Выбор метрики под прикладную сферу:
- Медицинская диагностика и безопасность: Ошибка II рода (FN — пропустить болезнь) смертельно опасна. Ошибка I рода (FP — ложноположительный ПЦР-тест) неприятна, но решается повторным анализом крови. Здесь наша ключевая цель — максимизация Recall.
- Фильтрация спама и банковский скоринг: Ошибка I рода (FP — поместить важное письмо от контрагента или банка в «Спам») ведет к упущенной выгоде и финансовым потерям. Если же в папку «Входящие» случайно просочится одно лишнее рекламное письмо (FN), пользователь легко удалит его вручную. В этой задаче приоритетом выступает максимизация Precision.
Что делать, если в прикладной задаче одинаково важно избегать как ошибок первого, так и ошибок второго рода, или если у нас нет явного приоритета? Обычное среднее арифметическое между Precision и Recall здесь не подходит:
Если модель покажет \(\text{Precision} = 1.0\), но \(\text{Recall} = 0.04\), простое среднее выдаст внушительные \(0.52\), маскируя катастрофический провал полноты.
Для решения этой проблемы используется F1-score — гармоническое среднее между точностью и полнотой:
$$ F_1 = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}} $$
Особенность гармонического среднего заключается в том, что оно стремится к наименьшему из двух значений. \(F_1\)-score будет высоким только в том случае, когда и Precision, и Recall одновременно высоки. Если хотя бы один из показателей проседает, значение \(F_1\) резко падает.
Библиотека scikit-learn предоставляет модуль sklearn.metrics, содержащий функции расчета всех изученных характеристик. Каждая функция принимает два обязательных параметра: вектор фактических меток y_true и вектор предсказанных меток y_pred.
from sklearn.metrics import (
confusion_matrix,
accuracy_score,
precision_score,
recall_score,
f1_score,
classification_report
)
# Тестовые фактические и предсказанные данные
y_true = [0, 1, 0, 1, 0, 1, 0, 1]
y_pred = [0, 1, 1, 1, 0, 0, 0, 1]
# 1. Построение матрицы ошибок
cm = confusion_matrix(y_true, y_pred)
print("Confusion Matrix:\n", cm)
# 2. Индивидуальный расчет метрик
print(f"Accuracy: {accuracy_score(y_true, y_pred):.2f}")
print(f"Precision: {precision_score(y_true, y_pred):.2f}")
print(f"Recall: {recall_score(y_true, y_pred):.2f}")
print(f"F1 Score: {f1_score(y_true, y_pred):.2f}")
Для глубокой комплексной аналитики применяется функция classification_report(), которая генерирует структурированную сводку показателей:
precision recall f1-score support
0 0.75 0.75 0.75 4
1 0.75 0.75 0.75 4
accuracy 0.75 8
macro avg 0.75 0.75 0.75 8
weighted avg 0.75 0.75 0.75 8
Как интерпретировать параметры отчета:
confusion_matrix, accuracy_score, precision_score, recall_score, f1_score.classification_report.