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

Python训练LASSO/RIDGE模型遇true_divide运行时警告求助

解决LASSO/RIDGE训练中偶发的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:41:26