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)

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.


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

8

Stosuję poniższe podejście.

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

reg.predict([[2136]])

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.


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

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.


1

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

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

to zadziałało dla mnie


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

-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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.