Statsmodels多分类逻辑回归输出全为NaN值问题排查
解决MNLogit拟合全NaN结果及数值警告问题
问题场景
使用statsmodels的MNLogit拟合多分类逻辑回归时,出现输出全为NaN的结果,同时触发两个RuntimeWarning。相关细节如下:
用于拟合的代码:
X = sm.add_constant(df) logreg_model = sm.MNLogit(y[:n], X).fit()
数据情况:
- 输入特征
df仅包含debt列,其中绝大多数值为0.00,仅存在2个非0值 - 确认数据中无NaN值
触发的警告信息:
RuntimeWarning: overflow encountered in exp eXB = np.column_stack((np.ones(len(X)), np.exp(X))) RuntimeWarning: invalid value encountered in divide return eXB/eXB.sum(1)[:,None]
最终输出结果全为NaN:
Dep. Variable: y No. Observations: 50 Model: MNLogit Df Residuals: 12 Method: MLE Df Model: 19 Date: Thu, 08 Jun 2023 Pseudo R-squ.: nan Time: 14:19:33 Log-Likelihood: nan converged: True LL-Null: -138.74 Covariance Type: nonrobust LLR p-value: nan ============================================================================== y=6 coef std err z P>|z| [0.025 0.975] ------------------------------------------------------------------------------ const nan nan nan nan nan nan debt nan nan nan nan nan nan
问题原因
核心问题是特征debt的方差几乎为0:绝大多数样本值相同(0.00),仅两个异常值,这种情况下最大似然估计(MLE)无法得到有效的参数解。计算过程中,np.exp(X)会因极端值溢出产生inf,后续的除法操作就会生成NaN,最终导致所有结果失效。标准化操作无法解决该问题——标准化仅调整变量尺度,无法提升变量的方差。
解决办法
- 处理低方差特征
- 若
debt对预测目标无实际意义,直接从特征集中移除; - 若必须保留,可将其转换为二分类特征(0 vs 非0),或与其他特征组合构建新的有效特征;
- 若
- 检查目标变量分布
确认目标变量y的类别是否存在极端不平衡(某类别样本量极少),这类情况也会导致拟合失败,必要时可合并类别或使用过采样/欠采样调整样本分布; - 调整拟合参数
在fit()方法中尝试指定数值更稳定的优化器,比如method='bfgs',或调整maxiter增加迭代次数,但这只能作为辅助手段,核心仍需解决低方差特征问题。
内容的提问来源于stack exchange,提问作者pedritoanonimo
相关产品推荐
相关产品推荐

