Поиск по сайту:

Повторная перекрестная проверка в k-кратном порядке для оценки модели в Python


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

Один запуск процедуры перекрестной проверки в k-кратном размере может привести к зашумленной оценке производительности модели. Различные разделения данных могут привести к очень разным результатам.

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

В этом уроке вы познакомитесь с повторной k-кратной перекрестной проверкой для оценки модели.

После завершения этого урока вы будете знать:

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

Начните свой проект с моей новой книги «Освоение машинного обучения с помощью Python», включающей пошаговые руководства и файлы исходного кода Python для все примеры.

Давайте начнем.

Обзор руководства

Этот урок разделен на три части; они есть:

  1. k-кратная перекрестная проверка
  2. Повторная перекрестная проверка в k-кратном размере
  3. Повторная перекрестная проверка k-крата в Python

k-кратная перекрестная проверка

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

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

Дополнительную информацию о процедуре перекрестной проверки в k-кратном размере см. в руководстве:

  • Нежное введение в k-кратную перекрестную проверку

Процедуру k-кратной перекрестной проверки можно легко реализовать с помощью библиотеки машинного обучения scikit-learn.

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

Функцию make_classification() можно использовать для создания набора данных синтетической двоичной классификации. Мы настроим его для генерации 1000 выборок, каждая с 20 входными функциями, 15 из которых вносят вклад в целевую переменную.

В приведенном ниже примере создается и суммируется набор данных.

# test classification dataset
from sklearn.datasets import make_classification
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1)
# summarize the dataset
print(X.shape, y.shape)

При выполнении примера создается набор данных и подтверждается, что он содержит 1000 выборок и 10 входных переменных.

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

(1000, 20) (1000,)

Затем мы можем оценить модель на этом наборе данных, используя k-кратную перекрестную проверку.

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

Функция cross_val_score() будет использоваться для выполнения оценки, беря набор данных и конфигурацию перекрестной проверки и возвращая список оценок, рассчитанных для каждого сгиба.

Полный пример приведен ниже.

# evaluate a logistic regression model using k-fold cross-validation
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
# create dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1)
# prepare the cross-validation procedure
cv = KFold(n_splits=10, random_state=1, shuffle=True)
# create model
model = LogisticRegression()
# evaluate model
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
# report performance
print('Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))

При выполнении примера создается набор данных, а затем на нем оценивается модель логистической регрессии с использованием 10-кратной перекрестной проверки. Затем сообщается средняя точность классификации набора данных.

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

В этом случае мы видим, что модель достигла оценочной точности классификации около 86,8 процента.

Accuracy: 0.868 (0.032)

Теперь, когда мы знакомы с перекрестной проверкой в k-кратном размере, давайте посмотрим на расширение, которое повторяет процедуру.

Повторная перекрестная проверка в k-кратном размере

Оценка производительности модели с помощью k-кратной перекрестной проверки может быть зашумленной.

Это означает, что при каждом запуске процедуры может быть реализовано различное разделение набора данных на k-кратное число, и, в свою очередь, распределение оценок производительности может быть различным, что приводит к разным средним оценкам производительности модели.

Величина разницы в расчетной производительности от одного запуска k-кратной перекрестной проверки к другой зависит от используемой модели и самого набора данных.

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

Одним из решений по уменьшению шума в оцениваемой производительности модели является увеличение значения k. Это уменьшит смещение в оценке эффективности модели, хотя и увеличит дисперсию: например. больше привязывайте результат к конкретному набору данных, используемому при оценке.

Альтернативный подход состоит в том, чтобы повторить процесс перекрестной проверки k-кратно несколько раз и сообщить о средней производительности для всех сгибов и всех повторов. Этот подход обычно называют повторной k-кратной перекрестной проверкой.

… повторная k-кратная перекрестная проверка повторяет процедуру […] несколько раз. Например, если 10-кратную перекрестную проверку повторить пять раз, для оценки эффективности модели будет использовано 50 различных отложенных наборов.

- Страница 70, Прикладное прогнозное моделирование, 2013.

Важно отметить, что каждый повтор процесса перекрестной проверки в k-кратном размере должен выполняться на одном и том же наборе данных, разделенном на разные складки.

Преимущество повторной k-кратной перекрестной проверки заключается в улучшении оценки средней производительности модели за счет подбора и оценки гораздо большего количества моделей.

Обычное количество повторений включает 3, 5 и 10. Например, если для оценки производительности модели используются 3 повтора 10-кратной перекрестной проверки, это означает, что необходимо будет подобрать (3 * 10) или 30 различных моделей. и оценено.

  • Подходит: для небольших наборов данных и простых моделей (например, линейных).

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

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

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

Библиотека машинного обучения Python scikit-learn обеспечивает реализацию повторяющейся k-кратной перекрестной проверки с помощью класса RepeatedKFold.

Основными параметрами являются количество сверток (n_splits), что соответствует «k» при перекрестной проверке k-кратности, и количество повторов (n_repeats ).

Хорошее значение по умолчанию для k — k=10.

Хорошее значение по умолчанию для количества повторов зависит от того, насколько зашумлена оценка производительности модели в наборе данных. Число повторов в 3, 5 или 10, вероятно, будет хорошим началом. Больше повторов, чем 10, вероятно, не потребуется.

...
# prepare the cross-validation procedure
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)

В приведенном ниже примере демонстрируется повторная перекрестная проверка нашего тестового набора данных в k-кратном размере.

# evaluate a logistic regression model using repeated k-fold cross-validation
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import RepeatedKFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
# create dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1)
# prepare the cross-validation procedure
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# create model
model = LogisticRegression()
# evaluate model
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
# report performance
print('Accuracy: %.3f (%.3f)' % (mean(scores), std(scores)))

При выполнении примера создается набор данных, затем на нем оценивается модель логистической регрессии с использованием 10-кратной перекрестной проверки с тремя повторениями. Затем сообщается средняя точность классификации набора данных.

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

В этом случае мы видим, что модель достигла расчетной точности классификации около 86,7 процента, что ниже, чем ранее сообщенный результат однократного прогона (86,8 процента). Это может свидетельствовать о том, что результат одного прогона может быть оптимистичным и что результат трех повторов может быть лучшей оценкой истинной средней производительности модели.

Accuracy: 0.867 (0.031)

Ожидается, что повторная k-кратная перекрестная проверка состоит в том, что повторное среднее будет более надежной оценкой производительности модели, чем результат одной процедуры k-кратной перекрестной проверки.

Это может означать меньше статистического шума.

Один из способов измерения этого показателя — сравнение распределения средних показателей производительности при различном количестве повторений.

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

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

Стандартную ошибку можно рассчитать следующим образом:

  • стандартная_ошибка=выборочное_стандартное_отклонение/sqrt (количество повторений)

Мы можем вычислить стандартную ошибку для выборки, используя функцию scipy sem().

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

Пример ниже демонстрирует это, сообщая о производительности модели с 10-кратной перекрестной проверкой с повторением процедуры от 1 до 15.

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

# compare the number of repeats for repeated k-fold cross-validation
from scipy.stats import sem
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import RepeatedKFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from matplotlib import pyplot

# evaluate a model with a given number of repeats
def evaluate_model(X, y, repeats):
	# prepare the cross-validation procedure
	cv = RepeatedKFold(n_splits=10, n_repeats=repeats, random_state=1)
	# create model
	model = LogisticRegression()
	# evaluate model
	scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
	return scores

# create dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=1)
# configurations to test
repeats = range(1,16)
results = list()
for r in repeats:
	# evaluate using a given number of repeats
	scores = evaluate_model(X, y, r)
	# summarize
	print('>%d mean=%.4f se=%.3f' % (r, mean(scores), sem(scores)))
	# store
	results.append(scores)
# plot the results
pyplot.boxplot(results, labels=[str(r) for r in repeats], showmeans=True)
pyplot.show()

Выполнение примера показывает точность классификации средней и стандартной ошибки с использованием 10-кратной перекрестной проверки с различным количеством повторений.

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

В этом случае мы видим, что значение одного повтора по умолчанию выглядит оптимистичным по сравнению с другими результатами с точностью около 86,80 процента по сравнению с 86,73 процента и ниже с различным количеством повторов.

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

Глядя на стандартную ошибку, мы видим, что она уменьшается с увеличением количества повторов и стабилизируется на значении около 0,003 примерно при 9 или 10 повторениях, хотя при 5 повторениях стандартная ошибка достигает 0,005, что составляет половину от того, что достигается при одиночный повтор.

>1 mean=0.8680 se=0.011
>2 mean=0.8675 se=0.008
>3 mean=0.8673 se=0.006
>4 mean=0.8670 se=0.006
>5 mean=0.8658 se=0.005
>6 mean=0.8655 se=0.004
>7 mean=0.8651 se=0.004
>8 mean=0.8651 se=0.004
>9 mean=0.8656 se=0.003
>10 mean=0.8658 se=0.003
>11 mean=0.8655 se=0.003
>12 mean=0.8654 se=0.003
>13 mean=0.8652 se=0.003
>14 mean=0.8651 se=0.003
>15 mean=0.8653 se=0.003

Диаграмма «ящик с усами» создается для суммирования распределения баллов для каждого количества повторений.

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

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

Принимая это во внимание, использование пяти повторов с выбранным тестовым оборудованием и алгоритмом представляется хорошим выбором.

Дальнейшее чтение

В этом разделе представлены дополнительные ресурсы по этой теме, если вы хотите углубиться в нее.

Учебники

  • Нежное введение в k-кратную перекрестную проверку
  • Как исправить перекрестную проверку k-крата для несбалансированной классификации

API

  • sklearn.model_selection.KFold API.
  • sklearn.model_selection.RepeatedKFold API.
  • sklearn.model_selection.LeaveOneOut API.
  • API sklearn.model_selection.cross_val_score.

Статьи

  • Перекрестная проверка (статистика), Википедия.
  • Стандартная ошибка, Википедия.

Краткое содержание

В этом руководстве вы обнаружили повторную перекрестную проверку в k-кратном размере для оценки модели.

В частности, вы узнали:

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

У вас есть вопросы?
Задавайте свои вопросы в комментариях ниже, и я постараюсь ответить.