Метрики оценивания моделей с sklearn

Добрый день, уважаемые читатели. Порой перед инженерами моделей машинного обучения встаёт проблема: как правильно оценить, какую модель выбрать. В этом нам помогут метрики оценивания — способы оценить способность модели предсказывать результат.

Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.
А на YouTube-канале ты найдешь обучающие видео по программированию. Подписывайся!

Сегодня мы разберём основные метрики оценивания для классификаторов и регрессионных моделей, которые реализованы в sklearn.metrics.

Accuracy

Первая метрика для классификации — accuracy (точность). Я предоставлю две формулы: нормализированную и ненормализированую версию.


    \[\phi_{norm} (y, y_1) = \frac{1}{n} \cdot \sum_{i=1}^n \left[(y^i == y_{1}^i) \right]\]


    \[\phi (y, y_1) = \sum_{i=1}^n \left[(y^i == y_{1}^i) \right]\]

Нормализированная версия представляет собой соотношение кол-ва корректных предсказаний и общего кол-ва меток.
Ненормализированная версия представляет собой просто кол-во верных предсказаний. Разберём небольшой пример:

from sklearn.metrics import accuracy_score

y_true = [0, 1, 2, 3]
y_pred = [0, 1, 2, 2]

print(accuracy_score(y_pred, y_true))
print(accuracy_score(y_pred, y_true, normalize=False))

0.75
3

Данный пример показывает нам, что из 4-ех меток мы правильно «предсказали» 3. Ну и соответственно точность предсказания — 75%.

Precision & Recall

Далее рассмотрим такие две метрики, так precision и recall, которые очень похожи. Конкретнее речь будет идти о их вариации для бинарной классификации.


    \[PR = \frac{TP}{TP + FP}\]


    \[RC = \frac{TP}{TP + FN}\]

Здесь:

  • TP (True Positive) — кол-во правильно предсказанных «положительных» меток (предсказание диагноза у пациента, у которого действительно он есть);
  • FP (False Positive) — кол-во неправильно предсказанных «положительных» меток (предсказание диагноза для пациента, у которого он отсутствует);
  • FN (False Negative) — кол-во неправильно предсказанных «отрицательных меток» (предсказание отсутствия диагноза у пациента, у которого он есть).

Рассмотрим практический пример использования этих метрик оценивания с помощью sklearn.metrics:

from sklearn.metrics import precision_score, recall_score

y_true = [0, 1, 1, 0, 1, 1, 1, 0]
y_pred = [0, 1, 0, 0, 1, 1, 0, 1]

print(precision_score(y_pred, y_true))
print(recall_score(y_pred, y_true))

0.6
0.75

F1 score

Еще одна метрика оценки классификаторов напрямую связана с precision и recall,
т. к. имеет формулу:

    \[F1 = \frac{2 \cdot (PR \cdot RC)}{PR + RC}\]

Опять же разберём реализацию F1-score в sklearn для бинарной классификатора:

from sklearn.metrics import f1_score

y_true = [1, 0, 1, 0, 1, 1, 0]
y_pred = [1, 1, 1, 0, 1, 1, 1]

print(f1_score(y_true, y_pred))

0.8

Далее мы приступим к разбору метрик оценивания регрессионных моделей.

Mean Absolute Error

MAE (Mean Absolute Error, Средняя Абсолютная Ошибка (рус.)) — мера схожести предсказаний и правильных значений для каких-либо наблюдений. Имеет следующую формулу:

    \[MAE(y, y_1) = \frac{1}{n} \cdot \sum_{i=1}^n |y^i - y^i_1|\]

Здесь y — предсказанные значения, y_1 — правильные значения для n наблюдений. Использование MAE в sklearn выглядит следующим образом:

from sklearn.metrics import mean_absolute_error

y_true = [0.75, 2.5, 2.1, 0.4, 3.1, 3.35]
y_pred = [0.6, 2.4, 2.05, 0.335, 3.005, 3.25]

print(mean_absolute_error(y_pred, y_true))

0.09333333333333345

Стоит помнить, что значение функции ошибки точно не говорит нам о точности модели, т. к. мы не знаем, какое значение дисперсии является для нас критическим. Если принять за единицу тысячу долларов при условии, что мы предсказываем цену на товар, то 100 долларов — это довольно серьезная погрешность. Однако если же мы предсказываем индекс благополучия, то 0.1 — не есть столь великой потерей (пример условный).

Mean Squared Error

MSE (Mean Squared Error, Средняя Квадратическая Ошибка (рус.)) использует похожий принцип сравнения. Эта метрика имеет следующую формулу:

    \[MSE(y, y_1) = \frac{1}{n} \cdot \sum_{i = 1}^n (y^i - y_1^i)^2\]

Использовать её с помощью sklearn также просто, как и MAE:

from sklearn.metrics import mean_squared_error

y_true = [0.75, 2.4, 2.105, 0.55, 3.251, 3.15]
y_pred = [0.6, 2.4, 2.05, 0.45, 3.105, 3.25]

print(mean_squared_error(y_pred, y_true))

0.011140166666666671

Root Mean Squared Deviation

RMSD напрямую связана с MSE — значение этой меры равно корню квадратному из значения MSE для заданных наборов:

    \[RMSD(y, y_1) = \sqrt{MSE(y, y_1)} = \sqrt{\frac{1}{n} \cdot \sum_{i=1}^n (y^i - y^i_1)^2)}\]

RMSD отсутствует в sklearn, однако с помощью NumPy и функции sqrt мы можем с легкостью вычислить значение этой метрики.

from sklearn.metrics import mean_squared_error
import numpy as np

y_true = [0.75, 2.4, 2.105, 0.55, 3.251, 3.15]
y_pred = [0.6, 2.4, 2.05, 0.45, 3.105, 3.25]

print(np.sqrt(mean_squared_error(y_pred, y_true)))

0.10554698795639159

R2 score

R^2 score — последняя мера оценки регрессионных моделей в этой статье, которая от перечисленных выше двух отличается тем, что может принимать отрицательное значение при плохой обобщающей способности модели.

    \[R^2(y, y_1) = 1 - \frac{\sum_{i=1}^{n} (y^i - y_1^i)^2}{\sum_{i=1}^{n} (y^i - y_{mean})^2}\]

Эта метрика оценивания присутствует в sklearn, и её использование ничем не отличается от большинства тех мер, что были указаны выше.

from sklearn.metrics import r2_score

y_true = [50, 51, 34, 56, 72, 38]
y_pred = [52, 48, 37, 55, 63, 31]

print(r2_score(y_pred, y_true))

0.7812202097235462

Чем ближе R^2 к 1, тем лучше обобщающая способность модели.

Заключение

В этой статье мы разобрали метрики оценивания для классификаторов и регрессоров, ограничившись в основном бинарной классификацией для классификации.

Чтобы ещё лучше запомнить себе материал, приведенный в этой статье, можете сохранить и изменить на своё усмотрение этот документ.

Советую прочитать статью «Кастомизируем свой Jupyter Notebook«.

А также подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.