五、决策树
决策树(decision tree)是一种基本的分类与回归方法,这里主要讨论用于分类的决策树。它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。其主要的有点是模型具有可读性,分类速度快,学习时利用训练数据,根据损失函数最小化的原则简历决策树模型。决策树的学习通常包括三个步骤:特征选择,决策树的生成和决策树的修剪。
5.1决策树模型与学习
5.1.1决策树模型
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型:内结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或者属性,叶结点表示一个类。
5.1.2决策树与if-then规则
可以将决策树看成是一个if-then规则的集合。将决策树转化成if-then规则的过程是这样的:由决策树的根结点到叶结点的每一条路径构建一条规则;路径上内部结点的特征对应着规则的条件,而叶结点的类对应着规则的结论。
5.1.3决策树与条件概率分布
决策树还表示给定特征条件下的类的条件概率分布。这一条件概率分布定义在特征空间的一个划分(partition)上。将特征空间划分为互不相交的单元(cell)或者区域(region),并在每个单元定义一个类的概率分布就构成了一个条件概率分布。
5.1.4决策树学习
决策树学习,假设给定训练数据集
其中, xi 为输入实例(特征向量) yi 为类标记, N 为样本容量。学习的目标是根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。
决策树学习本质上是从训练数据集中归纳出一组分类规则。我们需要的是一个与训练数据矛盾较小的决策树,同时具有很好的泛化能力。另一个角度看,决策树学习是由训练数据集估计条件概率模型。我们选择的条件概率模型应该不仅对训练数据有很好的拟合,而且对未知数据有很好的预测。
决策树学习用损失函数表示这一目标。如下所述,决策树学习的损失函数通常是正则化的极大似然函数。决策树学习的策略是以损失函数为目标函数的最小化。
当损失函数确定以后,学习问题就变为在损失函数意义下选择最优决策树的问题。因为从所有可能的决策树中选取最优决策树是NP完全问题(NP的英文全称是Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题),所以现实中决策树学习算法通常采用启发式方法,近似求解这一最优化问题。这样得到的决策树是次最优(sub-optimal)的。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。
5.2特征选择
5.2.1特征选择问题
特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。通常特征选择的准则是信息增益或信息增益比。
5.2.2信息增益
在信息论与概率统计中,熵(entropy)是表示随机变量不确定性的度量。设
则随机变量 X 的熵定义为
通常上式中的对数以2为底或者以自然对数 e 为底,这时熵的单位分别称作比特(bit)或纳特(nat)。由定义可知,熵只依赖于
熵越大,随机变量的不确定性就越大。从定义可以验证
当随机变量只取两个值,例如 1,0 时,即 X 的分布为
熵为
这时,熵 H(p) 随概率 p 变化的曲线如图
当
设有随机变量 (X,Y) ,其联合概率分布为
条件熵 H(Y|X) 表示在已知随机变量 X 的条件下随机变量
当熵和条件熵中的概率由数理统计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为 经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)。此时若有0概率,则令 0log0=0
信息增益(information gain)表示得知特征 X 的信息而使得类
特征 A 对训练数据集
一般地,熵 H(Y) 与条件熵 H(Y|X) 之差称为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中的类与特征的互信息。
决策树学习应用信息增益准则选择特征。信息增益大的特征具有更强的分类能力。
根据信息增益准则的 特征选择方法是:对训练数据集(或子集) D ,计算其每个特征的信息增益,并比较他们的大小,选择信息增益最大的特征。
5.2.3信息增益比
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比(information gain ratio)可以对这一问题进行校正。这是特征选择的另一准则。
定义(信息增益比):特征
5.3决策树的生成
5.3.1 ID3算法
ID3
算法(interative dichotomiser 3)的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。具体方法是:从根结点(root node)开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。最后得到一个决策树。
ID3
相当于用极大似然法进行概率模型的选择。
ID3算法只有树的生成,所以该算法生成的树容易产生过拟合。
#计算给定数据集的香农熵
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {}
for featVec in dataSet: #the the number of unique elements and their occurance
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob * log(prob,2) #log base 2
return shannonEnt
#按照给定特征划分数据集
def splitDataSet(dataSet, axis, value):
retDataSet = []
for featVec in dataSet:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis] #chop out axis used for splitting
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet
#选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):
numFeatures = len(dataSet[0]) - 1 #the last column is used for the labels
baseEntropy = calcShannonEnt(dataSet)
bestInfoGain = 0.0; bestFeature = -1
for i in range(numFeatures): #iterate over all the features
featList = [example[i] for example in dataSet]#create a list of all the examples of this feature
uniqueVals = set(featList) #get a set of unique values
newEntropy = 0.0
for value in uniqueVals:
subDataSet = splitDataSet(dataSet, i, value)
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob * calcShannonEnt(subDataSet)
infoGain = baseEntropy - newEntropy #calculate the info gain; ie reduction in entropy
if (infoGain > bestInfoGain): #compare this to the best gain so far
bestInfoGain = infoGain #if better than current best, set to best
bestFeature = i
return bestFeature #returns an integer
#创建树的函数代码
def createTree(dataSet,labels):
classList = [example[-1] for example in dataSet]
if classList.count(classList[0]) == len(classList):
return classList[0]#stop splitting when all of the classes are equal
if len(dataSet[0]) == 1: #stop splitting when there are no more features in dataSet
return majorityCnt(classList)
bestFeat = chooseBestFeatureToSplit(dataSet)
bestFeatLabel = labels[bestFeat]
myTree = {bestFeatLabel:{}}
del(labels[bestFeat])
featValues = [example[bestFeat] for example in dataSet]
uniqueVals = set(featValues)
for value in uniqueVals:
subLabels = labels[:] #copy all of labels, so trees don't mess up existing labels
myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
return myTree
5.3.2 C4.5的生成方法
C4.5 算法与 ID3 算法相似, C4.5 算法对 ID3 算法进行了改进。 C4.5 在生成的过程中,用信息增益比来选择特征。
5.4决策树的剪枝
决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树容易出现过拟合现象。过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树,解决这一问题的方法是考虑决策树的复杂度,对已生成的决策树进行简化。
在决策树学习中讲已生成的树进行简化的过程称为剪枝(pruning)。
决策树的剪枝往往通过极小化决策树整体的损失函数(loss function)或代价函数(cost function)来实现。设树
T
的叶结点个数为
令
其中 C(T) 表示模型对训练数据的预测误差,即模型与训练数据的拟合程度, |T| 表示模型复杂度,参数 α≥0 控制两者之间的影响。较大的 α 促使选择较简单的模型(树),较小的 α 促使选择较复杂的模型(树)。 α=0 意味着只考虑模型与训练数据的拟合程度,不考虑模型的复杂度。
可以看出,决策树生成只考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合。而决策树剪枝通过优化损失函数还考虑了减小模型复杂度。决策树生成学习局部的模型,而决策树剪枝学习整体的模型。
树的剪枝算法
输入:生成算法产生的整个树 T ,参数
输出:修剪后的子树 Tα
(1)计算每个结点的经验熵
(2)递归地从树的叶结点向上回缩
设一组叶结点回缩到其父结点之前与之后的整体树分别为 TB 与 TA ,其对应的损失函数值分别是 Cα(TB) 与 Cα(TA) ,如果
(3)返回(2),直至不能继续为止,得到损失函数最小的子树 Tα
5.5 CART算法
分类与回归树(classification and regression tree,CART)模型,是应用广泛的决策树学习方法。CART同样由特征选择、树的生成及剪枝组成,既可以用于分类也可以用于回归。以下将用于分类与回归的树统称为决策树。
**CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法。**CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
CART算法由以下两步组成:
(1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
(2)决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。
5.5.1 CART生成
决策树的生成就是递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼(Gini index)指数最小化准则,进行特征选择,生成二叉树。
1.回归树的生成
最小二乘回归树生成算法:
输入:训练数据集D;
输出:回归树
f(x)
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
(1)选择最优切分变量
j
与切分点
遍历变量 j ,对固定的切分变量
(2)对选定的对 (j,s) 划分区域并决定相应的输出值:
(3)继续对两个子区域调用步骤(1),(2),直至满足停止条件。
(4)将输入空间划分为M个区域 R1,R2,⋯,RM ,生成决策树:
2.分类树的生成
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
基尼指数(定义):分类问题中,假设有 K 个类,样本点属于第
对于二分类问题,若样本点属于第1个类的概率是 p ,则概率分布的基尼指数为
对于给定的样本集合 D ,其基尼指数为
这里 Ck 是 D 中属于第
如果样本集合
在特征 A 的条件下,集合
基尼指数 Gini(D) 表示集合D的不确定性,基尼指数 Gini(D,A) 表示经 A=a 分割后集合D的不确定性。基尼指数越大,样本集合的不确定性就越大,这一点与熵类似。
CART树的生成
输入:训练数据集D
输出:CART决策树
根据训练数据集,从根结点开始,递归地对每个结点进行一下操作,构建二叉决策树:
(1)设结点的训练数据集为D,计算现有特征对该数据集的基尼指数。此时,对每一个特征A,对其可能取的每个值a,根据样本点对
A=a
的测试是“是”或“否”将D分割成
D1
和
D2
两部分
(2)在所有可能的特征A以及它们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点,依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中
(3)对两个子结点递归地调用(1),(2),直至满足停止条件
(4)生成CART决策树
算法停止的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。
5.5.2 CART剪枝
CART剪枝算法从“完全生长”的决策树的底端剪去一些子树,使决策树变小(模型变简单),从而能够对未知数据有更准确的预测。CART剪枝算法由两步组成:首先,从生成算法产生的决策树 T0 底端开始不断剪枝,直到 T0 的根结点,形成一个子树序列 {T0,T1,⋯,Tn} ;然后,通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。