webentwicklung-frage-antwort-db.com.de

Abnahme der Warnung in Sklearn über 1d Array, obwohl kein 1D Array vorhanden ist

Ich versuche, SKLearn zu verwenden, um ein SVM-Modell auszuführen. Ich probiere es gerade mit einigen Beispieldaten aus. Hier sind die Daten und der Code:

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)

Zu Ihrer Information, wenn ich renne 

import sklearn
sklearn.__version__

Es gibt 0,17 aus.

Wenn ich nun print(clf.predict([1, 1])) starte, erhalte ich die folgende Warnung:

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)

Es gibt mir eine Vorhersage, die großartig ist. Ich finde das aus einigen Gründen jedoch komisch.

Ich habe kein 1d-Array. Wenn Sie A drucken, erhalten Sie

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

Was scheint mir 2 dimensional zu sein. Aber okay, lassen Sie uns einfach sagen, dass ich tatsächlich ein 1D-Array habe. Versuchen wir, es mit reshape zu ändern, wie im Fehler vorgeschlagen.

Gleicher Code wie oben, aber jetzt haben wir

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

Aber dann gibt dies ein Array der Länge 20 aus, was keinen Sinn macht und nicht das ist, was ich will. Ich habe es auch mit reshape(1, -1) ausprobiert, aber dies gibt mir eine einzige Beobachtung/Liste mit 20 Elementen darin. 

Wie kann ich meine Daten in numpy Arrays umformen, damit ich diese Warnung nicht bekomme?


Ich habe mir zwei Antworten zu SO angesehen, und beide haben nicht für mich gearbeitet. Frage 1 und Frage 2 . Es scheint, dass Q1 tatsächlich 1D-Daten war und mit reshape gelöst wurde, was ich probiert habe. In Q2 gibt es eine Antwort darauf, wie Warnungen und Fehler verfolgt werden, was ich nicht will. Die andere Antwort ist wieder eine Instanz eines 1D-Arrays.

15
Katya Handler

Der Fehler kommt von der Vorhersagemethode. Numpy interpretiert [1,1] als 1d-Array. Dies sollte also die Warnung vermeiden:

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

Beachte das:

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)

Beachten Sie auch, dass Sie kein Array von Formen verwenden können (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

Anstatt zu laufen 

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

Lauf

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

das Beispiel für die Vorhersage könnte intuitiv sein:

[1,9]

Sie können den Vektor jedoch als vorherige Antwort umformen. Oder machen Sie einfach folgendes:

[[1,9]]

BEISPIEL

import numpy als np aus sklearn import svm zufällig als zufällig importieren

A = np.array ([[Random (0, 20) für i im Bereich (2)] für i im Bereich (10))) 0, 1, 0, 1]

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

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

0