Python线性回归:plt.plot()不显示直线。相反,它连接散点图上的每个点
我对python比较陌生。我试图做多元线性回归,绘制散点图和最佳拟合线,每次使用一个特征 这是我的代码: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
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()