file = pd.DataFrame({'name':['s', 'k', 'lo', 'ki'] , 'age':[12, 23, 32, 22], 'marks':[34, 34, 43, 22], 'score':[1, 1, 0, 1]})
我想使用以下命令运行逻辑回归:
import statsmodels.formula.api as smf
logit = smf.logit( 'score ~ age + marks', file)
results = logit.fit()
但是我收到了一个错误:
"statsmodels.tools.sm_exceptions.PerfectSeparationError:
Perfect separation detected, results not available".
我还将数据拆分为训练集和测试集我该怎么办?我必须在此之后使用predict命令。
" GLM" R中的命令看起来比Python容易得多。
答案 0 :(得分:1)
当我处理一些数据时,我也遇到了类似的错误。这是由于数据的属性。 由于两个组(得分= 0和得分= 1)在您的数据中完全分开,因此决策边界可以在任何地方(无限解)。因此库无法返回单个解决方案。 这个FIGURE会显示您的数据。解决方案1,2,3都有效。
我在Matlab中使用glmnet运行它。 Matlab的错误是:
警告:估计的系数完全将故障分开 成功。这意味着理论上的最佳估计值不是有限的。
使用更多数据点会有所帮助。
有趣的是,来自scikit-learn的LogisticRegression似乎没有抱怨。
使用scikit-learn解决问题的示例代码是:
import pandas as pd
import numpy as np
from patsy import dmatrices
from sklearn.linear_model import LogisticRegression
file = pd.DataFrame({'name':['s', 'k', 'lo', 'ki'] , 'age':[12, 23, 32, 22], 'marks':[34, 34, 43, 22], 'score':[1, 1, 0, 1]})
# Prepare the data
y,X = dmatrices('score ~ age + marks',file)
y = np.ravel(y)
# Fit the data to Logistic Regression model
model = LogisticRegression()
model = model.fit(X,y)
要将数据拆分为培训和测试,您可能需要参考: http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html