谈谈模型融合之一 —— 集成学习与 AdaBoost
前言
前面的文章中介绍了决策树以及其它一些算法,但是,会发现,有时候使用使用这些算法并不能达到特别好的效果。于是乎就有了集成学习(Ensemble Learning),通过构建多个学习器一起结合来完成具体的学习任务。这篇文章将介绍集成学习,以及其中的一种算法 AdaBoost。
集成学习
首先先来介绍下什么是集成学习:
- 构建多个学习器一起结合来完成具体的学习任务,常可获得比单一学习器显著优越的泛化性能,对“弱学习器” 尤为明显(三个臭皮匠,顶个诸葛亮)
- 也称为
Multi-Classifier System,Committee-Based Learning - 学习器可以是同类型的,也可以是不同类型
这么一看,就感觉集成学习与常说的模型融合很像,甚至可以理解为就是模型融合。
那么,常用的集成学习方法有哪些呢?
- Boosting,将各种弱分类器串联起来的集成学习方式,每一个分类器的训练都依赖于前一个分类器的结果,代表:AdaBoost,Gradient Boosting Machine
- Bagging,Bootstrap Aggregating 的缩写。这种方法采用的是随机有放回的选择训练数据然后构造分类器,最后进行组合,代表:Random Forest
- Voting/Averaging,在不改变模型的情况下,直接对各个不同的模型预测的结果进行投票或者平均
- Binning,最近看到的一种方法,还没细看,参考论文
- Stacking
- Blending
后面几种方法这里暂时不做介绍,后面会单独写博客来介绍这些方法
AdaBoost
算法思想
这里将介绍一个基于 Boosting 方法的一个学习算法 AdaBoost,于1995年由 Freund 和 Schapire 提出。其主要思想为:
- 先训练出一个基学习器
- 根据该学习器的表现对训练样本权重进行调整,使得现有基学习器做错的样本在后续学习器的训练中受到更多的关注
- 基于调整后的权重来训练下一个基学习器
- 重复 2、3 直至学习器数目达到事先指定的值 T
- 最终将这 T 个学习器进行加权结合
\]
具体算法
设训练数据集
\]
初始化训练数据的权值分布
\]
for t in range(T):
假设训练得到分类器 \(h_t(x)\) ,则可计算 \(h_t(x)\) 在当前训练集上的分类误差:
\]
若 \(\epsilon_{t} > 0.5\), break; 否则计算分类器权重
\]
然后更新样本权重
\]
其中 \(Z_t\) 为归一化因子
\]
构建基本分类器的线性组合
\]
得到最终分类器
\]
这里我们可以看到 \(\alpha_t\) 是大于 $\frac{1}{2} $ 的,如果误分类了,那么 \(-\alpha_{t} y^{(i)} h_{t}\left(x^{(i)}\right)\) 为大于 0 的数,那么样本的权重就会被放大,反之,则会被缩小。并且, \(\epsilon_t\) 越大,\(\alpha_t\) 就越小,即在最终构建强分类器的时候,误差率越小的弱分类器预测结果所占比重越高。
算法推导
思考两个个问题, \(\alpha_t\) 的公式是怎么来的?以及权重更新公式是怎么来的?下面通过公式推导来讲解
假设已经经过 \(t-1\) 轮迭代,得到\(f_{t-1}(x)\),根据前向分布加法算法
\]
目标是损失函数最小,即
\]
所以,有
\]
\]
我们先来化简损失函数
\\ & = & \sum_{i=1}^{N}w_{t,i}(\frac{\sum_{y_i=h_t(x_i)}w_{t,i}}{\sum_{i=1}^{N}w_{t,i}}exp(-\alpha_t)+\frac{\sum_{y_i \ne h_t(x_i)}w_{t,i}}{\sum_{i=1}^{N}w_{t,i}}exp(-\alpha_t))
\end{eqnarray}
\]
仔细以看,后面那项 \(\frac{\sum_{y_i \ne h_t(x_i)}w_{t,i}}{\sum_{i=1}^{N}w_{t,i}}\) 就是分类误差率 \(\epsilon_{t}\),所以
\]
对 \(\alpha_t\) 求偏导
\frac{\partial Loss}{\partial \alpha_t} & = & \sum_{i=1}^{N}w_{t,i}[-(1-\epsilon_t)exp(-\alpha_t)+\epsilon_texp(\alpha_t)]
\end{eqnarray}
\]
令 \(\frac{\partial Loss}{\partial \alpha_t} = 0\) ,则
\]
推得
\]
另,由前向分布加法算法
w_{t,i} & = & \exp[-y_if_{t-1}(x_i)] \\
& = & \exp[-y_i(f_{t-2}(x_i)+\alpha_{t-1}h_{t-1}(x_i))] \\
& = & w_{t-1,i}\exp[\alpha_{t-1}h_{t-1}(x_i)]
\end{eqnarray}
\]
再加上规范化因子即为算法中的更新公式。(公式敲的要累死了~~~)
代码实现
这里为了方便起见,我使用了 sklearn 里面的决策树,之前使用的时候一直没发现 sklearn 里的决策树可以带权重训练 orz。。。决策树带权训练的代码我后面再研究研究
from sklearn.tree import DecisionTreeClassifier
def adaboost(X, y, M, max_depth=None):
"""
adaboost函数,使用Decision Tree作为弱分类器
参数:
X: 训练样本
y: 样本标签, y = {-1, +1}
M: 使用 M 个弱分类器
max_depth: 基学习器决策树的最大深度
返回:
F: 生成的模型
"""
num_X, num_feature = X.shape
# 初始化训练数据的权值分布
D = np.ones(num_X) / num_X
G = []
alpha = []
for m in range(M):
# 使用具有权值分布 D 的训练数据集学习,得到基本分类器
# 使用 DecisionTreeClassifier,设置树深度为 max_depth
G_m = DecisionTreeClassifier(max_depth=max_depth)
# 开始训练
G_m.fit(X, y, D)
# 计算G_m在训练数据集上的分类误差率
y_pred = G_m.predict(X)
e_m = np.sum(D[y != y_pred])
if e_m == 0:
break
if e_m == 1:
raise ValueError("e_m = {}".format(e_m))
# 计算 G_m 的系数
alpha_m = np.log((1 - e_m) / e_m) / 2
# print(alpha_m)
# 更新训练数据集的权值分布
D = D * np.exp(-alpha_m * y * y_pred)
D = D / np.sum(D)
# 保存 G_m 和其系数
G.append(G_m)
alpha.append(alpha_m)
# 构建基本分类器的线性组合
def F(X):
num_G = len(G)
score = 0
for i in range(num_G):
score += alpha[i] * G[i].predict(X)
return np.sign(score)
return F
小节
上面介绍了集成学习的一些知识点以及 AdaBoost 的基本原理及实现,下一篇将介绍集成学习中基于 Bagging 的随机森林(Random Forest)。
谈谈模型融合之一 —— 集成学习与 AdaBoost的更多相关文章
- 集成学习值Adaboost算法原理和代码小结(转载)
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...
- 集成学习之AdaBoost
AdaBoost 当做出重要决定时,大家可能会考虑吸取多个专家而不只是一个人的意见,机器学习也是如此,这就是集成学习的基本思想.使用集成方法时有多种形式:可以是不同算法的集成,也可以是同一算法在不同设 ...
- 机器学习回顾篇(13):集成学习之AdaBoost
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- 集成学习之Adaboost算法原理小结
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系.前者的代表算法就是是boostin ...
- 集成学习之Adaboost算法原理
在boosting系列算法中,Adaboost是最著名的算法之一.Adaboost既可以用作分类,也可以用作回归. 1. boosting算法基本原理 集成学习原理中,boosting系列算法的思想:
- 集成学习算法——adaboost
adaboost是boosting类集成学习方法中的一种算法,全称是adaptive boost,表示其是一种具有自适应性的算法,这个自适应性体现在何处,下面来详细说明. 1.adaboost算法原理 ...
- 谈谈模型融合之三 —— GBDT
前言 本来应该是年后就要写的一篇博客,因为考完试后忙了一段时间课设和实验,然后回家后又在摸鱼,就一直没开动.趁着这段时间只能呆在家里来把这些博客补上.在之前的文章中介绍了 Random Forest ...
- 机器学习—集成学习(Adaboost)
一.原理部分: 二.sklearn实现: from sklearn.ensemble import AdaBoostClassifier from sklearn.datasets import lo ...
- 决策树(中)-集成学习、RF、AdaBoost、Boost Tree、GBDT
参考资料(要是对于本文的理解不够透彻,必须将以下博客认知阅读): 1. https://zhuanlan.zhihu.com/p/86263786 2.https://blog.csdn.net/li ...
随机推荐
- ps学习教程
1.通道抠图:http://www.16xx8.com/photoshop/tongdaokoutu/
- Python基础:11变量作用域和闭包
一:变量作用域 变量可以是局部域或者全局域.定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域. 全局变量的一个特征是除非被删除掉,否则它们的存活到脚本运行结束,且对于所有的函数, ...
- jmter对于函数的处理
1.获取当天的时间函数 ${__time(yyyy-MM-dd_HH-mm-ss)} 2.获取随机函数 ${__Random(100,300,)} 3.查看结果数
- 2018-2-13-WPF-获得触笔悬停元素上
title author date CreateTime categories WPF 获得触笔悬停元素上 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:2 ...
- Ubuntu 14.04 使用ntfs-config解决开机自动挂载NTFS分区的方法
先安装: sudo apt-get install ntfs-3g ntfs-config 再配置一下: sudo ntfs-config 然后就会弹出来一个对话框,选择你需要挂载的分区,点应用,再选 ...
- SuperSocket从服务器端主动发起连接
你可以从服务器端主动连接客户端, 连接建立之后的网络通信处理将和客户端主动建立连接的处理方式一样. var activeConnector = appServer as IActiveConnecto ...
- fastclick使用与 fastclick ios11.3相关bug原因(ios输入框点击变得不灵敏,ios input失焦后,页面上移,点击不了)
FastClick 移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击.为了能够立即响应用户的点击事件,就有了FastClick. 安装fastc ...
- ThinkPHP3.2版本安全更新
近日我们收到了一个关于3.2版本的漏洞提醒,官方已经第一时间进行处理和更新.由于3.2版本已经过了官方的维护和安全更新周期,而且大量的开发者也进行了二次开发,因此不再发布新版,官方仅进行安全公告和修复 ...
- MATLAB常用函数, 常见问题
MATLAB常用函数 1.常用取整函数 round(x):四舍五入函数 floor(x) : 向下取整, 即 floor(1.2)=1, floor(1.8) = 1 ceil(x) : 向上取整, ...
- js利用select标签生成简易计算功能
html中使用select option作为运算符的承接容器,输入值,选择不同运算符,计算结果. 文章地址 https://www.cnblogs.com/sandraryan/ <!DOCTY ...