Ошибка в скрипте Python "Ожидается двухмерный массив, вместо него получен одномерный массив:"?

Я следую этому руководству, чтобы составить прогноз 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 и получаю сообщение об ошибке "Ожидается двухмерный массив, вместо него получен одномерный массив:" Я думаю, что скрипт предназначен для более старых версий, но я не знаю, как преобразовать его в версию 3.6.

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

X.reshape(1, -1)

Ответ 1

Вы просто должны предоставить метод predict с тем же 2D-массивом, но с одним значением, которое вы хотите обработать (или более). Короче говоря, вы можете просто заменить

[0.58,0.76]

С

[[0.58,0.76]]

И это должно сработать.

ОБНОВЛЕНИЕ: Этот ответ стал популярным, поэтому я решил добавить немного больше объяснений по поводу ML. Краткая версия: мы можем использовать predict только для данных, которые имеют ту же размерность, что и обучающие данные (X).

В рассматриваемом примере мы даем компьютеру несколько строк в X (по 2 значения в каждой) и показываем правильные ответы в y. Когда мы хотим использовать predict новые значения, наша программа ожидает того же - связка строк. Даже если мы хотим сделать это только для одной строки (с двумя значениями), эта строка должна быть частью другого массива.

Ответ 2

Проблема возникает, когда вы запускаете предсказание по массиву [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

Ответ 3

Я использую следующий подход.

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

reg.predict([[2136]])

Ответ 4

Я столкнулся с той же проблемой, за исключением того, что тип данных экземпляра, который я хотел предсказать, был объектом panda.Series.

Ну, мне просто нужно было предсказать один экземпляр ввода. Я взял его из кусочка моих данных.

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

В этом случае вам нужно преобразовать его в 1-мерный массив и затем reshape его.

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

В документах values преобразуют Series в массив numpy.

Ответ 5

Я столкнулся с той же проблемой. Вам просто нужно сделать его массивом, и, кроме того, вы должны поставить квадратные скобки, чтобы сделать его одним элементом двумерного массива, так как первая скобка инициализирует массив, а вторая делает его элементом этого массива.

Так что просто замените последнее утверждение на:

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

Ответ 6

С одной функцией мой список Dataframe преобразуется в серию. Мне пришлось преобразовать его обратно в список Dataframe, и это сработало.

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

Ответ 7

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

API, используемый для разрешения скалярного значения, но теперь вам нужно указать двумерный массив.

Ответ 8

Просто введите аргумент между двойной квадратной скобкой:

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

это сработало для меня

Ответ 9

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