【问题标题】:linearRegression() returns list within list (sklearn)线性回归()返回列表中的列表(sklearn)
【发布时间】:2012-07-17 23:13:06
【问题描述】:

我在 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

【问题讨论】:

  • 我不打算让 sklearn 工作。如果有另一个 python 库可以返回线性多元回归的相关系数,我很想听听...

标签: python list regression


【解决方案1】:

通过更新 SciKit-Learn 文件夹中的两个文件来解决此问题。

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

【讨论】:

    【解决方案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

    【讨论】:

    • 知道如何绕过它吗?或者另一种在python中获得多元线性回归的方法?
    • 您可以使用clf.coef_.flatten() 将数组折叠为一维。
    【解决方案3】:

    我从未使用过您所指的多元线性回归模块,所以我不知道为什么会发生这种情况。但是如果你只是想解决你的问题,你可以扁平化列表:

    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 我明白了...在查看文档后,完全不清楚为什么 coef 具有不同的布局,具体取决于您如何调用 fit()。至少没有记录这种可能性。您可以尝试联系support 以获得该项目。虽然您找不到真正的解决方案,但您可以查看我的答案的编辑。
    • @Zach 你能检查clf.coefclf.coef[0] 的类型(当你有一个子列表时)?实际上,您可能会在某处获得tuple 而不是list
    • 它们都是 。我尝试用 numpy.ndarray 替换列表,但它无法识别数据类型..
    • 如果我用x = numpy.ndarray((2, 3)) 创建一个numpy.ndarray,那么我得到type(x) -&gt; numpy.ndarraytype(x[0]) -&gt; numpy.ndarraytype(x[0][0]) -&gt; numpy.float64。我预计您会在第一个示例中为type(x[0][0]) 获得numpy.float64,在第二个示例中为type(x[0])。不是这样吗?
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 1970-01-01
      • 2019-09-06
      • 2015-01-29
      • 2014-01-18
      • 2021-02-20
      • 2020-02-23
      • 2021-05-07
      相关资源
      最近更新 更多