您已经拟合了一个回归模型,R² 看起来不错,系数也合乎直觉。但一张好看的摘要表可能掩盖了严重设定错误的模型。有一个散点图常常能捕捉到数字忽略的东西:残差图。
本文介绍什么是残差图、如何阅读它们、值得了解的模式,以及如何在 Python 和 R 中创建残差图。大多数初学者会完全跳过诊断这一步。看完本文,您就不会了。
什么是残差图?
残差是模型预测与实际发生之间的差:residual = observed − predicted。残差图把这些差值呈现出来。x 轴显示预测(拟合)值或某个解释变量;y 轴显示残差。一条位于零处的水平参考线代表完美预测。
围绕零随机散点:健康的残差图。图片由作者提供。
核心思想是:如果模型较好地刻画了关系,残差应看起来像噪声。围绕零随机分布、没有明显模式。一旦出现形状,模型就在传达仅靠系数无法表达的信息。
如何解读残差图
留意模式。理想情况下,不应有明显模式。这就是根本规则。残差的位置、散布和形状所揭示的内容,才是有趣之处。
位置:散点是否以零为中心?
如果残差在某些拟合值区域位于零线上方、而在另一些区域位于下方,说明模型有偏差。它在某些区域持续高估或低估。这通常指向缺失变量或直线模型无法捕捉的非线性关系。
散布:方差是否大致恒定?
从左到右扫描。如果残差的散布在所有拟合值上大致相同,这是好迹象。如果点随着拟合值增加而向外张开,方差在变化。这称为异方差性 。它不会破坏系数估计,但会使标准误不可靠,这在进行任何假设检验 时很重要。
形状:是否存在曲线或趋势?
平坦且无明显模式是您想要的。U 形或拱形表明模型缺少非线性项。簇或带状提示数据中存在被模型当作一类处理的子群。单个远离其他点的观测值得进一步调查。
常见残差图模式及其含义
四种提示模型问题的残差图模式。图片由作者提供。
围绕零的随机散点
理想结果。点在零线的上方和下方大致均匀分布,没有可辨识趋势,通常表明模型较好地捕捉了关系。一定程度的随机性是预期的。
弯曲的模式
弯曲或拱形的模式通常意味着存在未建模的非线性关系。模型在拟合穿过弯曲数据的直线。修正方法通常是添加多项式项(如 x² )或对自变量进行变换。这是实践中较常见的模式之一,尤其在建模房价或生长类的生物数据时。
漏斗或扇形
残差随着拟合值增大而越分越开:这是异方差性,方差并不恒定。在金融数据中很常见,因预测误差通常会随结果量级而变化。对因变量取对数变换往往是合理的第一步;加权最小二乘也是一种选择。
簇或分组
残差图中出现明显分组通常意味着数据包含模型未考虑的子群体。很可能存在应加入模型的分类变量(地区、处理组、产品类型)。如果您看到两三条紧密的带状点列,从这里入手。
大的孤立残差
单个远离其余点的观测值得一看。它可能是真实的离群点、数据录入错误,或具备异常特征的观测。不要自动删除。先理解其成因。是否保留取决于情境,而非方便与否。
对于这些模式,残差图识别的是症状而非诊断。它告诉您哪里有问题;仍需要弄清楚原因。
残差图可检查哪些回归假设?
在了解这些模式后,值得明确残差图可以、以及不能评估的回归假设。
线性性: 如果自变量与因变量之间的关系确为线性,将残差与拟合值作图时不应出现趋势。曲线或拱形是线性性不成立的直接视觉信号。
方差恒定: 漏斗形正是异方差性的样子。如果散布随拟合值增大而增大,则等方差被违背。残差-拟合值图可能是捕捉这一问题最常用的工具。
独立性: 如果观测具有某种自然顺序(时间、空间、受试者聚类),可以将残差与该顺序作图以检查模式。时间有序图中的残差出现趋势提示自相关。不过,普通的残差-拟合值图不一定能揭示这一点;有时需要专门的残差-顺序图。
离群点和高影响观测: 大的孤立残差会标记模型预测较差的观测。就“影响力”而言,即对回归线有不成比例拉动的观测,“残差 vs. 杠杆值”图比基础残差图更具信息量。
残差图无法可靠评估的一件事是正态性。平坦的残差-拟合值图并不能确认误差服从正态分布。为此,您需要一张Q-Q 图 。这是一处常见混淆点,值得理清。
如何在 Python 中创建残差图
标准流程是使用 scikit-learn 拟合模型并计算残差,再用 matplotlib 可视化。下面是一个在房屋数据上进行简单线性回归的完整示例:
import numpy as np
import matplotlib. pyplot as plt
from sklearn. linear_model import LinearRegression
sqft = np. array( [ 800 , 1000 , 1200 , 1500 , 1800 , 2000 , 2200 , 2500 , 3000 , 3500 ] )
price = np. array( [ 150 , 180 , 210 , 260 , 300 , 330 , 370 , 420 , 500 , 560 ] )
X = sqft. reshape( - 1 , 1 )
model = LinearRegression( )
model. fit( X, price)
predicted = model. predict( X)
residuals = price - predicted
plt. figure( figsize= ( 8 , 5 ) )
plt. scatter( predicted, residuals, color= 'steelblue' , edgecolors= 'white' , s= 80 )
plt. axhline( y= 0 , color= 'red' , linestyle= '--' , linewidth= 1.2 )
plt. xlabel( 'Fitted Values' )
plt. ylabel( 'Residuals' )
plt. title( 'Residual Plot' )
plt. tight_layout( )
plt. show( ) 技术支持
关键一行是 residuals = price - predicted。axhline() 的调用添加了零参考线;没有它,图会难读得多。如果这个输出大致看起来没有模式,说明情况还不错。注意在较高的拟合值处残差更大。只有 10 个点,很难确认,但这暗示了前面讨论过的扇形趋势。
想更深入了解 Python 回归,请参阅我们的 Introduction to Regression with statsmodels in Python 课程,详细讲解模型拟合、假设检查与结果解读。
如何在 R 中创建残差图
R 的原生支持让这一步更容易。用 lm() 拟合模型后,内置的 plot() 函数会自动生成完整的诊断面板,其中包含残差-拟合值图。
sqft <- c( 800 , 1000 , 1200 , 1500 , 1800 , 2000 , 2200 , 2500 , 3000 , 3500 )
price <- c( 150 , 180 , 210 , 260 , 300 , 330 , 370 , 420 , 500 , 560 )
housing_model <- lm( price ~ sqft)
plot( housing_model, which = 1 ) 技术支持
参数 which = 1 只绘制残差-拟合值图。若不指定,您将得到四个标准诊断图:残差 vs. 拟合值、Q-Q、尺度-位置,以及残差 vs. 杠杆值。当您想快速获得完整图景时很有用。R 还会按索引标注最极端的三个点,免去手动寻找离群点的麻烦。
想完整学习 R 中的回归,我们的 Introduction to Regression in R 课程自基础起讲解模型构建与诊断。
残差图与其他回归诊断图的比较
残差-拟合值图是起点,而非全貌。若干相关图可回答不同的问题。
残差图 vs. Q-Q 图
残差-拟合值图用于检查线性性和方差恒定。Q-Q 图用于检查正态性,即残差是否服从正态分布。这是两个不同问题。残差图看起来干净并不保证正态性,而 Q-Q 图也无法告诉您关于方差的信息。二者通常都需要。
两种不同的图,对模型提出两种不同的问题。图片由作者提供。
残差图 vs. 尺度-位置图
尺度-位置图(也称扩散-位置图)将绝对标准化残差的平方根与拟合值作图。它旨在检测异方差性,并且通常比原始残差图更容易识别漏斗形,因为它去除了残差的正负号,专注于散布。
残差图 vs. 残差-杠杆值图
杠杆值衡量的是观测自变量取值有多不寻常,而非模型对其预测有多差。高杠杆值叠加大残差可能是具有影响力的观测。残差-杠杆值图能识别这些组合,并通常按名称高亮最有问题的点。如果您担心高影响观测扭曲模型,请查看此图。
当残差图显示问题时该怎么办
残差图是诊断工具,而非裁决。出现模式并不意味着模型无用。以下是常见模式与后续步骤的对应:
弯曲模式: 考虑添加多项式项或对自变量进行变换。对 x 取对数或加入 x² 项常能把关系拉直。
漏斗形: 尝试对因变量进行对数或平方根变换。若无效,加权最小二乘可降低噪声更大的观测的影响力。
大的孤立残差: 调查该观测。先检查是否为数据录入错误。若点是合法的,考虑模型是否需要纳入导致其异常的因素。
簇或分组: 寻找尚未纳入的分类变量。有时为子群分别建模才是正解。
残差图显示的是症状。它不会告诉您确切原因,而且单一模式有时可能对应多种解释。把它当作提出更好问题的触发器。
阅读残差图的常见误区
期待完全随机的 图: 真实数据是杂乱的。少量不合群的点、轻微的不对称、在极端处的一些聚集:这些都很正常。问题不在于图是否“完美随机”,而在于是否存在可被更好模型消除的系统性模式。
把每个离群点都当作坏数据: 大残差意味着模型对该观测预测不佳。不代表该观测是错误的。有时离群点是数据集中最有意思的点。只有在理解其成因后再考虑删除。
认为残差图能证明正态性: 并不能。干净的残差-拟合值图告诉您线性性和方差恒定。正态性需要 Q-Q 图。这两种诊断是互补而非可替换的。
脱离背景读图: 时间序列模型的残差图应与横截面数据的残差图区别解读。何谓“令人担忧的模式”取决于数据结构、样本量以及模型用途。在预测模型中值得修复的模式,在探索性分析中可能可以忽略。
结论
拟合模型、查看摘要、对 R² 感到满意:大多数人到此为止。残差图是此后要看的内容,它常常讲述不同的故事。围绕零的随机散点是您想要的。曲线、漏斗、分组以及极端的孤立点,各自都提示模型尚未考虑到的因素。
没有一张图能给出全貌。将残差-拟合值图与 Q-Q 图(正态性)、尺度-位置图(方差)配合使用;若关心高影响观测,再看杠杆值图。每一张图都在回答不同的问题。
如果想进一步学习,我们的Intermediate Regression with statsmodels in Python 课程深入讲解假设检验,包括当诊断图标记出问题时如何应对。若想更全面理解回归假设与模型评估,我们的 Python 线性回归假设教程是一个自然的下一步阅读。
您已经拟合了一个回归模型,R² 看起来不错,系数也合乎直觉。但一张好看的摘要表可能掩盖了严重设定错误的模型。有一个散点图常常能捕捉到数字忽略的东西:残差图。
本文介绍什么是残差图、如何阅读它们、值得了解的模式,以及如何在 Python 和 R 中创建残差图。大多数初学者会完全跳过诊断这一步。看完本文,您就不会了。
什么是残差图?
残差是模型预测与实际发生之间的差:residual = observed − predicted。残差图把这些差值呈现出来。x 轴显示预测(拟合)值或某个解释变量;y 轴显示残差。一条位于零处的水平参考线代表完美预测。
围绕零随机散点:健康的残差图。图片由作者提供。
核心思想是:如果模型较好地刻画了关系,残差应看起来像噪声。围绕零随机分布、没有明显模式。一旦出现形状,模型就在传达仅靠系数无法表达的信息。
如何解读残差图
留意模式。理想情况下,不应有明显模式。这就是根本规则。残差的位置、散布和形状所揭示的内容,才是有趣之处。
位置:散点是否以零为中心?
如果残差在某些拟合值区域位于零线上方、而在另一些区域位于下方,说明模型有偏差。它在某些区域持续高估或低估。这通常指向缺失变量或直线模型无法捕捉的非线性关系。
散布:方差是否大致恒定?
从左到右扫描。如果残差的散布在所有拟合值上大致相同,这是好迹象。如果点随着拟合值增加而向外张开,方差在变化。这称为异方差性。它不会破坏系数估计,但会使标准误不可靠,这在进行任何假设检验时很重要。
形状:是否存在曲线或趋势?
平坦且无明显模式是您想要的。U 形或拱形表明模型缺少非线性项。簇或带状提示数据中存在被模型当作一类处理的子群。单个远离其他点的观测值得进一步调查。
常见残差图模式及其含义
四种提示模型问题的残差图模式。图片由作者提供。
围绕零的随机散点
理想结果。点在零线的上方和下方大致均匀分布,没有可辨识趋势,通常表明模型较好地捕捉了关系。一定程度的随机性是预期的。
弯曲的模式
弯曲或拱形的模式通常意味着存在未建模的非线性关系。模型在拟合穿过弯曲数据的直线。修正方法通常是添加多项式项(如 x²)或对自变量进行变换。这是实践中较常见的模式之一,尤其在建模房价或生长类的生物数据时。
漏斗或扇形
残差随着拟合值增大而越分越开:这是异方差性,方差并不恒定。在金融数据中很常见,因预测误差通常会随结果量级而变化。对因变量取对数变换往往是合理的第一步;加权最小二乘也是一种选择。
簇或分组
残差图中出现明显分组通常意味着数据包含模型未考虑的子群体。很可能存在应加入模型的分类变量(地区、处理组、产品类型)。如果您看到两三条紧密的带状点列,从这里入手。
大的孤立残差
单个远离其余点的观测值得一看。它可能是真实的离群点、数据录入错误,或具备异常特征的观测。不要自动删除。先理解其成因。是否保留取决于情境,而非方便与否。
对于这些模式,残差图识别的是症状而非诊断。它告诉您哪里有问题;仍需要弄清楚原因。
残差图可检查哪些回归假设?
在了解这些模式后,值得明确残差图可以、以及不能评估的回归假设。
残差图无法可靠评估的一件事是正态性。平坦的残差-拟合值图并不能确认误差服从正态分布。为此,您需要一张Q-Q 图。这是一处常见混淆点,值得理清。
如何在 Python 中创建残差图
标准流程是使用 scikit-learn 拟合模型并计算残差,再用 matplotlib 可视化。下面是一个在房屋数据上进行简单线性回归的完整示例:
关键一行是
residuals = price - predicted。axhline()的调用添加了零参考线;没有它,图会难读得多。如果这个输出大致看起来没有模式,说明情况还不错。注意在较高的拟合值处残差更大。只有 10 个点,很难确认,但这暗示了前面讨论过的扇形趋势。想更深入了解 Python 回归,请参阅我们的Introduction to Regression with statsmodels in Python课程,详细讲解模型拟合、假设检查与结果解读。
如何在 R 中创建残差图
R 的原生支持让这一步更容易。用
lm()拟合模型后,内置的plot()函数会自动生成完整的诊断面板,其中包含残差-拟合值图。参数
which = 1只绘制残差-拟合值图。若不指定,您将得到四个标准诊断图:残差 vs. 拟合值、Q-Q、尺度-位置,以及残差 vs. 杠杆值。当您想快速获得完整图景时很有用。R 还会按索引标注最极端的三个点,免去手动寻找离群点的麻烦。想完整学习 R 中的回归,我们的Introduction to Regression in R课程自基础起讲解模型构建与诊断。
残差图与其他回归诊断图的比较
残差-拟合值图是起点,而非全貌。若干相关图可回答不同的问题。
残差图 vs. Q-Q 图
残差-拟合值图用于检查线性性和方差恒定。Q-Q 图用于检查正态性,即残差是否服从正态分布。这是两个不同问题。残差图看起来干净并不保证正态性,而 Q-Q 图也无法告诉您关于方差的信息。二者通常都需要。
两种不同的图,对模型提出两种不同的问题。图片由作者提供。
残差图 vs. 尺度-位置图
尺度-位置图(也称扩散-位置图)将绝对标准化残差的平方根与拟合值作图。它旨在检测异方差性,并且通常比原始残差图更容易识别漏斗形,因为它去除了残差的正负号,专注于散布。
残差图 vs. 残差-杠杆值图
杠杆值衡量的是观测自变量取值有多不寻常,而非模型对其预测有多差。高杠杆值叠加大残差可能是具有影响力的观测。残差-杠杆值图能识别这些组合,并通常按名称高亮最有问题的点。如果您担心高影响观测扭曲模型,请查看此图。
当残差图显示问题时该怎么办
残差图是诊断工具,而非裁决。出现模式并不意味着模型无用。以下是常见模式与后续步骤的对应:
残差图显示的是症状。它不会告诉您确切原因,而且单一模式有时可能对应多种解释。把它当作提出更好问题的触发器。
阅读残差图的常见误区
结论
拟合模型、查看摘要、对 R² 感到满意:大多数人到此为止。残差图是此后要看的内容,它常常讲述不同的故事。围绕零的随机散点是您想要的。曲线、漏斗、分组以及极端的孤立点,各自都提示模型尚未考虑到的因素。
没有一张图能给出全貌。将残差-拟合值图与 Q-Q 图(正态性)、尺度-位置图(方差)配合使用;若关心高影响观测,再看杠杆值图。每一张图都在回答不同的问题。
如果想进一步学习,我们的Intermediate Regression with statsmodels in Python课程深入讲解假设检验,包括当诊断图标记出问题时如何应对。若想更全面理解回归假设与模型评估,我们的 Python 线性回归假设教程是一个自然的下一步阅读。