之前我们谈到的几乎所有任务都是在预测分类标签,而我们要尝试换个角度,来看看如果想要预测一个特定的数值,应该怎么做。
Regression 正是用来预测数值的机器学习方法,我们叫它回归。我们不仅能够使用回归来预测特定数字,回归还能帮助我们理解变量之间的关联强度。我们先从最基础的线性模型开始,逐步深入到更复杂的模型,学习如何在真正的实现中处理那些带有噪声和异常值的数据。
什么是回归?
在回归问题中,我们的目标是将一个或者多个 特征 (Feature) 与一个 连续目标变量 (Continuous Target Variable) 建立数学关系。
在之前的分类任务中,我们预测的是 类别标签 (Class Label),例如是否,而回归任务旨在预测一个在连续尺度上的输出。如果我们想预测明天的天气是阴天还是晴天,那么我们可以使用分类模型;但如果我们想预测明天的温度是多少度,那么我们就需要使用回归模型。
我们可以先从最基础的,只建模一个特征的 简单线性回归 (Simple Linear Regression) 开始讲起,先了解了解最基础的内容吧。
简单线性回归
从数学逻辑上来看,回归本质上是在寻找一个函数 $f(x)$,使得它能够尽可能地准确地映射特征向量 $x$ 到目标变量 $y$。
简单线性回归是回归分析中最基本的形式,它试图通过一个线性函数来描述一个特征与目标变量之间的关系。如果我们假设特征 $x$ 和目标变量 $y$ 之间的关系是线性的,那么我们可以用以下的方程来表示:
$$y = w_0 + w_1 x$$
其中,$w_1$ 代表了斜率,反应每当 $x$ 变动一个单位时,$y$ 的变化量;$w_0$ 则是截距,表示当 $x=0$ 时 $y$ 的值。
然而我们在现实生活中处理的数据肯定不可能完全符合这个线性关系,数据中会存在一些噪声和异常值,这导致数据点一定不可能能够精准落到一条直线上。因此:

如图所示,线性回归的本质是尝试寻找一条最优拟合线。
当我们在图中画出这条回归线的时候,每个样本到这条线的垂直距离叫做垂直偏移,一般叫做 残差 (Residual error)。残差可以用来衡量模型预测得准不准,残差总和越小,说明模型的拟合效果越好。而为了能够最大化模型的拟合效果,我们追求的是让预测值能够尽可能贴近真实观测值,从而最小化误差总和。
多元线性回归
而实际上我们刚才说到的简单线性回归,算是 多元线性回归 (Multiple Linear Regression) 下的一种特例。现实生活中单纯只有一个特征的情况是非常少见的,我们通常会有多个特征来描述一个样本,那么我们就需要使用多元线性回归来建模了。
显而易见,当我们拥有多个特征的时候,回归方程就会演变成多个特征的加权和:
$$y = w_0x_0 + w_1 x_1 + w_2 x_2 + \ldots + w_n x_n$$
而为了数学表达的间接性,我们通常约定 $x_0 = 1$,这样截距项就能够很优雅得包含在向量运算中:
$$y = \mathbf{w}^\top \mathbf{x}$$
其中, $\mathbf{w}$ 是权重向量,里面包含了 $w_0, w_1, \ldots, w_n$ 这些所有的特征系数,而 $\mathbf{x}$ 是特征向量,包含了 $x_0, x_1, \ldots, x_n$ 这些特征值。
这可以解释为模型对不同特征重要性的“评估”。如果某个特征的权重 $w_i$ 比较大,且为正,那么说明这个特征与目标强相关;而如果接近0,那么代表这个特征对目标的影响较小。
简单线性回归可以在一个二维坐标轴上进行表示,因为它只包含一个特征和一个目标变量。而想要表示多元线性回归,我们需要在更高维的空间中进行可视化:

就比如上图展示的那样:如果我们有两个特征,那么我们的预测结果就会落在一个特征空间上方的一个平滑面上。
多元线性回归实战
了解了理论,我们来看看在真实的数据集上,多元线性回归是如何工作的。
我们使用波士顿房屋数据集来进行演示。这个数据集包含了自1978年以来波士顿地区的房价信息,总共有506个样本,其中每个样本有13个特征和一个目标变量(房价)。为了简洁,我们在这里仅关注里面的某几个特征:
- LSTAT: 低收入人群比例
- INDUS: 城镇非零售商用土地的比例
- NOX: 一氧化氮浓度
- RM: 每个住宅的平均房间数
最后我们尝试将 MEDV 通过上面的几个特征进行建模,看看能不能预测出房价。
EDA
在正式给模型喂数据,运行回归算法之前,我们首先需要对数据进行一些摸底排查。这在数据科学中有一个专有名词,叫做 探索性数据分析 (Exploratory Data Analysis, EDA)。
由于我们说过,现实世界中的数据往往充斥着噪声,所以在这一步,我们使用可视化的手段,来初步了解一些数据的情况:有没有异常值,数据的分布是否偏斜,以及最重要的一点,初步判断各个特征与目标变量之间是否存在某种线性或者非线性的关系。
散点图矩阵
而达成EDA手段的一个重要工具叫做 散点图矩阵 (Scatterplot Matrix)。与其说我们一个一个画图,不如我们直接将所有的特征和目标变量都放在一个矩阵里,来看看它们之间的关系。下面是一个散点图矩阵的示例:

如图所见,各个特征按照从上到下,从左到右的顺序排列在矩阵的行和列上。但是想要读懂矩阵究竟在表示什么,我们需要线了解什么是 Pearson 相关系数。
Pearson's r,也叫做 Pearson 相关系数,是用来衡量两个变量之间线性关系强度的统计指标。它的取值范围在 -1 到 1 之间。下图展示了 Pearson 相关系数在不同数据分布下的取值:

如果两个变量之间存在完全正相关关系,也就是随着A的增加,B也会增加,那么 Pearson's r 就等于1;反之如果存在完全负相关关系,也就是随着A的增加,B会减少,那么 Pearson's r 就等于-1。
如果两个数据之间没有这么绝对的关系,那么如果是正相关,取值会在0到1之间;如果是负相关,取值会在-1到0之间。
最后,如果两个变量之间完全没有线性关系,那么 Pearson's r 就等于0。
Pearson's r 的计算本质上是两个特征的协方差除以它们的标准差的乘积:
$$r = \frac{\sum_{i=1}^{n}(x^(i) - \mu_x)(y^(i) - \mu_y)}{\sqrt{\sum_{i=1}^{n}(x^(i) - \mu_x)^2 \sum_{i=1}^{n}(y^(i) - \mu_y)^2}} = \frac{\sigma_{xy}}{\sigma_x \sigma_y}$$
通过分母,我们对协方差进行了标准化,使得 Pearson's r 的取值范围被限制在 -1 到 1 之间。
那么回到散点图矩阵,每个小方格中的数字就是 Pearson's r,代表了对应的两个变量之间的线性相关程度。由于对角线上的变量与自己是完全相关的,所以 Pearson's r 都是1;而非对角线上的数字则代表了不同变量之间的相关程度。
拟合
我们通过EDA确认了特征与房价之间存在线性关系,那么接下来我们要考虑一个问题:如何找到那条最完美的直线来拟合这些数据点呢?

在这里我们可以使用 普通最小二乘法 (Ordinary Least Squares, OLS) 来找到最佳拟合线。OLS 的核心思想是通过最小化残差的平方和来找到最佳拟合线。
看上面那张拟合线穿过数据点的图。由于我们希望总残差最小化,并且我们不希望正向和反向的残差相互抵消,我们选择将这些残差全部平方,再求和。
我们的损失函数很简单,就是每个样本的误差度量:
$$L(\hat{y}^{(i)}, y^{(i)}) = (\hat{y}^{(i)} - y^{(i)})^2$$
而要找到全局优化问题,我们需要通过损失函数来构造代价函数。于是我们计算出了 误差平方和 (Sum of Squared Errors, SSE):
$$SSE = \sum_{i=1}^{n} (y^{(i)} - \hat{y}^{(i)})^2$$
在这里,SSE 就是多元线性回归的 代价函数 (Cost Function)。既然找到了代价函数,我们需要找到一个合适的方法来最小化它。
还记得Adaline吗?我们在之前的章节中提过,本质上就是一个梯度下降的框架,目标也是最小化平方误差。你会发现两者在数学形式上是非常相似的:
$$J(w) = \frac{1}{2} \sum_{i=1}^{n} (y^{(i)} - \hat{y}^{(i)})^2$$
虽然Adaline用来分类,但是它们的数学底层逻辑依然是相同的。最后,使用梯度下降算法,我们就能够找到最优的 $\mathbf{w}$,使得代价函数 $J(w)$ 最小化,从而得到最佳拟合线。
根据微积分推导,权重的更新量 $\delta w_j$ 可以表示为:
$$\delta w_j = \eta \sum_{i=1}^{n} (y^{(i)} - \hat{y}^{(i)}) x_j^{(i)}$$
但实际上这些玩法在之前我们已经见过了,所以我们就不再赘述了。
收敛与预测
通过刚才的流程,我们就能够一步步找到最优的权重向量 $\mathbf{w}$,从而得到最佳拟合线了。那么在这个收敛过程中,具体的流程是怎样的?
当我们运行梯度下降算法时,我们会记录每一个Epoch下的SSE。随着迭代次数的增加,SSE应该会逐渐减少,直到达到一个稳定的水平,这就意味着模型已经收敛了:

当我们的模型收敛之后,你可以看到拟合线已经非常贴近数据点了,这时候我们就可以使用这个模型来进行预测了。

还记得之前讲过标准化吗?由于我们依旧使用梯度下降,因此我们需要对特征进行标准化处理,以确保模型能够更快地收敛。
最后,我们的模型就可以用来预测了。假设我们想要知道一个拥有5个房间的房子值多少钱,我们就首先将这个值进行标准化处理,随后塞入模型中进行预测。当模型给你一个数之后,你再做一步反标准化处理,就能够得到这个房子的预测价格了。
解析解
但是,梯度下降真的是收敛的唯一解吗?
在实际的ML应用中,我们往往追求更高的计算效率和精度。因此,我们可以通过解析解来直接计算出最优的权重向量 $\mathbf{w}$,而不需要迭代地进行梯度下降。
解析解的核心思想是通过矩阵运算来直接求解最优权重。具体来说,我们可以使用以下的公式来计算 $\mathbf{w}$:
$$\mathbf{w} = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{y}$$
而这个公式叫做 正规方程 (Normal Equation)。这里的 $\mathbf{X}$ 是特征矩阵,$\mathbf{y}$ 是目标变量的向量。我们试图找到一组权重 $\mathbf{w}$,使得特征空间与目标值之间的误差在最小二乘意义下最小化。
正规方程的推导核心
正规方程的推到核心在于,令损失函数 $J(\mathbf{w})$ 关于权重 $\mathbf{w}$ 的偏导数为零,从而找到损失函数的最小值。具体来说,我们首先计算损失函数:
$$J(\mathbf{w}) = \frac{1}{2} \sum_{i=1}^{n} (y^{(i)} - \hat{y}^{(i)})^2 = \frac{1}{2} (\mathbf{y} - \mathbf{X}\mathbf{w})^\top (\mathbf{y} - \mathbf{X}\mathbf{w})$$
接下来,我们对 $J(\mathbf{w})$ 关于 $\mathbf{w}$ 求导:
$$\frac{\partial J(\mathbf{w})}{\partial \mathbf{w}} = -\mathbf{X}^\top (\mathbf{y} - \mathbf{X}\mathbf{w})$$
将导数设置为零,我们得到:
$$\mathbf{X}^\top (\mathbf{y} - \mathbf{X}\mathbf{w}) = 0$$
展开后,我们可以得到:
$$\mathbf{X}^\top \mathbf{y} = \mathbf{X}^\top \mathbf{X} \mathbf{w}$$
最后,我们通过矩阵运算来求解 $\mathbf{w}$:
$$\mathbf{w} = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{y}$$
初中高中奥数哥有没有给你表演过压轴大题的解析几何解法?你会发现当你还在使用各种几何关系和引理来解题的时候,他们早就使用解析几何方法直接算出答案了。所以说,相比梯度下降要一步步求解,使用解析解主打的就是一个求解快,而且在计算机中由于矩阵运算可以被并行化,计算效率非常高。只要你内存中能装得下矩阵 $\mathbf{X}^\top \mathbf{X}$,那么解析解就能快速给出答案。
但是你会发现奥数哥往往会在某些题目上面使用解析几何,在其他题目上却不使用解析几何。这因为解析集合在某些情况下要么计算量巨大,要么根本无法计算出结果。在ML中也是一样:当特征数量非常大时,计算 $(\mathbf{X}^\top \mathbf{X})^{-1}$ 的时间复杂度是 $O(n^3)$,这对于大规模数据集来说是不可行的。反而梯度下降的时间复杂度是 $O(kn^2)$,其中 $k$ 是迭代次数,通常远小于 $n$,因此在大规模数据集上更为实用。
而且梯度下降绝对稳妥,从不挑食。无论损失函数长什么样,只要它能够被导,我们都可以使用梯度下降来找到最优解;而解析解则不一定适用于所有的损失函数,特别是当损失函数不是二次函数时,解析解可能根本不存在。
最后,也可能是解析解的杀手锏:它甚至不需要对特征进行标准化处理。回想一下我们为什么要做标准化,是因为考虑到梯度下降一步步求解的过程,如果特征的尺度差异过大,可能会导致梯度下降的收敛速度变慢,甚至无法收敛。而解析解直接通过矩阵运算来求解最优权重,不依赖步长,因此不受特征尺度的影响。
异常值处理与RANSAC
看完了回归的基本原理和实现,我们来看看在实际应用中,回归模型是如何处理异常值的。
线性回归模型对哪些异常值有着近乎偏执的敏感性,因为它们追求的是所有点误差平方和的最小化。因此,如果数据集中存在一个异常值,最小二乘法会试图调整拟合线来尽可能地靠近这个异常值,这样整个拟合线就偏了。
我们虽然可以手动剔除异常值,但是先不说这需要非常强的特征领域知识,而且当特征维度较高的时候,异常值的定义也变得非常模糊,难以辨别了。而且,即使你有办法能克服上面的问题,样本数量那么大,祝你好运吧。
因此我们需要一个合适的算法来帮助我们剔除这些异常值。
RANSAC 算法,全称 Random Sample Consensus,核心思想有点像“民主共识制”:
随机采样与模型拟合:从数据集中随机选择一个子集,来建立一个初始模型。选择的样本数量往往是能够拟合模型所需的最小样本数量。
评估模型:使用这个模型来预测所有数据点,并计算每个数据点与模型的距离。如果某个数据点与模型的距离小于预设的阈值,那么我们就认为这个数据点是一个内点(Inlier),否则就是一个外点(Outlier)。
迭代优化:重复上述过程多次,每次都随机选择不同的子集来拟合模型,并评估模型的性能。最终,我们选择那个内点数量最多的模型作为最终的拟合结果。
这样几步下来,我们本质上就让数据自己来决定哪些点是异常值,而不需要我们人工干预,学习数据的分布。
模型评估
残差图
一个很有诊断价值的可视化工具叫做 残差图 (Residual Plot)。如果我们将模型的预测值放在横轴,把预测误差(预测值 - 真实值)放在纵轴,那么我们就可以得到一个残差图:

如果模型成功捕获了数据集中的特征,那么剩下的残差理论来讲应该是随机分布,看起来像无规律的白噪声。这意味着在理想状态下,样本点应该随机地散落在中心水平线 $y = 0$ 的两侧。但如果残差图显示出了某种特定的几何形状,例如一个抛物线,那么就说明模型没有成功捕获数据中的某些特征,可能是因为我们使用了一个过于简单的模型,而漏掉了数据中蕴藏的非线性信息。
均方误差
但是残差图还是比较主观的评估方法,我们还需要一个更客观的评估指标来衡量模型的性能。一个常用的指标叫做 均方误差 (Mean Squared Error, MSE),它是残差平方和的平均值:
$$MSE = \frac{1}{n} \sum_{i=1}^{n} (y^{(i)} - \hat{y}^{(i)})^2$$
由于我们定义模型的代价函数是SSE,而SSE直接代指模型的误差总和,我们为什么不直接使用SSE来评估模型的性能呢?
这是因为SSE的数值会跟着样本数量的增加而增加,这样不方便我们在不同规模的数据集之间作比较。因此,MSE通过对SSE取平均值,提供了一个标准化的衡量标准。
简单来说,MSE 的值越小,说明模型的预测结果越接近真实值,模型的性能越好。或者如果你观测到训练集MSE非常小,但测试集MSE却很大,那么就说明你的模型过拟合了。
决定系数
虽然说MSE的值不会受到样本数量的影响,但是它仍然会受到目标变量的尺度的影响。比如说,如果我们在预测房价,那么MSE的值可能会非常大,但如果我们在预测某个品种蚂蚁的体重,那么MSE的值可能会非常小。这样的话,我们就很难通过MSE来比较不同模型的性能了。
为了解决这个问题,我们引入 决定系数 (Coefficient of Determination),也叫做 $R^2$。本质上是MSE的标准化版本,核心在于将模型的预测误差与一个最差的基准模型进行对比。这个基准模型通常是一个简单的模型,它总是预测目标变量的平均值。
如果你的 $R^2$ 值越接近1,说明模型的预测效果越好,能够解释目标变量的变异程度越高。反之,如果 $R^2$ 值接近0,说明模型的预测就跟猜平均值一样,解释能力不强。
$R^2$ 的定义为:
$$R^2 = 1 - \frac{SSE}{SST}$$
SSE是模型的误差平方和,代表了你的模型无法解释的那部分残差波动;而SST是总平方和,代表了原始数据的总波动。因此,这个分式实际上在计算 “在数据的总波动中,你的模型还有百分之多少没被搞定”?用1减去这个分式,就能得到模型已经解释了多少数据。
总的来说, $R^2$ 告诉我们模型捕捉到了数据中百分之多少的信号。
如果你闲的想要展开 $R^2$ 公式,你会发现:
$$R^2 = 1 - \frac{SSE}{SST} = 1 - \frac{\sum_{i=1}^{n}(y^{(i)} - \hat{y}^{(i)})^2}{\sum_{i=1}^{n}(y^{(i)} - \mu{y})^2} = 1 - \frac{MSE}{Var(y)}$$
其中,$Var(y)$ 是目标变量的方差,代表了数据的总波动程度。通过这个公式,我们可以看到 $R^2$ 实际上是在比较模型的平均误差与数据的总波动之间的关系。
正则化
之前我们提过正则化相关的内容。还记得R1和R2吗?如果我们的模型出现过拟合问题,那么我们就要考虑使用正则化来解决这些问题了。
正则化 (Regularization) 的核心逻辑是在损失函数中认为引入惩罚项。如果模型过拟合的原因是因为它学习了过多数据点的规律,导致多项式中某些系数权重 $w$ 调的过大,那么我们为什么不让正则化来惩罚这些过大的权重呢?因此,正则化通过规定权重向量 $\mathbf{w}$ 的大小来限制模型的复杂度,从而帮助我们防止过拟合。
在R1和R2的基础上,我们会在它们的基础上再介绍一个新的正则化方法: 弹性网络。如果你对R1和R2的内容还不够熟悉,我建议你回去看看第三章,第四章和第六章的内容,或者去隔壁看看我在COMP3354里写的关于正则化的内容。
岭回归
岭回归 (Ridge Regression) 采用的是L2正则化方法,它在损失函数中加入了权重向量 $\mathbf{w}$ 的平方和作为惩罚项:
$$J(\mathbf{w}){Ridge} = \sum{i=1}^n (y^(i)- \hat{y}^(i))^2 + \lambda \sum_{j=1}^m w_j^2$$
它在原本的最小二乘损失函数中加入了一个权重平方和的惩罚项,具体的目标就是让所有的权重趋向于变小。但是由于 L2正则化公式定义的那样,权重虽然会变小,但永远不会变成0.
这意味着所有的特征都会保留在模型中,只是这些特征的权重会被压缩到一个较小的范围内,导致这些特征的话语权被集体削弱。
LASSO
LASSO (Least Absolute Shrinkage and Selection Operator) 实际上也不是什么新朋友了,它就是R1正则化的马甲。
LASSO有一个非常神奇(且我们之前提到过)的数学特性,那就是它能够将某些权重直接压缩到0。这意味着LASSO不仅能够帮助我们防止过拟合,还能够帮助我们进行特征选择:
$$J(\mathbf{w}){LASSO} = \sum{i = 1}^n (y^(i) - \hat{y}^(i))^2 + \lambda \sum_{j=1}^m |w_j|$$
由于后面的惩罚项是权重的绝对值,所以当某些权重的绝对值足够小的时候,LASSO就会直接将它们压缩到0,这样就相当于从模型中剔除了这些特征。
之所以我们说能够“帮助我们做特征选择”,是因为当某些特征权重被压缩到0之后,这些特征就不再对模型的预测结果产生任何影响了,因此我们可以认为这些特征已经被模型自动剔除了。
弹性网络
弹性网络 (Elastic Net) 在某种程度上算是Ridge Regression和LASSO的结合体,它同时使用了L1和L2正则化:
$$J(\mathbf{w}){ElasticNet} = \sum{i=1}^n (y^(i) - \hat{y}^(i))^2 + \lambda_1 \sum w_j^2 + \lambda_2 \sum |w_j|$$
我们知道L1正则化非常冷酷。为了实现模型的稀疏性,它会毫不犹豫地将某些特征的权重直接压缩到0。但是这样会在某些情况下出现问题。例如,当你有几个特征之前存在高度相关的关系时,例如“房屋平米数”和“房间总数”:他们传达的信息高度重合。这种情况下,L1往往会随机从这一组变量中选择一个,然后丢弃掉其他的变量,这样非黑即白的玩法非常不稳定,一旦数据稍微多一点扰动,模型选出的特征就可能完全不一样了。
而L2呢就更像是一个温和的调停者,它不会直接将权重压缩到0,而是会让它们变得更小一些。这样保证了稳定性,但是无法帮你精简模型。
而弹性网络引入L1 L2惩罚项的好处是,弹性网络能够在那些特征之间存在高度相关性的情况下表现得更好,且更稳健。特别是当特征数量 $m$ 超过样本数量 $n$ 的时候,弹性网络能够更好地处理这种高维数据集。
L2用来保持模型的稳定性,而我们同时使用L1来保持模型的稀疏性,这样就能够在保持模型性能的同时,进行特征选择了。
这种结合带来的最大好处叫做所谓的分组效应。当你面前有一组高度相关的变量时,弹性网络的L2部分会像胶水一样把这些特征粘在一起,让它们要么被一起保留,要么被一起剔除,不像L1那样随机挑刺。
多项式回归
之前讲到的多元线性回归的问题在于,它没法拐弯。如果数据点有着明显的非线性关系,那么线性回归就无法发挥作用了。
因此我们需要一个更复杂,能够更好捕捉非线性关系的模型,来拟合更复杂的数据点。隆重介绍: 多项式回归 (Polynomial Regression)。
多项式回归的数学形式和多元线性回归非常相似,唯一的区别在于它将特征进行了一些非线性变换:
$$y = w_0 + w_1 x + w_2 x^2 + \ldots + w_d x^d$$
而之前的多元线性回归的方程是:
$$y = w_0 + w_1 x_1 + w_2 x_2 + \ldots + w_n x_n$$
你会发现多项式回归的方程中,特征 $x$ 被提升到了不同的幂次,这样就能够捕捉到数据中的非线性关系。

在这样一个明显呈非线性规律的数据集上,线性回归的拟合效果非常差,而多项式回归能够很好地捕捉到数据中的非线性关系。在同一个训练集上,线性模型的MSE高达569.78,$R^2$分数只有0.832。而相比之下,多项式回归将MSE骤降到61.33,$R^2$分数飙升到0.832。这意味着使用简单的特征转换,我们就能够多捕捉到15%数据中原本被视为“噪声”的有用信号。
对数转换
有时候我们并不需要将特征提升到高次幂来捕捉非线性关系,而是可以通过一些简单的数学变换来实现非线性关系的线性化。一个常用的变换方法叫做 对数转换 (Logarithmic Transformation)。
例如这个例子:

在这个MEDV-LSTAT的散点图中,我们通过肉眼观测,数据点大概呈现出一种指数衰减的关系。也就是说,随着LSTAT的增加,MEDV的下降速度逐渐变慢了。
如果 $f(x) = e^{-x}$,那么取自然对数,即 $\log(f(x)) = -x$,原本弯曲的指数曲线就会变成笔直的线段。因此,我们大胆假设,如果对特征变量进行对数转换,我们或许可以将原本扭曲的数据投影到一个近乎完美的线性空间中。
而我们施加了相应的数学转换后,我们发现好像确实在理:

你会发现在之前的散点图中,使用三次多项式回归也只能拿到 $R^2 = 0.66$ 的成绩,而线性只有 0.54。但是经过对数转换之后,即使只使用线性回归,我们就能够拿到 $R^2 = 0.69$ 的成绩,甚至比之前费尽心思构建的三次多项式模型表现得还要好。
这意味着通过透彻理解数据的数学本性并进行合理的Feature Engineering,我们可以使用更简单的模型来实现更强的预测性能,同时极大增强了模型的可解释性。
随机森林回归
但是如果数据分布极其复杂,无论是多项式还是对数转换都难以奏效,我们该怎么办?
随机森林回归 (Random Forest Regression) 代表了一种从全局拟合到局部拟合的转变,因此,它跟我们之前学到的线性或多项式回归在本质上完全不同。
之前的模型会尝试寻找一个全局函数来描述整个数据集的规律,就像是使用一个复杂的数学公式总结整个人生:在大部分情况下是做不到非常精确的描述的。而随机森林采取的是一种分而治之的策略,它通过构建多个决策树来捕捉数据中的局部规律,将复杂的输入空间切分成许多微小的,易于管理的区域。在每一i个小区域内,与其说尝试画线,而是直接计算该区域内样本的平均值作为预测。

正如上图所示,你会发现它的预测由许多细小水平线组成,这叫做分段线性函数。这意味着它不需要数据来满足任何严苛的线性假设,同样也能够灵活地适应数据中的非线性关系和复杂的交互效应。
随机森林回归依旧发挥它的集体智慧逻辑。它在回归任务中的核心思想是取平均。如果我们让一千名观察员去观察市场上的一小部分,每位观察员可能因为视野有限而存在偏见,这叫做高访察。但是如果我们将这1000个观察员的观察结果进行平均,那么这些偏见就会相互抵消,最终得到一个更准确的预测结果。
那么说得好,随即森林回归具体是怎样一个流程?
首先,给定一个数据集,我们会随机抽取多个子集来训练多个决策树。每个决策树都是在一个随机子集上训练的,这样就保证了每棵树的多样性。而抽取是通过切割数据集来实现的。
评价一个切割好坏地标准不再是分类中地熵,或者基尼系数,而是老朋友MSE。我们会计算切割前的MSE和切割后的MSE之间的差值,来评估这个切割是否能够有效地减少预测误差。如果切割能够显著降低MSE,那么我们就认为这个切割是有价值的,我们就会继续在这个子树上进行进一步的切割,直到满足某些停止条件,例如达到最大深度或者叶子节点中的样本数量小于某个阈值。
在切割好的这些树上,我们就可以进行预测了。对于一个新的输入样本,我们会将它同时输入到所有的树中,每棵树都会给出一个预测值。最后,我们将所有树的预测值进行平均,得到最终的预测结果。
最后,我们将这些在不同子集上训练的树的预测结果进行平均,这样就能够得到一个更稳定,更准确的预测结果。
决策树回归
决策树回归 (Decision Tree Regression) 是随机森林回归的一个特例。它的核心思想是通过构建一棵决策树来进行回归预测。
在之前线性回归和多项式回归的时候,我们往往需要花费很多时间在特征工程上。由于变量间存在复杂的非线性关系,我们需要对特征进行各种各样的变换,来让模型能够捕捉到这些关系。而决策树回归则完全不需要我们进行任何特征工程。它通过递归地将数据集切分成更小的子集来捕捉数据中的非线性关系和交互效应。
这意味着,即便特征与目标之间的关系曲折离奇,决策树也能够直接上手。这是因为决策树本质上是分而治之地逻辑,它一次仅分析一个特征,并根据这个特征的轴向上寻找切分点,而不需要像线性模型那样去权衡多个特征地加权线性组合。因此,它对特征的尺度完全不敏感,我们甚至可以在建模前直接省区标准化的步骤,这在某些情况下能够大大简化我们的建模流程。
在决策树回归中,我们使用MSE来作为衡量切分好坏地标准。对于树中任意一个节点 $t$,其误差定义为:
$$I(t) = MSE(t) = \frac{1}{N_t} \sum_{i \in D_t} (y^(i) - \hat{y}_t)^2$$
其中,$N_t$是节点内的样本数,$D_t$是节点内的样本集合,$\hat{y}_t$是节点内样本的平均值。这个公式代表,我们希望切分出的每一个小区域内的点,都能够尽可能地扎堆在它们的均值附近。
算法在每一个分岔口,都会计算信息增益,也就是切分前后MSE的差值:
$$IG(D_p, x_i) = I(D_p) - \frac{N_{left}}{N_p} I(D_{left}) - \frac{N_{right}}{N_p} I(D_{right})$$
而我们的目标就是找到一个特征和切分点,使得父节点的MSE和两个子节点加权MSE之间的差值最大化。通过不断地递归切分,我们就能够构建出一棵决策树来进行回归预测了。