我画了qq图多元回归,得到下面的图。有人可以告诉我为什么红线下有两点吗?这些点对我的模型有影响吗?
我使用下面的代码绘制图形。
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg = reg.fit(x_train,y_train)
pred_reg_GS = reg.predict(x_test)
diff= y_test-pred_reg_GS
import statsmodels.api as sm
sm.qqplot(diff,fit=True,line='45')
plt.show()
最佳答案
看一下Understanding Q-Q Plots,以获取有关QQ图的简明描述。对于您而言,这一部分很重要:
如果两组分位数都来自同一分布,我们应该
看到形成一条大致直线的点。
理论上的一对一关系在图中用红线明确表示。
关于你的问题...
这对我的模型有影响吗?
...可能会认为离该红线较远的一个或两个点离群。这意味着无论您在此处尝试构建的任何模型都无法捕获这些观察的属性。如果我们在这里查看的是回归模型中残差的QQ图,则应仔细查看这两个观察值。这两个是什么使它们在样本的其余部分中脱颖而出? “捕捉”这些离群值的一种方法通常是用一个或两个虚拟变量来表示它们。
编辑1:离群值和伪变量的基本方法
由于您尚未明确标记您的问题sklearn
,因此我自由地使用statsmodels
进行说明。代替您的数据样本,我将使用内置的iris
数据集,其中我们将使用的最后一部分如下所示:
1. sepal_width对sepal_length的线性回归
情节1:
看起来不错!没错但是,让我们通过向数据集中添加一些极值来将其混为一谈。您将在末尾找到完整的代码段。
2.引入异常值
现在,让我们在数据框中添加一行``sepal_width = 8 instead of
3`''。
这将为您提供以下qqplot以及非常清晰的异常值:
这是模型摘要的一部分:
===============================================================================
coef std err t P>|t| [0.025 0.975]
-------------------------------------------------------------------------------
sepal_width 1.8690 0.033 57.246 0.000 1.804 1.934
==============================================================================
Omnibus: 18.144 Durbin-Watson: 0.427
Prob(Omnibus): 0.000 Jarque-Bera (JB): 7.909
Skew: -0.338 Prob(JB): 0.0192
Kurtosis: 2.101 Cond. No. 1.00
==============================================================================
那么为什么这是一个离群值呢?因为我们弄乱了数据集。我无法确定您数据集中离群值的原因。在我们的伪造示例中,如果8个虹膜虹膜具有萼片宽度,其原因可能是很多。也许科学家将其标记为错误?也许根本就不是setosa吗?还是它已经过转基因?现在,与其从样本中丢弃此观察值,不如将其保留在原处,通常会提供更多信息,接受该观察值中有一些特殊之处,并通过包含该观察值
1
的虚拟变量来确切地说明这一点。而0
代表所有其他。现在,数据框的最后一部分应如下所示:3.使用虚拟变量识别异常值
现在,您的qqplot将如下所示:
这是您的模型摘要:
=================================================================================
coef std err t P>|t| [0.025 0.975]
---------------------------------------------------------------------------------
sepal_width 1.4512 0.015 94.613 0.000 1.420 1.482
outlier_dummy -6.6097 0.394 -16.791 0.000 -7.401 -5.819
==============================================================================
Omnibus: 1.917 Durbin-Watson: 2.188
Prob(Omnibus): 0.383 Jarque-Bera (JB): 1.066
Skew: 0.218 Prob(JB): 0.587
Kurtosis: 3.558 Cond. No. 27.0
==============================================================================
请注意,包含虚拟变量会更改
sepal_widht
的系数估计值,还会更改Skewness
和Kurtosis
的值。这就是离群值将对您的模型产生影响的简短版本。完整的代码:
import numpy as np
import pandas as pd
import statsmodels.api as sm
from matplotlib import pyplot as plt
import seaborn as sns
# sample data
df = pd.DataFrame(sns.load_dataset('iris'))
# subset of sample data
df=df[df['species']=='setosa']
# add column for dummy variable
df['outlier_dummy']=0
# append line with extreme value for sepal width
# as well as a dummy variable = 1 for that row.
df.loc[len(df)] = [5,8,1.4, 0.3, 'setosa', 1]
# define independent variables
x=['sepal_width', 'outlier_dummy']
# run regression
mod_fit = sm.OLS(df['sepal_length'], df[x]).fit()
res = mod_fit.resid
fig = sm.qqplot(res)
plt.show()
mod_fit.summary()