cross_val_score与LassoCV.score()得到的R²分数不一致问题
分数差异的核心原因
两个结果没有可比性,本质是计算逻辑完全不对等,核心差异有两点:
- 评估数据集完全不同
cross_val_score返回的是10折交叉验证的留出测试集平均得分:每一轮训练仅使用9折数据,剩余1折数据全程不参与模型训练,用来做最终评分,最终结果是模型在未见过的数据上的泛化能力估计,天然偏低。
而lassocv.score(X_train,Y_train)计算的是全量训练集上的训练得分:LassoCV完成内部交叉验证选出最优alpha后,会用全部X_train数据重新拟合最终模型,此时拿模型预测已经参与过训练的X_train标签,相当于用已经做过的原题考学生,分数必然高于未见过的新题得分。这也是不管怎么调整随机种子,cross_val_score结果始终更低的根本原因,属于正常现象,不是代码bug。 - 对比的模型参数不一致
传入cross_val_score的是固定alpha=0.1的Lasso模型,而LassoCV会通过内部交叉验证从候选alpha列表中自动选择泛化表现最优的alpha值,最终拟合的模型正则强度不一定等于0.1,两个模型本身的预测能力就存在差异,会进一步拉大分数差。
对等对比的正确方式
如果要得到接近的评分结果,需要保证模型参数、评估数据集两个维度完全对齐:
- 方案1:统一用交叉验证泛化得分做对比。直接将未fit的LassoCV实例传入cross_val_score,即调用
cross_val_score(lassocv, X_train, Y_train, scoring='r2', cv=kf)取平均值,该结果和LassoCV内部交叉验证选alpha时的评分逻辑一致,数值会基本匹配。 - 方案2:统一用独立测试集做评估。两个模型都在全量X_train上完成拟合后,调用
score(X_test, Y_test)计算在未参与训练的测试集上的得分,此时两个结果的差异仅来自alpha取值不同,不会出现训练集打分带来的虚高问题。
注意:哪怕两个模型的alpha完全一致,训练集上的score结果也永远会高于交叉验证留出集/独立测试集的得分,这是模型拟合训练数据的天然属性,正则只能缩小这个差距,无法完全消除。
内容的提问来源于stack exchange,提问作者juneliu
相关产品推荐
相关产品推荐

