Se eu entendi direito, o CV aninhado pode me ajudar a avaliar qual modelo e processo de ajuste de hiperparâmetro é melhor. O loop interno ( GridSearchCV
) encontra os melhores hiperparâmetros e o loop externo ( cross_val_score
) avalia o algoritmo de ajuste do hiperparâmetro. Em seguida, escolho qual combinação de ajuste / modelo do loop externo que minimiza mse
(estou olhando para o classificador de regressão) para o meu teste final de modelo.
Eu li as perguntas / respostas sobre validação cruzada aninhada, mas não vi um exemplo de um pipeline completo que utiliza isso. Então, meu código abaixo (por favor, ignore os intervalos de hiperparâmetros reais - isto é apenas por exemplo) e o processo de pensamento faz sentido?
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)
fonte
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)
A validação cruzada aninhada estima o erro de generalização de um modelo, portanto, é uma boa maneira de escolher o melhor modelo em uma lista de modelos candidatos e suas grades de parâmetros associadas. A postagem original está próxima de criar CV aninhado: em vez de fazer uma única divisão de teste de trem, deve-se usar um segundo divisor de validação cruzada. Ou seja, um "aninha" um divisor de validação cruzada "interno" dentro de um divisor de validação cruzada "externo".
O divisor interno de validação cruzada é usado para escolher hiperparâmetros. O divisor externo de validação cruzada calcula a média do erro de teste em várias divisões de teste de trem. A média do erro de generalização em várias divisões de teste de trem fornece uma estimativa mais confiável da precisão do modelo em dados não vistos.
Modifiquei o código da postagem original para atualizá-lo para a versão mais recente de
sklearn
(comsklearn.cross_validation
substituídosklearn.model_selection
e'mean_squared_error'
substituído por'neg_mean_squared_error'
) e usei doisKFold
divisores de validação cruzada para selecionar o melhor modelo. Para saber mais sobre validação cruzada aninhada, consulte osklearn
's exemplo de validação cruzada aninhada .fonte
X
ey
). Pelo que entendi, é a coisa certa a se fazer, mas o comentário deve ser corrigido. O que você acha?Você não precisa
GridSearchCV
faz isso por você. Para obter intuição do processo de pesquisa em grade, tente usarGridSearchCV(... , verbose=3)
Para extrair pontuações para cada dobra, consulte este exemplo na documentação do scikit-learn
fonte