决策树的学习通常包含三个步骤:特征选择、树的生成、树的剪枝。决策树的生成采用启发式的方法,只考虑局部最优,相对地,决策树的剪枝则考虑全局最优
特征选择
信息增益
随机变量\(X\)的熵定义为:
\[H(X)=-\sum \limits_{i}p_i\log p_i\]
熵越大,不确定性越大。从定义可验证
\[0 \leq H(X) \leq \log n\]
条件熵\(H(Y|X)\)定义为给定\(X\)时\(Y\)的条件概率分布的熵对\(X\)的数学期望:
\[H(Y|X)=\sum \limits_{i=1}^n p(X=x_i) H(Y|X=x_i)=-\sum \limits_{i=1}^n\sum \limits_{j=1}^m p(X=x_i) p(Y=y_j)\log p(Y=y_j)\]
特征\(A\)对数据集\(D\)的信息增益:
\[g(D,A)=H(D)-H(D|A)\]
一般地,熵\(H(Y)\)与条件熵\(H(Y|X)\)之差称为互信息。决策树学习中的信息增益等价于训练数据集中类与特征的互信息
信息增益比
以信息增益划分特征,容易偏向于选择取值较多的特征(如DNA),信息增益比定义为:
\[g_R(D,A)=\frac{g(D,A)}{H_A(D)}\]
其中,\(H_A(D)=-\sum_{i=1}^n \dfrac{|D_i|}{|D|}\log_2\dfrac{|D_i|}{|D|}\),\(n\)是特征\(A\)取值的个数。(可以看成特征\(A\)的熵)
决策树的生成
ID3算法
在决策树各个节点上应用信息增益准则选择特征,递归地构建决策树。
具体做法:从根节点开始,对节点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点(所以只能处理离散值);再对子节点递归调用上述方法。直到所有特征的信息增益均很小或没有特征可以选择为止。
ID3相当于用极大似然法进行概率模型的选择。但是该算法只有树的生成,所以该算法生成的树容易造成过拟合。
C4.5算法
C4.5算法与ID3算法类似,只是在生成过程中用信息增益比来选择特征。
决策树的剪枝
决策树对训练数据的分类很准确,但容易造成过拟合。原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决办法就是对树进行剪枝。
决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。设树\(T\)的叶节点个数为\(|T|\),\(t\)是树\(T\)的叶节点,该叶节点有\(N_t\)个样本点,其中\(k\)类的样本点有\(N_{tk}\)个,\(H_t(T)\)为叶节点\(t\)上的经验熵,\(\alpha \geq 0\)为参数,则决策树的损失函数可以定义为:
\[C_{\alpha}(T)=\sum \limits_{t=1}^{|T|}N_tH_t(T)+\alpha|T|\]
其中,叶节点的经验熵为
\[H_t(T)=-\sum_k \dfrac{N_{tk}}{N_t}\log \dfrac{N_{tk}}{N_t}\]
在损失函数中,第一项表示模型对训练数据的预测误差,\(|T|\)表示模型的复杂度,\(\alpha \geq 0\)控制两者之间的影响
CART算法
CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”。这样的决策树等价于递归地二分每个特征
算法由两步组成:
- 决策树生成:基于训练数据生成决策树,生成的决策树要尽量大
- 决策树剪枝:用验证数据集对已生成的树进行剪枝选择最优子树,这时用损失函数最小作为剪枝的标准
CART生成
回归树生成
- 输入:训练数据集\(D\)
- 输出:回归树\(f(x)\)
- 在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树
选择最优切分变量\(j\)(特征)与切分点\(s\)(特征的取值),求解
\[R_1(j,s)=\{x|x^{(j)}\leq s\} \quad R_2(j,s)=\{x|x^{(j)}> s\}\]
\[\min \limits_{j,s}\left[ \min \limits_{c_1} \sum \limits_{x_i \in R_1(j,s)}(y_i-c_1)^2+\min \limits_{c_2} \sum \limits_{x_i \in R_2(j,s)}(y_i-c_2)^2 \right]\]
遍历变量\(j\),对固定的切分变量\(j\)扫描切分点\(s\),选择使上式最小的对\((j,s)\)- 用选定的对\((j,s)\)划分区域并决定相应的输出值:
\[\hat{c}_m=\dfrac{1}{N_m}\sum \limits_{x_i\in R_m(j,s)}y_i,\quad x\in R_m, \ m=1,2\] - 继续对两个子区域调用上述步骤,直至满足停止条件
将输入空间划分为\(M\)个区域\(R_1,R_2,\cdots,R_M\),生成决策树:
\[f(x)=\sum \limits_{m=1}^M \hat{c}_m I(x \in R_m)\]
分类树生成
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点
假设有\(K\)个类,样本点属于第\(k\)类的概率为\(p_k\),则概率分布的基尼指数定义为
\[Gini(p)=\sum \limits_{k=1}^Kp_k(1-p_k)=1-\sum \limits_{k=1}^Kp_k^2\]
对于给定样本集合\(D\),\(C_k\)是\(D\)中属于第\(k\)类的样本子集,其基尼指数为
\[Gini(D)=1-\sum \limits_{k=1}^K(\frac{|C_k|}{|D|})^2\]
如果样本集合\(D\)根据特征\(A\)是否取某一可能值\(a\)被分割为\(D_1\)和\(D_2\)两部分,即
\[D_1=\{(x,y)\in D|A(x)=a\}, \quad D_2=D-D_1\]
则在特征\(A\)的条件下,集合\(D\)的基尼指数定义如下:
\[Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)\]
生成分类树时,在所有可能的特征\(A\)以及它们所有可能的切分点\(a\)中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点,然后生成两个子节点。
CART剪枝
- 首先从生成算法产生的决策树\(T_0\)底端开始不断剪枝,直到\(T_0\)的根节点,形成一个子树序列\(\{T_0,T_1,\cdots,T_n\}\);
- 然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。
算法如下:
- 输入:决策树\(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\)
- 设\(k=k+1,\alpha_k=\alpha,T_k=T\)
- 如果\(T_k\)不是由根节点及两个子节点构成的树,则回到步骤3,否则令\(T_k=T_n\)
- 采用交叉验证法在子树序列\(\{T_0,T_1,\cdots,T_n\}\)中选取最优子树\(T_{\alpha}\)
\(g(t)\)的解释:
- 对\(T\)的任意内部结点\(t\),以\(t\)为单节点树的损失函数是
\[C_{\alpha}(t)=C(t)+\alpha\] - 以\(t\)为根节点的子树\(T_t\)的损失函数是
\[C_{\alpha}(T_t)=C(T_t)+\alpha|T_t|\] - 当\(\alpha\)增大到某一处时,\(C_{\alpha}(T_t)<C_{\alpha}(t)\)变为相等,只要
\[\alpha=\frac{C(t)-C(T_t)}{|T_t|-1}\]
此时\(T_t\)和\(t\)有相同的损失函数,但是\(t\)的节点少,因此要进行剪枝。
决策树缺失值问题(概率化缺失值)
- 在选择分裂属性的时候,训练样本存在缺失值
- 基本思想是计算没有出现属性缺失的样本子集的信息增益,然后根据这部分样本在总体样本中的比例打个折,作为总体样本在该属性的信息增益
- 分类属性选择完成,对训练样本分类,发现属性缺失
- 对于一个样本\(x\),如果它在属性\(a\)上的取值已知,则将其划入到与其值对应的子节点。如果它在\(a\)上的属性未知,那么同时将其划归到所有的子节点,且将其在属性值\(a^{(i)}\)对应的子节点上的权重更新为\(\tilde{r_{i}} \cdot a\),其实质就是将一个样本以不同的概率(目标属性的比重)划入到不同的子节点。
- 训练完成,给测试集样本分类,有缺失值
- 这时候,就不能按比例分配了,因为你必须给该样本一个确定的label.这时候根据投票来确定,或者填充缺失值