决策树的学习分三步:特征选择、决策树生成和决策树剪枝
一、特征选择
特征选择可以用的指标有:信息增益、信息增益率和基尼指数
首先要了解什么是信息熵。设样本为D,共有n个类,样本中第k类样本占的比例为pk(k = 1,2,.....,n),那么D的信息熵为
H(D) = - Σnk=1 pk log2pk
信息熵反应D的“纯度”,值越小纯度越高。
另外还要了解条件熵。设特征A有V个取值,用A对D进行划分,每个取值上样本集记为Dv(v = 1,2,....,V),那么条件熵H(D|A)为
H(D|A) = ΣVv=1 |Dv| H(Dv) / |D|
1、信息增益,又叫做互信息
g(D,A) = H(D) - H(D|A)
信息增益表明使用特征A进行划分,可以使“纯度提升多少”。值越大,“纯度提升”越多。
但是信息增益倾向于选择取值较多的特征,比如:有10个样本,特征A有10个取值,每个取值有一个样本,这时分支节点的纯度达到最大,相应的信息增益最大,利用信息增益对特征进行选择,结果更可能选择这样的特征A。但这样的特征无法对新样本进行有效的预测。
2、信息增益率
使用信息增益率,可以对信息增益的这一问题进行校正。
g_ratio(D,A) = g(D,A)/h(A)
其中h(A) = - ΣVv=1 (|Dv|/|D|) log2(|Dv|/|D|)
需要注意的是,增益率对可取值较少的特征有偏好,所以C4.5算法并不是直接选择增益率最大的特征进行划分,而是先从候选属性中找出信息增益高于平均水平的属性,再从中选择信息增益率最高的。
3、基尼指数
Gini(D) = 1-Σnk=1 pk2
Gini_index(D,A) = ΣVv=1 |Dv| Gini(Dv) / |D|
基尼指数越小越越有利于划分。
二、决策树生成
决策树生成算法比较著名的就是ID3、C4.5以及CART了。其中ID3主要用到特征选择的方法是信息增益、C4.5是信息增益率、CART是基尼指数。
基本算法
——————————————————————————————————————————————————————————————
输入:训练集D = {(x1,y1),......,(xm,ym)}
属性集A = {A1,......Ad}
过程:TreeGenerate(D,A)
生成节点node; if D中样本全属于同一类别C: 将node标记为C类叶节点 return if A == 空集 or D中样本在A上的取值相同: 将node标记为叶节点,其类别标记为D中样本数最多的类 return 从A中选择最优划分属性A* #使用不同的特征选择方法将得到不同的算法 for A*的每个取值a: 为node生成一个分支;令Da为D中在A*上取值为a的样本子集 if Da为空: 将分支节点标记为叶节点,其类别标记为D中样本最多的类 return else: 以TreeGenerate(Da,A{A*})为分支节点
三、决策树剪枝
剪枝是决策是学习算法对付“过拟合”的主要手段。下面主要记录两种方法。
1、简单方法(见周志华《机器学习》)
从训练集中留出一部分作为验证集,利用余下的数据生成一棵完整的决策树,再自底向上对每一个非叶节点进行:将以该节点为根节点的树杈剪掉,即将该节点替换成叶节点,类标记为样本数最多的类。计算替换前与替换后的验证集精度,如果替换前比替换后验证集精度大,则不剪枝。
2、复杂方法(见李航《统计学习方法》)
先定义一个决策树学习的损失函数:
设树T有|T|个叶节点,叶节点t上的样本数记为Nt,其中k类的样本的有Ntk个(k = 1,2,...,n),Ht(T)为叶节点t上的熵,损失函数
Cα(T) = Σ|T|t=1 Nt Ht(T) +α|T|
损失函数的前一项记为C(T),表示模型对训练数据的预测误差(为什么可以表示预测误差,个人理解:熵表示“纯度”也表示“混乱度”,值越大纯度越低,比如t包括三个白球和三个黑球的熵比六个白球的大,三个白球和三个黑球的t节点的类标不管是白还是黑都有三个被分错,而六个白球都不会被分错)。
损失函数的后一项|T|表示模型复杂度(树的叶节点越多树越庞大,相应的越复杂),α≥0可以权衡模型复杂度和训练误差(树越大,训练误差越小,但|T|越大。α越大倾向于寻找复杂度低,训练误差也相对较低的树,α=0意味着只考虑模型与训练数据的拟合程度,不考虑模型复杂度)
剪枝,就是在α确定时,选择损失函数最小的模型。
剪枝算法
输入:生成的树T,参数α
输出:修剪后的子数Tα
(1)计算每个节点的熵
(2)递归地从树的叶节点向上回缩。设一组叶节点回缩到其父节点前后的整棵树记为TA,TB,其对应的损失函数值分别为Cα(TA),Cα(TB),如果Cα(TA) ≤ Cα(TB),则进行剪枝,并将父节点变为新的叶节点。
(3)返回(2),直到不能继续为止,得到损失函数最小的子数Tα。
α的确定
自动确定α算法
输入:生成的树T0,
输出:最优决策树Tα
(1)设k = 0,T = T0
(2)设α = +∞
(3)自下而上地对每个内部结点t计算C(Tt),|T|以及
g(t) = [C(t) - C(Tt)] / [|Tt| - 1]
α = min(α,g(t))
其中Tt表示以t为根节点的子树,C(Tt)是对训练数据的预测误差,|Tt|是Tt的叶节点个数。
(4)对g(t) = α的内结点t进行剪枝,并对叶结点t以多数表决法决定其类,得到树T。
(5)k = k+1,αk=α,Tk = T.
(6)如果Tk不是由根节点及两个叶节点构成的树,则返回步骤(3);否则令Tk = Tn.
(7)采用交叉验证法在子树序列T0,......,Tn中选取最优子树Tα
具体为什么这样做就能选择比较好的α和最优树,以及怎么做交叉检验选取最优树,在李航《统计学习基础》上,贴个图吧
四、关于连续性特征的划分方法,见周志华《机器学习》和李航《统计学习方法》。虽然都是书上搬过来的,码字也很累。。。。写到这吧