You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:12:27