Когда вы делаете это:
regr.fit([x], [y])
Вы по сути вводите это:
regr.fit([[1,2,3,4,5,6,7]], [[1,2,1,3,2.5,2,5]])
имеет форму (1,7)
для X
и (1,7)
для y
.
Теперь рассмотрим документацию fit()
:
Параметры:
X : numpy array or sparse matrix of shape [n_samples,n_features]
Training data
y : numpy array of shape [n_samples, n_targets]
Target values. Will be cast to X’s dtype if necessary
Итак, модель предполагает, что у вас есть данные, у которых есть данные, и у них 7 целей. Пожалуйста, смотрите это для получения дополнительной информации о мульти-выходной регрессии .
Таким образом, во время прогнозирования модели потребуются данные с 7 объектами, имеющими форму (n_samples_to_predict, 7)
, и они будут выводить данные с формой (n_samples_to_predict, 7)
.
Если вместо этого вы хотите что-то вроде этого:
x y
1 1.0
2 2.0
3 1.0
4 3.0
5 2.5
6 2.0
7 5.0
тогда вам нужно иметь форму (7,1)
для ввода x
и (7,)
или (7,1)
для цели y
.
Итак, как сказал @WStokvis в комментариях, вам нужно сделать следующее:
import numpy as np
X = np.array(x).reshape(-1, 1)
y = np.array(y) # You may omit this step if you want
regr.fit(X, y) # Dont wrap it in []
И затем снова во время предсказания:
X_new = np.array([1, 2000, 3, 4, 5, 26, 7]).reshape(-1, 1)
regr.predict(X_new)
И тогда выполнение следующих действий не вызовет ошибку:
regr.predict([[2000]])
потому что требуемая форма присутствует.
Обновление для комментария: -
Когда вы делаете [[2000]]
, он будет внутренне преобразован в np.array([[2000]])
, поэтому он имеет форму (1,1)
. Это похоже на (n_samples, n_features)
, где n_features = 1
. Это верно для модели, потому что на тренировке данные имеют форму (n_samples, 1)
. Так что это работает.
Теперь допустим, у вас есть:
X_new = [1, 2000, 3, 4, 5, 26, 7] #(You havent wrapped it in numpy array and reshape(-1,1) yet
Опять же, это будет внутренне преобразовано так:
X_new = np.array([1, 2000, 3, 4, 5, 26, 7])
Так что теперь X_new имеет форму (7,)
. Смотрите его только одномерный массив. Не имеет значения, является ли он вектором строки или вектором столбца. Это просто одномерный массив (n,)
.
Таким образом, scikit не может определить, являются ли его n_samples=n
и n_features=1
или наоборот (n_samples=1
и n_features=n
). Пожалуйста, смотрите мой другой ответ, который объясняет об этом .
Так что нам нужно явно преобразовать одномерный массив в 2-й с помощью reshape(-1,1)
. Надеюсь, теперь все ясно.