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

Python中OLS模型训练集R-squared与测试集r2_score计算值不一致问题

训练集与测试集R²值差异过大的原因及遗漏要点

核心原因

  • 过拟合:即使训练集R²仅为0.204,模型依然可能拟合了训练集特有的噪声而非通用规律,泛化能力不足,导致测试集表现暴跌。如果特征维度较高、训练样本量较小,无正则化的sm.OLS()非常容易出现这类问题。
  • 训练集与测试集分布偏移:数据集拆分时未做随机打乱、时序数据直接按顺序拆分未考虑时间漂移,都会导致训练集和测试集的特征、标签分布差异过大,模型在训练集学到的规律完全无法适配测试集。
  • 数据预处理流程不统一:如果做标准化、归一化、缺失值填充等预处理时,使用了全量数据集(训练+测试)的统计量计算规则,相当于向模型泄露了测试集信息,或训练集做了预处理但测试集未应用相同规则,都会导致测试集预测结果严重偏离。
  • 评估指标计算逻辑不一致:sm.OLS()默认会返回两种R²:如果你的X_train未添加截距项,输出的是未中心化R²,而r2_score()默认计算的是中心化R²,二者计算规则不同本身就会产生结果差异。同时也要确认y_pred是由X_test预测生成,没有出现标签、预测值配对错误的低级问题。
  • 测试集样本量过小或存在极端异常值:测试集样本量少的情况下,少量异常值就会大幅拉低R²数值,而训练集样本量更大,异常值的影响会被稀释。

遗漏的操作要点

  • 数据集拆分后先做分布校验:拆分前对非时序数据做随机打乱,时序数据严格按时间维度拆分,拆分后核对训练集、测试集的特征与标签的均值、方差、分位数等统计指标,确认二者分布无显著差异。
  • 统一预处理逻辑:所有预处理的统计规则(均值、标准差、缺失值填充值、类别编码映射等)只能从训练集计算得到,再分别应用到训练集和测试集上,禁止使用全量数据集计算预处理参数。
  • 对齐R²计算逻辑:给训练集特征添加截距项X_train = sm.add_constant(X_train)后再训练模型,保证sm.OLS()输出的R²为中心化R²,和r2_score()的计算逻辑对齐,避免指标不可比的问题。
  • 补充交叉验证验证模型效果:使用K折交叉验证观测多个折叠的训练集、验证集R²表现,如果所有折叠都出现训练集R²远高于验证集的情况,即可确定为过拟合问题,需要替换带正则化的回归模型(如Ridge、Lasso)、降低特征维度、补充训练样本。
  • 校验异常值:分别排查训练集、测试集的特征和标签是否存在极端异常值,重点处理测试集的异常值对评估结果的干扰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:27:03