Ошибка в скрипте 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. и, следовательно, масштабирование масштабирования в свою очередь не приводит к какой-либо ошибке!