我正在尝试使用scikit-learn 中的GridSearchCV并查看训练/测试指标之间的差异。
当我使用 RandomForestRegressor 进行正常的测试/训练拆分时,指标具有可比性。类似于:
训练 R2:0.97
测试 R2:0.85
但是,当我尝试在 GridSearchCV 中使用相同的数据时,测试和训练指标似乎完全不同,测试准确度是一个很大的负数,而不是介于 0 和 1 之间。
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
...
rf_reg = RandomForestRegressor(max_depth=10,
random_state=RANDOM,
n_estimators=100,
n_jobs=N_JOBS)
param_grid = {
"min_samples_leaf": [1, 2, 4, 10]
}
grid_cv = GridSearchCV(rf_reg, param_grid, cv=5, return_train_score=True)
grid_cv.fit(X, y)
我很惊讶当我检查测试和训练的分数时,它们似乎是两个不同的指标。RandomForestRegressor 的默认分数是 R2,但测试集的结果看起来完全是另一个指标。
results = pd.DataFrame(grid_cv.cv_results_)
print('Train scores:\n', results['mean_train_score'])
print('Test scores:\n', results['mean_test_score'])
Train scores:
0 0.974572
1 0.963771
2 0.936328
3 0.877382
Name: mean_train_score, dtype: float64
Test scores:
0 -5.948434
1 -5.798446
2 -6.034835
3 -6.655515
Name: mean_test_score, dtype: float64
训练分数对我来说很有意义,它们应该在 0-1 之间,因为我期待 R2 错误指标,这是 RandomForestRegressor 的默认值。但是为什么测试分数是不同的指标呢?它们也应该在 0 和 1 之间,怎么可能得到负数?这对我来说没有意义。
cross_val_score 也会发生同样的事情,我期待一个 R2 指标,但它返回负数。即使将评分方法显式设置为 'r2' 也会返回负数。
from sklearn.model_selection import cross_val_score
scores = cross_val_score(rf_reg, X, y, cv=5, scoring='r2')
print(scores)
[ -5.15970579 -4.67536964 -13.17643335 -2.11630272 -4.51688508]