Итак, вы работаете над несбалансированным набором данных уже несколько дней и пробуете различные модели машинного обучения, тренируете их на части вашего набора данных, проверяете их точность, и вы в восторге от того, что каждый раз набирает балл выше 0,95. время. Вы действительно думаете, что достигли точности 95% с вашей моделью?

Необходимость оценки

Я предполагаю, что вы выполнили первоклассную предварительную обработку своего набора данных, а также удалили все отсутствующие значения или категориальные значения и шум. Какой бы современный алгоритм вы ни использовали для построения своей гипотезы и обучения модели машинного обучения, вы должны оценить его производительность, прежде чем двигаться дальше.

Теперь самый простой и быстрый способ оценить модель - разделить набор данных на обучающий и тестовый набор, обучить модель с использованием данных обучающего набора и проверить ее точность с точностью. И не забудьте перетасовать набор данных перед выполнением разделения. Но этот метод вовсе не гарантия, простыми словами вы не можете полагаться на такой подход при доработке модели. Вам может быть интересно - Почему?

Предположим, вы работаете с набором данных спам-писем, который содержит 98% спам-писем и 2% действительных писем, не относящихся к спаму. электронные письма. В этом случае, даже если вы не создадите никакой модели, а просто классифицируете каждый ввод как спам, вы получите точность 0,98. Это состояние называется парадоксом точности.

Представьте, что произошло бы, если бы это была модель для классификации опухолевых клеток или рентгеновских снимков грудной клетки, и вы выпустили бы на рынок модель с точностью 98%. Может быть, это убило бы сотни пациентов, мало ли.

Не волнуйтесь и возьмите чашку чего-нибудь теплого. В статье ниже я объясню весь процесс оценки вашей модели машинного обучения. Все, что вам нужно знать, - это некоторый базовый синтаксис Python в качестве предварительного условия.

Оценка модели

Сначала мы разделяем все данные, которые у нас есть, на два набора: один используется для обучения модели, а другой сохраняется как набор задержек, который используется для проверки. как модель ведет себя с полностью невидимыми данными. На рисунке ниже представлена ​​вся идея выполнения сплита.

Обратите внимание, что соотношение при тестировании поезда может быть любым, например, 80:20, 75:25, 90:10 и т. Д. Это решение, которое инженер по машинному обучению должен принять в зависимости от объема данных. Хорошее практическое правило - использовать для тестирования 25% набора данных.

Вы можете легко сделать это, используя некоторый Python и Sci-kit Learn API с открытым исходным кодом.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42, shuffle = True, stratify = y)

X - это исходный полный набор функций, а y - это полный набор соответствующих истинных меток. Вышеупомянутая функция разделяет весь набор на поезд и тестовый набор с коэффициентом 0,3, назначенным для тестового набора. Параметр shuffle установлен в значение true, поэтому набор данных будет случайным образом перемешан перед разделением. Параметр stratify недавно добавлен в Sci-kit Learn из v0.17, он важен при работе с несбалансированными наборами данных, такими как пример классификации спама. Он выполняет разбиение, так что пропорция значений в произведенной выборке будет такой же, как пропорция значений, предоставленных параметру stratify.
Например, если переменная y является двоичной категориальной переменной со значениями 0 и 1, и есть 10% нулей и 90% единиц, stratify=y обеспечит, чтобы ваше случайное разбиение содержало 10% 0 и 90% из 1.

Как мы обсуждали, только проверка того, сколько примеров из набора тестов было правильно классифицировано, не является полезным показателем для проверки производительности модели из-за таких факторов, как дисбаланс классов. Нам нужна более надежная и детальная метрика.

Матрица путаницы

Поприветствуйте матрицу путаницы. Простой и популярный метод диагностики работоспособности модели. Давайте разберемся в этом с нашим сценарием классификации спама. Матрица путаницы будет выглядеть так.

Есть несколько показателей, которые можно вывести из матрицы путаницы, например:

Accuracy = (TP + TN) /(TP + TN + FP + FN)
Precision = (TP) / (TP + FP)
Recall = (TP) / (TP + FN)
F1 Score = (2 x Precision x Recall) / (Precision + Recall)
—  where TP is True Positive, FN is False Negative and likewise for the rest.

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

Теперь, когда вы поняли концепцию, давайте разберемся, как это легко сделать с помощью Sci-kit Learn API и нескольких строк Python.

from sklearn.metrics import confusion_matrix, classification_report
y_pred = model.predict (X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

Предполагая, что вы подготовили модель с помощью метода .fit () на обучающем наборе (о котором я, вероятно, напишу как-нибудь в другой день), вы затем вычисляете прогнозируемый набор меток с помощью метода модели .predict (). У вас есть исходные метки для них в y_test, и вы передаете два массива в две указанные выше функции. Вы получите матрицу путаницы два на два (поскольку классификация спама - это двоичная классификация) и отчет о классификации, который возвращает все вышеупомянутые показатели.

Примечание. Истинные значения передаются в качестве первого параметра, а прогнозируемые значения - в качестве второго параметра.

Перекрестная проверка

Перекрестная проверка - это метод оценки того, как статистический анализ обобщается на независимый набор данных. Это метод оценки моделей машинного обучения путем обучения нескольких моделей на подмножествах доступных входных данных и их оценки на дополнительном подмножестве данных. С помощью перекрестной проверки высока вероятность того, что мы сможем легко обнаружить чрезмерную подгонку.

There are several cross validation techniques such as :-
1. K-Fold Cross Validation
2. Leave P-out Cross Validation
3. Leave One-out Cross Validation
4. Repeated Random Sub-sampling Method
5. Holdout Method

В этом посте мы обсудим самый популярный из них - кросс-валидацию K-Fold. Остальные также очень эффективны, но менее распространены в использовании.

Итак, давайте займемся минутой, чтобы спросить себя, зачем нам нужна перекрестная проверка -
Мы разделили набор данных на обучающий набор и набор для тестирования (или удерживающий набор). Но точность и показатели сильно зависят от того, как было выполнено разбиение, это зависит от того, был ли набор данных перетасован, какая часть была взята для обучения и тестирования, сколько и так далее. Более того, это не отражает способность модели к обобщениям. Это приводит нас к перекрестной проверке.

К-фолд перекрестная проверка

Сначала я хотел бы познакомить вас с золотым правилом - «Никогда не смешивайте данные обучения и тестирования». Вашим первым шагом всегда должно быть изолировать набор тестовых данных и использовать его только для окончательной оценки. Таким образом, на обучающем наборе будет выполняться перекрестная проверка.

Первоначально весь набор обучающих данных разбивается на k равных частей. Первая часть сохраняется как набор удержания (тестирования), а оставшиеся k-1 части используются для обучения модели. Затем обученная модель тестируется на удерживающем наборе. Вышеупомянутый процесс повторяется k раз, в каждом случае мы продолжаем изменять набор удержания. Таким образом, каждая точка данных получает равные возможности для включения в набор тестов.

Обычно k равно 3 или 5. Его можно расширить даже до более высоких значений, таких как 10 или 15, но это становится чрезвычайно затратным с точки зрения вычислений и требует много времени. Давайте посмотрим, как мы можем реализовать это с помощью нескольких строк кода Python и Sci-kit Learn API.

from sklearn.model_selection import cross_val_score
print(cross_val_score(model, X_train, y_train, cv=5))

Мы передаем модель или объект классификатора, функции, метки и параметр cv, который указывает K для перекрестной проверки K-Fold. Метод вернет список из k значений точности для каждой итерации. Как правило, мы берем среднее из них и используем его в качестве консолидированной оценки перекрестной проверки.

import numpy as np
print(np.mean(cross_val_score(model, X_train, y_train, cv=5)))

Хотя это может быть дорогостоящим в вычислительном отношении, перекрестная проверка необходима для оценки производительности модели обучения.

Не стесняйтесь взглянуть на другие методы оценки баллов перекрестной проверки, которые я включил в раздел ссылок в конце этой статьи.

Заключение

Требования к точности модели машинного обучения варьируются в зависимости от отрасли, предметной области, требований и постановки проблемы. Но подтверждение окончательной модели никогда не должно выполняться без оценки всех основных показателей.

Кстати, после того, как вы закончите оценку и окончательно подтвердите свою модель машинного обучения, вам следует повторно использовать тестовые данные, которые изначально были изолированы только для целей тестирования, и обучить свою модель с полными данными, которые у вас есть, чтобы увеличить шансы для лучшего предсказания.

Спасибо за прочтение. Это был общий обзор темы, я постарался приложить все усилия, чтобы объяснить рассматриваемые концепции простым способом. Не стесняйтесь комментировать, критиковать и предлагать улучшения к статье. Кроме того, хлопки воодушевляют меня писать больше! Следите за новостями, чтобы увидеть больше статей.

Взгляните на это удобное введение в нейронные сети с PyTorch.

использованная литература

[1] Оставить перекрестную проверку P-out
[2] Оставить перекрестную проверку P-out
[3] Метод повторной случайной подвыборки
[4] Метод удержания
[5] Перекрестная проверка
[6] Стэнфордский МООК - Статистическое обучение с помощью R - Примечания к курсу