Предсказать будущие значения после использования полиномиальной регрессии в Python

1

В настоящее время я использую TensorFlow и SkLearn, чтобы попытаться создать модель, которая может прогнозировать объем продаж для определенного продукта X на основе температуры наружного воздуха в celcius.

Я взял свои данные для температуры и установил ее равной переменной x, а объем продаж - как переменную ay. Как видно на рисунке ниже, существует некоторая корреляция между температурой и объемом продаж:

Изображение 174551

Прежде всего, я попытался сделать линейную регрессию, чтобы понять, насколько она подходит. Это код для этого:

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(x_train, y_train) #fit tries to fit the x variable and y variable.

#Let try to plot it out.
y_pred = model.predict(x_train)

plt.scatter(x_train,y_train)
plt.plot(x_train,y_pred,'r')
plt.legend(['Predicted Line', 'Observed data'])
plt.show()

Это привело к предсказанной линии, которая была довольно плохой:

Изображение 174551

Однако очень приятная особенность sklearn заключается в том, что вы можете попытаться предсказать значение, основанное на температуре, поэтому, если бы я написал

model.predict(15)

я бы получил выход

array([6949.05567873])

Это именно то, что я хочу, я просто хотел, чтобы линия была лучше, поэтому вместо этого я попробовал полиномиальную регрессию с помощью sklearn, выполнив следующие действия:

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=8, include_bias=False) #the bias is avoiding the need to intercept
x_new = poly.fit_transform(x_train)
new_model = LinearRegression()
new_model.fit(x_new,y_train)

#plotting
y_prediction = new_model.predict(x_new) #this actually predicts x...?
plt.scatter(x_train,y_train)
plt.plot(x_new[:,0], y_prediction, 'r')
plt.legend(['Predicted line', 'Observed data'])
plt.show()

Кажется, что линия лучше подходит теперь: Изображение 174551

Моя проблема заключается не в том, что я не могу использовать new_model.predict(x), так как это приведет к "ValueError: фигуры (1,1) и (8) не выровнены: 1 (dim 1)! = 8 (dim 0 ) ". Я понимаю, что это потому, что я использую многочлен из 8 степеней, но есть ли способ предсказать y-axsis на основе ОДНОЙ температуры с использованием модели полиномиальной регрессии?

  • 0
    Можете ли вы попробовать new_model.predict([x for _ in range(8)]) ?
  • 0
    если я напишу в new_model.predict([[30 for x_train in range(8)]]) я действительно получаю вывод, но вывод массив ([2862.55322278]) в соответствии с моделью, я ожидал бы выход более 15k , у вас есть идея, почему я получаю такой низкий номер?
Теги:
tensorflow
machine-learning
scikit-learn

1 ответ

1
Лучший ответ

Попробуйте использовать new_model.predict([x**a for a in range(1,9)]) или в соответствии с вашим ранее используемым кодом, вы можете сделать new_model.predict(poly.fit_transform(x))

Поскольку вы подходите к линии

y = ax ^ 1 + bx ^ 2 +... + h * x ^ 8

вам необходимо преобразовать свой вход таким же образом, т.е. превратить его в полином без условий перехвата и наклона. Это то, что вы перешли в функцию линейной регрессии. Он изучает условия наклона для этого многочлена. Участок, который вы x_new[:,0] содержит только x ^ 1-член, который вы x_new[:,0] (x_new[:,0]), что означает, что данные, которые вы используете, имеют больше столбцов.

Последнее замечание: всегда следите за тем, чтобы ваши данные обучения и данные о будущем/валидации проходили одни и те же шаги предварительной обработки, чтобы обеспечить работу вашей модели.

Вот некоторые детали:

Позвольте начать с запуска вашего кода на синтетических данных.

from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from numpy.random import rand

x_train = rand(1000,1)
y_train = rand(1000,1)

poly = PolynomialFeatures(degree=8, include_bias=False) #the bias is avoiding the need to intercept
x_new = poly.fit_transform(x_train)
new_model = LinearRegression()
new_model.fit(x_new,y_train)

#plotting
y_prediction = new_model.predict(x_new) #this predicts y
plt.scatter(x_train,y_train)
plt.plot(x_new[:,0], y_prediction, 'r')
plt.legend(['Predicted line', 'Observed data'])
plt.show()

Изображение 174551

Теперь мы можем предсказать значение y, преобразуя x-значение в полином степени 8 без перехвата

print(new_model.predict(poly.fit_transform(0.25)))

[[0.47974408]]

  • 0
    Спасибо!! Это решило мой вопрос
  • 0
    У меня есть один вопрос, но если я попытаюсь предсказать new_model.predict(poly.fit_transform(30)) я получу вывод, который я ожидаю: array([16963.83798785]) . Однако, если я попытаюсь предсказать 35 градусов вместо 30, я получу выходной массив ([- 71530.20368012]) Моя самая высокая степень в моем наборе данных - 29,56, поэтому имеет смысл, что она не может предсказать что-то правильное, но почему это происходит столько? Согласно текущему графику, я бы предположил, что он будет расти. Спасибо за помощь.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню