决策树(Decision Tree)
决策树是一种树形结构,以信息熵为度量构造一棵熵值下降最快的树,它每个内部节点表示在某个特征上的分割使得分割前后熵值下降最快,到叶子结点处的熵值为零,此时每个叶结点中的样本都被归为同一类(训练时叶结点中数据的真实类别未必为同一类)。
决策树算法递归的选择最优特征,并用该特征分割数据集,使得对各个子数据集有一个最好的分类过程,这一过程对应着对特征空间的划分,也对应着决策树的构建。 决策树的训练过程就是递归的构建决策树的过程。
1. 信息论
1.1 自信息
自信息表示随机变量\(x\)包含的信息量的大小,用来衡量事件的不确定性,当该事件发生的概率越高(或越低)时,所包含的信息越少,如:太阳从东边升起,一定会发生,所包含的信息量为0;反之,扔硬币正面朝上的概率为0.5,不确定性最大,所以自信息最多。自信息的定义如下:
\[I(x) = -log(p(x)) \]1.2 熵
在信息论和概率统计中,熵表示随机变量不确定性的度量。 设\(X\)是一个取有限个值的离散随机变量,其概率分布为:
\[P(X=x_i)=p_i \]则随机变量X的熵被定义为自信息对\(X\)的期望:
\[H(X)=-\sum p_i log p_i \]熵越大,随机变量的不确定性就越大。 特别的,当随机事件一定发生,即\(p_i\)为0或1时,熵最小,为零;当随机事件等可能发生,即\(p_i=\frac{1}{n}\)时,熵最大,为1。
1.3 条件熵
条件熵\(H(Y|X)\)表示在给定随机变量\(X\)条件下\(Y\)的不确定性,定义为X给定条件下,Y的条件概率分布的熵对X的数学期望 :
\[\begin{aligned} H(Y|X)&=\sum_x p(x)H(Y|X=x)\\ &=-\sum_x p(x)\sum_y p(y|x)logp(y|x)\\ &=-\sum_x \sum_y p(x,y)log(y|x) \end{aligned} \]条件熵也被定义为\((X,Y)\)发生所包含的熵,减去\(X\)单独发生所包含的熵。表示在\(X\)发生前提下,\(Y\)发生新带来的熵。
\[\begin{aligned} H(Y|X) &= H(X,Y)-H(X) \\ &=-\sum_{x,y}p(x,y)logp(x,y) + \sum_xp(x)log(x)\\ &=-\sum_{x,y}p(x,y)logp(x,y) + \sum_x(\sum_yp(x,y))log(x)\\ &=-\sum_{x,y}p(x,y)logp(x,y) + \sum_{x,y}p(x,y)logp(x)\\ &=-\sum_{x,y}p(x,y)log\frac{p(x,y)}{p(x)}\\ &=-\sum_{x,y}p(x,y)logp(y|x) \end{aligned} \]1.4 信息增益
当熵和条件熵中的概率由参数估计(如极大似然估计MLE)得到时,所对应的熵分别为经验熵和经验条件熵。
信息增益表示在得知特征X的信息而使得类Y的不确定性减少的程度。
特征\(A\)对训练数据集\(D\)的信息增益\(g(D,A)\),定义为集合\(D\)的经验熵\(H(D)\)与在给定条件下特征\(A\)条件下\(D\)的经验条件熵\(H(D|A)\)之差,即:
\[g(D,A)=H(D)-H(D|A) \]一般地,熵\(H(Y)\)与条件熵\(H(Y|X)\)之差称为互信息,决策树学习中的信息增益等价于训练数据集中的类与特征的互信息。
信息增益计算方法
根据信息信息增益选择特征的方法是:对训练数据集(或子集)D,计算其每个特征的信息增益,并比较他们的大小,选择信息增益最大的特征。
- 计算训练数据集的经验熵\(H(D)=-\sum_{k=1}^{K}\frac{|C_k|}{|D|}log\frac{|C_k|}{|D|}\)
- 遍历所有特征,对于特征A:
- 计算特征\(A\)对数据集\(D\)的经验条件熵\(H(D|A)\)
- 计算特征A的信息增益\(g(D,A)=H(D)-H(D|A)\)
计算特征\(A\)对数据集\(D\)的经验条件熵的计算方式如下:
\[\begin{aligned} H(D|A) &= -\sum_{i,k}p(D_k,A_i)logp(D_k|A_i)\\ &=-\sum_{i=1}^np(A_i)\sum_{k=1}^Kp(D_k|A_i)logp(D_k|A_i)\\ &=-\sum_{i=1}^n\frac{|D_i|}{|D|}\sum_{k=1}^K\frac{|D_{ik}|}{|D_i|}log\frac{|D_{ik}|}{|D_i|} \end{aligned} \]其中,\(i\)表示根据特征\(A\)将样本\(D\)分成\(i\)个类别,\(k\) 表示样本D本身按照自身标签分成k个类别,即:
\[\begin{aligned} H(D|A) &= -\sum_{i}p(A_i)H(D|A=A_i)\\ &=-\sum_{i}\frac{特征A属于i的样本数}{数据集D}\times(在特征A属于i的样本中计算分类标签的熵) \end{aligned} \]1.5 信息增益比
以信息增益作为划分训练数据集的特征,存在偏向于选取取值较多的特征的问题,如:数据特征列如果有样本id的特征,则使用样本id计算经验条件熵\(H(D|A)\)为0,因为样本id特征中每个id只有一个样本,计算的分类标签熵为0。这样信息增益下降最多,但使用样本id划分数据集显然是不合适的,因为它无法泛化到测试数据,会过拟合。而使用信息增益比可以对这一问题进行校正。
信息增益比定义为:
\[g_r(D,A)=\frac{g(D,A)}{H(A)} \]其中,\(H(A)\)表示数据集D中特征A的熵:
\[H_A(D)=-\sum_{i=1}^n\frac{|D_i|}{|D|}log\frac{|D_i|}{|D|} \]信息增益比相当于对特征值多的特征做了个归一化,校正信息增益容易偏向于取值较多的特征的问题。但是同样增益比对可取值数目较少的特征有所偏好,因此 C4.5 决策树先从候选划分属性中找出信息增益高于平均水平的特征,在从中选择增益率最高的。
1.6 Gini系数
基尼系数也是一种随机变量不确定性度量,可以看成是熵的泰勒近似,定义如下:
\[Gini(p) = \sum_{k=1}^{K}p_k(1-p_k)=1-\sum_{k=1}^{K}p_k^2\\ =1-\sum_{k=1}^{K}(\frac{|C_k|}{|D|})^2 \]其中,\((1-p_k)\)可以看成是\(f(x)=-lnx\)在\(x=1\)处的一阶泰勒展开,相当于用\(1-x\)在\(x=1\)的邻域内近似\(f(x)=-lnx\)函数。
\[H(X)=-\sum_{k=1}^Kp_klnp_k\approx \sum_{k=1}^Kp_k(1-p_k) \]2. ID3算法
在决策树各结点使用信息增益进行特征选择,递归的构建决策树。
具体方法就是从根节点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子节点;再对子节点递归地调用以上方法,构建决策树;直至所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树。
- 算法步骤
输入:训练数据集\(D\),特征值\(A\),阈值\(z\)。
输出:决策树\(T\)。
- 若\(D\)中所有的样本都属于同一类\(C_k\),则\(T\)为单节点树,并将类\(C_k\)作为该节点的类别标签,返回T。
- 若待分割特征集合\(A\)为空,则\(T\)为单节点树,并将\(D\)中样本数类别最大的\(C_k\)作为该节点的类别标签,返回T。
- 若不符合上面两种情况,则按照信息增益算法公式计算\(A\)中每个特征对\(D\)的信息增益,选择信息增益最大的特征\(A_g\)。
- 如果\(A_g\)的信息增益小于阈值\(z\),则置\(T\)为单节点树,并将\(D\)中样本数类别最大的\(C_k\)作为该节点的类别标签,返回\(T\)。
- 如果\(A_g\)的信息增益大于阈值\(z\),则对\(A_g\)的每一个取值\(a_i\),依据\(A_g=a_i\)将\(D\)分割为若干非空子集\(D_i\),将\(D_i\)中样本数类别最大的类作为标记,构建子节点,由结点及其子节点构成树\(T\),返回T。
- 对第\(i\)个子节点,以\(D_i\)为训练集,以\((A-Ag)\)为特征集,递归地调用上面5个步骤,得到子树\(T_i\),返回\(T_i\)。
3. C4.5算法
C4.5和ID3算法相似,C4.5是在ID3的基础上进行了改进,从ID3用信息增益来选取特征改成了用信息增益比来选取特征,其他步骤均与ID3算法一致。
4. CART算法
分类回归树(CART) 采用二分递归分割的 方法,基于基尼系数作为分割指标,将当前样本分割为两个子集,因此,CART算法构建的是一颗二叉树。
- 算法步骤:
输入:训练数据集D,特征值\(A\),阈值\(z\)。
输出:CART决策树 。
- 对于所有的特征值\(A_i\)以及它们可能的取值(分割点)\(a_j\),以\(a_j\)为分割点计算基尼指数。
- 在所有可能的特征\(A_i\)以及他们的所有可能的切分点\(a_j\)中,选择基尼指数最小的特征及其分割点作为最优特征与最优分割点。
- 递归的对两个子节点调用(1)、(2),直到满足阈值\(z\)。
5. 连续变量
5.1 CART算法
CART算法对连续变量使用平方误差最小准则,进行特征选择构建二叉树。
- 算法步骤:
- 对
6. 决策树的评价
数据集的某个特征的信息增益(率)/gini指数越大,说明该特征对样本的熵的减小能力越强,即这个特征使得数据集的不确定性变得更小,该特征更加适合用于对数据集分类。
决策树的评价函数(损失函数)可以定义为:
\[C(T)=\sum_{t\in leaf}N_t·H(t) \]即对决策树的所有叶子节点的熵求和,该值越小说明分类的效果越好。由于每个结点包含的样本数目不同,所以可对样本加权求熵和,上式中的\(N_t\)即为加权值。
7. 决策树的剪枝
决策树生成算法是通过递归的方法产生决策树,直到不能继续下去为止,这样产生的树往往对训练数据的分类很准确,但对未知数据的分类却没那么准确,即出现过拟合的现象。过拟合的原因在于学习时过度考虑如何提高训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的方法是减小决策树的复杂度,对已生成的决策树进行简化,我们把这种对已生成的树进行简化的过程称为剪枝。
三种决策树的剪枝算法相同,都是从已生成的树上裁掉一些子树或叶节点,并将其根结点或父节点作为新的叶节点得到新的树\(T_i\),重复上述操作直到只剩下根节点,并且得到不同剪枝的\(k\)棵决策树。然后在验证数据集上对这\(k\)个树用评价函数进行评价,选择损失函数最小的树\(T_a\)。
7.1 剪枝算法
叶结点越多,决策树越复杂,损失越大,修正:
\[C_a(T) = C(T)+\alpha·|T_{leaf}| \]其中\(|T_{leaf}|\)表示叶子结点数量,\(\alpha\)为剪枝系数,约束叶子节点数量。
剪枝系数计算方法:
考察以当前决策树\(T_0\)的内部节点\(r\)为根的子树:
- 剪枝后的损失函数:\(C_a(r) = C(r) + \alpha\)
- 剪枝前的损失函数:\(C_a(R)=C(R)+\alpha·|R_{leaf}|\)
- 令二者相等,求得\(\alpha\)
剪枝算法步骤:
- 计算当前决策树\(T_0\)的所有内部节点为根节点构建子树的剪枝系数。
- 查找最小剪枝系数的结点,剪枝得到决策树\(T_k\)。
- 重复以上步骤,直到决策树\(T_k\)只有一个结点。
- 得到决策树序列\({T_1, T_2, ..., T_k}\)。
- 使用验证样本集选择最优子树。使用损失函数\(C(T)=\sum_{t\in leaf}N_t·H(t)\)作为评估指标。
8. Bagging策略
- 从样本集中有放回的重采样n个样本
- 在所有特征上,用这n个样本构建分类器(决策树、SVM、Logistic回归等)。
- 重复上述步骤m次,得到m个分类器。
- 将数据放在这m个分类器上,根据m个分类器投票结果,决定数据属于哪一类。
9. 随机森林
随机森林在Bagging基础上做了修改。
- 从样本集中用Bootstrap采样选出n个样本。
- 从所有特征中,随机选择k个样本,选择最佳分割特征作为结点构建CART树。
- 重复上述步骤m次,构建m课CART树。
- 这m课CART树形成随机森林,投票决定数据属于哪一类。
也可以使用决策树、SVM、Logistic回归构建基本分类器,也叫做随机森林。
投票机制:
- 简单投票机制
- 一票否决
- 少数服从多数
- 阈值表决
- 贝叶斯投票机制:加权投票
其中,\(WR\)表示加权得分,\(R\)表示该电影用户投票平均分,\(C\)表示所有电影平均得分,\(v\)表示该电影投票人数,\(m\)表示排名前k名的电影投票最低数。
10. 样本不均衡处理方法
假定A类比B类样本多,且严重不平衡:
- A类欠采样
- 随机欠采样
- A类分成若干子类,分别与B类进行ML模型训练
- 基于聚类的A类分割,分别与B类进行ML模型训练
- B类过采样
- 避免欠采样造成的信息丢失
- B类数据合成
- 随机插值得到新样本
- SMOTE
- 代价敏感学习
- 降低A类权值,提高B类权值