决策树基础

决策树的学习分三步:特征选择、决策树生成和决策树剪枝

一、特征选择

  特征选择可以用的指标有:信息增益、信息增益率和基尼指数

  首先要了解什么是信息熵。设样本为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α

 


 具体为什么这样做就能选择比较好的α和最优树,以及怎么做交叉检验选取最优树,在李航《统计学习基础》上,贴个图吧

四、关于连续性特征的划分方法,见周志华《机器学习》和李航《统计学习方法》。虽然都是书上搬过来的,码字也很累。。。。写到这吧

原文地址:https://www.cnblogs.com/miranda-zxh/p/7458656.html