Recibiendo una advertencia de desaprobación en Sklearn sobre la matriz 1d, a pesar de no tener una matriz 1D

Estoy tratando de usar SKLearn para ejecutar un modelo SVM. Solo lo estoy probando ahora con algunos datos de muestra. Aquí están los datos y el código:

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) 

Para tu información, cuando corro

 import sklearn sklearn.__version__ 

Produce 0,17.

Ahora, cuando ejecuto print(clf.predict([1, 1])) , print(clf.predict([1, 1])) la siguiente advertencia:

 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 sa single sample. DeprecationWarning) 

Me da una predicción, lo cual es genial. Sin embargo, me parece extraño por algunas razones.

No tengo una matriz 1D. Si imprime A, obtiene

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

Lo que me parece ser bidimensional. Pero bueno, digamos que lo que tengo es, de hecho, una matriz 1D. Intentemos cambiarlo mediante la reshape , como lo sugiere el error.

Mismo código que el anterior, pero ahora tenemos

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

Pero luego esto genera una serie de longitud 20, que no tiene sentido y no es lo que quiero. También lo probé con reshape(1, -1) pero esto me da una sola observación / lista con 20 elementos.

¿Cómo puedo remodelar mis datos en matrices numpy para no recibir esta advertencia?


Miré dos respuestas en SO, y ninguna funcionó para mí. Pregunta 1 y pregunta 2 Parece que Q1 era en realidad datos 1D y se resolvió utilizando reshape , que probé y no pude. Q2 tiene una respuesta sobre cómo rastrear advertencias y errores, que no es lo que quiero. La otra respuesta es de nuevo una instancia de una matriz 1D.

El error viene del método de predicción. Numpy interpretará [1,1] como una matriz 1d. Así que esto debería evitar la advertencia:

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

Darse cuenta de:

 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) 

Además, tenga en cuenta que no puede usar una matriz de formas (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)  in () ----> 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 

En lugar de correr

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

correr

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

La muestra para la predicción de forma intuitiva podría ser:

[1,9]

Pero puedes remodelar el vector como la respuesta anterior. O simplemente haz lo siguiente:

[[1,9]]

EJEMPLO

importar número como np desde sklearn importar svm importar aleatoriamente como aleatoriamente

A = np.array ([[random.randint (0, 20) para i en el rango (2)] para i en el rango (10)]) lab = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]

clf = svm.SVC (kernel = ‘linear’, C = 1.0) clf.fit (A, laboratorio)

imprimir clf.predicto ([[1,9]])