Что такое перекрестная проверка в машинном обучении?
Введение в перекрестную проверку в машинном обучении и ее реализация с помощью Python.
В машинном обучении перекрестная проверка – это статистический метод оценки производительности обобщения, который является более стабильным и тщательным, чем использование разделения набора данных на набор для обучения и набор для тестирования. В этой статье я расскажу, что такое перекрестная проверка и как ее использовать для машинного обучения с помощью языка программирования Python.
Что такое перекрестная проверка
При перекрестной проверке данные разделяются несколько раз и обучаются несколько моделей. Самая часто используемая версия перекрестной проверки – это k-кратная перекрестная проверка, где k – это заданное пользователем число, обычно 5 или 10.
При пятиэтапной перекрестной проверке данные сначала разделяются на пять частей (приблизительно) равного размера, называемые свертками. Затем формируется последовательность моделей. Первая модель обучается с использованием первой складки в качестве тестового набора, а остальные складки (2–5) используются в качестве обучающей выборки.
Модель строится с использованием данных из складок 2–5, затем точность оценивается для складки 1. Затем строится другая модель, на этот раз с использованием складки 2 в качестве тестового набора и данных из складок 1, 3, 4 и 5 в качестве обучающего набора.
Этот процесс повторяется с использованием складок 3, 4 и 5 в качестве тестовых наборов. Для каждого из этих пяти разделов данных на наборы для обучения и тестирования мы вычисляем точность. В итоге мы собрали пять значений точности.
Реализация перекрестной проверки с Python
Мы можем легко реализовать процесс перекрестной проверки с помощью языка программирования Python, используя библиотеку Scikit-learn в Python.
Перекрестная проверка реализована в scikit-learn с использованием функции cross_val_score модуля model_selection. Параметры функции cross_val_score – это модель, которую мы хотим оценить, обучающие данные и наземные метки истинности. Давайте оценим LogisticRegression на наборе данных iris:
from sklearn.model_selection import cross_val_score from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression iris = load_iris() logreg = LogisticRegression() scores = cross_val_score(logreg, iris.data, iris.target) print("Cross-validation scores: {}".format(scores))
Результат:
Cross-validation scores: [ 0.961 0.922 0.958]
По умолчанию cross_val_score выполняет тройную перекрестную проверку, возвращая три значения точности. Мы можем изменить количество используемых складок, изменив параметр cv:
scores = cross_val_score(logreg, iris.data, iris.target, cv=5) print("Cross-validation scores: {}".format(scores))
Результат:
Cross-validation scores: [ 1. 0.967 0.933 0.9 1. ]
Обычный способ суммировать точность перекрестной проверки – вычислить среднее:
print("Average cross-validation score: {:.2f}".format(scores.mean()))
Результат:
Average cross-validation score: 0,96.
Преимущества и недостатки использования перекрестной проверки
Использование перекрестной проверки вместо разделения на одно обучение и один набор тестов дает несколько преимуществ. Прежде всего, следует помнить, что train_test_split выполняет случайное разделение данных.
Представьте, что нам «повезло» со случайным разделением данных, и все примеры, которые трудно разделить на категории, попадают в обучающий набор. В этом случае набор тестов будет содержать только «простые» примеры, а точность нашего набора тестов будет нереалистичной.
И наоборот, если нам «не повезло», мы могли случайным образом поместить все примеры, которые трудно ранжировать, в тестовый набор и, следовательно, получить нереалистичную оценку.
Однако при использовании перекрестной проверки каждый пример будет в тестовом наборе ровно один раз: каждый пример находится в одной из складок, и каждая складка является тестовым набором один раз. Следовательно, модель должна хорошо обобщаться для всех выборок в наборе данных, чтобы все баллы перекрестной проверки (и их среднее значение) были высокими.
Наличие нескольких разделений данных также дает информацию о чувствительности нашей модели к выбору набора обучающих данных. Для набора данных радужной оболочки мы увидели точность от 90% до 100%. Это довольно большой диапазон, и он дает нам представление о том, как модель может работать в худшем случае и в лучшем случае при применении к новым данным.
Еще одно преимущество перекрестной проверки перед использованием одного разделения данных состоит в том, что мы используем наши данные более эффективно. При использовании train_test_split мы обычно используем 75% данных для обучения и 25% данных для оценки.
При использовании пятикратной перекрестной проверки на каждой итерации мы можем использовать четыре пятых данных (80%) для обучения модели. При использовании 10 перекрестных проверок мы можем использовать девять десятых данных (90%) для обучения модели. Чем больше данных, тем точнее модели.
Главный недостаток – увеличение вычислительных затрат. Поскольку в настоящее время мы обучаем k моделей вместо одной, перекрестная проверка будет примерно в k раз медленнее, чем выполнение одного деления данных.
Вывод
Используя среднюю перекрестную проверку, мы можем сделать следующий вывод: ожидается, что модель будет иметь в среднем около 96% точности. Глядя на пять баллов, полученных в результате пятикратной перекрестной проверки, мы также можем сделать вывод, что существует относительно большая разница в точности между складками, от 100% до 90%.
Это может означать, что модель очень зависит от конкретных складок, используемых для обучения, но это также может быть просто следствием небольшого размера набора данных.
Надеюсь, вам понравилась эта статья о том, что такое перекрестная проверка, и ее реализация с использованием Python, а также ее преимущества и недостатки.