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

为何LogisticRegressionCV的.score()与cross_val_score结果存在差异?

为什么LogisticRegressionCV的.score()和cross_val_score结果不一致?

这是个非常典型的困惑,核心在于两者的目标和计算逻辑完全不同,我来帮你拆解清楚:

1. LogisticRegressionCV的核心逻辑

LogisticRegressionCV的本质不是用来做模型评估,而是通过交叉验证自动选择最优的正则化参数(C值),然后用全部训练数据训练一个最终模型。具体流程是:

  • 用你传入的skf拆分训练集,在每折上测试多组C值(默认是对数间距的候选值);
  • 找到在交叉验证中表现最优的C值;
  • 用**整个训练集(X_train_sc + y_train)**和这个最优C值,重新训练一个完整的逻辑回归模型;
  • 当你调用logreg.score(X_train_sc, y_train)时,是在全量训练数据上评估这个最终训练好的模型,所以得分是模型在训练集上的“自洽”准确率,自然会偏高(因为模型见过所有训练数据)。

你的代码中得到的0.8495就是这个最终模型在全训练集上的准确率。

2. cross_val_score的核心逻辑(你的用法)

当你把已经拟合好的logreg传入cross_val_score时,它的行为是:

  • 对skf的每一个折,克隆一个全新的、未拟合的LogisticRegressionCV实例(和你原模型的参数配置一致,比如cv=skf、solver='liblinear');
  • 在每折的训练子集上,重新执行“交叉验证选C + 训练模型”的流程;
  • 用训练好的模型在该折的验证子集上评分;
  • 最后返回所有折的验证得分的平均值。

你得到的0.8228是各折验证集上的平均准确率,这是模型在未见过的数据上的表现,所以会比全训练集的得分低,这才是更贴近模型泛化能力的评估结果。

3. 验证差异的小实验

如果你想直观验证这一点,可以做两个小测试:

  • 查看LogisticRegressionCV交叉验证过程中的各折得分并取平均,这个结果会和cross_val_score的平均值高度接近:
    print(logreg.cv_results_['mean_test_score'].mean())
    
  • 用LogisticRegressionCV选出的最优C,构建普通的LogisticRegression模型,再做交叉验证,结果也会和之前的0.8228接近:
    from sklearn.linear_model import LogisticRegression
    
    final_model = LogisticRegression(C=logreg.C_[0], solver='liblinear')
    print(cross_val_score(final_model, X_train_sc, y_train, cv=skf).mean())
    

总结一下:你混淆了“模型在全训练集上的准确率”和“交叉验证的平均验证准确率”,这两个指标的评估对象和场景完全不同,所以结果自然有差异~

内容的提问来源于stack exchange,提问作者orangecat94

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:42:29