我在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
答案 0 :(得分:2)
似乎与scipy.linalg有关。如果您跟踪调用链,它首先在https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/linear_model/base.py#L218中,然后到达https://github.com/scipy/scipy/blob/master/scipy/linalg/basic.py#L468处的if语句。 if
区分您的两个测试用例。在第一种情况下m,n=2,6
,在第二种情况下,您有m,n=3,3
。
答案 1 :(得分:2)
通过更新SciKit-Learn文件夹中的两个文件来解决此问题。
代码在这里: https://github.com/scikit-learn/scikit-learn/commit/d0b20f0a21ba42b85375b1fbc7202dc3962ae54f
答案 2 :(得分:1)
我从未将模块用于您所指的多元线性回归,因此我不知道为什么会发生这种情况。但如果您只想解决问题,可以将列表展平:
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]
只有当里面有子列表时才会使列表变平。
答案 3 :(得分:-1)
这真的不是关于Python语言的有效问题;这对sklearn的开发者来说应该是一个问题。但是......如果您知道数据将被返回的格式,您可以:
print 'getting value 0:', clf.coef_[0][0]
print 'getting value 1:', clf.coef_[0][1]
^^^