所以这个问题也困扰着我,虽然其他人提出了很好的观点,但他们并没有回答 OP 问题的所有方面。
真正的答案是:增加 k 的分数差异是由于选择的度量 R2(确定系数)。例如MSE、MSLE 或 MAE 使用 cross_val_score 或 cross_val_predict 不会有任何区别。
见definition of R2:
R^2 = 1 - (MSE(ground truth, prediction)/MSE(ground truth, mean(ground truth)))
粗体部分解释了为什么随着 k 的增加得分开始不同:我们拥有的分割越多,测试折叠中的样本越少,测试折叠的均值方差就越大。
相反,对于较小的 k,测试折叠的均值不会与完整的地面实况均值相差太大,因为样本量仍然足够大,方差很小。
证明:
import numpy as np
from sklearn.metrics import mean_absolute_error as mae
from sklearn.metrics import mean_squared_log_error as msle, r2_score
predictions = np.random.rand(1000)*100
groundtruth = np.random.rand(1000)*20
def scores_for_increasing_k(score_func):
skewed_score = score_func(groundtruth, predictions)
print(f'skewed score (from cross_val_predict): {skewed_score}')
for k in (2,4,5,10,20,50,100,200,250):
fold_preds = np.split(predictions, k)
fold_gtruth = np.split(groundtruth, k)
correct_score = np.mean([score_func(g, p) for g,p in zip(fold_gtruth, fold_preds)])
print(f'correct CV for k={k}: {correct_score}')
for name, score in [('MAE', mae), ('MSLE', msle), ('R2', r2_score)]:
print(name)
scores_for_increasing_k(score)
print()
输出将是:
MAE
skewed score (from cross_val_predict): 42.25333901481263
correct CV for k=2: 42.25333901481264
correct CV for k=4: 42.25333901481264
correct CV for k=5: 42.25333901481264
correct CV for k=10: 42.25333901481264
correct CV for k=20: 42.25333901481264
correct CV for k=50: 42.25333901481264
correct CV for k=100: 42.25333901481264
correct CV for k=200: 42.25333901481264
correct CV for k=250: 42.25333901481264
MSLE
skewed score (from cross_val_predict): 3.5252449697327175
correct CV for k=2: 3.525244969732718
correct CV for k=4: 3.525244969732718
correct CV for k=5: 3.525244969732718
correct CV for k=10: 3.525244969732718
correct CV for k=20: 3.525244969732718
correct CV for k=50: 3.5252449697327175
correct CV for k=100: 3.5252449697327175
correct CV for k=200: 3.5252449697327175
correct CV for k=250: 3.5252449697327175
R2
skewed score (from cross_val_predict): -74.5910282783694
correct CV for k=2: -74.63582817089443
correct CV for k=4: -74.73848598638291
correct CV for k=5: -75.06145142821893
correct CV for k=10: -75.38967601572112
correct CV for k=20: -77.20560102267272
correct CV for k=50: -81.28604960074824
correct CV for k=100: -95.1061197684949
correct CV for k=200: -144.90258384605787
correct CV for k=250: -210.13375041871123
当然,这里还有一个没有展示的效果,其他人都提到了。
随着 k 的增加,有更多的模型在更多的样本上训练并在更少的样本上进行验证,这会影响最终的分数,但这并不是由cross_val_score 和cross_val_predict 之间的选择引起的。