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
4

4 に答える 4

3

これは、SciKit-Learnフォルダー内の2つのファイルを更新することで修正されています。

コードはここにあります: 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により、2つのテストケースが区別されます。最初のケースm,n=2,6と2番目のケースでは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 に答える