Я пытаюсь построить модель логистической регрессии в 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`