Python Линейная регрессия: plt.plot () не показывает прямую линию. Вместо этого он соединяет каждую точку на диаграмме рассеяния. - PullRequest
0 голосов
/ 07 августа 2020

Я относительно новичок в python. Я пытаюсь создать многомерную линейную регрессию и графики разброса и линию наилучшего соответствия, используя по одной функции за раз.

Это мой код:

Train=df.loc[:650] 
valid=df.loc[651:]

x_train=Train[['lag_7','rolling_mean', 'expanding_mean']].dropna()
y_train=Train['sales'].dropna()
y_train=y_train.loc[7:]

x_test=valid[['lag_7','rolling_mean', 'expanding_mean']].dropna()
y_test=valid['sales'].dropna()

regr=linear_model.LinearRegression()
regr.fit(x_train,y_train)

y_pred=regr.predict(x_test)

plt.scatter(x_test['lag_7'], y_pred,color='black')
plt.plot(x_test['lag_7'],y_pred, color='blue', linewidth=3)

plt.show()

И это график, который я получаю -

введите описание изображения здесь

Я много пробовал искать, но безрезультатно. Я хотел понять, почему это не показывает линию наилучшего соответствия и почему вместо этого он соединяет все точки на диаграмме рассеяния.

Спасибо!

1 Ответ

0 голосов
/ 05 сентября 2020

Предполагая, что ваша графическая библиотека - это 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 on lag_7

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 on rolling_mean

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

Linear regression on expanding_mean

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 регрессией по одной функции за раз.

...