Si je comprends bien, le CV imbriqué peut m'aider à évaluer le meilleur modèle et le processus de réglage d'hyperparamètre. La boucle interne ( GridSearchCV
) trouve les meilleurs hyperparamètres et la boucle externe ( cross_val_score
) évalue l'algorithme de réglage des hyperparamètres. Je choisis ensuite le combo réglage / modèle de la boucle externe qui minimise mse
(je regarde le classificateur de régression) pour mon test de modèle final.
J'ai lu les questions / réponses sur la validation croisée imbriquée, mais je n'ai pas vu d'exemple de pipeline complet qui utilise cela. Donc, mon code ci-dessous (veuillez ignorer les plages hyperparamétriques réelles - c'est juste par exemple) et le processus de réflexion ont-ils du sens?
from sklearn.cross_validation import cross_val_score, train_test_split
from sklearn.grid_search import GridSearchCV
from sklearn.metrics import mean_squared_error
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVR
from sklearn.datasets import make_regression
# create some regression data
X, y = make_regression(n_samples=1000, n_features=10)
params = [{'C':[0.01,0.05,0.1,1]},{'n_estimators':[10,100,1000]}]
# setup models, variables
mean_score = []
models = [SVR(), RandomForestRegressor()]
# split into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.3)
# estimate performance of hyperparameter tuning and model algorithm pipeline
for idx, model in enumerate(models):
clf = GridSearchCV(model, params[idx], scoring='mean_squared_error')
# this performs a nested CV in SKLearn
score = cross_val_score(clf, X_train, y_train, scoring='mean_squared_error')
# get the mean MSE across each fold
mean_score.append(np.mean(score))
print('Model:', model, 'MSE:', mean_score[-1])
# estimate generalization performance of the best model selection technique
best_idx = mean_score.index(max(mean_score)) # because SKLearn flips MSE signs, max works OK here
best_model = models[best_idx]
clf_final = GridSearchCV(best_model, params[best_idx])
clf_final.fit(X_train, y_train)
y_pred = clf_final.predict(X_test)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
print('Final Model': best_model, 'Final model RMSE:', rmse)
la source
best_idx = np.where(np.mean(cv,1).min())[0]; final_m = GridSearchCV(models[best_idx], params[best_idx]); final_m.fit(X,y)
for model, param in zip(models, params): clf = GridSearchCV(model, param) my_score = cross_val_score(clf, X, y, scoring='mean_squared_error') my_scores.append(my_score)
La validation croisée imbriquée estime l'erreur de généralisation d'un modèle, c'est donc un bon moyen de choisir le meilleur modèle à partir d'une liste de modèles candidats et de leurs grilles de paramètres associées. Le poste d'origine est proche de faire un CV imbriqué: plutôt que de faire un seul fractionnement train-test, on devrait plutôt utiliser un deuxième séparateur de validation croisée. C'est-à-dire que l'on "imbrique" un séparateur de validation croisée "interne" à l'intérieur d'un séparateur de validation croisée "externe".
Le séparateur de validation croisée interne est utilisé pour choisir les hyperparamètres. Le séparateur de validation croisée externe fait la moyenne de l'erreur de test sur plusieurs fractionnements de train-test. La moyenne de l'erreur de généralisation sur plusieurs divisions train-test fournit une estimation plus fiable de la précision du modèle sur des données invisibles.
J'ai modifié le code de l'article d'origine pour le mettre à jour vers la dernière version de
sklearn
(avecsklearn.cross_validation
remplacé parsklearn.model_selection
et avec'mean_squared_error'
remplacé par'neg_mean_squared_error'
), et j'ai utilisé deuxKFold
répartiteurs de validation croisée pour sélectionner le meilleur modèle. Pour en savoir plus sur la validation croisée imbriquée, voir lesklearn
l » exemple sur la validation croisée imbriquée .la source
X
ety
). Pour autant que je sache, c'est la bonne chose à faire, mais le commentaire doit être corrigé. Qu'est-ce que tu penses?Tu n'as pas besoin
GridSearchCV
fait cela pour vous. Pour obtenir l'intuition du processus de recherche de grille, essayez d'utiliserGridSearchCV(... , verbose=3)
Pour extraire les scores de chaque pli, voir cet exemple dans la documentation scikit-learn
la source