Получение LinAlgError: единственная матричная ошибка для одних и тех же данных и кода - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь построить модель логистической регрессии в python, используя sklearn и statsmodel.Однако я получаю единственную матричную ошибку.Мой набор данных содержит 273 переменных с целевым разделением 80 на 20.Исходные данные содержали 30 переменных, которые я создал для фиктивных переменных.Функция прошла нормально вчера.Сегодня я получаю единственную матричную ошибку с теми же данными и кодом.

Поэтому я изменил выборку на 90/10 для цели и изменил настройку чайников на

df2 = pd.get_dummies(df,dummy_na=False,drop_first=True)

Этоработает нормально, однако я сталкиваюсь с несбалансированным примером проблемы, где он предсказывает класс большинства.Так что, если я использую SMOTE для выборки снова, я получаю ошибку единственной матрицы.

Я хочу понять, как создаются манекены, которые вызывают проблему, или сам пакет.Когда я впервые получил ошибку единичной матрицы для разделения 80-20, я сделал следующие вещи, чтобы устранить ошибку, я изменил функцию чайников с

df2 = pd.get_dummies(df,dummy_na=True,drop_first=True)

на

df2 = pd.get_dummies(df,dummy_na=False,drop_first=False)</i>

и обновилПакет statsmodel

!pip install statsmodels -U

Это сработало.Некоторые изменения не работают.

import pandas as pd
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt 
plt.rc("font", size=14)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import seaborn as sns
sns.set(style="white")
sns.set(style="whitegrid", color_codes=True)

df2 = pd.get_dummies(df,dummy_na=False,drop_first=True)

from sklearn.preprocessing import Imputer

imp = Imputer(missing_values='NaN', strategy='mean', axis=1)
imputed_df2=pd.DataFrame(imp.fit_transform(df2))
imputed_df2.columns = df2.columns
imputed_df2.index = df2.index


from sklearn.feature_selection import RFE


X = imputed_df2.iloc[:,np.r_[0:26,27:273]]
y = imputed_df2.iloc[:,26]

!pip install statsmodels -U
!pip install pytest -U

!pip install -U imbalanced-learn

from imblearn.over_sampling import SMOTE
os = SMOTE(random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, 
random_state=0)
columns = X_train.columns
os_data_X,os_data_y=os.fit_sample(X_train, y_train)
os_data_X = pd.DataFrame(data=os_data_X,columns=columns )
os_data_y= pd.DataFrame(data=os_data_y,columns=['y'])

print("length of oversampled data is ",len(os_data_X))
print("non joins",len(os_data_y[os_data_y['y']==0]))
print("joins",len(os_data_y[os_data_y['y']==1]))


 X=os_data_X
 y=os_data_y
 import statsmodels.api as sm
 logit_model=sm.Logit(y,X)
 result=logit_model.fit()
 print(result.summary2())



  Warning: Maximum number of iterations has been exceeded.
     Current function value: inf
     Iterations: 35
 ------------------------------------------------------------------------
  LinAlgError                               Traceback (most recent call 
 last)
  <ipython-input-19-74777910a202> in <module>()
  5 import statsmodels.api as sm
  6 logit_model=sm.Logit(y,X)
   ----> 7 result=logit_model.fit()
  8 print(result.summary2())

 /usr/local/envs/py3env/lib/python3.5/site- 
 packages/statsmodels/discrete/discrete_model.py in fit(self, 
 start_params, 
 method, maxiter, full_output, disp, callback, **kwargs)
 1832         bnryfit = super(Logit, self).fit(start_params=start_params,
 1833                 method=method, maxiter=maxiter, 
full_output=full_output,
 -> 1834                 disp=disp, callback=callback, **kwargs)
  1835 
 1836         discretefit = LogitResults(self, bnryfit)

/usr/local/envs/py3env/lib/python3.5/site- 
packages/statsmodels/discrete/discrete_model.py in fit(self, 
start_params, 
 method, maxiter, full_output, disp, callback, **kwargs)
 218         mlefit = super(DiscreteModel, 
self).fit(start_params=start_params,
 219                 method=method, maxiter=maxiter, 
 full_output=full_output,
   --> 220                 disp=disp, callback=callback, **kwargs)
  221 
  222         return mlefit # up to subclasses to wrap results

/usr/local/envs/py3env/lib/python3.5/site- 
packages/statsmodels/base/model.py in fit(self, start_params, method, 
 maxiter, full_output, disp, fargs, callback, retall, skip_hessian, 
**kwargs)
471             Hinv = cov_params_func(self, xopt, retvals)
472         elif method == 'newton' and full_output:
--> 473             Hinv = np.linalg.inv(-retvals['Hessian']) / nobs
474         elif not skip_hessian:
475             H = -1 * self.hessian(xopt)

 /usr/local/envs/py3env/lib/python3.5/site- 
packages/numpy/linalg/linalg.py in inv(a)
526     signature = 'D->D' if isComplexType(t) else 'd->d'
527     extobj = get_linalg_error_extobj(_raise_linalgerror_singular)
 --> 528     ainv = _umath_linalg.inv(a, signature=signature, 
 extobj=extobj)
529     return wrap(ainv.astype(result_t, copy=False))
530 

/usr/local/envs/py3env/lib/python3.5/site-packages/numpy/linalg/linalg.py 
   in 
   _raise_linalgerror_singular(err, flag)
     87 
     88 def _raise_linalgerror_singular(err, flag):
 ---> 89     raise LinAlgError("Singular matrix")
 90 
     91 def _raise_linalgerror_nonposdef(err, flag):

  LinAlgError: Singular matrix`
...