Предполагая, что ваша графическая библиотека - это matplotlib, импортированная с import matplotlib.pyplot as plt
, проблема в том, что вы передали одни и те же данные в plt.scatter
и plt.plot
. Первый - dr aws - график рассеяния, а второй - проводит линию через все точки в указанном порядке (сначала это нарисованная aws прямая линия между (x_test['lag_7'][0], y_pred[0])
и (x_test['lag_7'][1], y_pred[1])
, затем одна между (x_test['lag_7'][1], y_pred[1])
и (x_test['lag_7'][2], y_pred[2])
, et c.)
Относительно более общего вопроса о том, как выполнить многомерную регрессию и построить график результатов, у меня есть два замечания:
Поиск Линия наилучшего соответствия одной функции за раз представляет собой выполнение 1D регрессии для этой функции: это совершенно другая модель, чем многомерная линейная регрессия, которую вы хотите выполнить.
Я не думаю, имеет смысл разделить данные на обучающую и тестовую выборки, потому что линейная регрессия - очень простая модель с небольшим риском переобучения. Далее я рассматриваю весь набор данных df
.
Мне нравится использовать OpenTURNS, потому что он имеет встроенные средства просмотра линейной регрессии. Обратной стороной является то, что для его использования нам нужно преобразовать ваши pandas таблицы (DataFrame
или Series
) в объекты OpenTURNS класса Sample
.
import pandas as pd
import numpy as np
import openturns as ot
from openturns.viewer import View
# convert pandas DataFrames to numpy arrays and then to OpenTURNS Samples
X = ot.Sample(np.array(df[['lag_7','rolling_mean', 'expanding_mean']]))
X.setDescription(['lag_7','rolling_mean', 'expanding_mean']) # keep labels
Y = ot.Sample(np.array(df[['sales']]))
Y.setDescription(['sales'])
Вы не предоставили свой данных, поэтому мне нужно сгенерировать некоторые:
func = ot.SymbolicFunction(['x1', 'x2', 'x3'], ['4*x1 + 0.05*x2 - 2*x3'])
inputs_distribution = ot.ComposedDistribution([ot.Uniform(0, 3.0e6)]*3)
residuals_distribution = ot.Normal(0.0, 2.0e6)
ot.RandomGenerator.SetSeed(0)
X = inputs_distribution.getSample(30)
X.setDescription(['lag_7','rolling_mean', 'expanding_mean'])
Y = func(X) + residuals_distribution.getSample(30)
Y.setDescription(['sales'])
Теперь давайте найдем наиболее подходящую линию по одной функции за раз (1D линейная регрессия):
linear_regression_1 = ot.LinearModelAlgorithm(X[:, 0], Y)
linear_regression_1.run()
linear_regression_1_result = linear_regression_1.getResult()
ot.VisualTest_DrawLinearModel(X[:, 0], Y, linear_regression_1_result)
linear_regression_2 = ot.LinearModelAlgorithm(X[:, 1], Y)
linear_regression_2.run()
linear_regression_2_result = linear_regression_2.getResult()
View(ot.VisualTest_DrawLinearModel(X[:, 1], Y, linear_regression_2_result))
linear_regression_3 = ot.LinearModelAlgorithm(X[:, 2], Y)
linear_regression_3.run()
linear_regression_3_result = linear_regression_3.getResult()
View(ot.VisualTest_DrawLinearModel(X[:, 2], Y, linear_regression_3_result))
As you can see, in this example, none of the one-feature linear regressions are able to very accurately predict the output.
Now let us do multivariate linear regression. To plot the result, it is best to view the actual vs. predicted values.
full_linear_regression = ot.LinearModelAlgorithm(X, Y)
full_linear_regression.run()
full_linear_regression_result = full_linear_regression.getResult()
full_linear_regression_analysis = ot.LinearModelAnalysis(full_linear_regression_result)
View(full_linear_regression_analysis.drawModelVsFitted())
Многомерная линейная регрессия
Как вы можете видеть, в этом примере соответствие намного лучше с многомерной линейной регрессией, чем с 1D регрессией по одной функции за раз.