决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的判定,每个分支代表这个特征属性在其值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
决策树的构造过程不依赖领域知识,决策树的构造就是根据计算公式(信息增益、信息增益比、基尼指数等)来确定优先选择哪个特征属性对训练数据进行划分,依次类推,直到叶子节点(叶子节点中的数据都属于同一个类别)。究竟优先选择哪个特征属性?其评价标准是让各个分裂子集尽可能地“纯”,尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别,而这个任务就交给数学公式——信息增益、信息增益比、基尼指数等来确定!
属性选择度量算法有很多,这里介绍ID3、C4.5和CART三种常用算法。
针对这三个算法:设训练数据集为, 表示其样本容量,即样本个数。设有K个类,k = 1,2,…,K,||为属于类的样本个数,。设特征A有n个不同的取值,根据特征A的取值将D划分为n个子集, 为
的样本个数, 。记子集 中属于类 的样本的集合为 ,即 , 为 的样本个数。
为了便于说明先给出熵和条件熵的定义。
在信息论与概率统计中,熵(entropy)是表示随机变量不确定性的度量,设X是一个取有限个值的离散随机变量,其概率分布
为:
则随机变量X的熵的定义为(对数以2或是e为底):
由定义可知,熵只依赖于X的分布,而与X的取值无关,所以也可以将X的熵记作,即
“信息熵”information entropy是度量样本集合纯度最常用的一种指标,假定当前样本集合D中第k类样本所占比例为(k=1,2,...,K),则D的信息熵定义为:
H(D)的值越小,则D的纯度越高。
用属性A对样本集D进行划分所获得的“信息增益”(information gain):
一般而言,信息增益越大,使用属性A来进行划分所获得的“纯度提升”越大,所以划分属性的选择为取值最大的属性。 (此处A的含义为所有属性的代表)
信息增益准则对可取值数目比较多的属性有所偏好,C4.5对此进行了改进(这样说准确吗?)。
如果使得每个样例的编号作为属性,每个分支有一个样本,这些分支结点的纯度已达到最大,但是这样的决策树不具有泛化能力,无法对新样本进行有效预测,信息增益准则对可取值数目较多的属性有所偏好。
著名的C4.5决策树算法使用“增益率”gain ratio来选择最优划分属性。
但,增益率准则对可取值数目较少的属性有多偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
CART假设决策树是二叉树(对于属性是连续值的属性,以某两个取值的中值进行划分。对于属性取值为离散值的属性,以属性是否取某个值为分割方式)。内部节点特征的取值为“是”和“否”。
CART决策树Classification and Regression Tree是一种著名的决策树学习算法,分类和回归都可用,CART决策树使用“基尼系数(指数)”来选择划分属性。分类问题中,假设有K个类,样本点属于k类的概率为,则概率分布的基尼指数定义为
对于给定的样本集合D,其基尼系数(指数)为
Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此,Gini(D)越小,则数据集D的纯度越高。
如果样本集合D根据特征A是否取某一个可能值a被分割成和 两部分,则在特征A的条件下,集合D的基尼指数定义为
我们在候选属性集合中,选择使得划分后基尼指数最小的属性作为最优划分属性,即
详细参见《统计学习方法》p68页。
参见《统计机器学习》p59页表5.1,详细计算过程参见p64页和p71页中间。
离散属性 | 连续属性 | |
ID3 | 根据分裂属性值的个数进行分叉(例如:年龄有:青年、中年、老年) | 选取合适的分裂属性与分裂点(是否只会被分为两部分,>=3可否?对于二分类问题,没有必要) |
C4.5 | 同上 | 同上 |
CART-分类 | 根据属性值等于某个值与不等于某个值进行分叉(例如取值为青年或不是青年,因为CART为二叉树) | 选取合适的分裂属性与分裂点(二叉树) |
CART-回归 | 同上 | 选取合适的分裂属性与分裂点(二叉树) |
剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段,决策树分支过多,以至于把训练集自身的一些特点当做所有数据都具有的一般性质而导致过拟合,预剪枝(prepruning)和后剪枝(postpruning)是决策树剪枝的两种基本策略,预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点;后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能的提升,则将该子树替换为叶结点。
判别决策树泛化性能提升:随机划分数据集为训练集和验证集,根据上节中的一些准则选择属性划分,预剪枝根据划分前后对验证集预测结果进行评判是否继续划分,降低了过拟合的风险,显著减少了决策树的训练时间开销和测试时间开销,但有些分支的当前划分虽不能提升泛化性能、甚至导致下降,但在其基础上进行后续划分有可能导致性能显著提高,预剪枝可能带来“欠拟合”风险。后剪枝从训练集生成一颗完整的决策树,自底向上决定是否剪枝,后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般泛化能力优于预剪枝决策树,欠拟合风险小,但是后剪枝决策树在生成完全决策树之后进行,并且要自底向上对树中所有非叶结点逐一考察,训练时间开销比预剪枝和未剪枝都要大很多。
连续值属性一般采用二分法进行处理,对属性区间寻找中位点进行划分,确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。分裂点的选择方法:对于取值为连续值的属性,将n个样本从小到大排列,共有n-1个划分点。我们就可以像离散属性值一样来考察这些划分点,选择最优划分点对样本集合进行划分。
与离散属性不同,若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性。
缺失值处理需要解决两个问题:1、如何在属性值缺失的情况下进行划分属性选择? 2、给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?详见《西瓜书》
非叶结点不再是仅对某个属性,而是对属性的线性组合进行测试,换言之,每个非叶节点是一个线性分类器。
决策树优点:计算量简单,可解释性强,比较适合处理有缺失属性的样本,能够处理不相关的特征
缺点:容易过拟合,后续出现了随机森林,减小了过拟合现象
1、如果属性用完了怎么办?——在决策树构造过程中可能会出现这种情况:所有属性都作为分裂属性用光了,但有的子集还不是纯净集,即集合内的元素不属于同一类别。在这种情况下,由于没有更多信息可以使用了,一般对这些子集进行“多数表决”,即使用此子集中出现次数最多的类别作为此节点类别,然后将此节点作为叶子节点。
2、上述描述仅仅记录了大体过程,如果是初学者难免还是不易理解。建议阅读周志华老师的西瓜书,结合例子很容易理解了。
3、目前只是在原理上有了清晰的认识,在实际使用时,结合源码再做深入理解更佳。
4、今天看到当初第一遍学习copy过来的blog,真是晦涩难懂,面对琳琅满目的网络世界,在完全不懂时对这些信息的甄别能力真是有限。
5、决策树ID3,C4.5是分类决策树(分类),其属性碰到离散值是正常情况,其属性取值碰到连续值,则去某两个属性取值的中值进行划分。CART分类与回归树,作为分类树时,对于属性是离散值的属性,由于CART是二叉树,内部节点的取值为是或者否,此时,以属性 “年龄” 为例(青年、中年、老年),只能以取值为“青年”和取值不是“青年”进行划分,对于属性为离散值的情况处理方式同上,只是计算方式不同(基尼指数)。CART为回归树的情况面对上述情形,处理方式相同,只是计算方式不同(最优切分属性和切分点(j,s))。
6、决策树这样以信息增益、信息增益率、基尼指数的方式选择属性进行划分的方式如何统一到损失函数的框架中?
1、周志华老师的《机器学习》
2、https://www.cnblogs.com/yiruparadise/p/5687758.html