web-dev-qa-db-ja.com

1Dアレイがないにもかかわらず、Sklearnで1Dアレイを介して非推奨の警告が表示される

SKLearnを使用してSVMモデルを実行しようとしています。私は今、いくつかのサンプルデータでそれを試しています。データとコードは次のとおりです。

_import numpy as np
from sklearn import svm
import random as random

A = np.array([[random.randint(0, 20) for i in range(2)] for i in range(10)])
lab = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

clf = svm.SVC(kernel='linear', C=1.0)
clf.fit(A, lab)
_

参考までに、私が走るとき

_import sklearn
sklearn.__version__
_

0.17を出力します。

ここで、print(clf.predict([1, 1]))を実行すると、次の警告が表示されます。

_C:\Users\me\AppData\Local\Continuum\Anaconda2\lib\site-packages\sklearn\ut
ils\validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecat
ed in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.re
shape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contain
s a single sample.
  DeprecationWarning)
_

それは私に予測を与えます、それは素晴らしいです。しかし、いくつかの理由でこれは奇妙だと思います。

1D配列がありません。 Aを印刷すると、

_array([[ 9, 12],
       [ 2, 16],
       [14, 14],
       [ 4,  2],
       [ 8,  4],
       [12,  3],
       [ 0,  0],
       [ 3, 13],
       [15, 17],
       [15, 16]]) 
_

これは私には2次元のように見えます。しかし、わかりました、私が持っているものは実際には1D配列であるとしましょう。エラーで示唆されているように、reshapeを使用して変更してみましょう。

上記と同じコードですが、今では

_A = np.array([[random.randint(0, 20) for i in range(2)] for i in range(10)]).reshape(-1,1)
_

しかし、これは長さ20の配列を出力しますが、これは意味がなく、私が望むものではありません。 reshape(1, -1)でも試してみましたが、これにより、20個のアイテムを含む単一の観測/リストが得られます。

この警告を受け取らないように、データをnumpy配列に再形成するにはどうすればよいですか?


私はSOについて2つの答えを見ましたが、どちらもうまくいきませんでした。 質問1 および 質問2 。 Q1は実際には1Dデータであり、私が試したが失敗したreshapeを使用して解決されたようです。 Q2には警告とエラーを追跡する方法についての回答がありますが、これは私が望んでいることではありません。もう1つの答えは、やはり1D配列のインスタンスです。

15
Katya Handler

エラーはpredictメソッドに起因しています。 Numpyは[1,1]を1d配列として解釈します。だからこれは警告を避けるべきです:

clf.predict(np.array([[1,1]]))

次のことに注意してください。

In [14]: p1 = np.array([1,1])

In [15]: p1.shape
Out[15]: (2,)

In [16]: p2 = np.array([[1,1]])

In [17]: p2.shape
Out[17]: (1, 2)

また、形状の配列(2,1)は使用できないことに注意してください。

In [21]: p3 = np.array([[1],[1]])

In [22]: p3.shape
Out[22]: (2, 1)

In [23]: clf.predict(p3)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-23-e4070c037d78> in <module>()
----> 1 clf.predict(p3)

/home/juan/anaconda3/lib/python3.5/site-packages/sklearn/svm/base.py in predict(self, X)
    566             Class labels for samples in X.
    567         """
--> 568         y = super(BaseSVC, self).predict(X)
    569         return self.classes_.take(np.asarray(y, dtype=np.intp))
    570 

/home/juan/anaconda3/lib/python3.5/site-packages/sklearn/svm/base.py in predict(self, X)
    303         y_pred : array, shape (n_samples,)
    304         """
--> 305         X = self._validate_for_predict(X)
    306         predict = self._sparse_predict if self._sparse else self._dense_predict
    307         return predict(X)

/home/juan/anaconda3/lib/python3.5/site-packages/sklearn/svm/base.py in _validate_for_predict(self, X)
    472             raise ValueError("X.shape[1] = %d should be equal to %d, "
    473                              "the number of features at training time" %
--> 474                              (n_features, self.shape_fit_[1]))
    475         return X
    476 

ValueError: X.shape[1] = 1 should be equal to 2, the number of features at training time
20

実行する代わりに

print(clf.predict([1, 1]))

実行

print(clf.predict([[1,1]]) 
5
Bharath M

直感的な予測のサンプルは次のとおりです。

[1,9]

しかし、前の答えのようにベクトルの形を変えることができます。または、次のようにします。

[[1,9]]

import numpy as sklearnからimport svm import random as random

A = np.array([[random.randint(0、20)for i in range(2)] for i in range(10)])lab = [0、1、0、1、0、1、0、 1、0、1]

clf = svm.SVC(kernel = 'linear'、C = 1.0)clf.fit(A、lab)

clf.predict([[1,9]])を出力します

0