Шаг 137.
Введение в машинное обучение с использованием Python. ... . Стратифицированная k-блочная перекрестная проверка ... . Больше контроля над перекрестной проверкой

    На этом шаге мы рассмотрим еще один способ организации перекрестной проверки.

    Ранее мы уже видели, что можно настроить количество блоков, используемое в 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]

    На следующем шаге мы рассмотрим перекрестную проверку с исключением по одному.




Предыдущий шаг Содержание Следующий шаг