2016-12-18 1 views
0

나는 다음과 같은 코드를 사용하여 파이썬에서 로지스틱 회귀 분석을 수행하기 위해 노력하고 있어요 -로지스틱 회귀를

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 

답변

2

당신은 데이터가 초평면에 의해 완벽하게 분리 될 수 있다는 것을 의미한다. 이런 일이 발생하면 매개 변수에 대한 최대 우도 추정치가 무한대가되어 오류가 발생합니다. 완벽한 분리

예 : 나는 여성 관찰을받을 경우이 경우

Gender Outcome 
male  1 
male  1 
male  0 
female 0 
female 0 

가, 나는 결과가 0이 될 것이라고 100 % 확신을 가지고 알고, 내 데이터가 완벽하게 결과를 분리합니다. 불확실성이 없으며 계수를 찾기위한 수치 계산이 수렴되지 않습니다.

오류에 따르면 비슷한 현상이 발생합니다. 단 10 개의 항목 만 있으면 1000 개의 항목 또는 그와 비슷한 것을 어떻게 처리 할 것인지 상상할 수 있습니다. 따라서 더 많은 데이터를 얻으십시오 :)

+0

추가 : AFAICS, model.raise_on_perfect_prediction = False'를 호출하기 전에 model.fit이 완벽한 분리 예외를 해제합니다. 그러나 설명 된 바와 같이 매개 변수는 식별되지 않거나 이론적으로 무한하지만 예상되는 매개 변수는 최적화 중지 기준에 따라 달라집니다. – user333700

관련 문제