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

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

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

Graph made using matplotlib.pyplot

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

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's 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()

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

enter image description here

Тем не менее, очень хорошая особенность 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()

Теперь линия выглядит лучше: enter image description here

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

1 Ответ

0 голосов
/ 26 сентября 2018

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

Так как вы вписываете строку

y = x ^1 + b x ^ 2 + ... + h * x ^ 8

вам необходимо преобразовать ваш вход таким же образом, т.е. превратить его в полином без пересечения и наклонатермины.Это то, что вы передали в функцию обучения линейной регрессии.Он изучает условия наклона для этого многочлена.График, который вы показали, содержит только индекс x ^ 1, который вы проиндексировали (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()

Plot showing data and line fit

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

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

[[0.47974408]]

...