5

我在 Python ( sklearn ) 中进行多元线性回归,但由于某种原因,系数没有正确返回为列表。相反,会返回一个 IN A LIST 列表:

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
4

4 回答 4

3

这可以通过更新 SciKit-Learn 文件夹中的两个文件来解决。

代码在这里: https ://github.com/scikit-learn/scikit-learn/commit/d0b20f0a21ba42b85375b1fbc7202dc3962ae54f

于 2012-07-19T21:31:47.220 回答
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]

仅当其中有子列表时,才会使列表变平。

于 2012-07-18T20:27:50.080 回答
2

似乎是 scipy.linalg 的问题。如果您跟踪调用链,它首先进入https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/linear_model/base.py#L218,然后到达https://的 if 语句/github.com/scipy/scipy/blob/master/scipy/linalg/basic.py#L468。这if区分了您的两个测试用例。在第一种情况下m,n=2,6,在第二种情况下,你有m,n=3,3.

于 2012-07-18T22:46:46.560 回答
-1

这确实不是关于 Python 语言的有效问题。这应该是 sklearn 开发人员的问题。但是......如果您知道这是您的数据返回的格式,您可以:

print 'getting value 0:', clf.coef_[0][0]
print 'getting value 1:', clf.coef_[0][1]
                                   ^^^ 
于 2012-07-18T20:26:40.643 回答