为什么选择K会降低我的交叉验证分数?


11

在使用scikit-learn中的Boston Housing数据集RandomForestRegressor(带有默认参数)时,我注意到了一些奇怪的事情:随着将折叠数增加到10以上,交叉验证平均得分降低了。我的交叉验证策略如下:

cv_met = ShuffleSplit(n_splits=k, test_size=1/k)
scores = cross_val_score(est, X, y, cv=cv_met)

... num_cvs变化多端。我设置test_size1/num_cvs镜像k倍CV的训练/测试拆分大小行为。基本上,我想要类似k-fold CV的东西,但是我也需要随机性(因此ShuffleSplit)。

将该试验重复几次,然后绘制平均得分和标准差。

K折交叉验证中的圆〜K面积

(请注意,的大小k由圆的面积表示;标准偏差在Y轴上。)

一致地,增加k(从2到44)会导致得分短暂增加,然后k随着进一步增加(超过10倍)而稳步下降!如果有的话,我希望更多的培训数据会导致分数略有提高

更新资料

更改评分标准以表示绝对错误会导致我预期的行为:评分会随着K折CV中的折叠数增加而提高,而不是接近0(默认值为' r2 ')。问题仍然是,为什么默认得分指标导致均值和STD指标的性能下降,而折叠次数却越来越多。


您的褶皱中是否有重复的记录?这可能是由于过度拟合
已退出-Anony-Mousse

1
@ Anony-Mousse不,因为波士顿房屋数据集没有重复记录,ShuffleSplit的抽样也没有重复记录。
布莱恩·比恩

4
此外,改善绘图效果。使用误差线显示平均值,±stddev和最小值/最大值。将k放在另一轴上。
已退出-Anony-Mousse

1
我不认为更多的训练示例会增加过拟合的机会。我再次使用ShuffleSplit(n_splits = 300,具有不同的测试大小)使用此数据集绘制了一条学习曲线,并发现随着提供了更多的训练示例,准确性不断提高。
布赖恩·比恩

1
抱歉,您是对的,更好是更好,最好是1。但是,如果使用均方误差或绝对误差,则不会出现此问题。因此,它必须对错误项进行处理
rep_ho

Answers:


1

当应用于单个样本时,r ^ 2得分是不确定的(例如,留一式CV)。

r ^ 2不利于评估小型测试集:当用于评估足够小的测试集时,尽管预测良好,但分数仍可能远远超出负数。

给定单个样本,对于给定域的良好预测可能看起来很糟糕:

from sklearn.metrics import r2_score
true = [1]
predicted = [1.01] # prediction of a single value, off by 1%
print(r2_score(true, predicted))
# 0.0

增加测试集的大小(保持预测的准确性相同),然后r ^ 2评分突然变得接近完美:

true = [1, 2, 3]
predicted = [1.01, 2.02, 3.03]
print(r2_score(true, predicted))
# 0.9993

另一个极端是,如果测试量为2个样本,而我们恰巧正在评估2个彼此接近的样本,那么即使预测非常好,这也会对r ^ 2分数产生重大影响:

true = [20.2, 20.1] # actual target values from the Boston Housing dataset
predicted = [19, 21]
print(r2_score(true, predicted))
# -449.0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.