Получение предупреждения об устаревании в Sklearn над массивом 1d, несмотря на отсутствие массива 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)

FYI, когда я запустил

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]]) 

Который кажется мне двумерным. Но все в порядке, давайте просто скажем, что то, что у меня есть, на самом деле является 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, и ни один из них не работал у меня. Вопрос 1 и Вопрос 2. Похоже, что Q1 был фактически 1D-данными и был решен с помощью reshape, который я пробовал и терпел неудачу. Q2 имеет ответ о том, как отслеживать предупреждения и ошибки, чего я не хочу. Другой ответ снова является экземпляром 1D-массива.

Ответы

Ответ 1

Ошибка исходит из метода прогнозирования. 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

Ответ 2

Вместо запуска

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

Run

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

Ответ 3

образец для прогнозирования интуитивно может быть:

[1,9]

Но вы можете изменить вектор в качестве предыдущего ответа. Или просто выполните следующие действия:

[[1,9]]

Пример

импортировать numpy как np от sklearn import svm импортировать случайные как случайные

A = np.array([[random.randint(0, 20) для я в диапазоне (2)] для я в диапазоне (10)]) lab = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

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

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