[统计学习方法]决策树
来源:互联网 发布:氨基酸数据库 编辑:程序博客网 时间: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 其中
0≤H(x)≤logn
如果熵越大,则该随机变量的不确定性就越大,例如上面说的两个特征,第一个特征的两个取值分别是99%和1%,第二个特征的两个取值分别是50%和50%,那么
H1(x)=−0.99log20.99−0.01log20.01≈0.08
H2(x)=−0.5log20.5−0.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))
其中,
因此,我们可以对每一个特征计算出如果通过该特征进行分类,不确定性降低的大小,然后选择降低最多的那个特征进行分类。
同样,我们也可以定义信息增益比,也就是
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=1T∑k=1KNtklogNtkNt 其中
Nt 表示分到节点t的数据个数,Ntk 表示类别k分到节点t的数据个数,但是这个式子中并没有存在可以表示“误分率”或“正确分类率”的变量。
那么我们可以从叶子节点往根节点走,对于每一个节点,计算出如果把该节点的子树去掉后得到的决策树的损失函数
因为去不去掉某子树对决策树上的其他节点并不影响,因此,我们只需要计算这棵子树去掉前和去掉后的损失函数就行,不需要计算整棵树的损失函数,这样可以简化损失函数的计算。
CART算法
CART算法也是类似的想法,就是先尽量复杂的生成一颗决策树,然后再通过极小化损失函数来进行剪枝,但是相比前面的算法来说,它的不同之处在于他是个二叉树,他可以同时处理连续的(回归)和离散的(分类)两种情况。
回归树
如果是连续的情况,我们就需要在连续的值中寻找一个切分点,将它分成两部分,因此如果我们知道需要切分的特征为j,则最理想的切分点s就是他们分出来的两部分数据输出值的方差之和最小,也就是
F(j)=mins(∑x(j)i≤s(yi−c1)2+∑x(j)i>s(yi−c2)2)
那么我们在所有的特征j中,选择一个
分类树
假设有K个类,数据落到每一个类的概率为
Gini(p)=∑k=1Kpk(1−pk)=1−∑k=1Kp2k 当其为二元分类时,
Gini(p)=2p(1−p)
基尼指数和熵类似,也是用来定义集合的不确定性的,也是值越大,说明不确定性也越大。
同样的,我们如果知道特征j,也可以把数据分成值为x,以及不为x两类,然后计算基尼指数。在给定的特征j中选择基尼指数最小的分割方法,然后再选择值最小的j进行分割,这一点与回归树类似。
CART剪枝
同样的,也是从叶子节点往根节点剪,损失函数还是
那么我们就可以知道,如果把一个节点t的子树
那么我们就可以求出当这两个值相等时,临界的
Cα(Tt)=Cα(t) 得到
α=C(t)−C(Tt)|Tt−1|
如果我们从下往上剪枝,使得这棵树越来越简单,那么临界的
[T1,T2,...,Tn] 那么对应的
α 的临界值也可以写成一列
[α1,α2,...,αn]
而且,当n越来越大时,T越来越简单,
然后我们就可以用验证的数据集来测试
因为在这里是拿用来验证的数据集来做测试,因此直接测试
- [统计学习方法]决策树
- 复习统计学习方法-决策树
- 统计学习方法----决策树
- 统计学习方法--决策树
- 统计学习方法《决策树》
- 统计学习方法:决策树
- 统计学习方法笔记:决策树
- 统计学习方法 5-决策树
- 决策树小结----统计学习方法读书笔记
- 《统计学习方法,李航》:5、决策树
- 统计学习方法(二)决策树
- 五、决策树--统计学习方法总结
- 统计学习方法——决策树
- 统计学习方法笔记七----决策树
- 统计学习方法五 决策树分类
- 统计学习方法五 决策树分类
- 统计学习方法--决策树 python实现
- 《统计学习方法》笔记(六)--决策树
- (Android入门)Android四大组件
- Performance and Optimization For Mecanim[Unity]
- 3.7
- win7+ubuntu14.04双系统,重装win7后,修复grub方法
- mysql数据库备份
- [统计学习方法]决策树
- 关于typedef的用法总结
- PAT A1007Maximum Subsequence Sum(贪心算法)
- windows下字符集与编码方案
- Linux内核分析(1)
- VMware自动更新文件位置
- 【机房收费系统】——类型的转换
- Java:集合的作用
- LeetCode(62): Unique Paths