Wenn ich das richtig verstehe, kann mir Nested-CV dabei helfen, zu bewerten, welcher Modell- und Hyperparameter-Optimierungsprozess am besten ist. Die innere Schleife ( GridSearchCV
) findet die besten Hyperparameter, und die äußere Schleife ( cross_val_score
) wertet den Algorithmus zur Optimierung der Hyperparameter aus. Ich wähle dann aus der äußeren Schleife aus, welche Tuning- / Modellkombination mse
für meinen endgültigen Modelltest minimiert wird (ich betrachte den Regressionsklassifikator).
Ich habe die Fragen / Antworten zur verschachtelten Kreuzvalidierung gelesen, aber kein Beispiel für eine vollständige Pipeline gesehen, die dies nutzt. Ist mein Code unten (bitte ignorieren Sie die tatsächlichen Hyperparameterbereiche - dies ist nur zum Beispiel) und der Denkprozess sinnvoll?
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)
quelle
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)
Die verschachtelte Kreuzvalidierung schätzt den Generalisierungsfehler eines Modells. Daher ist es eine gute Möglichkeit, das beste Modell aus einer Liste von Kandidatenmodellen und den zugehörigen Parametergittern auszuwählen. Der ursprüngliche Beitrag steht kurz vor der Erstellung eines verschachtelten Lebenslaufs: Anstatt einen einzelnen Zug-Test-Split durchzuführen, sollte stattdessen ein zweiter Kreuzvalidierungs-Splitter verwendet werden. Das heißt, man "verschachtelt" einen "inneren" Kreuzvalidierungs-Splitter in einem "äußeren" Kreuzvalidierungs-Splitter.
Der innere Kreuzvalidierungs-Splitter wird zur Auswahl von Hyperparametern verwendet. Der äußere Kreuzvalidierungs-Splitter mittelt den Testfehler über mehrere Zug-Test-Splits. Die Mittelung des Generalisierungsfehlers über mehrere Zug-Test-Teilungen liefert eine zuverlässigere Schätzung der Genauigkeit des Modells für unsichtbare Daten.
Ich habe den Code des ursprünglichen Beitrags geändert, um ihn auf die neueste Version von
sklearn
(mitsklearn.cross_validation
ersetzt durchsklearn.model_selection
und durch'mean_squared_error'
ersetzt durch'neg_mean_squared_error'
) zu aktualisieren , und ich habe zweiKFold
Kreuzvalidierungs-Splitter verwendet, um das beste Modell auszuwählen. Um mehr über verschachtelte Kreuzvalidierung finden Sie auf dassklearn
‚s Beispiel auf verschachtelte Kreuzvalidierung .quelle
X
undy
). Soweit ich weiß, ist dies das Richtige, aber dann muss der Kommentar korrigiert werden. Was denken Sie?Du brauchst nicht
GridSearchCV
macht das für dich. Versuchen Sie es mit, um sich ein Bild vom Rastersuchprozess zu machenGridSearchCV(... , verbose=3)
Informationen zum Extrahieren von Punktzahlen für jede Falte finden Sie in diesem Beispiel in der Scikit-Learn-Dokumentation
quelle