训练统计模型GLM模型时,在权重检测错误中检测到NaN、inf或无效值



我正在使用我的数据使用python statsmodels包来训练GLM模型(poisson族(。我的数据既包含数值,也包含分类值。我对数值进行了标准化,并对分类值进行了一次热编码(降低了第一级(。当我将数据放入模型中时,我得到了以下异常:

~/miniconda3/envs/losscost/lib/python3.7/site-packages/insite/losscost/losscost.py in evaluate(self, x, control, peril_descs)
271                     family=sm.families.Poisson(link=sm.families.links.log()),
272                 )
--> 273                 freq_fitted = freq_glm.fit()
274                 freq_results[name].append(freq_fitted)
275 
~/miniconda3/envs/losscost/lib/python3.7/site-packages/statsmodels/genmod/generalized_linear_model.py in fit(self, start_params, maxiter, method, tol, scale, cov_type, cov_kwds, use_t, full_output, disp, max_start_irls, **kwargs)
1025             return self._fit_irls(start_params=start_params, maxiter=maxiter,
1026                                   tol=tol, scale=scale, cov_type=cov_type,
-> 1027                                   cov_kwds=cov_kwds, use_t=use_t, **kwargs)
1028         else:
1029             self._optim_hessian = kwargs.get('optim_hessian')
~/miniconda3/envs/losscost/lib/python3.7/site-packages/statsmodels/genmod/generalized_linear_model.py in _fit_irls(self, start_params, maxiter, tol, scale, cov_type, cov_kwds, use_t, **kwargs)
1163             wls_mod = reg_tools._MinimalWLS(wlsendog, wlsexog,
1164                                             self.weights, check_endog=True,
-> 1165                                             check_weights=True)
1166             wls_results = wls_mod.fit(method=wls_method)
1167             lin_pred = np.dot(self.exog, wls_results.params)
~/miniconda3/envs/losscost/lib/python3.7/site-packages/statsmodels/regression/_tools.py in __init__(self, endog, exog, weights, check_endog, check_weights)
46         if check_weights:
47             if not np.all(np.isfinite(w_half)):
---> 48                 raise ValueError(self.msg.format('weights'))
49 
50         if check_endog:
ValueError: NaN, inf or invalid value detected in weights, estimation infeasible.

我试着只对数值进行训练,效果很好。造成这个问题的原因是什么?

你能像这样在fit调用中添加一个关键字参数吗?看看它是否有帮助:

model = sm.GLM(...)
model.fit(method="lbfgs")

我认为Inf/NaN在IRLS权重中。IRLS的鲁棒性略低于直接优化。

此外,确保你的设计矩阵不是单一的:

model = sm.GLM(...)
u, s, vt = numpy.linalg.svd(model.exog, 0)
print(s)

s的所有元素(奇异值(都应该是严格正的。

如果你仍然有麻烦,你的模型的样本大小和尺寸是多少?

相关内容

最新更新