Введение
Вложенная кросс-валидация (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). Мы визуализировали разницу в производительности между двумя методами с помощью столбчатой диаграммы.