Accuracy (Точность) = точно угаданные / число примеров =
= (TP + TN) / (TP + TN + FP + FN).
Precision (Точность для 1) = TP / (TP + FP).
Recall (Полнота) = TP / (TP + FN) (или сколько процентов 1 мы нашли правильно).
F мера = 1 / (1/Precision + 1/Recall).
Самые часто применяющиеся метрики для классификации – precision и recall. Они не зависят от несбалансированности классов, как accuracy. Эта ситуация возникает, когда соотношение единиц и нулей в датасете далеко от 50/50.
В метриках классификации есть еще одна интересная – AUC-ROC (Area Under Curve of Receiver Operating Characteristic). Она нужна тогда, когда алгоритм классификации выдает вероятность принадлежности к какому-либо классу – 0 или 1. Чтобы посчитать метрики Recall и Precision, нам придется делать разные пороговые значения для вероятностей (чтобы различать классы) и считать их. Как раз для этого и нужна AUC-ROC, которая хорошо показывает эффективность классификатора независимо от порогового значения. Чтобы ее построить, необходимо взять набор пороговых значений из отрезка [8–0;1] и для каждого значения порога вычислить два числа:
TPR (True Positive Rate) = TP/(TP + FN) и
FPR (False Positive Rate) = FP/(FP + TN).
Отметить эти числа как точки в плоскости координат TPR и FPR и получить следующую кривую (рис. 8.3).
Площадь под ней и есть AUC. В случае если вы получаете AUC близкий к 0.5, ваш классификатор почти ничем не отличается от
Рис. 8.3. ROC-кривая
случайного подбрасывания монетки. Чем его значение ближе к 1, тем лучше. Этот показатель часто используется в научной литературе и соревнованиях Kaggle.
Для других задач, например для ранжирования результатов поиска и для рекомендаций, используются свои показатели качества работы, о них можно узнать в специальной литературе.
Итак, у нас есть метрика. Теперь с ее помощью мы сможем сравнивать разные модели друг с другом и понимать, какая из них лучше. Можно приступать к обучению.
ML изнутри
Практически любая ML-модель для обучения с учителем сводится к двум вещам: определение функции потерь (loss function для одного примера, cost function для множества примеров) и процедуры ее минимизации.
Например, для линейной регрессии это будет среднеквадратичная ошибка в том виде, в каком мы определили ее ранее. Чтобы найти минимум функции потерь, существуют различные процедуры оптимизации. Одна из них называется градиентным спуском (Gradient Descent), она широко применяется на практике.
Как правило, оптимизация выглядит следующим образом:
1. Коэффициенты (которые нужно подобрать) модели инициализируются нулями или случайно.
2. Вычисляется величина функции потерь (например, среднеквадратичное отклонение) и ее градиент (производная от функции потерь). Градиент нам нужен, чтобы понять, куда двигаться для минимизации ошибки.
3. Если функция потерь изменилась существенно и мы не достигли максимального числа повторений расчета, то пересчитаем коэффициенты, исходя из градиента, и идем к шагу 2.
4. Считаем, что оптимизация завершена, возвращаем модель с вычисленными коэффициентами.
Графически градиентный спуск выглядит как на рис. 8.4.
Рис. 8.4. Градиентный спуск
У нас есть функция потерь, и с произвольной точки мы двигаемся в сторону ее минимума последовательно, по шагам.
У этого алгоритма есть еще две версии: стохастический градиентный спуск (SGD) и пакетный (Mini Batch Gradient Descent). Первый используется для работы с большими данными, когда мы из всего датасета используем только один пример для одной итерации обучения. Альтернативной для больших данных является пакетная версия (batch) этого алгоритма, которая вместо одного примера использует подмножество датасета.
Линейная регрессия
Самая простая и популярная модель регрессии. На самом деле ее мы затрагивали в школе, когда писали формулу линейной зависимости. Когда я учился в старших классах, она выглядела так:
Обычно работают с множественной линейной регрессией (multivariate linear regression), формула которой выглядит так: