使用LinearRegression时RMSE接近零的原因排查求助
问题分析与解决方案
核心原因推测
你的线性模型RMSE异常极低,仅在标准化后出现且只影响线性模型,大概率是特征中存在与目标变量(总CO₂排放量)几乎完全线性相关的变量。标准化后,线性模型会无限制依赖这个特征进行预测,看似得到完美结果,实则是数据冗余或标签泄露导致的假阳性。
排查与解决步骤
1. 检查特征与目标的相关性
先定位和目标变量线性相关度最高的特征,确认是否存在“作弊”特征:
import pandas as pd import numpy as np # 合并训练特征与目标变量,计算相关系数 train_data = pd.concat([X_train, y_train], axis=1) corr_values = train_data.corr()[y_train.name].sort_values(ascending=False) print("特征与目标的相关性排序:") print(corr_values)
如果某个特征的相关系数接近1(比如>0.99),那它就是问题根源——比如数据集里的Total Energy Use这类变量,CO₂排放量通常直接由能耗乘以固定系数计算而来,属于完全线性相关的冗余特征,必须移除。
2. 查看线性模型的系数权重
线性模型的系数能直接反映哪个特征被过度依赖:
# 给转换后的特征加上列名,方便识别 feature_names = transform.get_feature_names_out() X_train_transformed = pd.DataFrame(X_train_transformed, columns=feature_names) # 输出系数绝对值排序 lr_coef = pd.DataFrame(lr.coef_, index=feature_names, columns=['系数']) print("模型系数绝对值排序:") print(lr_coef.sort_values(by='系数', key=abs, ascending=False))
若某特征的系数绝对值远大于其他特征,说明模型完全依赖它进行预测,可进一步验证该特征与目标的强关联。
3. 验证TargetEncoder的编码结果
TargetEncoder用目标均值编码类别变量,若某个类别下的所有样本目标值完全一致,编码后的特征会和目标高度相关:
# 检查每个类别变量的编码结果与目标的关系 encoder = TargetEncoder() encoded_train = encoder.fit_transform(X_train[var_str_tmp], y_train) for col in encoded_train.columns: corr = np.corrcoef(encoded_train[col], y_train)[0,1] print(f"类别变量 {col} 编码后与目标的相关性:{corr:.4f}")
若相关性接近1,考虑更换编码方式(如OneHotEncoder)或移除该类别变量。
4. 排除数据泄露
确认特征中没有包含直接推导目标的变量:比如是否不小心加入了CO₂排放量的衍生变量(如人均CO₂排放,计算时用到了总排放),这类变量属于标签泄露,必须删除。
总结
线性模型对完全线性相关的特征极度敏感,标准化后会放大这种依赖,导致RMSE异常偏低。通过以上步骤定位到问题特征后,移除该特征或调整编码方式,就能得到合理的模型结果。
内容的提问来源于stack exchange,提问作者Bydhon
相关产品推荐
相关产品推荐

