Единый прогноз с линейной регрессией - PullRequest
0 голосов
/ 29 апреля 2018

Реализация линейной регрессии, как показано ниже:

from sklearn.linear_model import LinearRegression

x = [1,2,3,4,5,6,7]
y = [1,2,1,3,2.5,2,5]

# Create linear regression object
regr = LinearRegression()

# Train the model using the training sets
regr.fit([x], [y])

# print(x)
regr.predict([[1, 2000, 3, 4, 5, 26, 7]])

производит:

array([[1. , 2. , 1. , 3. , 2.5, 2. , 5. ]])

При использовании функции прогнозирования, почему нельзя использовать одно значение x для прогнозирования?

Пытаясь regr.predict([[2000]])

возвращается:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-3a8b477f5103> in <module>()
     11 
     12 # print(x)
---> 13 regr.predict([[2000]])

/usr/local/lib/python3.6/dist-packages/sklearn/linear_model/base.py in predict(self, X)
    254             Returns predicted values.
    255         """
--> 256         return self._decision_function(X)
    257 
    258     _preprocess_data = staticmethod(_preprocess_data)

/usr/local/lib/python3.6/dist-packages/sklearn/linear_model/base.py in _decision_function(self, X)
    239         X = check_array(X, accept_sparse=['csr', 'csc', 'coo'])
    240         return safe_sparse_dot(X, self.coef_.T,
--> 241                                dense_output=True) + self.intercept_
    242 
    243     def predict(self, X):

/usr/local/lib/python3.6/dist-packages/sklearn/utils/extmath.py in safe_sparse_dot(a, b, dense_output)
    138         return ret
    139     else:
--> 140         return np.dot(a, b)
    141 
    142 

ValueError: shapes (1,1) and (7,7) not aligned: 1 (dim 1) != 7 (dim 0)

1 Ответ

0 голосов
/ 30 апреля 2018

Когда вы делаете это:

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). Надеюсь, теперь все ясно.

...