决策树算法梳理-3

任务3 - 决策树算法梳理

1. 信息论基础(熵 联合熵 条件熵 信息增益 基尼不纯度)


什么是决策树?

一棵决策树(Decision Tree)是一个树结构(可以是二叉树或非二叉树),每个非叶节点对应一个特征,该节点的每个分支代表这个特征的一个取值,而每个叶节点存放一个类别或一个回归函数。

使用决策树进行决策的过程就是从根节点开始,提取出待分类项中相应的特征,按照其值选择输出分支,依次向下,直到到达叶子节点,将叶子节点存放的类别或者回归函数的运算结果作为输出(决策)结果。

决策树的决策过程非常直观,容易被人理解,而且运算量相对小。它在机器学习当中非常重要。如果要列举“十大机器学习模型”的话,决策树应当位列前三。

下图是一个决策树的例子:
在这里插入图片描述
这棵树的作用,是对要不要接受一个 Offer 做出判断。

我们看到,这棵树一共有7个节点,其中有4个叶子节点和3个非叶子节点。它是一棵分类树,每个叶子节点对应一个类别。

那么有4个叶子节点,是说一共有4个类别吗?当然不是!从图中我们也可以看出,总共只有2个类别:accept offer(接受)和 decline offer(拒绝)。

理论上讲,一棵分类树有 n 个叶子节点(n>1,只有一个结果也就不用分类了)时,可能对应2~n 个类别。不同判断路径是可能得到相同结果的(殊途同归)。

以上例而言,拿到一个 Offer 后,要判断三个条件:(1)年薪;(2)通勤时间;(3)免费咖啡。

这三个条件的重要程度显然是不一样的,最重要的是根节点,越靠近根节点,也就越重要——如果年薪低于5万美元,也就不用考虑了,直接 say no;当工资足够时,如果通勤时间大于一个小时,也不去那里上班;就算通勤时间不超过一小时,还要看是不是有免费咖啡,没有也不去。

这三个非叶子节点(含根节点),统称决策节点,每个节点对应一个条件判断,这个条件判断的条件,我们叫做特征。上例是一个有三个特征的分类树。

当我们用这棵树来判断一个 Offer 的时候,我们就需要从这个 Offer 中提取年薪、通勤时间和有否免费咖啡三个特征出来,将这三个值(比如:[ $ 65,000,0.5 hour, don’t offer free coffee])输入给该树。

该树按照根节点向下的顺序筛选一个个条件,直到到达叶子为止。到达的叶子所对应的类别就是预测结果。

构建决策树:

决策树的作用过程是很简单的,那么决策树是如何构造的呢?

前面讲了,获得一种模型的过程叫训练,那么我们如何训练可以得到一棵决策树呢?

简单讲,有以下几步:

  • 准备若干的训练数据(假设有 m 个样本);
  • 标明每个样本预期的类别;
  • 人为选取一些特征(即决策条件);
  • 为每个训练样本对应所有需要的特征生成相应值——数值化特征;
  • 将通过上面的1-4步获得的训练数据输入给训练算法,训练算法通过一定的原则,决定各个特征的重要性程度,然后按照决策重要性从高到底,生成决策树。

在构造决策树时,我们需要解决的第一个问题就是,当前数据集上哪个特征在划分数据分类是起决定作用。为了找到决定性的特征,划分出最好的结果,我们必须评估每个特征。完成测试知乎,原始数据集就被划分为几个数据子集。

划分数据集的原则是:将无序的数据变得更加有序。组织杂乱无章数据的一种方法就是使用信息论度量信息,信息论是量化处理信息的分支科学。我们可以再划分数据之前或之后使用信息论量化度量信息的内容。

在划分数据之前之后信息发生的变化称为信息增益,知道如何计算信息增益,我们就可以计算每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择。

在可以评测哪种数据划分方式是最好的数据划分之前,我们必须学习如何计算信息增益。集合信息的度量方式称为香农熵或者简称

熵定义为信息的期望值,所以我们也称之为信息熵,在明晰这个概念之前,我们必须知道信息的定义。

那么如何定义信息量:

  • 某事件发生的概率小,则该事件的信息量大;
  • 如果两个事件X和Y独立,即p(xy) = p(x)p(y),假定X和Y的信息量分别为h(X)和h(Y),则二者同时发生的信息量应该为h(XY) = h(X) + h(Y).
  • 定义事件X发生的概率为:p(x),则X的信息量为:

在这里插入图片描述
为了计算熵,我们需要计算所有随机事件的信息期望值,通过下面的公式得到:

在这里插入图片描述其中,n 是随机事件的数目。
熵是随机变量不确定性的度量,不确定性越大,熵值越大。



设有随机变量(X,Y),其联合概率分布为:
在这里插入图片描述
于是,两个随机变量X,Y的联合分布,可以形成联合熵(Joint Entropy),用H(X, Y)表示。
两个变量 X 和 Y 的联合信息熵定义为:
在这里插入图片描述
其中 x 和 y 是 X 和 Y 的特定值,相应地,p(x,y) 是这些值一起出现的联合概率, 若 p(x,y) 为0,则 p(x,y)log2[p(x,y)] 定义为0。

对于两个以上的变量,该式的一般形式为:
在这里插入图片描述
其中x1,…,xn是X1,…,Xn的特定值,相应地,p(x1,…,xn)是这些变量同时出现的概率,若p(x1,…,xn)为0,则p(x1,…,xn)log2[p(x1,…,xn))] 被定义为0.
联合熵,大于每个独立的熵,小于独立熵的和。



条件熵为H(Y|X)=H(X,Y)−H(X)。条件熵表示在已知随机变量X的条件下随机变量Y的不确定性。
在这里插入图片描述



另一个度量集合无序程度的方法是基尼不纯度,简单的说就是从一个数据集中随机选取子项,度量其被错误分类到其他分组里的概率。

在这里插入图片描述

  • 显然基尼不纯度越小,纯度越高,集合的有序程度越高,分类的效果越好;
  • 基尼不纯度为 0 时,表示集合类别一致;
  • 基尼不纯度最高(纯度最低)时,f1 = f2 = … = fm = 1/m ,
    在这里插入图片描述

2.决策树的不同分类算法(ID3算法、C4.5、CART分类树)的原理及应用场景

根据处理数据类型的不同,决策树又分为两类:分类决策树与回归决策树,前者可用于处理离散型数据,后者可用于处理连续型数据。
三种比较常见的分类决策树分支划分方式包括:ID3, C4.5, CART。
在这里插入图片描述
ID3 算法–以信息增益为度量,选择分裂后信息增益最大的特征进行分裂。

C4.5–选用信息增益率(Gain Ratio)——用比例而不是单纯的量——作为选择分支的标准。

CART分类树–特征选取依据不是增益量或者增益率,而是** Gini 系数**(Gini Coefficient)。每次选择 Gini 系数最小的特征作为最优切分点;

3. 回归树原理

下面介绍回归树原理。

回归树既然是决策树,那么必然会存在以下两个核心问题:如何选择划分点?如何决定叶节点的输出值?

一个回归树对应着输入空间(即特征空间)的一个划分以及在划分单元上的输出值。分类树中,我们采用信息论中的方法,通过计算选择最佳划分点。而在回归树中,采用的是启发式的方法。假如我们有n个特征,每个特征有si(i∈(1,n))个取值,那我们遍历所有特征,尝试该特征所有取值,对空间进行划分,直到取到特征j的取值s,使得损失函数最小,这样就得到了一个划分点。描述该过程的公式如下:
在这里插入图片描述
假设将输入空间划分为M个单元:R1,R2,…,Rm 那么每个区域的输出值就是:cm=ave(yi|xi∈Rm),也就是该区域内所有点 y 值的平均数。

举个例子。如下图所示,假如我们想要对楼内居民的年龄进行回归,将楼划分为3个区域R1,R2,R3(红线),那么R1的输出就是第一列四个居民年龄的平均值,R2的输出就是第二列四个居民年龄的平均值,R3的输出就是第三、四列八个居民年龄的平均值。
在这里插入图片描述
算法描述如下:
在这里插入图片描述

4. 决策树防止过拟合手段

本节介绍两种在决策树归纳上避免过分拟合的策略。

先减枝(提前终止规则):在这种方法中,树增长算法在产生完全拟合整个训练数据集的完全增长的决策树之前就停止决策树的生长。为了做到这一点,需要采用更具限制性的结束条件。例如,当观察到的不纯性度量的增益(或估计的泛化误差的改进)低于某个确定的阈值时就停止扩展叶结点。这种方法的优点在于避免产生过分拟合训练数据的过于复杂的子树。然而,很难为提前终止选择正确的阈值。阈值太高将导致拟合不足的模型,而阈值太低就不能充分地解决过分拟合的问题。此外,即便使用已有的属性测试条件得不到显著的增益,接下来的划分也可能产生较好的子树。

后剪枝:在该方法中,初始决策树按照最大规模生长,然后进行剪枝的步骤,按照自底向上的方式修剪完全增长的决策树。修剪有两种做法:(1)用新的叶结点替换子树,该叶结点的类标号由子树下记录中的多数类确定;或者(2)用子树中最常使用的分支代替子树。当模型不能再改进时终止剪枝步骤。与先剪枝相比,后剪枝技术倾向于产生更好的结果,因为不像先剪枝,后剪枝是根据完全增长的决策树做出的剪枝决策,先减枝则可能过早终止决策树的生长。然而,对于后剪枝,当子树被剪掉后,生长完全决策树的额外的计算就被浪费了。

图4-29展示了4.3.6节web机器人检测的简化后的决策树模型。注意跟在depth=1的子树已经用涉及属性ImagePages的一个分支替换,这种方法又称子树提升(subtree raising);depth>1且MultiAgent=0的子树被类标号为0的叶结点替换,这种方法称作子树替换(subtree replacement);depth>1且MultiAgent=1的子树完整保留。
在这里插入图片描述

5. 模型评估

5.1 保持方法

在保持(Holdout)方法中,将被标记的原始数据划分成两个不想交的集合,分别称为训练集合检验集。在训练数据集上归纳分类模型,在检验集上评估模型的性能。训练集和检验集的划分比例通常根据分析家的判断(例如,50-50,或者2/3作为训练集、1/3作为检验集)。分类器的准确率根据模型在检验集上的准确率估计。

5.2 随机二次抽样

可以多次重复保持方法来改进对分类器性能的估计,这种方法称作随机二次抽样(random subsampling)。设acci是第i次迭代的模型准确率,总准确率是accsub=∑ki=1acci/k。随机二次抽样也会遇到一些与保持方法同样的问题,因为在训练阶段也没有利用尽可能多的数据。并且,由于它没有控制每个记录用于训练和检验的次数,因此,有些用于训练的记录使用的频率可能比其他记录高很多。

5.3 交叉验证

替代随机二次抽样的一种方法是交叉验证(cross-validation)。在该方法中,每个记录用于训练的次数相同,并且恰好检验一次。为了解释该方法,假设把数据分为相同大小的两个子集,首先,我们选择一个子集作训练集,而另一个作检验集,然后交换两个集合的角色,原先作训练集的现在做检验集,反之亦然,这种方法叫做二折交叉验证。总误差通过对两次运行的误差求和得到。在这个例子中,每个样本各作一次训练样本和检验样本。k折交叉验证是对该方法的推广,把数据分为大小相同的k份,在每次运行,选择其中一份作检验集,而其余的全作为训练集,该过程重复k次,使得每份数据都用于检验恰好一次。同样,总误差是所有k次运行的误差之和。

5.4 自助法

以上方法都是假定训练记录采用不放回抽样,因此,训练集合检验集都不包含重复记录。在自助(bootstrap)方法中,训练记录采用有放回抽样,即已经选作训练的记录将放回原来的记录集中,使得它等机率地被重新抽取。如果原始数据有N个记录,可以证明,平均来说,大小为N的自助样本大约包含原始数据中63.2%的记录。这是因为一个记录被自助抽样抽取的概率是1−(1−1/N)N,当N充分大时,该概率逐渐逼近1−e−1=0.632。没有抽中的记录就成为检验集的一部分,将训练集建立的模型应用到检验集上,得到自助样本准确率的一个估计εi。抽样过程重复b次,产生b个自助样本。

按照如何计算分类器的总准确率,有几种不同的自助抽样法。常用的方法之一是.632自助(.632 bootstrap),它通过组合每个自助样本的准确率(εi)和由包含所有标记样本的训练集计算的准确率(accs)计算总准确率(accboot):
在这里插入图片描述

6. sklearn参数详解,Python绘制决策树

6.1 sklearn参数详解–决策树

sklearn.tree.DecisionTreeClassifier
        (criterion='gini', splitter='best', max_depth=None, min_samples_split=2, 
        min_samples_leaf=1,min_weight_fraction_leaf=0.0, max_features=None, 
        random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, 
        min_impurity_split=None, class_weight=None, presort=False)
参数详解
criterion特征选择的标准,有信息增益和基尼系数两种,使用信息增益的是ID3和C4.5算法(使用信息增益比),使用基尼系数的CART算法,默认是gini系数。
splitter特征切分点选择标准,决策树是递归地选择最优切分点,spliter是用来指明在哪个集合上来递归,有“best”和“random”两种参数可以选择,best表示在所有特征上递归,适用于数据集较小的时候,random表示随机选择一部分特征进行递归,适用于数据集较大的时候。
max_depth决策树最大深度,决策树模型先对所有数据集进行切分,再在子数据集上继续循环这个切分过程,max_depth可以理解成用来限制这个循环次数。
min_samples_split子数据集再切分需要的最小样本量,默认是2,如果子数据样本量小于2时,则不再进行下一步切分。如果数据量较小,使用默认值就可,如果数据量较大,为降低计算量,应该把这个值增大,即限制子数据集的切分次数。
min_samples_leaf叶节点(子数据集)最小样本数,如果子数据集中的样本数小于这个值,那么该叶节点和其兄弟节点都会被剪枝(去掉),该值默认为1。
min_weight_fraction_leaf在叶节点处的所有输入样本权重总和的最小加权分数,如果不输入则表示所有的叶节点的权重是一致的。
max_features特征切分时考虑的最大特征数量,默认是对所有特征进行切分,也可以传入int类型的值,表示具体的特征个数;也可以是浮点数,则表示特征个数的百分比;还可以是sqrt,表示总特征数的平方根;也可以是log2,表示总特征数的log个特征。
random_state随机种子的设置,与LR中参数一致。
max_leaf_nodes最大叶节点个数,即数据集切分成子数据集的最大个数。
min_impurity_decrease切分点不纯度最小减少程度,如果某个结点的不纯度减少小于这个值,那么该切分点就会被移除。
min_impurity_split切分点最小不纯度,用来限制数据集的继续切分(决策树的生成),如果某个节点的不纯度(可以理解为分类错误率)小于这个阈值,那么该点的数据将不再进行切分。
class_weight权重设置,主要是用于处理不平衡样本,与LR模型中的参数一致,可以自定义类别权重,也可以直接使用balanced参数值进行不平衡样本处理。
presort是否进行预排序,默认是False,所谓预排序就是提前对特征进行排序,我们知道,决策树分割数据集的依据是,优先按照信息增益/基尼系数大的特征来进行分割的,涉及的大小就需要比较,如果不进行预排序,则会在每次分割的时候需要重新把所有特征进行计算比较一次,如果进行了预排序以后,则每次分割的时候,只需要拿排名靠前的特征就可以了。

6.2 Python绘制决策树

参考:
https://cloud.tencent.com/developer/article/1146079

https://blog.csdn.net/weixin_40604987/article/details/79296427

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值