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

使用cross_val_score与Linear Regression时的结果差异问题排查

交叉验证得分差异异常的原因与解决方法

核心现象

  • 全量数据(X,Y)传入cross_val_score时,结果出现极端异常值(如-1.04310278e+25),其余值波动也较大
  • 用train_test_split划分后的x_train/y_train(哪怕test_size设为0.01,数据量接近全量)时,得分稳定在-0.5~-0.9的合理范围

关键原因

  1. 标准化操作的数据泄露
    你提前对全量数据做了标准化(usestandardization函数直接对全量数据fit_transform),再拆分特征和目标、训练和测试集。这种做法违反了交叉验证的核心原则:验证集数据不能参与训练过程的任何统计计算。

    • 全量数据交叉验证时,每个fold的验证集已经包含在标准化的均值、方差统计量中,导致模型在某个fold中可能因数据分布偏差触发数值不稳定,比如线性回归系数爆炸,最终产生极端大的MSE(负MSE对应原始MSE为1e25)。
    • 拆分后的x_train虽也是全量子集,但交叉验证的fold内部数据分布相对一致,暂时没触发极端数值问题,但本质上仍存在数据泄露。
  2. 线性回归的数值稳定性问题
    全量数据的某个交叉验证fold中,训练集可能存在多重共线性(特征高度相关)或极端特征值,导致线性回归求解时出现奇异矩阵,系数计算溢出,进而预测误差暴增。

解决方法

1. 用Pipeline修复数据泄露

必须在每个交叉验证fold内部单独执行标准化操作,通过Pipeline将标准化与模型绑定,确保训练集和验证集的隔离:

from sklearn.pipeline import Pipeline

# 构建标准化+多输出回归的管道
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('mulregressor', MultiOutputRegressor(LinearRegression()))
])

# 对全量数据做交叉验证,每个fold自动完成训练集标准化、验证集转换
k_fold_acc = cross_val_score(pipeline, X, Y, cv=10, scoring="neg_mean_squared_error")
print(k_fold_acc)

2. 排查数据异常

  • 检查多重共线性:用热力图查看特征相关性,删除高度相关特征或做降维
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    sns.heatmap(pd.DataFrame(X).corr(), annot=True, cmap='coolwarm')
    plt.show()
    
  • 检查目标变量极端值:查看daysOnMarket和price的统计分布,截断或删除异常值
    print(datastand[["daysOnMarket","price"]].describe())
    

3. 规范训练集的交叉验证流程

即使使用拆分后的x_train,也需用管道执行交叉验证,避免数据泄露:

k_fold_acc_train = cross_val_score(pipeline, x_train, y_train, cv=10, scoring="neg_mean_squared_error")
print(k_fold_acc_train)

预期效果

修复后,全量数据的交叉验证得分会与拆分后的训练集得分处于同一数量级,极端异常值会消失。

内容的提问来源于stack exchange,提问作者Marco Di Giacomo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:35:35