AdaBoost对实际数据分类的Julia实现

AdaBoost是机器学习领域一个很重要很流行的算法,而Julia是一门新兴的发展迅速的科学计算语言。本文将从一个实际例子出发,展示如何用Julia语言实现AdaBoost算法。

什么是AdaBoost

这方面的资料有很多,我将基于Hastie和Tibshirani的ESL(The Elements of Statistical Learning)有关章节的内容,从统计学习的角度简单介绍一下。另外,我一直在进行ESL的翻译工作,并试图实现书中有关算法,欢迎访问ESL-CN项目主页,本节的相关翻译内容参见这里。

给定预报向量\(X\),分类器\(G(X)\)在二值\(\\{-1,1\\}\)中取一个值得到一个预测。在训练样本上的误差率是

\[ \overline{err}=\frac{1}{N}\sum\limits_{i=1}^NI(y_i\neq G(x_i)) \]

在未来预测值上的期望误差率为\(E_{XY}I(Y\neq G(X))\)

弱分类器是误差率仅仅比随机猜测要好一点的分类器。boosting的目的是依次对反复修改的数据应用弱分类器算法,因此得到弱分类器序列\(G_m(x),m=1,2,\ldots,M\) 根据它们得到的预测再通过一个加权来得到最终的预测

\[ G(x)=\mathrm {sign}(\sum\limits_{m=1}^M\alpha_mG_m(x)) \]

用一个概念图(图来自ESL原书)表示如下:

AdaBoost对实际数据分类的Julia实现

具体来说,对每步boosting的数据修改是对每个训练观测\((x_i,y_i),i=1,2,\ldots,N\)赋予权重\(w_1,w_2,\ldots,w_N\)。初始化所有的权重设为\(w_i=1/N\),使得第一步以通常的方式对数据进行训练分类器。对每个接下来的迭代\(m=2,3,\ldots,M\),单独修改观测的权重,然后将分类算法重新应用到加权观测值上。在第\(m\)步,上一步中被分类器\(G_{m-1}(x)\)的误分类的观测值增大了权重,而正确分类的观测值权重降低了。因此当迭代继续,很难正确分类的观测受到越来越大的影响。每个相继的分类器因此被强制集中在上一步误分类的训练数据上。

算法10.1显示了AdaBoost.M1算法的详细细节。当前的分类器\(G_m(x)\)由第2(a)行的加权观测值得到。在第2(b)行计算加权误差率。第2(c)行计算赋予\(G_m(x)\)的权重\(\alpha_m\)来得到最终的分类器\(G(x)\)(第3行)。每个观测的个体权重在第2(d)行进行更新。在导出序列中下一个分类器\(G_{m+1}(x)\)时,被分类器\(G(x)\)错误分类的观测值的权重被因子\(exp(\alpha_m)\)进行缩放以提高它们的相对影响。

AdaBoost对实际数据分类的Julia实现

例子

特征\(X_1,\ldots,X_{10}\)是标准独立高斯分布,目标\(Y\)定义如下
\[ Y= \left\{ \begin{array}{ll} 1&\text{if } \sum_{j=1}^{10}X_j^2>\chi_{10}^2(0.5)\\ -1 & \text{otherwise} \end{array} \right. \qquad (10.2) \]

这里\(\chi_{10}^2(0.5)=9.34\)是自由度为10的卡方随机变量的中位数(10个标准的高斯分布的平方和)。有2000个训练情形,每个类别大概有1000个情形,以及10000个测试观测值。这里我们取称为“stump”的弱分类器:含两个终止结点的分类树。

实现

Julia的具体细节参见官方manual。

首先我们定义模型的结构,我们需要两个参数,弱分类器的个数n_clf和存储n_clf个弱分类器的n_clf\(\times 4\)的矩阵。因为对于每个弱分类器——两个终止结点的stump,我们需要三个参数确定,分割变量的编号idx,该分割变量对应的cutpoint值val,以及分类的方向flag(当flag取1时则所有比cutpoint大的观测值分到树的右结点,而flag取0时分到左结点),另外算法中需要确定的alpha参数,所以一个stump需要四个参数。下面代码默认弱分类器个数为10。

struct Adaboost n_clf::Int64 clf::Matrix end function Adaboost(;n_clf::Int64 = 10) clf = zeros(n_clf, 4) return Adaboost(n_clf, clf) end

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpddss.html