CV误差大于测试集预测误差

时间:2014-11-14 17:44:20

标签: machine-learning scikit-learn prediction random-forest cross-validation

我使用scikit-learn RandomForestRegressor为我的一个数据集构建模型,并与GridSearchCV一起确定模型超参数。我通过将总数据集拆分为具有80/20拆分的列车和测试集来评估模型的预测能力。在列车组上执行使用网格搜索的模型选择,然后使用最佳模型在测试集上进行预测。我一直看到,当使用该模型预测独立测试数据时,最佳网格搜索模型的CV R ^ 2得分低于R ^ 2得分。这在多个随机训练/测试分裂中持续存在。这种行为对我来说似乎很奇怪,而且我不确定我是否做错了,如果这种行为实际上是正常的,或者我的数据可能真的很奇怪。

相关代码如下(我也在输入功能上使用PCA作为我的建模管道的一部分)。我的输入数据包含3个功能(在PCA之后),我的目标数据包含5个功能,数据集包含100个样本。

# Split data into train and test sets
X_train, X_test, Y_train, Y_test = train_test_split(X_data, Y_data, test_size=0.2, random_state=1)

# Feature transformation and model fitting pipeline
pca = PCA(n_components=3)
clf = RandomForestRegressor(n_estimators=200, random_state=0)
pipe = Pipeline([('pca', pca), ('rf', clf)])

# Cross validation
cv = KFold(len(Y_train), n_folds=10, random_state=0)

# Grid search
grid_max_depth = [1, 2, 3, None]
grid_max_features = [1, 2, 3, 'auto']
grid_min_samples_split = [1, 2, 3]
grid_min_samples_leaf = [1, 2, 3]
param_grid = {'rf__max_depth': grid_max_depth, 'rf__max_features': grid_max_features, 'rf__min_samples_split': grid_min_samples_split, 'rf__min_samples_leaf': grid_min_samples_leaf}
clf_grid = GridSearchCV(pipe, param_grid, cv=cv, scoring='r2', verbose=1, n_jobs=2)

# Fit model
clf_grid.fit(X_train, Y_train)

# Get best cross-validation score from grid search
cv_score = clf_grid.best_score_

# Predict independent test data, score prediction
test_score = clf_grid.best_estimator_.score(X_test, Y_test)

来自5个不同的随机训练/测试分裂的示例CV和测试集R ^ 2得分是:

cv_score    |    test_score
---------------------------
0.4556      |    0.6061
0.5005      |    0.6568
0.4566      |    0.5293
0.4767      |    0.6806
0.5222      |    0.6404

非常感谢任何帮助或见解!

0 个答案:

没有答案