决策树- CART 分类树
在 决策树-\(ID3、C4.5\) 中,提到 \(C4.5\) 的不足,比如,模型用较为复杂的熵来度量,生成较为复杂的多叉树,只能处理分类问题,不能处理回归问题。对这些问题,\(CART\)(\(Classification\ And\ Regression\ Tree\))做了改进,可以处理分类,也可以处理回归。
一、特征选择
\(ID3\) 使用信息增益选择特征,增益大优先选择;
\(C4.5\) 使用信息增益比选择特征,减少因特征值多导致信息增益大的问题,信息增益比大优先选择;
\(CART\) 分类树使用基尼指数选择特征,基尼指数小优先选择,这与信息增益(比)相反。
1. 基尼系数
分类问题中,假设有 \(K\) 个类,样本点属于第 \(k\) 类的概率为 \(p_k\),则概率分布的基尼指数为
如果是二分类问题,样本点属于第 \(1\) 类的概率是 \(p\),则概率分布的基尼指数为
如果给定的是样本集合 \(D\),其基尼指数为
其中,\(C_k\) 是 \(D\) 中属于第 \(k\) 类的样本子集,\(K\) 是类的个数。
如果样本集合 \(D\) 根据特征 \(A\) 是否取某一可能值 \(a\) 被分割成 \(D_1\)、\(D_2\) 两部分,即
则在特征 \(A\) 的条件下,集合 \(D\) 的基尼指数定义为
基尼指数 \(Gini(D)\) 表示集合 \(D\) 的不确定性,基尼指数 \(Gini(D,A)\) 表示经过 \(A=a\) 分割后集合 \(D\) 的不确定性。基尼指数值越大,样本集合的不确定性越大,这一点与熵相似。
图 \(5.7\) 显示二分类问题中基尼指数 \(Gini(p)\)、熵之半 \(H(p)/2\)、分类误差率的关系。横坐标表示概率,纵坐标表示损失。
二、CART分类树算法
输入:训练集 \(D\),基尼指数阈值,样本个数阈值。
输出:\(CART\) 分类树
根据训练集,从根结点开始,递归地对每个结点进行以下操作,构建二叉树:
① 计算现有特征基尼指数。此时,对每个特征 \(A\),对其可能的取值 \(a\),根据样本点对 \(A=a\) 的测试为 “是” 或 “否”,将 \(D\) 分割成 \(D_1\) 和 \(D_2\) 两部分,利用式 \((3)\) 计算 \(A=a\) 时的基尼指数。
② 在所有可能的特征 \(A\) 以及它们所有可能的切分点 \(a\) 中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依据最优特征与最优切分点,从现结点生成两个子结点,将训练集分配到两个子结点中。
③ 对两个子结点递归调用 ①,②,直到满足停止条件。
④ 生成 \(CART\) 决策树。
算法停止条件:树的最大深度、结点划分所需最小样本数、叶子结点最小样本数、结点划分最小不纯度、最大叶子结点数等这些限制条件都可以作为停止条件,或没有更多特征。
例 \(1\):根据 决策树-\(ID3、C4.5\) 中例 \(2\) 的训练集,应用 \(CART\) 算法生成决策树。
解:计算各特征的基尼指数。分别以 \(A_1,A_2,A_3,A_4\) 表示年龄、有工作、有房子、信贷 \(4\) 个特征。
以 \(1,2,3\) 表示年龄为青年、中年、老年;以 \(1,2\) 表示有工作、无工作;有房子、无房子;以 \(1,2,3\) 表示信贷为非常好、好、一般。
求特征 \(A_1\) 的基尼指数:
由于 \(Gini(D,A_1=1)\) 和 \(Gini(D,A_1=3)\) 相等,且最小,所以 \(A_1=1\) 和 \(A_1=3\) 都可以选作 \(A_1\) 的最优切分点。
求特征 \(A_2\)、\(A_3\) 的基尼指数:
由于 \(A_2\)、\(A_3\) 只有一个切分点,所以他们就是最优切分点。
求特征 \(A_4\) 的基尼指数:
\(Gini(D,A_4=3)\) 最小,所以 \(A_4=3\) 为 \(A_4\) 的最优切分点。
在 \(A_1,A_2,A_3,A_4\) 特征中,\(Gini(D,A_3=1)=0.27\) 最小,所以选择 \(A_3\) 为最优特征,\(A_3=1\) 为最优切分点。于是,根结点生成两个子结点,一个是叶节点,对另一个结点继续使用以上方法 \(A_1,A_2,A_4\) 中选择最优特征及最优切分点,结果是 \(A_2=1\)。依次计算得知,所得结点都是叶结点。
根据计算,\(CART\) 算法生成的决策树与 \(ID3\) 生成的决策树完全一致。
三、对连续值和离散值的处理
1. 连续值处理
连续特征的取值数目是无限的,不能直接根据连续特征的取值来对结点进行划分,需连续特征离散化。最简单的二分法。
① 将 \(n\) 个连续值从小到大排列。
给定样本集 \(D\) 和连续特征 \(a\),特征 \(a\) 在 \(D\) 上有 \(n\) 个不同的取值,经从小到大排列,记为 \(\{a^1,a^2,...,a^n\}\)。
② 取相邻两样本值的中位点(平均值),得到 \(n-1\) 个划分点。
特征 \(a\) 的第 \(i\) 个划分点记为 \(T_a = \frac{a^i+a^{i+1}}{2}\),然后,就可像离散特征值一样来考察这些划分点。
③ 用基尼指数最小的点作为最优的划分点进行样本集的划分。
④ 在所有可能的特征 \(a\) 以及它们所有可能的切分点 \(i\) 中,用基尼指数最小的点来选择特征,构建决策树。
2. 离散值处理
\(CART\) 分类树对离散值的处理,思路:不停的二分离散特征。
在 \(ID3、C4.5\),如果某个特征 \(A\) 被选取建立决策树结点,它有 \(A_1、A_2、A_3\) 三种类别,在决策树建立上会生成一个三叉树。
\(CART\) 采用不停的二分。会考虑把特征 \(A\) 分成 \(\{A_1\}\) 和 \(\{A_2,A_3\}\)、 \(\{A_2\}\) 和 \(\{A_1,A_3\}\)、 \(\{A_3\}\) 和 \(\{A_1,A_2\}\) 三种情况,找到基尼指数最小的组合,比如 \(\{A_2\}\) 和 \(\{A_1,A_3\}\),然后建立二叉树结点,一个结点是 \(\{A_2\}\) 对应的样本,另一个结点是\(\{A_1,A_3\}\) 对应的样本。由于这次没把特征 \(A\) 的取值完全分开,后面还有机会对子结点继续选择特征 \(A\) 划分 \(A_1\) 和 \(A_3\)。这和 \(ID3、C4.5\) 不同,在 \(ID3、C4.5\) 中,离散特征只会参与一次节点的建立。
四、CART剪枝
\(CART\) 剪枝由两步组成:
- 从生成的决策树 \(T_0\) 底端开始不断剪枝,直到 \(T_0\) 根结点,形成子树序列 \(\{T_0,T_1,...,T_n\}\)。
- 通过交叉验证法在验证集上对子树序列进行测试,从中选择最优子树。
① 剪枝,形成一个子树序列
在剪枝过程中,计算子树的损失函数(由预测误差和树的复杂度共同决定):
其中,\(T\) 为任意子树,\(C(T)\) 为对训练集的预测误差(如基尼指数),\(|T|\) 为子树的叶结点个数,\(C_\alpha(T)\) 为参数是 \(\alpha\) 时的子树 \(T\) 的整体损失。参数 \(\alpha\) 权衡训练集的拟合程度与树的复杂度。
对固定的 \(\alpha\),一定存在使损失函数 \(C_\alpha(T)\) 最小的唯一子树,将其表示为 \(T_\alpha\)。
\(\alpha\) 越大,剪枝越厉害。当 \(\alpha\) 大的时候,最优子树 \(T_\alpha\) 偏小;当 \(\alpha\) 小的时候,最优子树 \(T_\alpha\) 偏大。
极端情况,当 \(\alpha=0\) 时,即没有正则化,整体树(原始生成的 \(CART\) 树)是最优的。当 \(\alpha \to \infty\) 时,即正则化强度最大,根节点组成的单结点树是最优的。
剪枝思路:
递归的方法对树进行剪枝。将 \(\alpha\) 从小增大,\(0=\alpha_0<\alpha_1<\alpha_2,...,<\alpha_n<+\infty\),产生一系列的区间 \([\alpha_i,\alpha_{i+1}),\ \ i=0,1,...,n\);剪枝得到的子树序列对应着区间 \(\alpha \in [\alpha_i,\alpha_{i+1}), \ \ i=0,1,...,n\) 的最优子树序列 \(\{T_0,T_1,...,T_n\}\),序列中的子树是嵌套的。
从整体树 \(T_0\) 开始剪枝。对 \(T_0\) 的任意内部结点 \(t\),以 \(t\) 为单结点树的损失函数是
以 \(t\) 为根节点的子树 \(T_t\) 的损失函数是
当 \(\alpha=0\) 及 \(\alpha\) 充分小时,有不等式
当 \(\alpha\) 增大时,在某一 \(\alpha\) 有
当 \(\alpha\) 再增大时,不等式 \(C_\alpha(T_t) < C_\alpha(t)\) 反向。只要 \(\alpha = \frac{C(t)-C(T_t)}{|T_t|-1}\),\(T_t\) 与 \(t\) 有相同的损失函数值,而 \(t\) 的结点少,因此 \(t\) 比 \(T_t\) 更可取,对 \(T_t\) 进行剪枝。
为此,对 \(T_0\) 中每一内部结点 \(t\),计算
它表示剪枝后整体损失函数减少的程度。在 \(T_0\) 中剪去 \(g(t)\) 最小的 \(T_t\),将得到的子树作为 \(T_1\),同时将最小的 \(g(t)\) 设为 \(\alpha_1\)。\(T_1\) 为区间 \([\alpha_1,\alpha_2)\) 的最优子树。
如此,剪枝下去,直到根节点。在这一过程中,不断增加 \(\alpha\) 的值,产生新的区间。
② 在剪枝得到的子树序列 \(T_0,T_1,...,T_n\) 中通过交叉验证选取最优子树 \(T_\alpha\)。
利用独立的验证集,测试子树序列 \(T_0,T_1,...,T_n\) 中各棵子树的平方误差与基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每颗子树 \(T_1,T_2,...,T_n\) 都对应一个参数 \(\alpha_1,\alpha_2,...,\alpha_n\)。所以,当最优子树 \(T_k\) 确定时,对应的 \(\alpha_k\) 也确定了,即得到最优决策树 \(T_\alpha\)。
\(CART\) 剪枝算法:
输入:\(CART\) 算法生成的决策树 \(T_0\)。
输出:最优决策树 \(T_\alpha\)。
① 设 \(k=0\),\(T=T_0\)。
② 设 \(\alpha=+\infty\)。
③ 自下而上对各内部结点 \(t\) 计算 \(C(T_t)\),\(|T_t|\) 以及
\[g(t) = \frac{C(t)-C(T_t)}{|T_t|-1} \\ \alpha = min(\alpha,g(t)) \]这里,\(T_t\) 表示以 \(t\) 为根结点的子树,\(C(T_t)\) 是对训练数据的预测误差,\(|T_t|\) 是 \(T_t\) 的叶结点个数。
④ 对 \(g(t)=\alpha\) 的内部结点 \(t\) 进行剪枝,并对叶结点 \(t\) 以多数表决法决定其类,得到树 \(T\)。
⑤ 设 \(k=k+1\),\(\alpha_k=\alpha\),\(T_k=T\)。
⑥ 如果 \(T_k\) 不是由根结点及两个叶结点构成的树,则回到步骤 ② ;否则令 \(T_k=T_n\)。
⑦ 采用交叉验证法在子树序列 \(T_0,T_1,...,T_n\) 中选取最优子树 \(T_\alpha\)。
五、CART算法小结
算法 | 支持模型 | 树结构 | 特征选择 | 连续值处理 | 缺失值处理 | 剪枝 |
---|---|---|---|---|---|---|
\(ID3\) | 分类 | 多叉树 | 信息增益 | 不支持 | 不支持 | 不支持 |
\(C4.5\) | 分类 | 多叉树 | 信息增益比 | 支持 | 支持 | 支持 |
\(CART\) | 分类、回归 | 二叉树 | 基尼系数、均方误差 | 支持 | 支持 | 支持 |
\(CART\) 算法缺点:
① 无论 \(ID3、C4.5、CART\) 都是选择一个最优的特征做分类决策,但大多数,分类决策不是由某一个特征决定,而是一组特征。这样得到的决策树更加准确,这种决策树叫多变量决策树(\(multi-variate\ decision\ tree\))。在选择最优特征时,多变量决策树不是选择某一最优特征,而是选择一个最优的特征线性组合做决策。代表算法 \(OC1\)。
② 样本一点点改动,树结构剧烈改变。这个通过集成学习一类的方法解决,如随机森林。
六、决策树算法小结
这里不纠结 \(ID3、C4.5、CART\) ,这部分来自 scikit-learn
英文文档。
优点:
① 简单直观,生成的决策树很直观。
② 基本不需要预处理,不需要提前归一化和处理缺失值。
③ 使用决策树预测的代价是 \(O(log_2m)\)。\(m\) 为样本数。
④ 即可以处理离散值也可以处理连续值。很多算法只专注于离散值或连续值。
⑤ 可以处理多维度输出的分类问题。
⑥ 相比神经网络之类的黑盒分类模型,决策树在逻辑上可以很好解释。
⑦ 可以交叉验证的剪枝来选择模型,从而提高泛化能力。
⑧ 对异常点的容错能力好,健壮性高。
缺点:
① 决策树算法非常容易过拟合,导致泛化能力不强。可以通过设置节点最少样本数量和限制决策树深度来改进。
② 决策树会因为样本发生一点的改动,导致树结构的剧烈改变。这个可以通过集成学习一类的方法来解决。
③ 寻找最优的决策树是一个 \(NP\) 难题(未解难题,即多项式复杂程度的非确定性问题),一般通过启发式方法来解决,但容易陷入局部最优。可以通过集成学习方法来改善。
④ 有些比较复杂的关系,决策树很难学习。比如异或。这个就没办法了,一般这种关系可以通过神经网络分类方法来解决。
⑤ 如果某些特征的样本比例过大,生成的决策树容易偏向这些特征。这个可以通过调节样本权重来改善。