В настоящее время я использую TensorFlow и SkLearn, чтобы попытаться создать модель, которая может прогнозировать объем продаж определенного продукта X на основе температуры наружного воздуха в градусах Цельсия.
Я взял свои наборы данных для температуры и установил его равным переменной x, а объем продаж - переменной y. Как видно на картинке ниже, существует какая-то корреляция между температурой и объемом продаж:
Прежде всего, я попытался провести линейную регрессию, чтобы увидеть, насколько хорошо она подходит. Вот код для этого:
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()
В результате получилась предсказанная строка, которая не соответствовала действительности:
Однако очень приятной особенностью 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()
Кажется, теперь линия подходит лучше: 
Моя проблема не в том, что я не могу использовать new_model.predict (x), поскольку это приведет к «ValueError: фигуры (1,1) и (8,) не выровнены: 1 (тусклый 1)! = 8 (тусклый 0)». Я понимаю, что это связано с тем, что я использую полином 8 градусов, но могу ли я предсказать ось Y на основе ОДНОЙ температуры, используя модель полиномиальной регрессии?
если я пишу в new_model.predict([[30 for x_train in range(8)]]), я действительно получаю результат, но результат массив ([2862.55322278]) в соответствии с моделью, которую я ожидал бы получить более 15 КБ, вы хоть представляете, почему я получаю такое маленькое число?






Попробуйте использовать 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()
Теперь мы можем предсказать значение 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, поэтому имеет смысл, что он не может предсказать что-то правильное, но почему он так сильно падает? Судя по текущему графику, я предполагал, что он пойдет вверх. Спасибо за помощь.
Полином 8-й степени определенно подходит для ваших данных, он снижается после окончания ваших данных. Попробуйте полиномы более низкой степени и используйте перекрестную проверку, чтобы выяснить, какая модель лучше всего подходит для ваших данных. Найдите компромисс смещения и дисперсии, чтобы начать поиск лучшей модели. Также поищите методы регуляризации.
Можете попробовать
new_model.predict([x for _ in range(8)])?