linearRegression()返回列表中的列表(sklearn)

5

我在Python中进行多元线性回归 (sklearn),但是由于某些原因,系数没有正确返回为一个列表。相反,返回的是一个嵌套列表:

from sklearn import linear_model
clf = linear_model.LinearRegression()
# clf.fit ([[0, 0, 0], [1, 1, 1], [2, 2, 2]], [0, 1, 2])
clf.fit([[394, 3878, 13, 4, 0, 0],[384, 10175, 14, 4, 0, 0]],[3,9])
print 'coef array',clf.coef_
print 'length', len(clf.coef_)
print 'getting value 0:', clf.coef_[0]
print 'getting value 1:', clf.coef_[1]

这会返回一个列表嵌套列表[[]]的值,而不是单层列表[]。不知道为什么会这样?输出结果如下:
coef array [[  1.03428648e-03   9.54477167e-04   1.45135995e-07   0.00000000e+00
0.00000000e+00   0.00000000e+00]]
length 1
getting value 0: [  1.03428648e-03   9.54477167e-04   1.45135995e-07   0.0000000
0e+00 0.00000000e+00   0.00000000e+00]
getting value 1:
Traceback (most recent call last):
  File "regress.py", line 8, in <module>
    print 'getting value 1:', clf.coef_[1]
IndexError: index out of bounds

但是这个有效:
from sklearn import linear_model
clf = linear_model.LinearRegression()
clf.fit ([[0, 0, 0], [1, 1, 1], [2, 2, 2]], [0, 1, 2])
# clf.fit([[394, 3878, 13, 4, 0, 0],[384, 10175, 14, 4, 0, 0]],[3,9])
print 'coef array',clf.coef_
print 'length', len(clf.coef_)
print 'getting value 0:', clf.coef_[0]
print 'getting value 1:', clf.coef_[1]

输出:

coef array [ 0.33333333  0.33333333  0.33333333]
length 3
getting value 0: 0.333333333333
getting value 1: 0.333333333333

1
我并不执着于尝试让sklearn工作。如果有另一个Python库可以返回线性多元回归的相关系数,我很乐意听听它... - Zach
4个回答

3

2

我从未使用你提到的多元线性回归模块,因此无法知道发生了什么。但是,如果您只想解决问题,可以将列表展平:

flat_list = clf.coef_[0]

如果列表可能有多个子列表(并且您想将它们全部合并为一个平面列表),那么您可以使用更通用的方法来展开它:

如果列表中可能包含多个子列表(并且您希望将它们组合成一个平面列表),则可以使用一种更通用的方法来展开它:
flat_list = [item for sublist in clf.coef_ for item in sublist]

编辑:在等待程序包开发人员提供真正的解释/解决方案期间,您可以依靠像这样的解决方案:

if isinstance(clf.coef_[0], list):
    clf.coef_ = clf.coef_[0]

仅当列表中存在子列表时才展平该列表。


并不是每种情况都会发生,这就是问题所在。我在想我是否做错了什么。 - Zach
@Zach 我明白了...看完文档后,我仍然不清楚为什么 coef 的布局会根据 fit() 的调用方式而有所不同。至少这种可能性没有被记录在文档中。你可以尝试联系该项目的支持团队。虽然你无法找到一个_真正的_解决方案,但你可以查看我回答中的编辑。 - betabandido
@Zach 你能检查一下 clf.coefclf.coef[0] 的类型吗?当你有一个子列表时,实际上你可能会得到一个 tuple 而不是一个 list - betabandido
它们都是<type 'numpy.ndarray'>。我尝试用numpy.ndarray替换列表,但它无法识别数据类型。 - Zach
如果我使用 x = numpy.ndarray((2, 3)) 创建一个 numpy.ndarray,那么我会得到 type(x) -> numpy.ndarraytype(x[0]) -> numpy.ndarraytype(x[0][0]) -> numpy.float64。我原本期望在第一个示例中 type(x[0][0]) 的类型是 numpy.float64,在第二个示例中 type(x[0]) 的类型是 numpy.float64。难道不是这样的吗? - betabandido

2

有什么办法能够绕过它吗?或者有没有其他方法可以在Python中实现多元线性回归? - Zach
你可以使用 clf.coef_.flatten(),它将数组压缩为一维。 - Daniel

-1

这并不是关于Python语言的一个有效问题;它应该是一个向sklearn开发人员提问的问题。但是...如果你知道数据将以这种格式返回,你可以这样做:

print 'getting value 0:', clf.coef_[0][0]
print 'getting value 1:', clf.coef_[0][1]
                                   ^^^ 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接