Python训练LASSO/RIDGE模型遇true_divide运行时警告求助
RuntimeWarning: invalid value encountered in true_divide问题 我之前也碰到过一模一样的情况——明明全局过滤了方差为0的特征,但交叉验证或者多次拆分数据集时还是会偶尔蹦出这个除零警告,确实和数据拆分的随机性脱不了关系,尤其是像你这样有900个特征的数据集,更容易出现子集里的特征“局部方差为0”的情况。下面给你几个针对性的解决思路:
核心原因拆解
你已经处理了全局方差为0的特征,但单次拆分后的训练/测试子集里,某个特征的所有样本值可能恰好完全相同(比如某个特征在整体数据集里有差异,但某次随机拆分后,训练集里的该特征样本全是同一个值),这时候做标准化(除以标准差)就会触发除零警告。另外,有些特征在子集里的标准差极小(接近0但不是严格为0),浮点数计算时也会被判定为“invalid value”。
具体解决方案
1. 拆分后针对训练集二次过滤特征
这是最根本的解决方法:每次做完数据拆分后,只基于训练集再次过滤方差极低的特征,然后把同样的过滤规则应用到测试集(绝对不能用测试集的数据来计算方差,避免数据泄露)。比如用VarianceThreshold设置一个极小的阈值(比如1e-8)来捕捉那些接近零方差的特征:
from sklearn.feature_selection import VarianceThreshold import numpy as np # 假设你用train_test_split得到了X_train, X_test selector = VarianceThreshold(threshold=1e-8) # 只在训练集上拟合,得到过滤规则 X_train_filtered = selector.fit_transform(X_train) # 用同样的规则转换测试集 X_test_filtered = selector.transform(X_test) # 之后用过滤后的特征训练LASSO/RIDGE from sklearn.linear_model import Lasso, Ridge lasso = Lasso(alpha=0.1) lasso.fit(X_train_filtered, y_train)
2. 使用更稳健的特征缩放方式
如果你的数据里有异常值,或者某些特征的标准差本来就很小,StandardScaler(基于均值和标准差)很容易踩坑。换成RobustScaler试试,它用中位数和四分位数范围来缩放,对极端值和小标准差的特征容忍度更高:
from sklearn.preprocessing import RobustScaler scaler = RobustScaler() X_train_scaled = scaler.fit_transform(X_train_filtered) X_test_scaled = scaler.transform(X_test_filtered)
3. 调整正则化参数
如果警告是在模型拟合过程中出现的,可能是正则化强度不够导致的极端计算。尝试调大alpha值(LASSO/RIDGE的正则化参数),更强的约束会让模型的系数更稳定,减少出现除零的概率。
4. 临时屏蔽警告(不推荐作为长期方案)
如果你只是想先确认模型是否能正常运行,暂时屏蔽警告可以用warnings模块,但这只是治标不治本,建议先解决根本问题:
import warnings warnings.filterwarnings("ignore", category=RuntimeWarning, message="invalid value encountered in true_divide")
总结
因为你的警告是偶发的,和数据拆分的随机性强相关,所以拆分后针对训练集二次过滤低方差特征是最有效的解决方案。配合稳健的缩放方式,基本能彻底解决这个问题。
内容的提问来源于stack exchange,提问作者user2117258

