NaN, inf или недопустимое значение, обнаруженное в весах, обнаружила ошибку при обучении statsmodels GLM-модели - PullRequest
0 голосов
/ 08 июля 2020

Я использую свои данные для обучения модели GLM (семейство Пуассона) с помощью пакета python statsmodels. Данные, которые у меня есть, содержат как числовые c значения, так и категориальные значения. Я сделал стандартизацию для значений numeri c и горячее кодирование для категориальных значений (отбросьте первый уровень). Когда я поместил данные в модель, у меня были следующие исключения:

~/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.

Я пробовал тренироваться только на числовых значениях c, и все работает нормально. В чем может быть причина возникновения этой проблемы?

1 Ответ

0 голосов
/ 09 июля 2020

Можете ли вы добавить аргумент ключевого слова к вашему подходящему вызову следующим образом и посмотреть, поможет ли он:

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 (сингулярные значения) должны быть строго положительными.

Если проблемы продолжаются, каков размер выборки и размер вашей модели?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...