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

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

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

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

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

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

В результате получилась предсказанная строка, которая не соответствовала действительности:

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

Однако очень приятной особенностью 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()

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

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

Можете попробовать new_model.predict([x for _ in range(8)])?

Sheldore 25.09.2018 15:36

если я пишу в new_model.predict([[30 for x_train in range(8)]]), я действительно получаю результат, но результат массив ([2862.55322278]) в соответствии с моделью, которую я ожидал бы получить более 15 КБ, вы хоть представляете, почему я получаю такое маленькое число?

Thomas 25.09.2018 18:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
4 388
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 ^ 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]]

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

Thomas 27.09.2018 12:35

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

Manny 27.09.2018 16:20

Другие вопросы по теме