可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。优点是具有可读性,分类速度快。
决策树模型与学习
决策树模型
- 模型: 决策树由结点(node)和又向边(directed edge)组成。内部结点(internal node)表示一个特征,叶结点(leaf node)表示一个类。
- if-then:由决策树的根结点到叶结点的每一条路径构建一条规则,互斥且完备,构成一个if-then规则的集合。
- 条件概率分布:决策树的每一条路径对应于特征空间划分中的一个单元,这时决策树可以看作是条件概率分布。
- 决策树学习:
- 本质上是从训练数据中归纳出一组分类规则,确定一个损失函数,从所有决策树中选取最优决策树是NP完全问题,所以一般采用启发式方法近似求解,得到的结果是次最优的(sub-optimal)的。
- 通常是递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类。
- 为了避免过拟合,需要自下而上进行剪枝,将树变得更简单。
- 决策树学习算法包括:特征选择,决策树的生成,决策树的剪枝。
- 常用算法:ID3,C4.5,CART。
特征选择
哪个特征含有更多的信息量,就先选择那个特征,从而提高效率。而信息量就是“熵”那套东西了,这里通常用信息增益或信息增益比来进行特征的选择。
- 熵(entropy):\[H(X) = -\sum_{i=1}^n p_i \log p_i,\:(这里0\log0 = 0)\] 熵越大,不确定性就越大,信息量越大。
条件熵(conditional entropy):
\[H(Y|X) = \sum_{i=1}^n p_i H(Y|X=x_i)\] 随机变量的分布越均匀,越难以预测,那么它的不确定性(熵)就越大,而条件熵是在已知某些信息的条件下,这时它的不确定性也就减小了一些。当我们使用数据来近似估计这些概率的时候,计算出来的实际是经验熵和经验条件熵。信息增益:
\[g(D,A) = H(D) - H(D|A)\] 等价于训练数据集中类与特征的互信息。根据信息增益准则的特征选择方法:
计算每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。输入:训练数据 \(D\)和特征 \(A\); 输出:特征 \(A\)对训练数据集 \(D\)的信息增益 \(g(D,A)\)
- 计算数据集\(D\)的经验熵\(H(D)\) \[H(D) = -\sum_{k=1}^K \frac{|C_k|}{D} \log_2 \frac{|C_k|}{D}\]
- 计算特征\(A\)对数据集\(D\)的经验条件熵\(H(D|A)\) \[H(D|A) = \sum_{i=1}^n \frac{|D_i|}{D} H(D_i)\]
- 计算信息增益 \[g(D,A) = H(D) - H(D|A)\]
特征选择的另一准则:信息增益比
\[g_R(D,A) = \frac{g(D,A)}{H(D)}\]
决策树的生成
ID3算法
从根结点开始,选择信息增益最大的特征,由该特征的不同取值建立子结点,递归计算,直到所有特征的信息增益均很小或没有特征可选择为止。(相当于用极大似然法进行概率模型的选择)
ID3算法
- 输入:训练数据集\(D\),特征集\(A\),阀值\(\varepsilon\)
- 输出:决策树\(T\)
- 若\(T\)中所有实例属于同一类\(C_k\),则T为单结点树,将\(C_k\)作为该结点的类标记,返回\(T\)。
- 若\(A=\varnothing\),则\(T\)为单结点树,并将\(D\)中实例数最大的类作为该结点的类标记,返回\(T\)。
- 否则,计算各特征的信息增益,选择信息增益最大的特征\(A_g\)。
- 如果\(A_g\)的信息增益小于阀值\(\varepsilon\),则置\(T\)为单结点树,并将\(D\)中实例数量最大的类作为该结点的类标记,返回\(T\)
- 否则,对\(A_g\)的每一个值\(a_i\),依\(A_g = a_i\)将\(D\)分割为若干非空子集\(D_i\),将\(D_i\)中实例数最大的类作为标记,构建子结点,由节点及其子结点构成树\(T\)(递归),返回\(T\)。
- (递归过程)对第\(i\)个子结点,以\(D_i\)为训练集,以\(A - \{ A_g \}\)为特征集,递归地调用步骤1-5,得到子树\(T_i\),返回\(T_i\)。
C4.5的生成算法
与上面的ID3算法相似,不同点是用信息增益比来选择特征。
决策树的剪枝
从已生成的决策树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
设树\(T\)的叶结点个数为\(|T|\),\(t\)是树\(T\)的叶结点,该叶结点有\(N_t\)个样本,其中\(k\)类的样本点有\(N_{kt}\)个,\(H_t(T)\)为叶结点\(t\)上的经验熵,定义决策树学习的损失函数为:
\[C_{\alpha} (T) = \sum_{t=1}^{|T|} N_t H_t(T) + \alpha |T|\] 将上式右端第一项记为\(C(T)\),这时:\(C_{\alpha} (T) = C(T) + \alpha |T|\),\(C(T)\)是对训练数据的预测误差,\(|T|\)是模型复杂度。剪枝,就是\(\alpha\)确定时,选择使损失函数最小模型。
树的剪枝算法
- 输入:生成算法产生的整个树\(T\),参数\(\alpha\);
- 输出:修剪后的子树\(T_{\alpha}\)
- 计算每个结点的经验熵。
- 递归地从树的叶结点向上回缩。(如果\(C_{\alpha}(T_A) \leq C_{\alpha}(T_B)\)则剪枝)
- 返回2,直至不能继续为止,得到损失函数最小的子树\(T_\alpha\) (具体可以使用动态规划来实现)
CART算法
分类与回归树:给定输入随机变量\(X\),输出随机变量\(Y\)的条件概率分布。(假设决策树是二叉树)
两步:
- 决策树的生成:基于训练数据集生成决策树,决策树要尽量大。
- 决策树剪枝:对已生成的树进行剪枝并选择最优子树。
CART生成
对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。
回归树的生成
回归树对应着输入空间的一个划分,以及在划分的单元上的输出值。
假设划分为\(M\)个单元\(R_1,R_2,...,R_M\),输出值分别为\(c_m\),于是回归树模型可以表示为:\[f(x) = \sum_{m=1}^M c_m I(x \in R_m)\]如果划分已经确定,用平方误差准则\(\sum_{x_i \in R_m} (y_i - f(x_i))^2\),那么每个单元上的最优输出应该是那些实例对应输出的均值: \(\hat{c_m} = ave(y_i | x_i \in R_m)\)
那么现在的问题是怎样对输入空间进行划分。
采用启发式的方法,如果选择第\(j\)个变量\(x^{j}\)(特征)和它的一个取值,作为切分变量(splitting variable)和切分点(splitting point),那么就能将空间分为两个区域:
\(R_1(j,s)= \{ x|x^{(j)} \leq s \}\) 和 \(R_2(j,s)= \{ x|x^{(j)} > s \}\) 最优的输出\(\hat{c_1}\)和\(\hat{c_2}\)将是这两个区域中所有\(y_i\)的均值,然后平方误差就是这两个区域分别的平方误差(实例对应的输出与\(\hat{c_1}\)或\(\hat{c_2}\))的和,所以,最优的切分变量\(j\)和最优切分点\(s\)应该使这个和最小。对于固定的输入变量\(j\)可以找到最优切分点\(s\),遍历所有输入变量,找到最优的\(j\),构成一对(j,s)。这样就将输入空间划分为两个区域,重复以上过程,直到满足停止条件。这样生成的回归树通常称为最小二乘回归树(least squares regression tree)
最小二乘回归树生成算法
输入:训练数据集\(D\); 回归树\(f(x)\). 在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
- 选择最优切分变量\(j\)与切分点\(s\),求解\[\min_{j,s} \left [ \min_{c_1} \sum_{x_i \in R_1(j,s)} (y_i - c_1)^2 + \min_{c_2} \sum_{x_i \in R_2(j,s)} (y_i - c_2)^2 \right ]\]遍历变量\(j\),对固定的切分点\(j\)扫描切分点\(s\),选择使上式达到最小的对(j,s)。
- 用选定的对(j,s)划分区域并决定相应的输出值:\[R_1(j,s)= \{ x|x^{(j)} \leq s \}, R_2(j,s)= \{ x|x^{(j)} > s \}\] \[\hat{c_m} = \frac{1}{N_m} \sum_{x_i} \in R_m(j,s) y_i , x\in R_m, m = 1, 2\] 继续对两个子区域调用步骤1,2,直至满足停止条件 将输入空间划分为\(M\)个区域\(R_1,R_2,...,R_M\),生成决策树:\[f(x) = \sum_{m=1}^M \hat{c_m} I(x \in R_m)\]
分类树的生成
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
- 基尼指数:\(Gini(p) = \sum_{k=1}^K p_k (1-p_k) = 1-\sum_{k=1}^K p_k^2\) 对于给定的样本集合\(D\),其基尼指数为\(Gini(D) = 1-\sum_{k=1}^K \left( \frac{|C_k|}{|D|} \right)^2\) 若根据特征\(A\)分为两个部分,则条件下的集合\(D\)的基尼指数定义为:\(Gini(D,A) = \frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2)\) 基尼指数与熵类似
CART生成算法:
- 输入:训练数据集\(D\),停止计算的条件;
- 输出:CART决策树
- 设结点的训练数据为\(D\),计算现有特征对该数据集的基尼指数。此时,对每一个特征\(A\),对其可能取的每个值\(a\),根据样本点对\(A=a\)的测试为“是”或“否”将\(D\)分割成\(D_1\)和\(D_2\)两个部分,计算\(A=a\)时基尼指数。
- 在所有可能的特征以及所有可能的切分点\(a\)中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,生成两个子结点,将训练数据集分配到两个子结点中去。
- 对两个子结点递归地调用1,2,直至满足条件。
- 生成CART决策树。
CART剪枝
两步:
- 从\(T_0\)底端开始不断剪枝,直到\(T_0\)的根结点,形成一个子树序列\(\{ T_0,T_1,...,T_n \}\);
- 然后通过交叉验证法在独立验证数据集上对子树序列进行测试,从中选择最优子树。
剪枝,形成一个子树序列
剪枝过程中,子树损失函数:\(C_{\alpha} (T) = C(T) + \alpha |T|\)
如果确定一个\(\alpha\),可以找到唯一的一个使损失函数最小的子树\(T_{\alpha}\)。(\(\alpha\)越小,树越复杂;随便地计算\(\alpha\)各种取值下的最优子树是不可取的,有人证明了有限个\(\alpha\)就可以了,它划分出一些区间,这些区间对应着最优子树序列)。
具体的,对\(T_0\)的任意一个内部结点\(t\),剪枝和不剪枝的区别是:以\(t\)为单结点的树的损失函数\(C_{\alpha}(t) = C(t) + \alpha\),和以\(t\)为根结点的子树\(T_t\)的损失函数\(C_{\alpha}(T_t) = C(T_t) + \alpha |T_t|\)。当\(\alpha = \frac{C(t) - C({T_t})}{|T_t| -1}\),(这时的\(\alpha\)增大或减小会像不同方向偏)它们有相同的损失函数,而剪枝的话结点更少,这时一般选择剪枝。
这样,也就是说\(g(t) = \frac{C(t) - C(T_t)}{|T_t| -1}\)可以可以表示剪枝后整体损失函数减少的程度。计算出所有的\(g(t)\),从最小的\(g(t)\)开始
- 在剪枝得到的子树序列\(T_0,T_1,...,T_n\)中通过交叉验证选取最优子树\(T_{\alpha}\)
利用独立的验证数据集,测试各子树的平方误差或基尼指数,得到最优子树\(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_t| -1}\]\[\alpha = \min (\alpha, g(t))\] 这里,\(T_t\)表示以\(t\)为根结点的子树,\(C(T_t)\)是对训练数据的预测误差,\(|T_t|\)是\(T_t\)的叶结点个数.
- 自上而下地访问内部结点\(t\),如果有\(g(t) = \alpha\),如果有\(g(t) = \alpha\),进行剪枝,并对叶结点\(t\)以多数表决法决定其类,得到树\(T\).
- 设\(k=k+1\),\(\alpha_k = \alpha\),\(T_k = T\).
- 如果\(T\)不是由根结点单独构成的树,则回到步骤4(这里有点疑问,需要先跟新\(\alpha\)吧,或者回到步骤3).
- 采用交叉验证法在子树序列中选取最优子树\(T_{\alpha}\)