【发布时间】: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