Błąd w skrypcie Pythona „Oczekiwano tablicy 2D, zamiast niej otrzymano tablicę 1D:”?

87

Postępuję zgodnie z tym samouczkiem, aby sformułować prognozę ML:

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

Używam Pythona 3.6 i otrzymuję błąd „Oczekiwana tablica 2D, zamiast niej otrzymałem tablicę 1D:” Myślę, że skrypt jest przeznaczony dla starszych wersji, ale nie wiem, jak przekonwertować go do wersji 3.6.

Już spróbuj z:

X.reshape(1, -1)
JonTargaryen
źródło
3
Która linia powoduje błąd?
stackoverflowuser2010
10
X = X.reshape(1, -1). Zmiana kształtu nie jest na miejscu.
Mad Physicist
2
@ stackoverflowuser2010: Zgaduję, że ostatnia linia clf.predict(<a-1d-thing>), ponieważ Xjest już dwuwymiarowa ( reshapemimo wszystko bezużyteczna ).
Mark Dickinson
@MarkDickinson Tak, ostatnia linijka to.
JonTargaryen
2
@JonTargaryen zmiana kształtu jest we właściwym miejscu, ale odrzucasz wynik. Przypisz wynik z powrotem do X.
Mad Physicist

Odpowiedzi:

165

Powinieneś po prostu podać predictmetodę z tą samą tablicą 2D, ale z jedną wartością, którą chcesz przetworzyć (lub więcej). Krótko mówiąc, możesz po prostu wymienić

[0.58,0.76]

Z

[[0.58,0.76]]

I powinno działać.

EDYCJA: Ta odpowiedź stała się popularna, więc pomyślałem, że dodam trochę więcej wyjaśnień na temat ML. Krótka wersja: możemy używać tylko predictna danych, które mają taką samą wymiarowość jak dane uczące ( X).

W omawianym przykładzie podajemy komputerowi kilka wierszy X(po 2 wartości w każdym) i pokazujemy mu prawidłowe odpowiedzi w formacie y. Kiedy chcemy predictużyć nowych wartości, nasz program oczekuje tego samego - kilku wierszy. Nawet jeśli chcemy to zrobić tylko dla jednego wiersza (z dwiema wartościami), ten wiersz musi być częścią innej tablicy.

Ofer Sadan
źródło
31
ale dlaczego to działa? Nie rozumiem, na czym polega problem.
Charlie Parker
2
jak to osiągnąć w przypadku większych ramek danych? (dynamicznie)
Sip
4
Dlaczego musi to być tablica 2D? Jaki jest tego powód?
problemofficer
19

Problem występuje podczas uruchamiania przewidywania na tablicy [0.58,0.76]. Rozwiąż problem, zmieniając jego kształt, zanim zadzwonisz 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
źródło
8

Stosuję poniższe podejście.

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

reg.predict([[2136]])
Vikas Rathour
źródło
6

Napotkałem ten sam problem, z wyjątkiem tego, że typem danych instancji, którą chciałem przewidzieć, był panda.Seriesobiekt.

Po prostu musiałem przewidzieć jedną instancję wejściową. Wziąłem to z wycinka moich danych.

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

W takim przypadku musisz przekonwertować go na tablicę 1-D, a następnie reshapeją.

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

Od docs , valuesprzekonwertuje Series w numpy tablicy.

devsaw
źródło
3

Miałem ten sam problem. Musisz po prostu uczynić z niej tablicę, a ponadto musisz umieścić podwójne nawiasy kwadratowe, aby uczynić z niej pojedynczy element tablicy 2D, ponieważ pierwszy nawias inicjuje tablicę, a drugi czyni ją elementem tej tablicy.

Więc po prostu zamień ostatnie stwierdzenie na:

print(clf.predict(np.array[[0.58,0.76]]))
Satyam Mittal
źródło
1

Miałem ten sam problem wcześniej, ale jakoś znalazłem rozwiązanie, możesz spróbować reg.predict([[3300]]).

API używane do dopuszczania wartości skalarnych, ale teraz musisz podać tablicę 2D.

FASIH AHMED
źródło
1

Po prostu wstaw argument między podwójnym nawiasem kwadratowym:

regressor.predict ([[wartości]])

to zadziałało dla mnie

Camunatas
źródło
0

Dzięki jednej funkcji moja lista Dataframe jest konwertowana na Serię. Musiałem przekonwertować go z powrotem na listę Dataframe i zadziałało.

if type(X) is Series:
    X = X.to_frame()
Król Artur
źródło
-1

Macierz X i Y zmiennej niezależnej i zmiennej zależnej odpowiednio do DataFrame z typu int64, tak aby została przekonwertowana z tablicy 1D na tablicę 2D .. tj. X = pd.DataFrame (X) i Y = pd.dataFrame (Y), gdzie pd należy do klasy pandy w języku Python. a zatem skalowanie funkcji z kolei nie prowadzi do żadnego błędu!

Chahat Agarwal
źródło