决策树(decision tree)是一种分类和回归算法。它是描述对实例进行分类的属性结构。树中的节点分为叶节点和内部节点两种:叶节点表示一个类,内部节点表示一种特征。
数据集往往有太多特征个数,从众多决策树中选取最优的决策树是一个NP完全问题。所以通常采取启发式的方法,近似求解这一最优化问题,这样得到的决策树是次最优的。通常的做法是递归的选取最优的特征,并基于该特征对数据集分割,分割后的数据递归进行上述过程,直到所有数据被正常分类或触发结束条件。
熵(entropy)是表示随机变量不确定性的度量。设\(X\)是一个取有限个值的离散随机变量,其概率分布为:
则随机变量\(X\)的熵定义为:
熵越大,随机变量的不确定性就越大。
信息增益\(g\),特征\(A\)对训练数据集\(D\)的信息增益\(g(D,A)\),定义为经验熵\(H(D)\)与特征\(A\)给定条件下\(D\)的经验条件熵\(H(D|A)\)之差,即互信息:
其中,\(H(D|A)=-\sum\limits_{i=1}^n \frac{|D_i|}{|D|}\),\(g(D,A)=H(D) - H(D|A)\),\(C_k\)是集合\(D\)中第\(k\)个类的样本集合。
信息增益比是为了解决信息增益偏向于选择取值较多的特征的问题。定义为信息增益\(g(D,A)\)与训练数据集\(D\)关于特征\(A\)的值的熵\(H_A(D)\)之比:
其中,\(H_A(D)=-\sum\limits_{i=1}^n \frac{|D_i|}{|D|} \log_2 \frac{|D_i|}{|D|}\)。
基尼指数\(Gini\),在分类问题中,假设有\(K\)个类,样本点属于第\(k\)类的概率为\(p_k\),则概率分布的基尼指数定义为:
同理,样本集合D的基尼指数为:
给定条件A下,集合D基尼指数:
5.3.1 ID3算法
训练数据集\(D\),特征集\(A\),阈值\(\epsilon\);
- 若\(D\)种所有的实例属于同一类\(C_k\),则\(T\)为单结点树吗,并将类\(C_k\)作为该结点的类标记,返回\(T\);
- 若\(A=\empty\),则\(T\)为单结点树,并将\(D\)中实例数最大的类\(C_k\)作为该节点的类标记,返回\(T\);
- 否则按照信息增益算法,计算\(A\)中各特征对\(D\)的信息增益,选择信息增益最大的特征\(A_g\);
- 如果\(A_g\)的信息增益小于阈值\(\epsilon\),则置\(T\)为单结点树,并将\(D\)中实例数最大的类\(C_k\)作为该结点的类标记,返回\(T\);
- 否则,对\(A_g\)的每一个可能值\(a_i\),依\(A_g=a_i\),将\(D\)分割为若干非空子集\(D_i\),将\(D_i\)中实例数最大的类作为标记,构建子节点,由结点及其子结点构成树\(T\),返回\(T\);
- 对第\(i\)个子节点,以\(D_i\)为训练集,以\(A-\{Ag\}\)为特征集,递归调用步骤1~5得到子树\(T_i\),返回\(T_i\)。
5.3.2 C4.5
C4.5在生成的过程中,用信息增益比来选择特征。
5.4 决策树剪枝决策树的生成过程中,往往产生过拟合现象,对训练数据集分类很准确,对位置的测试数据分类不准确。可以应用剪枝的技术从树上剪掉子树或者叶节点简化模型。
设树\(T\)的叶节点个数为\(|T|\),\(t\)是一个叶节点,一个叶节点由\(N_t\)个样本点,\(k\)类的样本有\(N_{tk}\)个,\(H_t(T)\)是叶节点t的经验熵,则一个损失函数可以定义为:
其中,\(H_t(T) = -\sum_k \frac{N_{tk}}{N_t}\log\frac{N_{tk}}{N_t}\)。
剪枝算法:
- 计算每个节点的经验熵;
- 递归从数的叶节点向上回缩,计算回缩前后的损失函数值,若损失函数减少,则剪枝;
- 重复步骤2,直至收敛。
分类树使用基尼指数表示不确定性,这里详细介绍回归树。
设X,Y分别表示输入和输出,并且Y是连续变量,训练数据集:
若树已经将空间划分为M个单元\(\{R_1,...,R_M\}\),回归树模型可以表示为:
损失函数用平方误差表示\(\sum\limits_{x_i\in R_m}(y_i - f(x_i))\),则\(R_m\)上\(c_m\)最优值\(\hat{c}_m\)为所有实例输出\(y_i\)的均值:
选择第\(x\)的第\(j\)维数据\(x^j\)和\(x^j\)的一个取值\(s\),可以划分:
优化下面公式:
最优切分点是均值,可以根据公式$$求得。
算法:
- 遍历\(j\)和\(s\),求解公式\((5.10)\),选择最优的\(j\)和\(s\)。
- 用选定的\(j\)和\(s\)划分区域,并根据\((5.9)\)求解输出值。
- 重复步骤1.和步骤2.,直至收敛。
CART剪枝分为两个步骤:首先从生成算法产生的决策树\(T_0\)底端不断剪枝,直到根节点,形成一个字数序列\(\{T_0,...,T_n\}\);然后交叉验证选择最优子树。
步骤1:
剪枝的过程中以t为根节点的子树的损失函数:
其中,\(T\)是任意子树,\(C_T\)是训练误差,\(\alpha\)是参数,\(|T|\)表示树的复杂度。
则以t为根节点的子树\(T_t\)损失函数为:
以\(t\)为单节点的树的损失函数为:
解\(\alpha\)为:
为\(T_0\)中每一个内部节点计算
选择最小的一个作为\(\alpha_1\),对应的子树作为\(T_1\)。以此递归,生成\(\{T_0,T_1,...T_n\}\)。
步骤2:
交叉验证所有子树,择优。
熵和基尼指数的关系: