Помилка в скрипті Python “Очікується 2D-масив, замість цього отримано 1D-масив:”?


87

Я дотримуюсь цього підручника, щоб зробити цей прогноз 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]))

Я використовую Python 3.6, і я отримую помилку "Очікуваний 2D-масив, замість цього отримав 1D-масив:" Я думаю, що сценарій призначений для старих версій, але я не знаю, як перетворити його на версію 3.6.

Уже спробуйте:

X.reshape(1, -1)

3
Який рядок видає помилку?
stackoverflowuser2010

10
X = X.reshape(1, -1). Переформування не відбувається.
Божевільний фізик

2
@ stackoverflowuser2010: Я думаю, останній рядок clf.predict(<a-1d-thing>), оскільки Xвже є двовимірним ( reshapeнезважаючи ні на що).
Марк Дікінсон,

@MarkDickinson Так, останній рядок є.
JonTargaryen

2
@JonTargaryen зміна форми знаходиться в потрібному місці, але ви відкидаєте результат. Призначити результат назад до X.
Божевільний фізик

Відповіді:


165

Ви просто повинні надати predictметоду той самий 2D-масив, але з одним значенням, яке ви хочете обробити (або більше). Словом, ви можете просто замінити

[0.58,0.76]

С

[[0.58,0.76]]

І це має спрацювати.

EDIT: Ця відповідь стала популярною, тому я подумав додати трохи більше пояснень щодо ML. Коротка версія: ми можемо використовувати лише predictдані, які мають ту саму розмірність, що і дані навчання ( X).

У розглянутому прикладі ми надаємо комп'ютеру купу рядків X(по 2 значення в кожному) і показуємо йому правильні відповіді в y. Коли ми хочемо predictвикористовувати нові значення, наша програма очікує того ж - купу рядків. Навіть якщо ми хочемо зробити це лише в одному рядку (з двома значеннями), цей рядок повинен бути частиною іншого масиву.


31
але чому це працює? Я не розумію, в чому проблема.
Чарлі Паркер,

2
як ви досягаєте цього для більших фреймів даних? (динамічно)
Сіп

4
Чому це повинен бути 2D-масив? Що є причиною цього?
problemofficer

19

Проблема виникає під час запуску передбачення на масиві [0.58,0.76]. Вирішіть проблему, змінивши її форму перед тим, як зателефонувати 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

Я використовую наведений нижче підхід.

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

reg.predict([[2136]])

6

Я зіткнувся з тією ж проблемою, за винятком того, що тип даних екземпляра, який я хотів передбачити, був panda.Seriesоб’єктом.

Ну, мені просто потрібно було передбачити один екземпляр введення. Я взяв це зі зрізу своїх даних.

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

У цьому випадку вам потрібно буде перетворити його в одновимірний масив, а потім reshape.

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

З документації , valuesбуде перетворювати серії в Numpy масив.


3

Я зіткнувся з тією ж проблемою. Вам просто потрібно зробити це масивом, до того ж ви повинні поставити подвійні квадратні дужки, щоб зробити його єдиним елементом 2D-масиву, оскільки перша дужка ініціалізує масив, а друга робить його елементом цього масиву.

Тож просто замініть останнє твердження на:

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

1

Я стикався з такою ж проблемою раніше, але я якось знайшов рішення, Ви можете спробувати reg.predict([[3300]]).

Раніше API дозволяв скалярне значення, але тепер вам потрібно надати 2D-масив.


1

Просто вставте аргумент між подвійною квадратною дужкою:

regressor.predict ([[значення]])

що працювало на мене


0

За допомогою однієї функції мій список Dataframe перетворюється на серію. Мені довелося перетворити його назад у список Dataframe, і це спрацювало.

if type(X) is Series:
    X = X.to_frame()

-1

Матриця X та Y незалежної змінної та залежної змінної відповідно до DataFrame із типу int64, щоб вона перетворилася з 1D масиву на 2D масив .. тобто X = pd.DataFrame (X) та Y = pd.dataFrame (Y) де pd має клас pandas у python. і таким чином масштабування функцій у свою чергу не призводить до помилок!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.