04 回归分析——《数据挖掘(主编:吕欣 王梦宁)》读书笔记

本文为《数据挖掘(主编:吕欣 王梦宁)》中“回归分析”相关内容的读书笔记,主要整理回归分析的基本思想、常用评价指标、线性回归模型、统计检验、多重共线性、岭回归、LASSO 回归以及非线性回归等内容。


一、回归分析概述

回归分析是数据挖掘中常用的预测建模方法,主要用于研究一个或多个自变量与连续型因变量之间的数量关系。

与分类问题不同,回归问题的输出结果通常是具体数值。例如,房价预测、销售额预测、温度预测、客流量预测等,都属于典型的回归分析问题。

从应用角度来看,回归分析不仅可以用于预测,还可以用于解释变量之间的关系。例如,在研究广告投入对销售额的影响时,回归模型不仅可以预测未来销售额,还可以帮助判断广告投入是否对销售额具有显著影响。

因此,回归分析既具有预测功能,也具有解释功能,是数据分析和数据挖掘中的重要基础方法。


二、回归模型的常用评价指标

在回归分析中,模型建立完成后,需要通过一定的评价指标来衡量模型的拟合效果和预测误差。常见的评价指标包括判定系数、平均绝对误差、均方根误差和平均绝对百分比误差等。


1. 判定系数 R²

判定系数用于衡量模型对因变量变化的解释程度,其公式为:

R2=1−RSSTSS R^2 = 1 - \frac{RSS}{TSS} R2=1TSSRSS

其中:

TSS=∑i=1N(yi−yˉ)2 TSS = \sum_{i=1}^{N}(y_i-\bar{y})^2 TSS=i=1N(yiyˉ)2

RSS=∑i=1N(yi−yi^)2 RSS = \sum_{i=1}^{N}(y_i-\hat{y_i})^2 RSS=i=1N(yiyi^)2

TSSTSSTSS 表示总平方和,RSSRSSRSS 表示残差平方和。

一般情况下,R2R^2R2 的取值越接近 1,说明模型对数据的解释能力越强;越接近 0,则说明模型解释能力较弱。

在 Python 中,可以使用如下方法计算:

from sklearn.metrics import r2_score

r2 = r2_score(y_true, y_pred)

需要注意的是,R2R^2R2 并不能单独说明模型一定优秀。尤其是在多元线性回归中,随着自变量数量增加,R2R^2R2 往往会升高,即使新增变量本身并没有实际解释意义。因此,在多元回归中通常还需要关注调整后的判定系数。


2. 调整后的判定系数

调整后的判定系数可以在考虑变量数量的基础上评价模型拟合效果,其公式为:

Rˉ2=1−RSS/(N−p−1)TSS/(N−1) \bar{R}^2 = 1 - \frac{RSS/(N-p-1)}{TSS/(N-1)} Rˉ2=1TSS/(N1)RSS/(Np1)

其中,NNN 表示样本数量,ppp 表示自变量个数。

与普通 R2R^2R2 相比,调整后的 R2R^2R2 会对模型复杂度进行惩罚。因此,当新增变量对模型解释能力贡献不大时,调整后的 R2R^2R2 不一定会升高。


3. 平均绝对误差 MAE

平均绝对误差用于衡量预测值与真实值之间的平均绝对偏差,其公式为:

MAE=1N∑i=1N∣yi^−yi∣ MAE = \frac{1}{N}\sum_{i=1}^{N}\left|\hat{y_i}-y_i\right| MAE=N1i=1Nyi^yi

MAE 的含义比较直观,表示模型平均每个样本预测偏差多少。由于它使用的是绝对值,因此相比平方误差,MAE 对异常值没有那么敏感。

Python 中可以使用:

from sklearn.metrics import mean_absolute_error

mae = mean_absolute_error(y_true, y_pred)

4. 均方根误差 RMSE

均方根误差是回归任务中常用的误差指标,其公式为:

RMSE=1N∑i=1N(yi^−yi)2 RMSE = \sqrt{\frac{1}{N}\sum_{i=1}^{N}(\hat{y_i}-y_i)^2} RMSE=N1i=1N(yi^yi)2

由于误差在计算过程中被平方,因此 RMSE 会更加关注较大的预测误差。当模型出现较大偏差时,RMSE 会比 MAE 更敏感。

Python 中可以使用:

from sklearn.metrics import mean_squared_error

rmse = mean_squared_error(y_true, y_pred, squared=False)

如果使用较新版本的 sklearn,也可以使用:

from sklearn.metrics import root_mean_squared_error

rmse = root_mean_squared_error(y_true, y_pred)

5. 平均绝对百分比误差 MAPE

平均绝对百分比误差用于从百分比角度衡量模型误差,其公式为:

MAPE=1N∑i=1N∣yi^−yiyi∣ MAPE = \frac{1}{N}\sum_{i=1}^{N}\left|\frac{\hat{y_i}-y_i}{y_i}\right| MAPE=N1i=1N yiyi^yi

MAPE 的优点是具有相对误差意义,可以用于比较不同量纲或不同规模的数据。

但是,当真实值 yiy_iyi 很小甚至接近 0 时,MAPE 可能会被异常放大,因此并不适合所有回归场景。

Python 中可以使用:

from sklearn.metrics import mean_absolute_percentage_error

mape = mean_absolute_percentage_error(y_true, y_pred)

三、一元线性回归

一元线性回归用于研究一个自变量与一个因变量之间的线性关系,其模型形式为:

y=β0+β1x+ε y = \beta_0 + \beta_1x + \varepsilon y=β0+β1x+ε

其中,β0\beta_0β0 表示截距项,β1\beta_1β1 表示回归系数,ε\varepsilonε 表示随机误差项。

一元线性回归的核心思想是寻找一条最合适的直线,使样本点到该直线的整体偏差尽可能小。通常情况下,模型参数可以通过最小二乘法进行估计。

使用 Python 建立线性回归模型时,可以使用 statsmodels

import statsmodels.api as sm

X = sm.add_constant(X)
model = sm.OLS(y, X).fit()

print(model.summary())

其中,sm.add_constant(X) 用于添加截距项,sm.OLS(y, X) 用于建立普通最小二乘回归模型。


四、线性回归模型的基本假设

线性回归模型的有效性依赖于若干基本假设。如果这些假设不满足,模型的参数估计和统计检验结果可能会受到影响。


1. 线性关系假设

自变量与因变量之间应当具有近似线性关系。如果变量之间明显呈现非线性关系,直接使用线性回归可能会导致模型拟合效果较差。


2. 误差项期望为 0

误差项的期望应为 0,即:

E(ε)=0 E(\varepsilon)=0 E(ε)=0

这表示模型的预测误差在整体上不应存在系统性偏高或偏低。


3. 方差齐性假设

误差项应具有恒定方差,即:

D(ε)=σ2 D(\varepsilon)=\sigma^2 D(ε)=σ2

如果不同自变量取值下残差波动差异较大,就可能存在异方差问题。异方差会影响参数估计的有效性和显著性检验结果。


4. 独立性假设

误差项之间应相互独立,不能存在明显相关性。在时间序列数据中,如果相邻时间点的误差存在相关关系,就可能出现自相关问题。


5. 正态性假设

在进行统计推断时,通常要求误差项近似服从正态分布:

ε∼N(0,σ2) \varepsilon \sim N(0,\sigma^2) εN(0,σ2)

正态性假设主要影响 t 检验和 F 检验等统计推断过程。


五、一元线性回归模型的统计检验

建立回归模型后,需要进一步判断模型是否具有统计意义。常见的检验包括拟合优度检验、F 检验和 t 检验。


1. 拟合优度检验

拟合优度通常使用判定系数 R2R^2R2 衡量:

R2=1−RSSTSS R^2 = 1 - \frac{RSS}{TSS} R2=1TSSRSS

它主要用于判断模型能够解释多少因变量的变化。


2. F 检验

F 检验用于判断整体回归模型是否显著。对于一元线性回归,其统计量为:

F=ESS/1RSS/(N−2) F = \frac{ESS/1}{RSS/(N-2)} F=RSS/(N2)ESS/1

其中,ESSESSESS 表示回归平方和,RSSRSSRSS 表示残差平方和,NNN 表示样本数量。

F 检验的主要作用是判断解释变量与被解释变量之间是否存在线性关系。如果 F 检验显著,说明模型整体具有统计意义。


3. t 检验

t 检验用于判断单个回归系数是否显著不为 0。对于一元线性回归,t 检验主要用于检验自变量 xxx 是否对因变量 yyy 具有显著影响。

t 检验的基本思想是:如果某个回归系数显著不为 0,则说明该自变量对因变量具有显著解释作用。


六、多元线性回归

当因变量受到多个自变量共同影响时,可以使用多元线性回归模型。其基本形式为:

y=β0+β1x1+β2x2+⋯+βpxp+ε y = \beta_0 + \beta_1x_1 + \beta_2x_2 + \cdots + \beta_px_p + \varepsilon y=β0+β1x1+β2x2++βpxp+ε

其中,ppp 表示自变量个数。

多元线性回归相比一元线性回归更适合处理复杂现实问题。例如,房价可能同时受到面积、地段、楼层、交通条件、周边配套等多个因素影响。

Python 建模方式如下:

import statsmodels.api as sm

X = sm.add_constant(X)
model = sm.OLS(y, X).fit()

print(model.summary())

七、多元线性回归模型的统计检验


1. 调整后的拟合优度检验

在多元线性回归中,普通 R2R^2R2 容易随着变量数量增加而升高。因此,通常需要结合调整后的 R2R^2R2 判断模型拟合效果:

Rˉ2=1−RSS/(N−p−1)TSS/(N−1) \bar{R}^2 = 1 - \frac{RSS/(N-p-1)}{TSS/(N-1)} Rˉ2=1TSS/(N1)RSS/(Np1)

如果加入新变量后调整后的 R2R^2R2 提高,说明该变量对模型具有一定贡献;如果调整后的 R2R^2R2 下降,则说明该变量可能没有提供有效解释信息。


2. F 检验

多元线性回归中的 F 检验用于判断模型整体是否显著,其统计量为:

F=ESS/pRSS/(N−p−1) F = \frac{ESS/p}{RSS/(N-p-1)} F=RSS/(Np1)ESS/p

其中,ppp 表示自变量个数,NNN 表示样本数量。

F 检验关注的是所有解释变量作为一个整体是否对因变量具有显著解释作用。


3. t 检验

t 检验用于判断每个自变量的回归系数是否显著。其基本形式为:

tj=βj^cjjσ^ t_j = \frac{\hat{\beta_j}}{\sqrt{c_{jj}}\hat{\sigma}} tj=cjj σ^βj^

其中,cjjc_{jj}cjj 为矩阵 (XTX)−1(X^TX)^{-1}(XTX)1 对角线上的对应元素。

在实际分析中,某个变量的 t 检验显著,说明在控制其他变量后,该变量仍然对因变量具有显著影响。


八、多重共线性

多重共线性是多元线性回归中常见的问题,指的是自变量之间存在较强的线性相关关系。

例如,在研究城市经济发展水平时,如果同时选取 GDP、人均收入、消费水平、就业规模等变量,这些变量之间可能高度相关。此时模型虽然可能具有较高的拟合优度,但单个变量的回归系数可能变得不稳定。


1. 多重共线性的危害

多重共线性可能带来以下问题:

  1. 回归系数估计不稳定;
  2. 模型对样本变化非常敏感;
  3. 单个变量的显著性检验可能失效;
  4. 难以判断每个自变量对因变量的独立影响;
  5. 回归系数可能出现与实际逻辑不一致的方向。

因此,在多元线性回归中,不能只关注模型拟合效果,还需要检查自变量之间是否存在严重共线性。


2. 多重共线性的判断方法

常用的判断方法是方差膨胀因子,即 VIF。

对于某个自变量 xjx_jxj,可以将其作为因变量,其他自变量作为解释变量进行回归,得到对应的判定系数 Rj2R_j^2Rj2,然后计算:

VIFj=11−Rj2 VIF_j = \frac{1}{1-R_j^2} VIFj=1Rj21

一般认为,当 VIFj≥10VIF_j \geq 10VIFj10 时,说明该变量与其他自变量之间可能存在较严重的多重共线性。

Python 中可以使用:

from statsmodels.stats.outliers_influence import variance_inflation_factor

vif = variance_inflation_factor(X.values, j)

3. 多重共线性的处理方法

处理多重共线性可以从以下几个方面入手:

第一,可以删除高度相关且理论意义较弱的变量。

第二,可以使用向前选择、向后剔除或逐步回归等变量筛选方法。

第三,可以适当增加样本数量,提高参数估计的稳定性。

第四,可以使用正则化回归方法,例如岭回归和 LASSO 回归。


九、岭回归

岭回归是在普通最小二乘回归的基础上加入 L2 正则化项,其目标函数为:

min⁡β{∑i=1N(yi−yi^)2+λ∑j=1pβj2} \min_{\beta}\left\{\sum_{i=1}^{N}(y_i-\hat{y_i})^2 + \lambda\sum_{j=1}^{p}\beta_j^2\right\} βmin{i=1N(yiyi^)2+λj=1pβj2}

其中,λ\lambdaλ 为岭参数,用于控制正则化强度。

岭回归通过压缩回归系数,可以降低模型对样本扰动的敏感性,从而缓解多重共线性问题。

Python 中可以使用:

from sklearn.linear_model import Ridge

model = Ridge(alpha=1.0)
model.fit(X_train, y_train)

1. 岭参数的选择

岭参数 λ\lambdaλ 的选择非常重要。如果 λ\lambdaλ 太小,正则化作用不明显;如果 λ\lambdaλ 太大,模型可能欠拟合。

常见的选择方法包括:

  1. 岭迹法;
  2. 交叉验证法。

其中,交叉验证法更加常用,可以通过比较不同参数下模型在验证集上的表现,选择效果最好的参数。


2. 岭回归的特点

岭回归的优点是可以缓解多重共线性,提高模型稳定性。

但是,岭回归通常只能将回归系数压缩到接近 0,而不能真正压缩为 0。因此,岭回归不能直接实现变量筛选。


十、LASSO 回归

LASSO 回归是在普通最小二乘回归的基础上加入 L1 正则化项,其目标函数为:

min⁡β{∑i=1N(yi−yi^)2+λ∑j=1p∣βj∣} \min_{\beta}\left\{\sum_{i=1}^{N}(y_i-\hat{y_i})^2 + \lambda\sum_{j=1}^{p}\left|\beta_j\right|\right\} βmin{i=1N(yiyi^)2+λj=1pβj}

与岭回归不同,LASSO 回归可以将部分回归系数压缩为 0,因此具有变量筛选功能。

Python 中可以使用:

from sklearn.linear_model import Lasso

model = Lasso(alpha=1.0)
model.fit(X_train, y_train)

1. LASSO 回归的特点

LASSO 回归适用于特征数量较多、变量之间存在共线性,且需要进行变量筛选的场景。

它的优点是可以简化模型结构,提高模型解释性。

但是,当多个变量之间高度相关时,LASSO 可能只保留其中一个变量,而忽略其他相关变量。因此,在使用 LASSO 时,也需要结合实际问题背景进行判断。


2. 岭回归与 LASSO 回归的区别

岭回归和 LASSO 回归都属于正则化回归方法,但二者的作用重点不同。

岭回归使用 L2 正则化,主要作用是压缩系数、提高模型稳定性,但一般不会使系数变为 0。

LASSO 回归使用 L1 正则化,既可以压缩系数,也可以将部分系数压缩为 0,因此具有变量筛选能力。

简单来说,岭回归更适合解决模型不稳定问题,LASSO 回归更适合进行特征选择。


十一、非线性回归

现实中的变量关系并不总是线性的。有时,自变量与因变量之间可能呈现曲线关系,例如指数关系、对数关系、幂函数关系等。此时,可以考虑使用非线性回归模型。

非线性回归可以分为两类:

第一类是本质线性模型。这类模型虽然表面上是非线性的,但可以通过变量变换转化为线性模型。例如,对数变换、平方项变换、多项式变换等。

第二类是本质非线性模型。这类模型无法通过简单变换转化为线性形式,需要通过非线性优化方法估计参数。

Python 中可以使用 scipy.optimize 中的 curve_fit 函数进行非线性拟合:

from scipy.optimize import curve_fit

params, covariance = curve_fit(func, x_data, y_data)

其中,func 是自定义的非线性函数,x_datay_data 分别为自变量和因变量数据。


十二、本章学习总结

通过本章学习可以发现,回归分析并不是简单地调用模型进行预测,而是一个较为完整的分析过程。

一个完整的回归分析通常包括:明确研究问题、选择变量、建立模型、评价误差、进行统计检验、诊断模型问题以及优化模型结果。

在实际应用中,模型的拟合效果并不是唯一标准。即使一个模型具有较高的 R2R^2R2,如果存在严重的多重共线性,其变量解释结果也可能不可靠。类似地,如果模型误差较小,但残差分布不合理,也说明模型仍然存在改进空间。

因此,回归分析既要关注预测精度,也要关注模型解释性和结果稳定性。对于数据挖掘任务而言,回归分析是一类非常基础但重要的方法。它不仅能够帮助我们进行数值预测,还能够帮助我们理解变量之间的关系。

本章内容使我认识到,建模过程不能只依赖算法结果,还需要结合统计检验、数据特征和实际问题背景进行综合判断。只有这样,才能建立更加可靠、合理且具有解释意义的回归模型。


十三、个人理解

我认为回归分析的核心不只是“拟合一条线”或者“得到一个预测值”,而是通过模型去理解变量之间的数量关系。

在学习这一章之前,我更容易把回归模型看作一种预测工具。但通过本章内容可以发现,回归分析还包含很多统计推断思想。例如,F 检验关注模型整体是否显著,t 检验关注单个变量是否显著,多重共线性分析关注变量之间是否存在干扰。

这说明,在实际数据分析中,模型结果不能只看误差指标,还要结合模型假设和统计检验进行判断。

尤其是在多元线性回归中,自变量越多并不一定代表模型越好。如果变量之间存在较强相关性,模型可能会出现系数不稳定、解释困难等问题。因此,变量选择和模型诊断同样重要。

总体来看,回归分析是连接统计分析和数据挖掘的重要方法。它既可以用于预测,也可以用于解释,是后续学习机器学习算法的重要基础。


参考代码汇总

# R2
from sklearn.metrics import r2_score

r2 = r2_score(y_true, y_pred)
# MAE
from sklearn.metrics import mean_absolute_error

mae = mean_absolute_error(y_true, y_pred)
# RMSE
from sklearn.metrics import mean_squared_error

rmse = mean_squared_error(y_true, y_pred, squared=False)
# MAPE
from sklearn.metrics import mean_absolute_percentage_error

mape = mean_absolute_percentage_error(y_true, y_pred)
# OLS 回归
import statsmodels.api as sm

X = sm.add_constant(X)
model = sm.OLS(y, X).fit()

print(model.summary())
# VIF
from statsmodels.stats.outliers_influence import variance_inflation_factor

vif = variance_inflation_factor(X.values, j)
# 岭回归
from sklearn.linear_model import Ridge

model = Ridge(alpha=1.0)
model.fit(X_train, y_train)
# LASSO 回归
from sklearn.linear_model import Lasso

model = Lasso(alpha=1.0)
model.fit(X_train, y_train)
# 非线性回归
from scipy.optimize import curve_fit

params, covariance = curve_fit(func, x_data, y_data)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐