2

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

这是我得到的图表-

在此处输入图像描述

我尝试了很多搜索但无济于事。我想了解为什么这没有显示一条最佳拟合线,而是为什么它连接了散点图上的所有点。

谢谢!

4

2 回答 2

1

请参阅线性回归意味着,您正在线性预测值,这将始终为您提供最佳拟合线。在您的代码中,其他任何事情都是不可能的:

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

使用正确的变量来绘制线,即:

plt.plot(x_test,y_pred)

在您用于测试的值和从中获得的预测之间绘制图表,即:

y_pred=regr.predict(x_test)

此外,您的模型必须接受相同的训练,否则您会得到直线,但结果会出乎意料。

这是一个多变量数据,因此您需要获得成对线 http://www.sthda.com/english/articles/32-r-graphics-essentials/130-plot-multivariate-continuous-data/#:~:text =wiki%2F3d%2Dgraphics-,Create%20a%20scatter%20plot%20matrix,pairwise%20comparison%20of%20multivariate%20data.&text=Create%20a%20simple%20scatter%20plot%20matrix

或更改模型以获取将完全更改模型的线性相关数据

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['lag_7'],y_train)

y_pred=regr.predict(x_test['lag_7'])

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

plt.show()
于 2021-05-17T09:26:59.107 回答
0

假设您的图形库是 matplotlib,使用 导入import matplotlib.pyplot as plt,问题是您将相同的数据传递给plt.scatterplt.plot。前者绘制散点图,而后者按给定顺序通过所有点的线(它首先在 和 之间绘制一条直线 (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]),等等)

关于如何进行多元回归并绘制结果的更一般的问题,我有两个评论:

  • 一次找到最适合一个特征的线相当于对该特征执行一维回归:它与您要执行的多元线性回归完全不同。

  • 我认为将数据拆分为训练和测试样本没有多大意义,因为线性回归是一个非常简单的模型,过拟合的风险很小。下面,我考虑整个数据集df

我喜欢使用 OpenTURNS,因为它具有内置的线性回归查看工具。缺点是要使用它,我们需要将您的 pandas 表(DataFrameSeries)转换为类的 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'])

现在,让我们一次找到一个特征的最佳拟合线(一维线性回归):

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)

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

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

expand_mean 的线性回归

如您所见,在此示例中,没有一个单特征线性回归能够非常准确地预测输出。

现在让我们进行多元线性回归。要绘制结果,最好查看实际值与预测值。

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

多元线性回归

如您所见,在此示例中,多元线性回归的拟合比一次一个特征的一维回归要好得多。

于 2020-09-05T09:34:38.753 回答