Вложенная кросс-валидация для выбора модели

Beginner

This tutorial is from open-source community. Access the source code

Введение

Вложенная кросс-валидация (Nested cross-validation) — это техника, используемая для оценки ошибки обобщения модели и ее гиперпараметров. Она особенно полезна при выборе между разными моделями или когда необходимо оптимизировать гиперпараметры. В этом руководстве мы сравним не-вложенную и вложенную кросс-валидацию на модели классификатора на основе опорных векторов (support vector classifier) с использованием набора данных ирисов (iris dataset). Мы также визуализируем разницу в производительности между двумя методами.

Советы по виртуальной машине (VM)

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

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

Если у вас возникнут проблемы во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Загрузка набора данных

Первый шаг — загрузить набор данных ирисов (iris dataset) из библиотеки scikit-learn.

from sklearn.datasets import load_iris

## Load the dataset
iris = load_iris()
X_iris = iris.data
y_iris = iris.target

Определение гиперпараметров

Далее мы определяем гиперпараметры, которые нужно оптимизировать для классификатора на основе опорных векторов (support vector classifier). В данном случае мы оптимизируем параметр стоимости C и коэффициент ядра gamma.

## Set up possible values of parameters to optimize over
p_grid = {"C": [1, 10, 100], "gamma": [0.01, 0.1]}

Определение модели

Мы используем классификатор на основе опорных векторов (Support Vector Classifier) с ядром радиальной базисной функции (radial basis function kernel).

from sklearn.svm import SVC

## We will use a Support Vector Classifier with "rbf" kernel
svm = SVC(kernel="rbf")

Не-вложенная кросс-валидация

Мы используем не-вложенную кросс-валидацию (Non-Nested Cross-Validation), чтобы настроить гиперпараметры и оценить производительность модели. Функция GridSearchCV выполняет полный поиск по заданным значениям параметров для оценщика (estimator). Мы используем 4-кратную кросс-валидацию.

from sklearn.model_selection import GridSearchCV

## Non_nested parameter search and scoring
clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=4)
clf.fit(X_iris, y_iris)
non_nested_score = clf.best_score_

Вложенная кросс-валидация

Мы используем вложенную кросс-валидацию (Nested Cross-Validation), чтобы оценить ошибку обобщения модели и ее гиперпараметров. В внутреннем цикле мы выполняем поиск по сетке (grid search), чтобы найти наилучшие гиперпараметры для каждого обучающего набора. Во внешнем цикле мы оцениваем производительность модели на тестовом наборе.

from sklearn.model_selection import KFold, cross_val_score

## Number of random trials
NUM_TRIALS = 30

## Arrays to store scores
non_nested_scores = np.zeros(NUM_TRIALS)
nested_scores = np.zeros(NUM_TRIALS)

## Loop for each trial
for i in range(NUM_TRIALS):
    ## Choose cross-validation techniques for the inner and outer loops,
    ## independently of the dataset.
    inner_cv = KFold(n_splits=4, shuffle=True, random_state=i)
    outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)

    ## Nested CV with parameter optimization
    clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=inner_cv)
    nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv)
    nested_scores[i] = nested_score.mean()

score_difference = non_nested_score - nested_scores.mean()

Визуализация результатов

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

from matplotlib import pyplot as plt

## Plot bar chart of the difference.
plt.bar(["Non-Nested", "Nested"], [non_nested_score, nested_scores.mean()])
plt.ylim([0.9, 1.0])
plt.ylabel("Score")
plt.title("Non-Nested and Nested Cross-Validation Scores")
plt.show()

Резюме

Вложенная кросс-валидация (Nested Cross-Validation) представляет собой мощную технику для оценки ошибки обобщения модели и ее гиперпараметров. Она может помочь предотвратить переобучение (overfitting) и обеспечить хорошие результаты работы модели на новых данных. В этом руководстве мы сравнили не-вложенную и вложенную кросс-валидацию на модели классификатора на основе опорных векторов (Support Vector Classifier) с использованием набора данных ирисов (iris dataset). Мы визуализировали разницу в производительности между двумя методами с помощью столбчатой диаграммы.