Python线性回归:plt.plot()不显示直线。相反,它连接散点图上的每个点

Python线性回归:plt.plot()不显示直线。相反,它连接散点图上的每个点,python,matplotlib,linear-regression,scatter-plot,best-fit,Python,Matplotlib,Linear Regression,Scatter Plot,Best Fit,我对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_me

我对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()
这是我得到的图表-

我试了很多次,但都没有用。我想了解为什么这不是一条最佳拟合线,而是连接散点图上的所有点


谢谢大家!

假设您的图形库是matplotlib,使用导入matplotlib.pyplot作为plt导入,问题是您向
plt.scatter
plt.plot
传递了相同的数据。前者绘制散点图,而后者按照给定的顺序通过所有点(首先在
(x_测试['lag_7'][0]、y_pred[0])
(x_测试['lag_7'][1]、y_pred[1])
之间绘制一条直线,然后在
(x_测试['lag_7'][1]、y_pred[1]和
之间绘制一条直线
等)

关于如何进行多元回归和绘制结果的更一般问题,我有两点意见:

  • 一次找到一个特征的最佳拟合线相当于对该特征执行一维回归:这是一个与您想要执行的多元线性回归完全不同的模型

  • 我认为将数据分成训练样本和测试样本没有多大意义,因为线性回归是一个非常简单的模型,几乎没有过度拟合的风险。在下面,我考虑整个数据集<代码> DF

我喜欢使用OpenTURNS,因为它有内置的线性回归查看功能。缺点是要使用它,我们需要将pandas表(
DataFrame
Series
)转换为类
Sample
的OpenTURNS对象

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线性回归):

如您所见,在本例中,单一特征线性回归都无法非常准确地预测输出

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

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


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

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

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)
在为测试输入的值和从该ie获得的预测值之间绘制图表:

y_pred=regr.predict(x_test)
此外,必须对模型进行相同的训练,否则将得到直线,但结果将出乎意料

这是一个多变量数据,所以你需要得到两两线

或者更改线性相关数据的模型,这将完全更改模型

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

您发布的代码不是独立的代码,它缺少所有的
导入
s,我们没有您的数据。您应该将测试数据
plt.scatter(xtest,ytest)
和线性回归的结果
plt.plot((0,3E6),regr.predict((0,3E6))
plt.plot(x_test,y_pred)
y_pred=regr.predict(x_test)
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()