【问题标题】:statsmodels logistic regression type problemsstatsmodels逻辑回归类型问题
【发布时间】:2015-04-18 13:39:45
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 如果没有最低限度的工作示例,就无法真正进行调试。 y的类型是什么? y 或 df 中是否有任何缺失值?您使用的是哪个版本的 statsmodels?你可能有一个病态的问题。为什么要将 matrix_rank 中的 tol 更改为 .1?
  • 您能否提供一些 .csv 文件中的示例数据?
  • 在问题中添加了指向 CSV 的链接。回答其他问题:y 是 0 或 1。没有缺失值。 statsmodels-0.6.1。我更改了tol,以便对最大范围更有信心。
  • 将method 添加到fit 调用解决了'bfgs' 和'nm' 的问题。令人惊讶的是有时会变得如此盲目(尽管这次图书馆的答案没有帮助),谢谢!对于没有方法参数的fitcall,我不太明白:强分离应该有利于分类问题。另外,我对数据进行了标准化,但没有帮助。
  • 强分离有利于相似数据的分类和预测。但是,参数估计值本质上不是唯一的,并且在预测没有强分离的新观测值时不是很可靠。

标签: python logistic-regression statsmodels


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 2016-10-05
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多