[comment]: # 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

前言

最近在看Peter Harrington写的“机器学习实战”,这是我的学习笔记,这次是第7章 - 利用AdaBoost元算法提高分类性能。

核心思想

在使用某个特定的算法是,有时会发现生成的算法\(f(x)\)的错误率比较高,只使用这个算法达不到要求。

这时\(f(x)\)就是一个弱算法。

在以前学习算法的过程中,我们认识到算法的参数很重要,所以把公式改写成这样:

\[f(x,arguments) \\
where \\
\qquad x \text{ : calculated data} \\
\qquad arguments \text{ : function arguments}
\]

一个思路是通过多个弱算法组合形成一个强算法来满足需求。

训练多个弱算法的思路如下:

  • 根据样本数据,求出\(f(x,arguments_1)\);
  • 调整样本数据:将满足匹配\(f(x,arguments_1)\)的样本数据的权重调低,将不满足匹配\(f(x,arguments_1)\)的样本数据的权重调高。
  • 重复以上步骤,训练出多个弱算法算法\(f(x,arguments_1), ..., f(x,arguments_n)\),直到这些弱算法组合的错误率等于0,或者小于指定值为止。

这个思路称之为Adaboost算法,是对其它算法组合的一种方式。

我们可以看出弱算法是同类的算法,也就是说,它们是基于相同的算法,只不过参数不同。这样元算法在训练算法的步骤中就好容易控制。

注:也有其它的的元算法,可以针对不同算法的。

基本概念

  • 元算法(meta-algorithm),是对其它算法组合的一种方式。也称为集成方法(ensemble method)。
  • 弱算法:准确度较低的算法。元算法通过组合多个弱算法来提高准确率。
  • 强算法:可以认为是组合后的算法。
  • boosting : 是一种元算法,将多个弱算法变成强算法的算法族。除了AdsBoost,还有LPBoost, TotalBoost, BrownBoost, xgboost, MadaBoost, LogitBoost, and others.
  • Adaboost : Adaptive Boosting的简称。一个具体的boosting算法。本章就是介绍这个算法。

详解Adaboost

说明:书中弱算法是一个单层决策树算法,返回的是一个二类分类结果(-1, 1)。所以书中Adaboost也是一个二类分类算法。

Adaboost训练算法

  • 输入

    • 样本数据
    • 弱算法的数量
  • 输出
    • 一个弱算法数组(弱算法参数,弱算法权重\(\alpha_i\))
  • 逻辑
在一个迭代中(弱算法数量)
计算当前算法的参数
计算当前算法的错误率
计算当前算法的权重
计算下次样本数据的权重
计算当前的样本数据错误数,如果是0,退出。
  • 核心数学公式

    • 训练算法 - 计算弱算法\(f_i(x)\)的权重\(\alpha_i\):

\[\alpha_i =
\begin{cases}
\frac{1}{2}ln \left (\frac{1 - \epsilon_i}{\epsilon_i} \right), & \text{if} \epsilon_i > C \\
\frac{1}{2}ln \left (\frac{1 - \epsilon_i}{C} \right), & \text{if} \epsilon_i \leqslant C
\end{cases} \\
where \\
\qquad \epsilon_i = \frac{count(\text{wrong classified samples})}{count(\text{all samples})} \text{ : error rate of function i} \\
\qquad C \text{ : constant }\ e^{-16}
\]

解释:为什要用自然对数?

个人认为在权重方面,自然对数和\(log_2,log_{10}\)性质上是一样的,它们的结果是等比例的。

数学家倾向于使用自然对数。

求对数是可以将数据关系线性化。比如:\(log_{10}1000 = 3, log_{10}100 = 2, log_{10}10 = 1\).

* 训练算法 - 调整样本数据:每条样本数据的权重$D_1$

\[D_i^{'(t)} =
\begin{cases}
D_i^{(t)}e^{-\alpha}, & \text{if the sample is classified correctly} \\
D_i^{(t)}e^{\alpha}, & \text{if the sample is not classified correctly}
\end{cases} \\
D_i^{(t+1)} = \frac{D_i^{'(t)}}{\textstyle \sum_{j=1}^n D_j^{'(t)}} \\
where \\
\qquad \alpha \text{ : weight of current weak function} \\
\qquad D \text{ : is a vector, the length is the length of samples data} \\
\qquad D_i \text{ : is weight value of sample data i} \\
\qquad D_i^{(t)} \text{ : is weight value of sample i for this function} \\
\qquad D_i^{(t+1)} \text{ : is weight value of sample i for next week function}
\]

解释:

假如有1000个sample,有100个sample被分错类,则:

\[\begin{array}{lcl}
\epsilon & =\frac{100}{1000} \\
\alpha & = \frac{1}{2}ln \left(\frac{1 - \frac{100}{1000}}{\frac{100}{1000}} \right) \\
& = \frac{1}{2}ln(9) \\
D_{correct}^{'} & = 1 * e^{-\frac{1}{2}ln(9)} \\
& = \frac{1}{e^{\frac{1}{2}} * 9} \\
D_{incorrect}^{'} & = 1 * e^{\frac{1}{2}ln(9)} \\
& = e^{\frac{1}{2}} * 9 \\
\frac{D_{incorrect}^{'}}{D_{correct}^{'}} & = e * 9 ^ 2
\end{array}
\]

可以看出错误的sample占的比例越小,下次的权重是二次方级数增大。

Adaboost分类算法

  • 输入

    • 分类数据
    • 弱算法数组
  • 输出
    • 分类结果
  • 逻辑
在一个迭代中(弱算法数量)
用当前弱算法计算分类结果$classified_i$
计算强分类结果(使用下面的公式)
返回分类结果
  • AdaBoost分类器中计算公式

\[\textstyle \sum_{i=1}^n \alpha_if_i(x) \\
where \\
\qquad \alpha_i \text{ : weight of weak function i} \\
\qquad f_i(x) \text{ : weak function i}
\]

参考

机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能的更多相关文章

  1. 【转载】 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

    原文地址: https://www.cnblogs.com/steven-yang/p/5686473.html ------------------------------------------- ...

  2. 《机器学习实战第7章:利用AdaBoost元算法提高分类性能》

    import numpy as np import matplotlib.pyplot as plt def loadSimpData(): dataMat = np.matrix([[1., 2.1 ...

  3. 利用AdaBoost元算法提高分类性能

    当做重要决定时,大家可能都会吸取多个专家而不只是一个人的意见.机器学习处理问题时又何尝不是如此?这就是元算法背后的思路.元算法是对其他算法进行组合的一种方式. 自举汇聚法(bootstrap aggr ...

  4. 第七章:利用AdaBoost元算法提高分类性能

    本章内容□ 组合相似的分类器来提髙分类性能□应用AdaBoost算法□ 处理非均衡分类问题

  5. 监督学习——AdaBoost元算法提高分类性能

    基于数据的多重抽样的分类器 可以将不通的分类器组合起来,这种组合结果被称为集成方法(ensemble method)或者元算法(meta-algorithom) bagging : 基于数据随机抽样的 ...

  6. 机器学习实战 - 读书笔记(13) - 利用PCA来简化数据

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第13章 - 利用PCA来简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. ...

  7. 使用 AdaBoost 元算法提高分类器性能

    前言 有人认为 AdaBoost 是最好的监督学习的方式. 某种程度上因为它是元算法,也就是说它会是几种分类器的组合.这就好比对于一个问题能够咨询多个 "专家" 的意见了. 组合的 ...

  8. 第九篇:使用 AdaBoost 元算法提高分类器性能

    前言 有人认为 AdaBoost 是最好的监督学习的方式. 某种程度上因为它是元算法,也就是说它会是几种分类器的组合.这就好比对于一个问题能够咨询多个 "专家" 的意见了. 组合的 ...

  9. 机器学习实战 - 读书笔记(14) - 利用SVD简化数据

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第14章 - 利用SVD简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. 基 ...

随机推荐

  1. Swift: 深入理解Core Animation(一)

    如果想在底层做一些改变,想实现一些特别的动画,这时除了学习Core Animation之外,别无选择. 最近在看<iOS Core Animation:Advanced Techniques&g ...

  2. 【总结】编写自己的JDBC框架

    一.数据库连接池: 在一般用JDBC 进行连接数据库进行CRUD操作时,每一次都会: 通过:java.sql.Connection conn = DriverManager.getConnection ...

  3. 即将放出ITSEC第一期所有培训视频

    课程大概被分为三个章节 客户端安全培训 安全工具培训 服务端安全培训   部分PPT                         详细课程表 FireBug代码调试工具使用:工具介绍 FireBu ...

  4. css3实现进度条的模拟

    两种进度条动画的实现: 1.css3,但IE9-不支持. 2.js动画,兼容性好,但没有css3实现的顺畅 Demo: <html>    <head>        < ...

  5. php 5.4 5.5 如何连接 ms sqlserver

    https://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx

  6. 安卓开发笔记——自定义广告轮播Banner(实现无限循环)

    关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...

  7. Gson解析数组多类型元素

    本文的出现是为了解决以下需求:使用Gson对json数组进行解析,但是数组里面元素的类型是多种的.数据如下: {"list":[{ "type":0, &quo ...

  8. JavaScript Scoping and Hoisting

    JavaScript中所有变量及函数名会自动提升 http://www.cnblogs.com/betarabbit/archive/2012/01/28/2330446.html

  9. rspec+rest-client测试第三方web service

    如果你手工测试Restful 服务将会是一件非常单调乏味的事情.当然,目前有一些浏览器插件可以通过可视化的界面帮助你手工测试,例如postman.rest console,但是每次系统版本更新,你都需 ...

  10. VS2008简体中文正式版序列号-试用到期解决

    VS2008简体中文正式版序列号 VS2008简体中文正式版序列号 1.Visual Studio 2008 Professional Edition:XMQ2Y-4T3V6-XJ48Y-D3K2V- ...