python中使用Logit()和fit()的逻辑回归

python中使用Logit()和fit()的逻辑回归,python,regression,jupyter-notebook,logistic-regression,Python,Regression,Jupyter Notebook,Logistic Regression,我尝试使用以下代码在python中执行逻辑回归- from patsy import dmatrices import numpy as np import pandas as pd import statsmodels.api as sm df=pd.read_csv('C:/Users/Documents/titanic.csv') df=df.drop(['ticket','cabin','name','parch','sibsp','fare'],axis=1) #remove col

我尝试使用以下代码在python中执行逻辑回归-

from patsy import dmatrices
import numpy as np
import pandas as pd
import statsmodels.api as sm

df=pd.read_csv('C:/Users/Documents/titanic.csv')
df=df.drop(['ticket','cabin','name','parch','sibsp','fare'],axis=1) #remove columns from table
df=df.dropna() #dropping null values

formula = 'survival ~ C(pclass) + C(sex) + age' 
df_train = df.iloc[ 0: 6, : ] 
df_test = df.iloc[ 6: , : ]

#spliting data into dependent and independent variables
y_train,x_train = dmatrices(formula, data=df_train,return_type='dataframe')
y_test,x_test = dmatrices(formula, data=df_test,return_type='dataframe')

#instantiate the model
model = sm.Logit(y_train,x_train)
res=model.fit()
res.summary()
我在这条线上出错了-

--->res=model.fit()
我在数据集中没有缺失值。然而,我的数据集非常小,只有10个条目。我不确定这里出了什么问题,我该如何解决?我正在Jupyter笔记本上运行程序。整个错误信息如下所示-

    ---------------------------------------------------------------------------
PerfectSeparationError                    Traceback (most recent call last)
<ipython-input-37-c6a47ec170d5> in <module>()
     19 y_test,x_test = dmatrices(formula, data=df_test,return_type='dataframe')
     20 model = sm.Logit(y_train,x_train)
---> 21 res=model.fit()
     22 res.summary()

C:\Program Files\Anaconda3\lib\site-packages\statsmodels\discrete\discrete_model.py in fit(self, start_params, method, maxiter, full_output, disp, callback, **kwargs)
   1374         bnryfit = super(Logit, self).fit(start_params=start_params,
   1375                 method=method, maxiter=maxiter, full_output=full_output,
-> 1376                 disp=disp, callback=callback, **kwargs)
   1377 
   1378         discretefit = LogitResults(self, bnryfit)

C:\Program Files\Anaconda3\lib\site-packages\statsmodels\discrete\discrete_model.py in fit(self, start_params, method, maxiter, full_output, disp, callback, **kwargs)
    201         mlefit = super(DiscreteModel, self).fit(start_params=start_params,
    202                 method=method, maxiter=maxiter, full_output=full_output,
--> 203                 disp=disp, callback=callback, **kwargs)
    204 
    205         return mlefit # up to subclasses to wrap results

C:\Program Files\Anaconda3\lib\site-packages\statsmodels\base\model.py in fit(self, start_params, method, maxiter, full_output, disp, fargs, callback, retall, skip_hessian, **kwargs)
    423                                                        callback=callback,
    424                                                        retall=retall,
--> 425                                                        full_output=full_output)
    426 
    427         #NOTE: this is for fit_regularized and should be generalized

C:\Program Files\Anaconda3\lib\site-packages\statsmodels\base\optimizer.py in _fit(self, objective, gradient, start_params, fargs, kwargs, hessian, method, maxiter, full_output, disp, callback, retall)
    182                             disp=disp, maxiter=maxiter, callback=callback,
    183                             retall=retall, full_output=full_output,
--> 184                             hess=hessian)
    185 
    186         # this is stupid TODO: just change this to something sane

C:\Program Files\Anaconda3\lib\site-packages\statsmodels\base\optimizer.py in _fit_newton(f, score, start_params, fargs, kwargs, disp, maxiter, callback, retall, full_output, hess, ridge_factor)
    246             history.append(newparams)
    247         if callback is not None:
--> 248             callback(newparams)
    249         iterations += 1
    250     fval = f(newparams, *fargs)  # this is the negative likelihood

C:\Program Files\Anaconda3\lib\site-packages\statsmodels\discrete\discrete_model.py in _check_perfect_pred(self, params, *args)
    184                 np.allclose(fittedvalues - endog, 0)):
    185             msg = "Perfect separation detected, results not available"
--> 186             raise PerfectSeparationError(msg)
    187 
    188     def fit(self, start_params=None, method='newton', maxiter=35,

PerfectSeparationError: Perfect separation detected, results not available
---------------------------------------------------------------------------
PerfectSeparationError回溯(最后一次最近调用)
在()
19 y_检验,x_检验=数据矩阵(公式,数据=df_检验,返回类型='dataframe')
20型=sm.Logit(y_列车、x_列车)
--->21 res=model.fit()
22决议摘要()
C:\Program Files\Anaconda3\lib\site packages\statsmodels\discrete\discrete\discrete\u model.py(self、start\u参数、方法、最大输出、完整输出、disp、回调、**kwargs)
1374 bnryfit=super(Logit,self).fit(开始参数=开始参数,
1375方法=方法,最大值=最大值,满输出=满输出,
->1376 disp=disp,callback=callback,**kwargs)
1377
1378 discretefit=LogitResults(自身、bnryfit)
C:\Program Files\Anaconda3\lib\site packages\statsmodels\discrete\discrete\discrete\u model.py(self、start\u参数、方法、最大输出、完整输出、disp、回调、**kwargs)
201 mlefit=super(离散模型,自)。fit(开始参数=开始参数,
202方法=方法,最大值=最大值,满输出=满输出,
-->203 disp=disp,callback=callback,**kwargs)
204
205返回mlefit#最多子类以包装结果
C:\Program Files\Anaconda3\lib\site packages\statsmodels\base\model.py合适(self、开始参数、方法、最大值、完整输出、disp、fargs、回调、retall、skip_hessian、**kwargs)
423回调=回调,
424雷特尔=雷特尔,
-->425满输出=满输出)
426
427#注:这是为了拟合#正则化,应该推广
C:\Program Files\Anaconda3\lib\site packages\statsmodels\base\optimizer.py in\u fit(self、objective、gradient、start\u params、fargs、kwargs、hessian、method、maxiter、full\u output、disp、callback、retall)
182 disp=disp,maxiter=maxiter,callback=callback,
183 retall=retall,满输出=满输出,
-->184赫斯=赫斯)
185
这是愚蠢的托多:把它换成理智的东西就行了
C:\Program Files\Anaconda3\lib\site packages\statsmodels\base\optimizer.py in_fit_newton(f、分数、开始参数、法格斯、夸格斯、disp、maxiter、回调、retall、满输出、赫斯、岭系数)
246历史记录。追加(新参数)
247如果回调不是无:
-->248回调(newparams)
249次迭代+=1
250 fval=f(newparams,*fargs)#这是负可能性
C:\Program Files\Anaconda3\lib\site packages\statsmodels\discrete\discrete\u model.py in\u check\u perfect\u pred(self,params,*args)
184 np.allclose(拟合值-endog,0)):
185 msg=“检测到完美分离,结果不可用”
-->186分离错误(msg)
187
188 def拟合(自、启动参数=无、方法=牛顿、maxiter=35、,
PerfectSeparationError:检测到完美分离,结果不可用

你有完美的分离,这意味着你的数据可以被超平面完美分离。当这种情况发生时,你的参数的最大似然估计是无限的,因此你的错误

完美分离的例子:

Gender   Outcome  
male     1
male     1
male     0
female   0
female   0
在这种情况下,如果我得到一个女性的观察结果,我100%肯定地知道结果将是0。也就是说,我的数据完美地分离了结果。没有不确定性,寻找我的系数的数值计算也不会收敛


根据您的错误,类似的情况正在发生。只有10个条目,您可以想象这是如何发生的,而不是有1000个条目或类似的内容。因此,获取更多数据:)

您有完美的分离,这意味着您的数据可以通过超平面完全分离。发生这种情况时,参数的最大似然估计是无限的,因此会产生错误

完美分离的例子:

Gender   Outcome  
male     1
male     1
male     0
female   0
female   0
在这种情况下,如果我得到一个女性的观察,我100%确定结果将是0。也就是说,我的数据完美地区分了结果。不存在不确定性,并且寻找我的系数的数值计算不收敛


根据你的错误,类似的事情正在发生在你身上。只有10个条目,你可以想象这是如何发生的,而不是有,比如说1000个条目或者类似的东西。因此,在调用model.fit之前,获取更多数据:)

附加:AFAICS,
model.raise\u on\u perfect\u prediction=False
将关闭完美分离异常。但是,如前所述,参数未确定或理论上是无限的,但结果中估计的参数将取决于优化停止标准。等等,如果两个雄性有结果1,但一个雄性有结果0,如何实现完美分离?当然,女性总是映射到0,但正如我所说的,男性呢?附加:AFAICS,
model.raise\u on\u perfect\u prediction=False
,然后调用model.fit将关闭完美分离异常。但是,如前所述,参数未确定或理论上是无限的,但结果中估计的参数将取决于优化停止标准。等等,如果两个雄性有结果1,但一个雄性有结果0,如何实现完美分离?当然,女性总是映射到0