Nếu tôi hiểu chính xác, lồng nhau-CV có thể giúp tôi đánh giá mô hình và quy trình điều chỉnh siêu tham số nào là tốt nhất. Vòng lặp bên trong ( GridSearchCV
) tìm ra các siêu đường kính tốt nhất và vòng lặp outter ( cross_val_score
) đánh giá thuật toán điều chỉnh siêu tham số. Sau đó, tôi chọn kết hợp điều chỉnh / mô hình nào từ vòng lặp bên ngoài để giảm thiểu mse
(tôi đang xem phân loại hồi quy) cho thử nghiệm mô hình cuối cùng của mình.
Tôi đã đọc các câu hỏi / câu trả lời về xác thực chéo lồng nhau, nhưng chưa thấy một ví dụ nào về một đường ống dẫn đầy đủ sử dụng điều này. Vì vậy, mã của tôi dưới đây (xin vui lòng bỏ qua các phạm vi siêu tham số thực tế - đây chỉ là ví dụ) và quá trình suy nghĩ có ý nghĩa?
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)