所以这个问题也困扰着我,虽然其他人提出了好的观点,但他们没有回答OP问题的所有方面。
真正的答案是: 使用增加的k值得分数的差异是由于选择的度量R2(确定系数)所致。例如,对于MSE、MSLE或MAE,使用cross_val_score或cross_val_predict没有任何区别。
见R2的定义:
R^2 = 1 - (MSE(实际值, 预测值)/ MSE(实际值, 实际值均值))
粗体部分解释了为什么得分开始在增加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
之间的选择所引起的。