Я пытаюсь использовать вложенную перекрестную проверку для сравнения моделей, но документация Scikit немного смутила меня с его реализацией внутреннего и внешнего l oop. Поэтому я надеюсь запустить его с моим текущим пониманием в области перекрестной проверки. Тем не менее, я не уверен, что способ, которым я управлял, точен.
Мой мыслительный процесс:
разделить весь набор данных для обучения и тестирования наборов
использовать набор данных поезда для настройки параметра с 5-кратным cv
с выбранным параметром из шага 2, используйте весь набор данных для оценки производительности наилучшего параметра с использованием 10-кратного cv 20 раз.
Чтобы добиться этого, мой код включен ниже:
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV, cross_val_score, KFold, train_test_split
import numpy as np
import pandas as pd
df = pd.DataFrame(df)
x = df[predictor]
y = df[response]
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=.8, random_state=1)
p_grid = {"C": 2 ** np.arange(-1, 3, 2, dtype = float),
"gamma": 2 ** np.arange(-1, 3, 2, dtype = float)}
svm = SVC(kernel="rbf")
inner_cv = KFold(n_splits=5, shuffle=True, random_state=1)
clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=inner_cv)
clf.fit(X_train, y_train)
tune_nested_scores = clf.best_score_
tune_nested_param = clf.best_params_
nested_scores = np.zeros(20)
clf_chosen = SVC(kernel='rbf', gamma=tune_nested_param['gamma'], C=tune_nested_param['C'])
for i in range(20):
outer_cv = KFold(n_splits=10, shuffle=True, random_state=i)
nested_score = cross_val_score(clf_chosen, X=x, y=y, cv=outer_cv)
nested_scores[i] = nested_score.mean()
avg_score = nested_scores.mean()
print(avg_score)
Вопрос: выглядит ли приведенный выше код для выполнения работы?