Fehler im Python-Skript "Erwartetes 2D-Array, stattdessen 1D-Array:"?

81

Ich folge diesem Tutorial , um diese ML-Vorhersage zu treffen:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style

style.use("ggplot")
from sklearn import svm

x = [1, 5, 1.5, 8, 1, 9]
y = [2, 8, 1.8, 8, 0.6, 11]

plt.scatter(x,y)
plt.show()

X = np.array([[1,2],
             [5,8],
             [1.5,1.8],
             [8,8],
             [1,0.6],
             [9,11]])

y = [0,1,0,1,0,1]
X.reshape(1, -1)

clf = svm.SVC(kernel='linear', C = 1.0)
clf.fit(X,y)

print(clf.predict([0.58,0.76]))

Ich verwende Python 3.6 und erhalte die Fehlermeldung "Erwartetes 2D-Array, stattdessen 1D-Array:" Ich denke, das Skript ist für ältere Versionen, aber ich weiß nicht, wie ich es in die Version 3.6 konvertieren soll.

Versuchen Sie es bereits mit:

X.reshape(1, -1)
JonTargaryen
quelle
3
Welche Zeile erzeugt den Fehler?
stackoverflowuser2010
10
X = X.reshape(1, -1). Umformung ist nicht vorhanden.
Mad Physicist
2
@ stackoverflowuser2010: Ich würde die letzte Zeile erraten clf.predict(<a-1d-thing>), da sie Xbereits zweidimensional ist ( reshapeungeachtet davon nutzlos ).
Mark Dickinson
@ MarkDickinson Ja, die letzte Zeile ist.
JonTargaryen
2
@ JonTargaryen Die Umformung ist am richtigen Ort, aber Sie verwerfen das Ergebnis. Ordnen Sie das Ergebnis wieder zu X.
Mad Physicist

Antworten:

155

Sie sollten der predictMethode nur dasselbe 2D-Array zur Verfügung stellen , jedoch einen Wert, den Sie verarbeiten möchten (oder mehr). Kurz gesagt, Sie können einfach ersetzen

[0.58,0.76]

Mit

[[0.58,0.76]]

Und es sollte funktionieren.

EDIT: Diese Antwort wurde populär, also dachte ich, ich würde etwas mehr Erklärung über ML hinzufügen. Die Kurzversion: Wir können nur predictDaten verwenden, die dieselbe Dimension haben wie die Trainingsdaten ( X).

In dem fraglichen Beispiel geben wir dem Computer eine Reihe von Zeilen X(mit jeweils 2 Werten) und zeigen ihm die richtigen Antworten in y. Wenn wir predictneue Werte verwenden möchten, erwartet unser Programm dasselbe - eine Reihe von Zeilen. Selbst wenn wir es nur mit einer Zeile (mit zwei Werten) machen wollen, muss diese Zeile Teil eines anderen Arrays sein.

Ofer Sadan
quelle
31
aber warum funktioniert das Ich verstehe nicht, worum es geht.
Charlie Parker
2
Wie erreichen Sie dies für größere Datenrahmen? (dynamisch)
Schluck
3
Warum muss es ein 2D-Array sein? Was ist der Grund dafür?
Problemoffizier
17

Das Problem tritt auf, wenn Sie eine Vorhersage für das Array ausführen [0.58,0.76]. Beheben Sie das Problem, indem Sie es umformen, bevor Sie anrufen predict():

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style

style.use("ggplot")
from sklearn import svm

x = [1, 5, 1.5, 8, 1, 9]
y = [2, 8, 1.8, 8, 0.6, 11]

plt.scatter(x,y)
plt.show()

X = np.array([[1,2],
             [5,8],
             [1.5,1.8],
             [8,8],
             [1,0.6],
             [9,11]])

y = [0,1,0,1,0,1]

clf = svm.SVC(kernel='linear', C = 1.0)
clf.fit(X,y)

test = np.array([0.58, 0.76])
print test       # Produces: [ 0.58  0.76]
print test.shape # Produces: (2,) meaning 2 rows, 1 col

test = test.reshape(1, -1)
print test       # Produces: [[ 0.58  0.76]]
print test.shape # Produces (1, 2) meaning 1 row, 2 cols

print(clf.predict(test)) # Produces [0], as expected
stackoverflowuser2010
quelle
7

Ich benutze den folgenden Ansatz.

reg = linear_model.LinearRegression()
reg.fit(df[['year']],df.income)

reg.predict([[2136]])
Vikas Rathour
quelle
5

Ich hatte das gleiche Problem, außer dass der Datentyp der Instanz, die ich vorhersagen wollte, ein panda.SeriesObjekt war.

Nun, ich musste nur eine Eingabeinstanz vorhersagen. Ich habe es einem Teil meiner Daten entnommen.

df = pd.DataFrame(list(BiogasPlant.objects.all()))
test = df.iloc[-1:]       # sliced it here

In diesem Fall müssen Sie es in ein 1-D-Array konvertieren und dann reshape.

 test2d = test.values.reshape(1,-1)

Aus dem docs , valueswird die Serie in eine numpy Array konvertieren.

devsaw
quelle
2

Ich hatte das gleiche Problem. Sie müssen es nur zu einem Array machen und außerdem doppelte eckige Klammern setzen, um es zu einem einzelnen Element des 2D-Arrays zu machen, da die erste Klammer das Array initialisiert und die zweite es zu einem Element dieses Arrays macht.

Ersetzen Sie einfach die letzte Aussage durch:

print(clf.predict(np.array[[0.58,0.76]]))
Satyam Mittal
quelle
1

Ich hatte früher das gleiche Problem, aber ich habe irgendwie die Lösung gefunden. Sie können es versuchen reg.predict([[3300]]).

Die API, die verwendet wurde, um skalare Werte zuzulassen, aber jetzt müssen Sie ein 2D-Array angeben.

FASIH AHMED
quelle
1

Fügen Sie einfach das Argument zwischen eine doppelte eckige Klammer ein:

regressor.predict ([[Werte]])

das hat bei mir funktioniert

Camunatas
quelle
0

Mit einer Funktion wird meine Dataframe-Liste in eine Serie konvertiert. Ich musste es wieder in eine Dataframe-Liste konvertieren und es funktionierte.

if type(X) is Series:
    X = X.to_frame()
König Arthur
quelle
-1

Die X- und Y-Matrix der unabhängigen Variablen bzw. der abhängigen Variablen in DataFrame vom Typ int64, sodass sie vom 1D-Array in das 2D-Array konvertiert wird. Dh X = pd.DataFrame (X) und Y = pd.dataFrame (Y) wobei pd ist von der Pandas-Klasse in Python. und somit führt die Feature-Skalierung wiederum nicht zu Fehlern!

Chahat Agarwal
quelle