一、引言
决策树是另一种十分有效的机器学习模型。该模型采取树状分支结构,能够很快地进行模型训练,并具有较高的准确率。
本文将以决策树的最简单形式开始,即特征只包括真值特征,或只有两种选择的特征,且结果也只有两种的情况。
二、决策树基本模型
决策树是一个二叉树,树的非叶节点存储需要区分的特征,叶节点存储预测的分类。对于每一个要进行预测的数据,从根节点开始,根据当前节点所对应的特征,选择移动到左子节点或右子节点。直到最终移动到一个叶节点,返回预测结果。
可以认为决策树的预测过程就是通过不同特征将当前数据分组归类的过程。决策树的构建过程,或者更一般地说,该模型的学习过程,也就是不断确定如何分类的过程。
三、决策树的构建
总体上讲,对于我们已有的样本数据,构建决策树的过程时这样的。
- 选择一个特征,将该特征作为当前节点的特征
- 根据该特征将样本数据分为两组
- 对于两组被分类的数据,分别递归执行如上操作,从而确定当前节点的左右子节点。直到当前数据已经全部是要预测的某个结果了、或者所有特征都被用完、又或者递归进行到了最大层数。
可以看到,决策树构建的过程中大部分过程都可以用简单的程序逻辑实现。现在唯一要解决的就是在每个节点时,如何选择一个特征了。
当然,对于神经网络来说也是这样的。唯一要解决的是如何选择权重。
四、特征的选择
我们要衡量选择不同特征对训练样本的区分效果。这点类似于损失函数。
我们区分的目标是使得所有当前组的样本属于同一个预测结果。那么我们就要找到一种衡量纯度的指标,数据越纯指标越小,数据越不纯指标越大。这种指标就是熵。假设某一种类在数据总体中的占比为 $p_1$,则熵 $H(p_1)$ 为
$$ p_0 = 1 - p_1 \\ H(p_1) = -p_1log_2(p_1) - p_0 log_2(p_0) $$即
$$ H(p_1) = -p_1log_2(p_1) - (1-p_1) log_2(1 - p_1) $$当 $p_1 = 0$ 或 $p_1 = 1$ 时
$$ H(0) = H(0+0) = 0 \\ H(1) = H(1-0) = 0 $$可以看出熵与交叉熵损失函数之间有联系。确实,交叉熵损失函数也是用来衡量预测的纯度的。对于一个预测,我们总希望它接近 0 或者 1,也就是纯度最大的比例。
我们不妨设决策树中预测可能结果中一个为正例,一个为负例。假设对于当前节点处的训练样本集合 $X$, 我们选择第 j 个特征,将该集合分为两个部分 $A_j$ 和 $B_j$。设此时 $A_j$ 和 $B_j$ 中正例所占比例分别为 $p_{Aj}, p_{Bj}$,则对应的熵为:
$$ H(p_{Aj}) 和 H(p_{Bj}) $$对于不同的 j,两个熵值均会不同,那么我们如何比较哪种选择更为合适呢?我们需要对熵取加权平均,权重为该集合中元素数量占原集合数量的比重。
$$ \frac{\#A_jH(p_{Aj}) + \#B_jH(p_{Bj})}{\#X} $$这是很合理的。举个例子,假设选择了一个特征将一个样本和其他样本分开,虽然第一个样本的熵为 0,可是该分类对样本整体的影响较小,决定整体纯度的还是其他样本的部分,最终平均后的熵可能并不会减少太多
我们将分类后的平均熵值对分类前的总熵的减少量称为信息增益(Information Gain)。假设选择某一特征时,子集合元素数量占原集合的比重为 $w^{left}, w^{right}$,则
$$ \text{Information Gain} = H(p^{root}_1) - (w^{left}H(p^{left}_1) + w^{right}H(p^{right}_1)) $$这样我们就解决了选择特征的问题,只要选择使信息增益最大的特征即可。
很明显,如果一个特征在祖先节点已经被选择过了,则信息增益为 0。当所有特征的信息增益都为 0 时,说明所有特征都已经被使用过了,此时就可以返回递归了。
五、多取值特征
之前,我们的每一个特征都只能有两个取值,我们要将特征的取值推广到多个。这里采用的方法是将多取值特征转化为双取值特征。
解决方案是采用独热(one-hot)编码。举例来说,如果有一个特征 x,取值为1、2或3。那么我们可以将其转化为三个特征 is_x_equal1、is_x_equal2和is_x_equal3。这样,三个新的特征就可以只取 0、1 两个值了。
六、连续取值特征
对于连续取值的特征,我们要将其转化为离散特征。
具体来说,我们可以取一个阈值 n,将样本按该特征的值分为大于 n 和小于等于 n 的两个部分。为了方便选择,我们可以取样本的值进行分割,也就是分别取每一个样本中该特征对应的值作为划分时所用的值,计算其信息增益,最后选择使信息增益最大的值作为对该特征的划分即可。
七、回归树——对连续取值结果的预测
回归树是对决策树的进一步扩展。使得决策树模型可以学习结果为连续值的训练样本。
这样,原本的计算信息增益的方法就不再适用了。现在的数据不再有纯度的分别了,取而代之的是疏密的区别。这里我们采用样本结果的方差来衡量数据的离散程度。依旧设子集合元素数量占原集合的比重为 $w^{left}, w^{right}$,样本结果的方差则为 $var^{root}, var^{left}, var^{right}$
则增益的大小为
$$ \text{Gain} = var^{root} - (w^{left}var^{left} + w^{right}var^{right}) $$经过不断的递归构建,我们最终在叶节点处得到一组方差较小的样本。将这组样本的结果取平均,即得到叶节点对应的预测值。
八、决策树林
决策树的缺点之一是其可能对数据中的微小变化十分敏感,以至于稍有不同的数据就会产生截然不同的决策树结构。对于需要有比较大可靠性的预测,这是需要避免的。
解决方法是生成许多不同结构的决策树,通过这些决策树的预测结果表决或取平均,得到最终的预测结果。但确定的训练样本只会产生确定的决策树。因此这里采用随机化保证生成不同结构的决策树。
也就是说,对于大小为 m 的训练集,我们从中随机放回抽取 m 个样本,组成一个新的训练集,用该训练集生成一个决策树。重复这样的过程多次,就可以得到许多不同结构的决策树。
还有一种名为 XGBoost 的方法。这样方法在选取样本组成新的训练集的过程中,会倾向于选择之前并未被选取的样本,这样组成的样本集合将更为一般化,从而使得学习效果更好。
这样,我们就得到了能解决大部分机器学习问题的决策树算法。