statsmodels 逻辑回归类型问题

statsmodels logistic regression type problems

我正在尝试使用 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,结果相同。

我可能遇到了 ill-conditioning 问题吗?我如何识别是否属于这种情况并加以解决?

编辑

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

没有dtype问题。

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

另外两个问题是解释变量的比例很差(大值),并且存在很强的分离,即预测概率不接近于零或不接近于 1 的观测值很少。

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

以下是zscoring后的数据df2 = (df - df.mean()) / df.std()加常量前,尝试了几种优化方法后。 '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