集成模型
集成模型简介
集成模型使用一系列弱学习器(也称基础模型、基模型)进行学习,并整合各个弱学习器的结果,从而得到更好的效果。
集成学习模型常见的算法有 Bagging 算法和 Boosting 算法。
- Bagging算法
Bagging 算法根据所有弱学习器的结果,取其多数预测值作为最终预测值。
该算法每次随机有放回地取一些数据构成一个新的训练集(因此数据可能重复),抽取 \\( n \\) 次后构建 \\( n \\) 个弱学习器,在分类问题中取多数作为结果,在回归问题中取平均值作为结果。
- Boosting算法
Boosting 算法的本质是将弱学习器提升为强学习器。它根据每一次训练结果,对更准确的模型赋予更高的权重。在多次调整权重后,整体的准确率就可以提高。
可以认为 Boosting 算法是一个进化的过程:优胜劣汰。
随机森林模型
原理简介
随机森林模型是一种经典的 Bagging 模型,其弱学习器为决策树模型。
下图展示了随机森林模型的原理:
随机森林模型在建立时,使用以下两个特征来保证模型的泛化能力:
- 数据随机:使用有放回的抽取数据
- 特征随机:若每个样本的特征为 \\( M \\) ,随机选取 \\( \sqrt{M} \\) 个特征来构造随机森林模型
简单代码实现
以下简单演示了随机森林模型的代码实现,随机森林模型有分类和回归两种模型:
下表列出了一些常用的调优参数,更多参数可以参见官方文档:
参数 | 含义 | 取值 |
---|---|---|
n_estimators | 弱学习器(决策树)的个数 | int 值,默认为 10 |
bootstrap | 是否有放回的抽样 | 默认是 |
oob_score | 是否选用外部样本(抽样后剩余的样本)作为测试集测试 | 默认否 |
除此之外,随机森林模型还有许多参数与决策树模型的参数是一致的。
AdaBoost算法
算法简介
AdaBoost算法(Adaptive Boosting)是一种有效且使用的 Boosting 算法,它根据前一次分类效果调整数据权重:分类错误的样本在下一次学习时会按比例提高其权重,并在每一轮迭代时向模型中加入一个新的弱学习器,直到误分类降低到阈值以下或达到最大学习次数。
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\} \\) 。
首先,初始化各样本的权重:
初始化得到的各样本权重相等。
接着,根据误差率 \\( e_m \\) 的计算公式,构造误差率最小的弱学习器 \\( F_m(X) \\) 。其中误差率指的是分类错误样本的权重之和,其计算公式为:
其中 \\( 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 \\) 的计算公式如下:
得到第 \\( m \\) 次迭代的强学习器公式如下:
其中 \\( f_m(x) \\) 是第 \\( m \\) 次迭代的强学习器。
接下来的一步是AdaBoost算法的核心思想:增大分类错误样本的权重,减小分类正确样本的权重。
样本权重的更新公式如下:
得到更新后的样本权重 \\( w_{m+1,i} \\) ,各样本权重和为 1 。其中的 \\( Z_m \\) 是一个规范化因子,计算公式如下:
反复迭代此过程,\\( M \\) 次迭代后得到的强学习器如下:
正则化项
防止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算法的迭代模型为:
其中 \\( T_m(x) \\) 是本次待搭建的决策树,也是拟合上一个模型残差值的决策树。\\( f_m(x) \\) 为第 \\( m \\) 次迭代后产生的新模型。
GBDT算法只需要简单拟合当前模型的残差,步骤如下:
- 初始化 \\( f_0(x)=0 \\)
- 当 \\( m=1,2,\dots,M \\) ,计算残差 \\( r_{mi}=y_i-f_{m-1}(x) \\) ;拟合残差得到决策树 \\( 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),其表达式为:
其中 \\( N \\) 为总样本数,\\( y_i \\) 是样本 \\( i \\) 的实际值,\\( f(x_i) \\) 为预测值。
损失函数过小可能出现过拟合,因此常常在损失函数中加入正则化项(惩罚项)\\( \lambda J(f) \\) 。
机器学习的目的就是构造损失函数最小的模型。