На этом шаге мы рассмотрим еще один способ организации перекрестной проверки.
Ранее мы уже видели, что можно настроить количество блоков, используемое в cross_val_score(), с помощью параметра cv. Однако scikit-learn позволяет значительно точнее настроить процесс перекрестной проверки, используя в качестве параметра cv генератор разбиений перекрестной проверки (cross-validation splitter). В большинстве случаев значения параметров, выставленные по умолчанию для k-блочной перекрестной проверки в случае регрессии и стратифицированной k-блочной проверки в случае классификации дают хорошие результаты, однако бывают ситуации, когда вы, возможно, захотите использовать другую стратегию. Допустим, мы хотим применить k-блочную перекрестную проверку к классификационному набору данных, чтобы воспроизвести чьи-то результаты. Для этого мы должны сначала импортировать класс KFold из модуля model_selection и создать его экземпляр, задав нужное количество блоков:
[In 8]: from sklearn.model_selection import KFold kfold = KFold(n_splits=5)
Затем мы можем передать генератор разбиений kfold в качестве параметра cv в функцию cross_val_score().
[In 9]: print("Значения правильности перекрестной проверки:\n{}".format( cross_val_score(logreg, iris.data, iris.target, cv=kfold))) Значения правильности перекрестной проверки: [1. 1. 0.86666667 0.93333333 0.83333333]
Таким образом, мы можем убедиться, что использование трехблочной (нестратифицированной) перекрестной проверки для набора данных iris действительно является очень плохой идеей:
[In 10]: kfold = KFold(n_splits=3) print("Значения правильности перекрестной проверки:\n{}".format( cross_val_score(logreg, iris.data, iris.target, cv=kfold))) Значения правильности перекрестной проверки: [0. 0. 0.]
Вспомним, что в наборе данных iris каждый блок соответствует одному классу и поэтому, применив нестратифицированную перекрестную проверку, мы ничего не сможем узнать о правильности модели. Еще один способ решения этой проблемы состоит в том, чтобы вместо стратификации перемешать данные и тем самым нарушить порядок сортировки примеров, определяемый их метками. Мы можем сделать это, передав генератору KFold параметр shuffle=True. Если мы перемешиваем данные, нам необходимо зафиксировать random_state, чтобы воспроизвести результат перемешивания. В противном случае каждый прогон cross_val_score() будет давать разный результат, поскольку каждый раз используется разное разбиение (это не является проблемой, но может привести к неожиданным результатам). Перемешивание данных перед их разбиением дает гораздо лучший результат:
[In 11]: kfold = KFold(n_splits=3, shuffle=True, random_state=0) print("Значения правильности перекрестной проверки:\n{}".format( cross_val_score(logreg, iris.data, iris.target, cv=kfold))) Значения правильности перекрестной проверки: [0.98 0.96 0.96]
На следующем шаге мы рассмотрим перекрестную проверку с исключением по одному.