机器学习工程师都去哪里露营? 随机森林里。哈哈,一个冷笑话。
where does a machine learning engineer go camping? In a random forest.
1. Decision tree model | 决策树模型
决策树模型是一个强大的算法,广泛应用于很多应用。也被很多人用来赢得机器学习算法竞赛。决策树模型是基于树形结构的一种监督学习算法,用来解决分类和回归问题。
一个猫咪分类的决策树示例如下:
决策树的叶子结点,也就是下图矩形框的位置,是最终决策结果。当有一个耳朵尖尖(Pointy)、脸圆圆的(Round)、有胡须(Present)的小动物出现时,根据决策树模型,他会被判定为一只猫。
图1
猫咪分类示例有10给样本数据,在这个10个数据中,我们会列出动物的耳朵形状、脸型、是否有胡须以及实际是否为一只猫。数据如下图所示:
图2
2. Choosing a split: Information Gain | 如何选择最佳分割特征
在树的每个结点,选择哪一个特征作为结点呢?如何构建决策树?首先让我们来看看 purity和information gain这两个指标。
2.1 Measuring purity| 纯度
在这里我们将探讨如何测量一组样本的纯度。如果一组样本全是猫或者全部不是猫,那么这组数据非常纯净。如果介于两者之间如何测量纯度呢?首先我们来看一下熵的定义。
熵是衡量数据集不纯度的一个指标。熵是关于概率Pi的函数,函数图形如下图3所示:
图3
图4
如果一组数据中有3只猫,那么P1 = 3/6 = 0.5,对应的熵等于1。 我们发现当猫和非猫的概率是50-50时,熵的值最大,也就是这是最不纯的情况。相反如果全是猫或者全是狗,那么熵为0。让我们再举几个例子,以进一步理解熵及其运作方式。当数据有5只猫一只狗时,P1 = 5/6 = 0.83,从图中读出熵大概是0.65。如果有两只猫和四只狗, 所以这里 p1 = 2/6,也就是 1/3,约等于0.33,从图中读出熵结果大约是 0.92。这实际上相当不纯。比5只猫1只狗更不纯,因为1/3更接近于50%-50%。
让我们来看看熵的公式, p1 是一组数据中是猫的概率。
H(p1)=-p1log2(p1) - (1-p1)log2(1-p1)
关于计算这个函数,有一点需要说明,如果p1或(1-p1)等于 0 ,那么这样的表达式看起来就是 0log(0),而 log(0)在技术上是未定义的,实际上是负的无穷。但按照惯例,为了计算熵,我们将 0log(0)等于 0,这样可以正确计算熵为零或1。
总结来说,熵函数是衡量数据集杂质程度的指标。它从零开始,上升到一,然后根据样本中positive examples的比例下降到零。
2.2 Information Gain | 信息增益
在构建决策树时,我们选择哪一个特征作为结点,取决于哪种特征选择能最大程度降低熵。在决策树的学习中,熵的减少被成为信息增益。那么如何计算增益,以用来决定选择哪个特征呢?
仍然以猫咪分类器为例子。该数据有3个特征,分别为耳朵、脸形、胡须。
如果根节点选择耳朵,那么左右各有5个动物,其中左边5只有4只是猫,那么P1=4/5。右侧有1只猫,那么P1 = 1/5。他们的熵都是0.72。
图5
如果我们选择脸型作为决策结点,那么左边的七个例子中有四个是猫,所以 P1 是 4/7,右边是1/3 是猫,所以右边的 P1 是 1/3。 4/7 的熵和 1/3 的熵分别是 0.99 和 0.92。最后如果根节点我们选择胡须特征,在这种情况下,左侧的 P1 是 3/4, 右侧的 P1 是 2/6,熵分别是0.81 和 0.92。 那么问题来了,我们该选择那一个特征呢?我们取这些熵的加权平均值计算。每个熵的权值是看有多少数据进入左/右分支。对于耳朵特征,两边的权重都是5/10. 对于脸型特征左右的权重分别是7/10和3/10。同理,胡须特征左右的权重的分别是4/10和6/10。所以三个特征的加权平均值为:
耳朵: 5/10 * 0.72 + 5/10 * 0.72
脸型: 7/10 * 099 + 3/10 * 0.92
胡须: 3/10 * 0.81 + 7/10 * 0.92
然后从中选择一个最小的值作为该结点的特征。在决策树构建方式上,我们实际上会对这些公式做最后一次修改,以遵循决策树构建的惯例,但这不会改变结果。 也就是说,我们不是计算加权平均熵,而是计算熵的减少,相较于根本没有分裂的情况。如果我们回到根节点,记住我们已有的根节点起始时,根节点中有全部 10 个例子, 包含五只猫和狗。因此在根节点,p1 等于 5/10 或 0.5。根节点的熵,实际上等于 1。 我们实际用选择特征的公式不是左右子分支的加权熵,而是根节点的熵减去加权熵。
图6
图中计算出来的这些数字,0.28、0.03 和 0.12,被称为信息增益,它衡量的是你在树中因分裂而得到的熵减少。在这三个特征中,0.28最大因此我们选择耳朵作为结点。为什么我们要计算熵的减少而不是直接使用加权熵呢? 因为当熵的减少比较小或者几乎不再减少时,我们将停止构建决策树,以减少过拟合。
information gain的一般性公式为:
图7
使用单一决策树的一个缺点是该决策树对数据中的微小变化可能非常敏感。 让算法更不敏感或更稳健的解决方案是构建多个决策树,而不是构建一个决策树 , 我们称之为树集成。
树集成的两种主要方法是:
1. Bagging(装袋法) - 并行构建多棵树
代表算法:随机森林
2. Boosting(提升法) - 串行构建多棵树
代表算法:XGBoost、AdaBoost
3. Random forest algorithm | 随机森林算法
在看随机森林算法之前,我们先来看一下有放回的抽样。
3.1 Sampling with replacement | 有放回抽样
一个袋子中有10个不同颜色的球,你需要从袋子中抽出10个球。你可能会说,这不就是把球全部拿出来? 不是的,我们不是一次性抽10个球,而是一次抽1个,分10次抽。每次抽完一个球,记住颜色。再把抽回的球放回袋子里,开始抽第二次。重复以上步骤,直到抽出10个球。这就是有放回抽样。 举个例子,对于4个颜色的token有放回抽样的组合可能有以下几种:
图8
3.2 Random forest algorithm| 随机森林算法
随机森林算法使用有放回抽样从N个训练样本中,随机抽取N个样本(允许重复)。使用k个特征(k < n, n是样本特征值)。然后按照信息增益对这N个样本,k个特征进行构建决策树。
k 一般选择.
重复B次之后,得到B棵决策树,这些树就构成了随机森林。B 一般等于100 - 500. 使用随机森林预测时:新样本输入到森林中的每一棵树,每棵树给出一个类别预测。最终预测 = 所有树预测的众数(得票最多的类别)
例如:100棵树预测一个样本
树1: 类别A
树2: 类别B
树3: 类别A
...
树100: 类别A
统计:类别A得票68,类别B得票32
最终预测:类别A。
4. XGBoost
多年来,机器学习研究人员已经提出了许多构建决策树和决策树集成的方法。目前,最常用或实现决策树集成或决策树的方法之一是XGBoost算法。它运行速度快,开源实现易于使用,并且已经非常成功地应用于赢得许多机器学习竞赛以及许多商业应用中。让我们来看看XGBoost是如何工作的。
我们先来回忆下随机森林算法。给定一个大小为m的训练集,你重复B次,使用有放回的抽样来创建一个新的训练集,大小为M,然后在新的数据集上训练决策树。
在第二次循环时,我们将改变算法,在采样时,我们不是从所有m个等概率的例子中挑选,而是让被先前训练的树表现不佳的误分类例子更有可能被选中。
以猫咪分类器为例,在第一次有放回抽样抽取10个样本时,构建了一棵决策树。我们用原始数据集查看分类的准确性。
图9
如图9 所示,我们有3个样本分类错误,那么第二次循环时,虽然依然使用有放回的抽样方法来生成另一个包含十个示例的训练集。但每次我们从这十个示例中挑选时,会有更高的概率挑选到这三个仍然被错误分类的示例。因此,这个过程通过像刻意练习一样,将第二棵决策树的注意力集中在专辑仍然表现不佳的示例上。
然后,提升过程会总共执行B次,其中在每次迭代中,你会查看对于树1、2直到(b-1)的集成树,哪些方面做得还不够好。当你在构建第b棵树时,你将有更高的概率选择那些例子,即先前采样树的集成仍然在哪些方面做得不够好。
如何给分类错误的数据增大概率,是一个复杂的数学问题。我们不用自己去实现,目前最广泛使用的是XGBoost,它是一个开源的梯度提升树实现,非常快速和高效。XGBoost还提供了良好的默认分割标准和停止分割的标准。XGBoost的一个创新之处在于它内置了正则化来防止过拟合,在诸如Kaggle这样广泛使用的机器学习竞赛网站中,XGBoost通常是一种极具竞争力的算法。
XGBoost算法实现很复杂,因此大家一般都使用开源的XGBoost。使用开源XGBoost进行分类预测,代码如下:
from xgboost import XGBClassifier
model = XGBClassifier()
model.fit(X train,y train)
y_pred = model.predict(X test)
5. XGBoost vs Random forest algorithm
如果你希望快速建立一个还不错、非常稳定的模型;你的数据比较脏、有较多噪声;你需要一个可靠的特征重要性参考;你计算资源有限或不想花太多时间调参。那么选择随机森林算法。
如果你在参加比赛或需要将模型性能推到极致;你有充足的时间和计算资源进行调参;你的数据质量较高,经过较好清洗;你需要处理大规模数据并利用其系统优化。那么选择XGBoost。
ps. 文中插图全部来自吴恩达机器学习课程。