机器学习基础(二):决策树

时间:2021-09-07 04:49:09

写在前面:决策树是一种常用的分类方法,也是我开始学习数据挖掘后接触的第一个算法,它的原理非常好理解,但在学习过程中也有一些容易忽略的细节,今天就来总结一下。

决策树

工作原理

相信大家小的时候一定都玩过这样一个游戏,你在心里想一个人名,对方提一些只能用“是”或“否”来回答的问题(例如,TA是男人吗?TA是歌手吗?),在你回答这些问题后,由对方来猜你心中所想的人名。决策树的工作原理与这个游戏很相似,顾名思义,它的模型是树状的,在每个结点处进行“决策”,将数据集按照最具有“决定性”的特征进行划分,直到每个分支下的数据属于同一类型或具有相同的特征。
机器学习基础(二):决策树
如图所示,决策树中包含三种结点:根节点,内部节点,叶节点。首先依据特征A将数据集划分成两部分,其中右侧子数据集拥有相同的类标签label1,因此不需要继续划分。再将左侧子数据集依据特征B划分成两部分,得到的两个子数据集都各自拥有统一的类标签,不需要继续划分。至此,一个最简单的决策树模型就构造成功了,接下来,就可以用它来对未知类别的数据进行预测:由根节点出发,在每个非终止节点处按照该节点对应的特征决定数据的走向,直到达到终止节点,分类结果便是该节点的类标签。
决策树的建立是一个递归的过程:

def buildTree(dataset):
if numlabel=1:
return label
bestfeature=findBestFeature()
subdataset=split(dataset,bestfeature)
node=creatNode()
for eachset in subdataset:
bulidTree(subdataset)
return node

最佳划分特征

明确了决策树的递归建立过程,那么就面临着一个问题:在划分时如何选择最佳的划分特征呢?我们希望每一次决策后能得到纯度更高的划分,集合不纯性的度量指标通常有熵和Gini不纯度,下面分别介绍。
信息熵和信息增益
ID3和C4.5决策树都使用信息熵来度量不纯度。在ID3算法中,首先计算当前数据集的基础熵:
机器学习基础(二):决策树
其中Si为所有分类类别,P(Si)为其发生的概率。
然后计算选择特征t后的信息熵:
机器学习基础(二):决策树
最后分别计算不同特征带来的信息增益,并选择信息增益最大的特征为最佳特征:
机器学习基础(二):决策树
由于熵的不纯性度量趋近于选择具有大量不同值的属性,但该属性却不一定是一个有预测性的属性,因此C4.5决策树算法在ID3的基础上提出了信息增益率:
机器学习基础(二):决策树
当某个特征产生了大量的划分时,上式分母将会很大,从而降低了信息增益。
Gini不纯度
CART算法使用Gini指标作为划分函数,计算所有候选的Gini指标值,产生最小Gini指标的点为最佳划分点:
机器学习基础(二):决策树
其中P(Si|A)为按照特征A进行划分后,第i类的概率。

过拟合问题

引起过拟合的原因
对训练数据拟合度过高的模型,其泛化误差可能比具有较高训练误差的模型大,这种情况就是模型的过拟合。对于决策树来说,噪声点、缺乏代表性样本都有可能引起过拟合。
决策树的剪枝
对决策树进行剪枝可以有效地避免过拟合情况的出现,主要分为先剪枝和后剪枝两种策略。
先剪枝是在建立决策树时,确定一个阈值,当不纯性度量的增益低于阈值时,停止决策树的向下生长。然而,阈值很难正确地选择,过高的阈值会导致拟合不足,阈值太低又无法充分解决过拟合的问题。
另一种方法是对已经按照最大规模生长的决策树进行后剪枝,按照自底向上的方式修剪。修剪的方法有两种:用新的叶结点替换子树,该叶结点的类标签由子树下记录的多数类决定;或者用子树中最常使用的分支代替子树。后剪枝的方法产生的结果往往要由于先剪枝,但是当子树被剪掉后,生长完全决策树的额外计算就被浪费了。

总结

决策树的优点主要有:
1、可以快速建立模型,分类速度也非常快;
2、算法容易理解,对于很多简单的数据集,决策树的准确率可以与其他分类算法媲美;
3、当训练样本大小足够时,决策树算法对于噪声的干扰具有相当好的鲁棒性,尤其是在采用避免过拟合的方法之后;
4、冗余属性不会对决策树产生影响。
同时,它的缺点是:
1、单决策树容易产生过拟合的问题;
2、ID3决策树不能处理连续型特征;
3、数据集中包含过多的不相关特征、子树的多次重复都会导致决策树模型过于庞大。
对于这些,CART树能够处理连续型特征,稍作修改还能够处理回归问题;过拟合可以通过组合方法(如boosting、bagging)来解决,模型的泛化能力和学习能力都非常出众……总之,以决策树为基础的许多树形模型在机器学习和数据挖掘中有着无可取代的重要地位。