[统计学习方法]决策树

来源:互联网 发布:氨基酸数据库 编辑:程序博客网 时间:2024/06/07 15:09

决策树其实就是一个if-else的集合,在应用中,如果给定一个输入,不断的通过if-else的判断,可以得到理想的输出。

对应到树上,也就是每一个节点是一个判断条件,而是否满足这个判断条件决定了该走到这个节点的哪一个子节点。而叶子节点决定了这个分支的输出应该是什么。那么在应用中,给定一个输入,从根节点不断往叶节点走,走到叶节点,就知道输出该是什么了。

那么关键问题在于,这颗树该如何得到。

决策树学习

什么是一颗好的决策树,首先需要最小化与训练集的矛盾,也就是尽可能多的让训练集通过该决策树得到正确的结果,但是也不能够过度拟合,也需要对未知的数据有很好的预测。

那么,输入数据有很多个维度,我们在每一个节点中都要选择接下来需要对哪一个维度进行决策,然后,决策的条件是什么,知道了这两个,我们就可以递归生成这个决策树,但是,这样生成的决策树可能对已知数据有很好的拟合度,却不能很好的处理未知的数据,因此我们需要让这个决策树变的简单一些,也就是把一些过于细枝末节的分枝剪掉。

因此,决策树的学习包含几个部分:特征选取,决策树生成,剪枝。

特征选取

首先我们需要决定对哪一个特征进行分类,从直觉上来说,例如一个特征,对于99%的数据都是True,对于1%的数据是False,另外一个特征,对于50%的数据都是True,对于1%的数据都是False,那么我们更倾向于选择第二个特征,因为他的分类效果更好,因为第一个只能够分出1%的数据,而第二个特征却能分出一半的数据。

如果从数学上来定义,我们可以用“熵”来定义变量的不确定性,即

假设X是一个取有限个值的离散随机变量,且

P(X=xi)=pi, i=1,2,...,n

则熵的定义为:

H(X)=i=1npilogpi

其中0H(x)logn

如果熵越大,则该随机变量的不确定性就越大,例如上面说的两个特征,第一个特征的两个取值分别是99%和1%,第二个特征的两个取值分别是50%和50%,那么

H1(x)=0.99log20.990.01log20.010.08

H2(x)=0.5log20.50.5log20.5=1

而且可以发现在最极端情况下,也就是如果取值分别是0%和100%时,H(x)=0

既然这样,我们希望在通过该分割之后使得各个部分不确定性降低越多越好,那么我们可以定义条件熵,用来计算分割出来的每部分数据的熵,即

H(Y|X)=i=1npiH(Y|X=xi)

其中,pi=P(X=xi),i=1,2,...,n

也就是对X进行分割之后,每个部分的熵的和。

那么之前说过,希望在分割之后使得各个部分的不确定性降低越多越好,因此我们可以表示成

max(H(Y)H(Y|X))

其中,g(Y,X)=H(Y)H(Y|X)也成为信息增益,那么特征选取也就可以说成寻找信息增益最大的特征。

因此,我们可以对每一个特征计算出如果通过该特征进行分类,不确定性降低的大小,然后选择降低最多的那个特征进行分类。

同样,我们也可以定义信息增益比,也就是

gR(Y,X)=H(Y)H(Y|X)H(Y)

决策树生成

那么知道了如何选取待分类的特征,那么就可以构建决策树了,首先从根节点开始,选择信息增益最大的特征进行分割并建立子节点,对于每个子节点再通过同样的方法进行分割,直到信息增益很小或者是没有特征可以选取为止,这种方法称为ID3算法

同样的,如果是采用信息增益比最大的特征来进行分割的话,也能够用来构建决策树,而这种方法称为C4.5算法

决策树的剪枝

之前说过,通过这样建立决策树,往往会产生过度拟合的效果,也就是对训练集能分类的异常准确,但是,对训练集意外的数据并不能很好的预测,因此,我们需要简化这个决策树,即把过度考虑该训练集的分支给去掉。

因此,我们可以定义一个损失函数,它由两部分组成,一部分是决策树对训练集的拟合程度,另一部分是树的复杂程度,然后,可以用一个参数α来调节这两部分的重要程度比,即

在这里,我们用|T|来定义树的复杂程度,也就是这棵树的节点个数,而C(T)用来表示训练集和树的拟合程度,则损失函数Cα(T)可以定义为

Cα(T)=C(T)+α|T|

同样,我们可以如下定义拟合程度(越小表示拟合度越高):

C(T)=i=1|T|r(t)p(t)

其中r(t)表示数据在节点t的误分率,p(t)表示数据落在节点t的概率,所以r(t)p(t)表示数据落在节点t上而且正好被误分的概率。

PS:我并不能理解该书中的C(T)定义法,因此在这里采用《An empirical comparison of pruning methods for decision tree induction》中的定义方法。

在本书中,C(T)的定义如下:

C(T)=t=1Tk=1KNtklogNtkNt

其中Nt表示分到节点t的数据个数,Ntk表示类别k分到节点t的数据个数,但是这个式子中并没有存在可以表示“误分率”或“正确分类率”的变量。

那么我们可以从叶子节点往根节点走,对于每一个节点,计算出如果把该节点的子树去掉后得到的决策树的损失函数Cα(TA),以及保留该子树得到的损失函数Cα(TB),如果Cα(TA)Cα(TB),那么我们就可以把这个子树给去掉。

因为去不去掉某子树对决策树上的其他节点并不影响,因此,我们只需要计算这棵子树去掉前和去掉后的损失函数就行,不需要计算整棵树的损失函数,这样可以简化损失函数的计算。

CART算法

CART算法也是类似的想法,就是先尽量复杂的生成一颗决策树,然后再通过极小化损失函数来进行剪枝,但是相比前面的算法来说,它的不同之处在于他是个二叉树,他可以同时处理连续的(回归)和离散的(分类)两种情况。

回归树

如果是连续的情况,我们就需要在连续的值中寻找一个切分点,将它分成两部分,因此如果我们知道需要切分的特征为j,则最理想的切分点s就是他们分出来的两部分数据输出值的方差之和最小,也就是

F(j)=mins(x(j)is(yic1)2+x(j)i>s(yic2)2)

那么我们在所有的特征j中,选择一个F(j)最小的特征j进行分类,然后对左右两个子树重复该操作,直到特征不可再分或者F(j)小于一个特定的阈值。

分类树

假设有K个类,数据落到每一个类的概率为pk,则定义一个基尼指数

Gini(p)=k=1Kpk(1pk)=1k=1Kp2k

当其为二元分类时,Gini(p)=2p(1p)

基尼指数和熵类似,也是用来定义集合的不确定性的,也是值越大,说明不确定性也越大。

同样的,我们如果知道特征j,也可以把数据分成值为x,以及不为x两类,然后计算基尼指数。在给定的特征j中选择基尼指数最小的分割方法,然后再选择值最小的j进行分割,这一点与回归树类似。

CART剪枝

同样的,也是从叶子节点往根节点剪,损失函数还是Cα(T)=C(T)+α|T|,在损失函数最小化的前提下,当α小的时候,得到的树就复杂,而当α增大的时候,得到的树就会越来越简单,直到最后变成只有一个根节点。

那么我们就可以知道,如果把一个节点t的子树Tt剪掉,那么剪之前的损失函数为Cα(Tt)=C(Tt)+α|Tt|,剪之后,对于节点t及其子树来说,只剩下了一个节点t了,因此损失函数为Cα(t)=C(t)+α

那么我们就可以求出当这两个值相等时,临界的α,也就是

Cα(Tt)=Cα(t)

得到 α=C(t)C(Tt)|Tt1|

如果我们从下往上剪枝,使得这棵树越来越简单,那么临界的α值就会越来越大,因此如果我们把剪枝后的树按照顺序写成一列

[T1,T2,...,Tn]

那么对应的α的临界值也可以写成一列

[α1,α2,...,αn]

而且,当n越来越大时,T越来越简单,α越来越大。

然后我们就可以用验证的数据集来测试T1TnC(T)值,得到一个误差最小的子树T及对应的参数α

因为在这里是拿用来验证的数据集来做测试,因此直接测试C(T)值而不需要加α|T|项,因为如果树太复杂(过度拟合),那么C(T)值在验证的数据集中误分率就会变得很高。

0 0
原创粉丝点击