使用cross_val_score评估LinearRegression返回极大值的解决建议
解决LinearRegression交叉验证结果异常的建议
核心原因分析
普通LinearRegression基于无正则化的最小二乘法,当数据存在多重共线性(特征间高度相关)、特征维度远大于样本量,或交叉验证的样本划分极端不平衡时,模型系数会出现爆炸式增长,导致预测误差剧增——反映在neg_mean_absolute_error指标上就是极大的负值(该指标为误差的相反数,数值越大代表实际误差越大)。而Lasso的L1正则化会自动将冗余特征的系数压缩至0,规避了这类问题。
具体排查与解决步骤
检查多重共线性
用方差膨胀因子(VIF)量化特征间的共线性程度,VIF值大于10通常说明存在严重共线性:from statsmodels.stats.outliers_influence import variance_inflation_factor import pandas as pd # 假设X_train为DataFrame格式 vif_data = pd.DataFrame() vif_data["feature"] = X_train.columns vif_data["VIF"] = [variance_inflation_factor(X_train.values, i) for i in range(X_train.shape[1])] print(vif_data)若存在严重共线性,可移除高度相关的特征,或用PCA进行特征降维。
优化交叉验证划分策略
cv=2的极端划分可能导致单个fold的数据分布与整体偏差极大,尝试增大折数(如5或10),或对回归任务采用分层划分:from sklearn.model_selection import StratifiedKFold import numpy as np # 按目标变量分桶实现回归分层K折 bins = np.linspace(y_train.min(), y_train.max(), 5) y_binned = np.digitize(y_train, bins) skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) scores = cross_val_score(Ln, X_train, y_train, scoring="neg_mean_absolute_error", cv=skf) print(np.mean(scores))添加特征标准化步骤
虽然LinearRegression对特征尺度不敏感,但标准化能在存在共线性时让系数估计更稳定,同时对齐Lasso的训练逻辑(Lasso默认对特征尺度敏感):from sklearn.preprocessing import StandardScaler from sklearn.pipeline import make_pipeline pipeline = make_pipeline(StandardScaler(), LinearRegression()) scores = cross_val_score(pipeline, X_train, y_train, scoring="neg_mean_absolute_error", cv=5) print(np.mean(scores))验证正则化的作用
尝试带L2正则化的Ridge回归,确认是否是无正则化导致的问题:from sklearn.linear_model import Ridge ridge = Ridge(alpha=1.0) scores = cross_val_score(ridge, X_train, y_train, scoring="neg_mean_absolute_error", cv=5) print(np.mean(scores))若Ridge结果正常,则进一步验证原问题是无正则化的最小二乘对数据缺陷过于敏感。
排查特征与目标的异常关系
检查是否存在与目标变量完全无关的特征,或特征是目标变量的线性组合(这类情况会让最小二乘的解不稳定)。可通过绘制特征-目标散点图,或用树模型(如RandomForestRegressor)输出特征重要性辅助判断。
内容的提问来源于stack exchange,提问作者Who_amI
相关产品推荐
相关产品推荐

