statsmodels逻辑回归类型问题

时间:2015-02-17 18:33:50

标签: python logistic-regression statsmodels

我正在尝试使用statsmodels for python来获取分类问题的系数。

我的代码如下:

import numpy as np
import pandas as pd
import statsmodels.api as sm

# Read a csv created with MS Excel
df = pd.read_csv("my_csv.csv", sep=';')

# 'target' is the variable to predict
y = df.pop('target')
df['ones'] = 1.0

logit = sm.Logit(y, df)

但是当我尝试运行回归时,它总是因不同的原因而失败

result = logit.fit()
# numpy.linalg.linalg.LinAlgError: Singular matrix
# Though, print(np.linalg.matrix_rank(df.values, tol=0.1)) returns max range
result = logit.fit('bfgs')
# TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'float'
result = logit.fit('nm')
# TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'float'

我对这些类型做错了吗? df.describe()正常工作,我也尝试将converters参数的浮动广告传递给read_csv,结果相同。

我可能患有病态调理问题吗?我怎么能识别是否是这种情况并解决它?

修改

CSV:https://drive.google.com/file/d/0B8K4OvvtLcJZU2FDQV81QXFDeUU

1 个答案:

答案 0 :(得分:2)

没有dtype问题。

fit('bfgs')的例外是第一个参数是start_params而不是方法。您应该使用关键字参数fit(method='bfgs')

另外两个问题是解释变量严重缩放(大值),并且存在强烈的分离,即只有非常少的观测值与预测概率不接近零或一。

主要问题是我们可以在此模型中进行预测,但我们没有足够的数据变化来识别参数。从本质上讲,解释变量有许多线性组合,它们都能很好地拟合和预测,或几乎同样适用。

以下是在添加常量之前对数据df2 = (df - df.mean()) / df.std()进行zscoring,并在尝试了几种优化方法之后。 'bfgs''nm'都不会收敛并停止最大迭代或超出最大函数评估。

某些参数的标准误差和置信区间非常大。

>>> print(res.summary())
                           Logit Regression Results                           
==============================================================================
Dep. Variable:                 target   No. Observations:                  432
Model:                          Logit   Df Residuals:                      420
Method:                           MLE   Df Model:                           11
Date:                Wed, 18 Feb 2015   Pseudo R-squ.:                  0.9522
Time:                        11:41:40   Log-Likelihood:                -12.411
converged:                      False   LL-Null:                       -259.88
                                        LLR p-value:                 3.858e-99
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
x_1           23.6635     37.189      0.636      0.525       -49.225    96.552
x_2            7.0859   1953.900      0.004      0.997     -3822.487  3836.659
x_3           -1.8228      3.723     -0.490      0.624        -9.119     5.474
x_4           -2.2849     26.949     -0.085      0.932       -55.105    50.535
x_5           -0.3327   4.46e+08  -7.46e-10      1.000     -8.74e+08  8.74e+08
x_6            5.6617     30.437      0.186      0.852       -53.993    65.317
x_7           -2.2849   1.92e+08  -1.19e-08      1.000     -3.77e+08  3.77e+08
x_8           -9.4476     32.708     -0.289      0.773       -73.554    54.659
x_9            1.2125      2.092      0.580      0.562        -2.888     5.313
x_10           6.0331     16.780      0.360      0.719       -26.856    38.922
x_11          -3.7498      3.187     -1.177      0.239        -9.996     2.497
ones          -6.9048   4.87e+07  -1.42e-07      1.000     -9.54e+07  9.54e+07
==============================================================================
对于几乎所有的观测,

预测概率接近零或一

>>> probs = res.predict()
>>> ((probs > 1e-2) & (probs < 1 - 1e-2)).sum()
92
>>> ((probs > 1e-1) & (probs < 1 - 1e-1)).sum()
2