1. 特征选择
1.1 信息增益
熵(entropy)是表示随机变量不确定性的度量,设x是一个取有限个值的离散随机变量,其概率分布为:
P(X=xi)=pi,i=1,2,⋯ ,nP(X=x_i)=p_i,i=1,2,\cdots,nP(X=xi)=pi,i=1,2,⋯,n
则随机变量X的熵定义为
H(X)=−∑i=1npilogpiH(X)=-\sum_{i=1}^np_ilog p_iH(X)=−i=1∑npilogpi
熵只依赖于X的分布,与X的取值无关,所以可将X的熵记做H(p)H(p)H(p),即
H(p)=−∑i=1npilogpiH(p)=-\sum_{i=1}^np_ilogp_iH(p)=−i=1∑npilogpi
条件熵P(Y∣X)P(Y|X)P(Y∣X)表示在已知随机变量X的条件下随机变量Y的不确定性。随机变量X给定的条件下Y的条件熵为
H(Y∣X)=∑i=1npiH(Y∣X=xi),这里,pi=P(X=xi),i=1,2,⋯ ,n.H(Y|X)=\sum_{i=1}^np_iH(Y|X=x_i),\\
这里,p_i=P(X=x_i),i=1,2,\cdots,n.H(Y∣X)=i=1∑npiH(Y∣X=xi),这里,pi=P(X=xi),i=1,2,⋯,n.
信息增益(information gain)表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
定义: 特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即
g(D,A)=H(D)−H(D∣A)g(D,A)=H(D)-H(D|A)g(D,A)=H(D)−H(D∣A)
设:D为训练数据集,|D|为其样本容量,即样本个数。设有K个类Ck,k=1,2,⋯ ,KC_k, k=1,2,\cdots,KCk,k=1,2,⋯,K, ∣Ck∣|C_k|∣Ck∣为属于类CkC_kCk的样本个数,∑k=1K∣Ck∣=∣D∣\sum_{k=1}^K|C_k|=|D|∑k=1K∣Ck∣=∣D∣.设特征A有n个不同的取值{a1,a2,⋯ ,an}\{a_1,a_2,\cdots,a_n\}{a1,a2,⋯,an},根据特征A的取值将D划分为n个子集D1,D2,⋯ ,Dn,∣Di∣为DiD_1,D_2,\cdots,D_n,|D_i|为D_iD1,D2,⋯,Dn,∣Di∣为Di的样本个数,∑i=1n∣Di∣=∣D∣.\sum_{i=1}^n|D_i|=|D|.∑i=1n∣Di∣=∣D∣.记子集DiD_iDi中属于属于类CkC_kCk的样本集合为DikD_{ik}Dik,即Dik=Di⋂Ck,∣Dik∣为DikD_{ik}=D_i \bigcap C_k,|D_{ik}|为D_{ik}Dik=Di⋂Ck,∣Dik∣为Dik的样本个数。则信息增益算法如下
###1.2 信息增益的算法
输入:训练数据集D和特征A;
输出:特征A对训练数据集D的信息增益g(D,A).
(1)计算数据集D的经验熵H(D)H(D)H(D)
H(D)=−∑K=1k∣Ck∣∣D∣log2∣Ck∣∣D∣H(D)=-\sum_{K=1}^k\frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|}H(D)=−K=1∑k∣D∣∣Ck∣log2∣D∣∣Ck∣
(2)计算特征A对数据集D的经验条件熵H(D|A)
H(D∣A)=∑i=1n∣Di∣∣D∣H(Di)=−∑i=1n∣Di∣∣D∣∑k=1K∣Dik∣∣Di∣log2∣Dik∣∣Di∣H(D|A)=\sum_{i=1}^n\frac{|D_i|}{|D|}H(D_i)=-\sum_{i=1}^n\frac{|D_i|}{|D|}\sum_{k=1}^K\frac{|D_{ik}|}{|D_i|}log_2\frac{|D_ik|}{|D_i|}H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣
(3)计算信息增益
g(D,A)=H(D)−H(D∣A)g(D,A)=H(D)-H(D|A)g(D,A)=H(D)−H(D∣A)
1.3 信息增益比
**定义:**特征A对训练数据集D的信息增益比gR(D,A)g_R(D,A)gR(D,A)定义为其信息增益g(D,A)g(D,A)g(D,A)与训练数据集D关于特征A的值的熵HA(D)H_A(D)HA(D)之比,即
gR(D,A)=g(D,A)/HA(D)g_R(D,A)=g(D,A)/H_A(D)gR(D,A)=g(D,A)/HA(D)
其中,HA(D)=−∑i=1n∣Di∣∣D∣log2∣Di∣∣D∣H_A(D)=-\sum_{i=1}^n\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣,n是特征A取值的个数。
2. ID3算法
输入: 训练数据集D,特征集A,阈值ϵ\epsilonϵ;
输出: 决策树T。
(1)若D中所有实例属于同一类CkC_kCk,则T为单节点树,并将类CkC_kCk作为该节点的类标记,返回T;
(2)若A=∅A=\varnothingA=∅,则T为单节点树,并将D中的实例数最大的类CkC_kCk作为该节点的类标记,返回T;
(3)否则,按照算法1.2计算A中各特征对D的信息增益,选择信息增益最大的特征AgA_gAg;
(4)如果AgA_gAg的信息增益小于阈值ϵ\epsilonϵ,则置T为单节点树,并将D中的实例数最大的类CkC_kCk作为该节点的类标记,返回T;
(5)否则,对AgA_gAg的每一可能值aia_iai,依Ag=aiA_g=a_iAg=ai将D分割为若干非空子集DiD_iDi,将DiD_iDi中实例数最大的类作为标记,构建子节点,由节点及其子节点构成树T,返回T ;
(6)对第i个子节点,以DiD_iDi为训练集,以A−{Ag}A-\{A_g\}A−{Ag}为特征集,递归调用步(1)~(5),得到子树TiT_iTi,返回TiT_iTi.
3. C4.5算法
C4.5算法对ID3算法进行改进,在生成树过程中用信息增益比来选择特征。
输入: 训练数据集D,特征集A,阈值ϵ\epsilonϵ;
输出: 决策树T。
(1) 如果D中所有实例属于同一类CkC_kCk,则置T为单节点树,并将CkC_kCk作为该节点的类,返回T;
(2) 如果A=∅A=\varnothingA=∅,则置T为单节点树,并将D中实例数最大的类CkC_kCk作为该节点的类,返回T;
(3) 否则,按信息增益比公式计算A中各特征对D的信息增益比,选择信息增益比的最大的特征Ag;A_g;Ag;
(4) 如果AgA_gAg的信息增益比小于阈值ϵ\epsilonϵ,则置T为单节点树,并将D中实例数最大的类CkC_kCk作为该节点的类,返回T;
(5) 否则,对AgA_gAg的每一个可能值aia_iai,依Ag=aiA_g=a_iAg=ai将D分割为若干非空子集DiD_iDi,将DiD_iDi中实例数最大的类作为标记,构建子节点,由节点及其子节点构成树T,返回T ;
(6对第i个子节点,以DiD_iDi为训练集,以A−{Ag}A-\{A_g\}A−{Ag}为特征集,递归调用步(1)~(5),得到子树TiT_iTi,返回TiT_iTi.
##4. 决策树的剪枝
决策树的剪枝是通过极小化决策树整体的损失函数来实现。设树T的叶结点个数为|T|,t是树T的叶结点,该叶结点有NtN_tNt个样本点,其中k类的样本点有NtkN_{tk}Ntk个,k=1,2,…,K,Ht(T)H_t(T)Ht(T)为叶结点t上的经验熵,α≥0\alpha\ge0α≥0为参数,则决策树学习的损失函数可以定义为
Cα(T)=∑t=1∣T∣NtHt(T)+α∣T∣C_{\alpha}(T)=\sum_{t=1}^{|T|}N_tH_t(T) +\alpha|T|Cα(T)=t=1∑∣T∣NtHt(T)+α∣T∣
其中,经验熵为
Ht(T)=−∑kNtkNtlogNtkNtH_t(T)=-\sum_k\frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t}Ht(T)=−k∑NtNtklogNtNtk
在损失函数中,右端第一项可记做C(T)
剪枝算法:
输入: 生成算法产生的整个树T,参数α\alphaα;
输出: 修剪后的子树TαT_{\alpha}Tα.
(1) 计算每个节点的经验熵;
(2) 递归地从树的叶结点向上回缩;
\qquad设一组叶结点回缩到其父节点之前与之后的整体树分别为TB和TAT_B和T_ATB和TA,其对应的损失函数值分别为Cα(TB)与Cα(TA)C_{\alpha}(T_B)与C_{\alpha}(T_A)Cα(TB)与Cα(TA),如果
Cα(TA)≤Cα(TB)C_{\alpha}(T_A)\le C_{\alpha}(T_B)Cα(TA)≤Cα(TB)
\qquad则进行剪枝,即将父节点变为新的叶结点;
(3) 返回(2),直至不能继续为止,得到损失函数最小的子树TαT_\alphaTα
##5. C5.0算法R实现
C5.0是C4.5的后继版本,C5.0算法是销售给商业用户的,但是该算法的单线程版本的源代码是公开的。C5.0算法已成为生成决策树的行业标准。
###5.1 C5.0的 优缺点
优点:
- 一个适用于大多数问题的通用分类器
- 高度自动化的学习过程,可以处理数值型数据,名义特征和缺失数据
- 只使用最重要的特征
- 可以用于只有相对较少的训练案例的数据或者有相当多训练案例的数据
- 没有数学背景也可以解释一个模型的结果
- 比其他复杂模型更有效
缺点: - 决策树模型在根据具有大量水平的特征进行划分时往往是有偏的
- 很容易过度拟合或者不能充分拟合模型
- 因为依赖于轴平行分割,所以在对一些关系建立模型时会有困难
- 训练数据中的小变化可能导致决策逻辑的较大变化
- 大的决策树可能很难理解,给出的决策可能看起来会违反直觉
###5.2 C5.0决策树语法
在R语言中应用C50包中的C5.0()函数
创建分类器:
m <- C5.0(train, class, trails = 1, costs = NULL)
- train: 包含训练数据的数据框
- class: 包含训练数据每一行分类的一个椅子向量
- trials: 可选,用于控制自助法循环次数
- costs: 可选矩阵,用于给出与各种类型错误相对应的成本,在构建成本矩阵时,行表示预测值,列表示实际值。
该函数返回一个C5.0模型的对象,能够用于预测。
进行预测:
p <- predict(m, test, type = "class")
- m: 有函数C5.0()训练的一个模型
- test: 包含测试数据集的数据框,该数据框和用来创建分类器的训练数据有同样的特征
- type: 取值为“class”或“prob”,标识预测是最可能的类别值或原始的预测概率值。