机器学习相关知识整理系列之一:决策树算法原理及剪枝(ID3,C4.5,CART)
决策树是一种基本的分类与回归方法。分类决策树是一种描述对实例进行分类的树形结构,决策树由结点和有向边组成。结点由两种类型,内部结点表示一个特征或属性,叶结点表示一个类。
1. 基础知识
熵
在信息学和概率统计中,熵(entropy)是表示随机变量不确定性的度量。设\(X\)是一个取有限个值得离散随机变量,其概率分布为:$$P(X = x_i) = p_i, i = 1,2,3,...,n$$
则随机变量\(X\)的熵定义为:$$H(X) = - \sum_{i=1}^{n}p_i\log{p_i}$$
通常上式中对数以\(2\),或者\(e\)为底。由定义知,熵依赖于\(X\)的分布,而于\(X\)的取值无关,所以\(X\)的熵记作\(H(p)\),即:
熵越大,随机变量的不确定性就越大,\(0\leq H(p) \leq \log{n}\)。
1.1 条件熵
设有随机变量\((X,Y)\),其联合概率分布为:
条件熵表示\(H(Y|X)\)在已知随机变量\(X\)的条件下随机变量\(Y\)的不确定性,定义为:
这里,\(p_i=P(X=x_i), i = 1,2,...,n\)。当熵和条件熵中的概率由数据估计(极大似然估计)得到时,所对应的熵分别为经验熵和经验条件熵。
1.2 信息增益
信息增益表示得知特征\(A\)的信息而使得类\(Y\)的信息的不确定性减少的程度。特征\(A\)对训练数据集\(D\)的信息增益\(g(D,A)\),定义为集合\(D\)的经验熵与特征\(A\)给定条件下\(D\)的经验条件熵之差,即:
(2)特征\(A\)对数据集\(D\)的经验条件熵\(H(D|A)\)
(3)信息增益\(g(D,A) = H(D) - H(D|A)\)
1.3 信息增益比
信息增益作为划分数据集的特征,存在偏向与选择取值较多的特征的问题。信息增益比可以改进改问题。特征\(A\)对训练数据集\(D\)的信息增益比\(g_R(D,A)\)定义为其信息增益\(g(D,A)\)与训练数据集\(D\)关于特征\(A\)的值得熵\(H_A(D)\)之比,即:
该评价函数值越小越好,所以,可以称为“损失函数”。
6. 剪枝
决策树对训练属于有很好的分类能力,但是对于未知的测试集未必有好的分类能力,泛化能力弱,即可能发生过拟合现象。为防止过拟合,我们需要进行剪枝。
三种决策树的剪枝过程算法相同,区别是对于当前树的评价标准不同。
剪枝分为预剪枝和后剪枝:
6.1 预剪枝:
(1)每一个结点所包含的最小样本数目,例如10,则该结点总样本数小于10时,则不再分;
(2)指定树的高度或者深度,例如树的最大深度为4;
(3)指定结点的熵小于某个值,不再划分。
6.2 后剪枝:
总体思路:由完全树\(T_0\)开始,剪枝部分结点得到\(T_1\),再次剪枝部分结点得到\(T_2\)...直到剩下树根的树\(T_k\);在验证数据集上对这\(k\)个树分别评价,选择损失函数最小的树\(T_a\)。
设树\(T\)的叶结点个数为\(|T|\),t是树T的叶结点,该叶结点有\(N_i\)个样本点,其中k类的样本点有\(N_{ik}个,k=1,2,...,K\)。 \(H_t(T)\)为叶结点\(t\)上的经验熵,\(\alpha \geq 0\)为参数,则决策树学习的损失函数可定义为:
其中经验熵为$$H_t(T) = \sum_{t=1}^{|T|}{\frac{N_{tk}}{N_t} \log {2} \frac{N{tk}}{N_t}}$$
这时有:$$C_{\alpha}(T) = C(T) + \alpha |T|$$
\(C(T)\)表示模型对训练数据集的预测误差,即模型与训练数据集的拟合程度。\(|T|\)表示模型的复杂度,参数\(\alpha \geq 0\)控制两者之间的影响。较大的\(\alpha\)促使选择较简单的模型(树),较小的\(\alpha\)促使选择较复杂的模型(树),当\(\alpha = 0\)时意味着只考虑模型与训练数据的拟合程度,不考虑模型复杂度。
假定当前对以\(r\)为根的子树剪枝,剪枝后,只保留\(r\)本身而删掉所有的子结点。
以\(r\)为根的子树:
- 剪枝后的损失函数:\(C_\alpha(r) = C(r) + \alpha\)
- 剪枝前的损失函数:\(C_\alpha(R) = C(R) + \alpha \cdot |R_{leaf}|\)(\(C(R)\)应该是小于\(C(r)\))
- 令二者相等,求得:\(\alpha = \frac{C(r) - C(R)}{R_{leaf} -1}\),\(\alpha\)称为结点\(r\)的剪枝系数。
对于给定的决策树\(T_0\):
- 计算所有内部结点的剪枝系数;
- 查找最小剪枝系数的结点,剪枝得决策树\(T_k\);
- 重复以上步骤,直到决策树\(T_k\)只有一个结点;
- 得到决策树序列\(T_0,T_1,T_2...T_k\);
- 使用验证样本集选择最优子树。