机器学习入门笔记06

集成模型

系列文章

集成模型

集成模型简介

集成模型使用一系列弱学习器(也称基础模型、基模型)进行学习,并整合各个弱学习器的结果,从而得到更好的效果。

集成学习模型常见的算法有 Bagging 算法和 Boosting 算法。

Bagging 算法根据所有弱学习器的结果,取其多数预测值作为最终预测值。

该算法每次随机有放回地取一些数据构成一个新的训练集(因此数据可能重复),抽取 \\( n \\) 次后构建 \\( n \\) 个弱学习器,在分类问题中取多数作为结果,在回归问题中取平均值作为结果。

Boosting 算法的本质是将弱学习器提升为强学习器。它根据每一次训练结果,对更准确的模型赋予更高的权重。在多次调整权重后,整体的准确率就可以提高。

可以认为 Boosting 算法是一个进化的过程:优胜劣汰。

随机森林模型

原理简介

随机森林模型是一种经典的 Bagging 模型,其弱学习器为决策树模型。

下图展示了随机森林模型的原理:

图片来源:https://cnvrg.io/random-forest-regression/

随机森林模型在建立时,使用以下两个特征来保证模型的泛化能力:

简单代码实现

以下简单演示了随机森林模型的代码实现,随机森林模型有分类和回归两种模型:

from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(random_state=42)
model.fit(X_train, Y_train)
RandomForestClassifier(random_state=42)

下表列出了一些常用的调优参数,更多参数可以参见官方文档:

参数含义取值
n_estimators弱学习器(决策树)的个数int 值,默认为 10
bootstrap是否有放回的抽样默认是
oob_score是否选用外部样本(抽样后剩余的样本)作为测试集测试默认否

除此之外,随机森林模型还有许多参数与决策树模型的参数是一致的。

AdaBoost算法

算法简介

AdaBoost算法(Adaptive Boosting)是一种有效且使用的 Boosting 算法,它根据前一次分类效果调整数据权重:分类错误的样本在下一次学习时会按比例提高其权重,并在每一轮迭代时向模型中加入一个新的弱学习器,直到误分类降低到阈值以下或达到最大学习次数。

AdaBoost算法的核心思想是:调整错误样本的权重,进而迭代升级。下图展示了其原理:

图片来源:https://www.sciencedirect.com/topics/engineering/adaboost

每次对于划分错误的数据,就加大它的权重,以便将其包含到正确的类别中。

数学原理

给定训练集数据:\\( T=\{ (X_1,Y_1), (X_2,Y_2), \dots, (X_N,Y_N) \} \\) 其中 \\( x \\) 为特征变量, \\( y \\) 为目标变量,且 \\( x_i \in \mathbb{R} ^n \\)\\( y_i \in \{-1,+1\} \\)

首先,初始化各样本的权重:

\\[ w_{1i} = \frac 1 N \qquad (i=1, 2, \dots, N) \\]

初始化得到的各样本权重相等。

接着,根据误差率 \\( e_m \\) 的计算公式,构造误差率最小的弱学习器 \\( F_m(X) \\) 。其中误差率指的是分类错误样本的权重之和,其计算公式为:

\\[ e_m = \sum _{i=1}^{N} w_{mi} \, I(F_m(x_i) \neq y_i) \\]

其中 \\( w_{mi} \\) 是样本 \\( i \\) 的权重,\\( F_m(x_i) \\) 是弱学习器所预测的样本 \\( i \\) 的分类(预测值);\\( y_i \\) 是样本的实际分类。 \\( I(F_m(x_i) \neq y_i) \\) 是一个指示函数(Indicator Function),当括号内的条件成立(预测失败)时,函数取值为 1 ;否则取值为 0 。

根据误差率可以调整弱学习器的权重,弱学习器 \\( F_m(x) \\) 的系数 \\( \alpha _m \\) 的计算公式如下:

\\[ \alpha _m = \frac 1 2 \ln \frac {1 - e_m}{e_m} \\]

得到第 \\( m \\) 次迭代的强学习器公式如下:

\\[ \begin{split} f_m(x) &= f_{m-1}(x) + \alpha _m F_m(x)\\ &= \sum _{i=1}^{m} \alpha _i F_i (x) \end{split} \\]

其中 \\( f_m(x) \\) 是第 \\( m \\) 次迭代的强学习器。

接下来的一步是AdaBoost算法的核心思想:增大分类错误样本的权重,减小分类正确样本的权重。

样本权重的更新公式如下:

\\[ w_{m+1,i} = \frac{w_{mi}}{Z_m} exp(-\alpha _m y_i F_m(x_i)) \qquad (i = 1, 2, \cdots, N)\\ \sum _{i=1}^{N} w_{m+1,i} =1 \\]

得到更新后的样本权重 \\( w_{m+1,i} \\) ,各样本权重和为 1 。其中的 \\( Z_m \\) 是一个规范化因子,计算公式如下:

\\[ Z_m = \sum _{i=1}^{N} w_{mi} exp(-\alpha _m y_i F_m(x_i)) \\]

反复迭代此过程,\\( M \\) 次迭代后得到的强学习器如下:

\\[ sign[f_M(x)] = sign[\sum _{i=1}^{M} \alpha _i F_i(x)]\\ \begin{equation} where \qquad sign(x)=\left\{ \begin{array}{cl} +1 & x > 0 \\ 0 & x = 0 \\ -1 & x < 0 \\ \end{array} \right. \end{equation} \\]

正则化项

防止AdaBoost算法过拟合的一种方式是向模型中加入正则化项,即每个若学习器的权重缩减系数 \\( v \\) ,又称学习率(learning rate)。

加入权重缩减后系数后弱学习器的迭代公式变为:\\( f_m(x) = f_{m-1}(x) + v\alpha _m F_m(x) \\)

权重缩减系数 \\( v \\) 的取值范围为 \\( (0,1] \\) 。取值越小,要达到一定的误分类或学习效果需要的迭代次数越多,需要的弱学习器越多。

AdaBoost算法原型在 sklearn.ensemble 包内,有分类(AdaBoostClassifier)和回归(AdaBoostRegressor)两种模型。

下表列出了一些常用的调优参数:

参数含义取值
base_estimator弱学习器类型决策树模型或MLP神经网络类型;默认为决策树类型
n_estimators弱学习器(决策树)的个数int 值,默认为 10
learning_rate弱学习器权重缩减系数 \\( v \\)默认为 1.0 ,即不缩减
algorithm算法类型'SAMME' 代表使用对样本集分类的效果调整弱学习器权重,'SAMME.R' 代表使用对样本集分类的预测概率调整弱学习器权重。

GBDT算法

算法原理

GBDT全称梯度提升树(Gradient Boosting Decision Tree),也是一种非常实用的Boosting算法,其特点为:将损失函数的负梯度作为残差的近似值,不断使用残差迭代和拟合回归树,最终生成强学习器。

GBDT算法的核心在于拟合残差

GBDT算法的迭代模型为:

\\[ f_m(x) = f_{m-1}(x) + T_m(x) \\]

其中 \\( T_m(x) \\) 是本次待搭建的决策树,也是拟合上一个模型残差值的决策树。\\( f_m(x) \\) 为第 \\( m \\) 次迭代后产生的新模型。

GBDT算法只需要简单拟合当前模型的残差,步骤如下:

  1. 初始化 \\( f_0(x)=0 \\)
  2. \\( m=1,2,\dots,M \\) ,计算残差 \\( r_{mi}=y_i-f_{m-1}(x) \\) ;拟合残差得到决策树 \\( T_m(x) \\) 并用其进行迭代
  3. 当误差或迭代次数达到指定要求时,得到回归问题提升树如下:
\\[ f_M(x)=\sum _{m=1}^{M} T_m(x) \\]

实际应用中,GBDT梯度提升树使用损失函数的负梯度在当前模型的值作为残差近似值。负梯度的定义如下:

\\[ -\frac{\partial L(y,f(x_i))}{\partial f(x_i)} \\]

若令损失函数为:

\\[ L(y,f(x_i)) = \frac 1 2 (y-f(x_i))^2 \\]

此时对损失函数求梯度:

\\[ -\frac{\partial L(y,f(x_i))}{\partial f(x_i)} = - \frac{\partial(\frac 1 2 (y-f(x_i))^2)}{\partial f(x_i)} = y - f(x_i) \\]

可见当损失函数是平方函数时,负梯度便等于残差;否则,只是残差的近似值。

GBDT模型和AdaBoost模型位于 Scikit-Learn 的同一个包内,它的分类模型为 GradientBoostingClassifier ,回归模型为 GradientBoostingRegressor ,对应的弱学习器分别为分类决策树和回归决策树。

除了决策树和 Boosting 算法通用的参数之外,它还有以下常用参数:

参数含义取值
subsample为防止过拟合,建立决策树的子采样比例0~1 :取值为 1 时使用所有样本,否则抽样使用部分样本;默认为 1 。
criterion特征选择标准'friedman_mse' 代表费尔德曼均方误差,mae 代表平均绝对误差。
tol提前停止训练的条件float 值,默认为 1e-4 ,损失改善小于该值时训练停止。

关于损失函数

可以用损失函数(loss function)来衡量模型拟合的程度。损失函数的实质是计算实际值与预测值之间的“距离”。

下表列出了一些常用的损失函数:

离散值0-1 损失函数
\\[ \begin{equation} L(y, f(x))=\left\{ \begin{array}{cl} 1 & y \neq f(x) \\ 0 & y = f(x) \\ \end{array} \right. \end{equation} \\]
指数损失函数'exponential'
\\[ L(y, f(x))=\exp (-yf(x)) \\]
对数损失函数'deviance'
\\[ L(y,f(x))=\ln (1+\exp(-yf(x))) \\]
连续值L1范数损失函数'linear'
\\[ L(y,f(x))=|y-f(x)| \\]
L2范数损失函数'square'
\\[ L(y,f(x))=(y-f(x))^2 \\]
Huber损失函数
\\[ \begin{equation} L(y, f(x))_\delta =\left\{ \begin{array}{cl} (y-f(x))^2 / 2 & |y - f(x)| \leq \delta \\ \delta(|y-f(x)| - \delta / 2) & |y - f(x)| > \delta \\ \end{array} \right. \end{equation} \\]

损失函数越小,预测值和真实值便越接近,模型拟合效果便越好。

风险函数用来表示平均意义的损失,又称为期望损失(expected loss),其表达式为:

\\[ \frac 1 N \sum _{i=1}^{N} L(y_i,f(x_i)) \\]

其中 \\( N \\) 为总样本数,\\( y_i \\) 是样本 \\( i \\) 的实际值,\\( f(x_i) \\) 为预测值。

损失函数过小可能出现过拟合,因此常常在损失函数中加入正则化项(惩罚项)\\( \lambda J(f) \\)

机器学习的目的就是构造损失函数最小的模型