【机器学习】决策树(基础篇)

本篇文章收录并转载自 CSDN博主 - 烂尾主教

7e6fc55519564e2a8319b3aa02ae08c2.png

思维导图

02b8d62f0f034be8a53d27f0f9c39079.png

前言

  • 本节将以例子为主,详细介绍生成决策树的原理部分,代码将不做重点介绍。

了解决策树(前后观看)

e7ff04577fcc4368b8812d4b754d768b.png

28495e74804c4ea79bc9e9207f423773.png

4907dd1a4b1a4ec6af6aaf232432ef76.png

决策树算法被广泛应用于数据挖掘、自然语言处理、图像处理等领域。它的优点包括易于理解和解释、计算复杂度低、具有较高的准确性等。

使用决策树(感性的认识)

给定决策树:

35ce043b59cd49dbb47699477204cc5c.png

给定数据:

年龄收入学历是否购买
25本科
35硕士
45初中
20大专
30博士

依据决策树我们可以判定的下表是否购买项的数据

年龄收入学历是否购买
25本科
35硕士
45初中
20大专
30博士

如何生成决策树(原理部分,此部分有局限性,主要是针对分类问题)

通过上面的例子,我们将相关决策树的名词,给出以下定义:

  • 最佳属性(最佳特征):在节点上,我们需要找到一个将数据集划分为最有利于分类的子集的属性。这个属性被称为最佳属性,

    • 上例中根节点的年龄属性,蓝色字段是为什么不选其他的属性的原因
  • 划分准则:划分准则是指用来衡量每个属性将数据集分成不同子集的优劣程度的方法。

    • 例如信息增益、基尼系数等
  • 子集:将数据集根据最佳属性划分后得到的数据子集。

  • 叶节点:决策树的终止节点,表示该节点下的所有数据都属于同一类别。叶节点不再进行划分。

要生成一颗决策树,通常需要考虑以下几个方面:

  1. 数据集的选择:需要先选定用于训练决策树的数据集。这个数据集应该包含足够多的样本,能够覆盖待分类问题中的所有可能情况。

  2. 最佳属性选择:在数据集中选择最佳的属性(特征),作为节点划分准则,通常会使用信息增益、基尼不纯度等指标来衡量每个属性(特征)的重要性,以便确定最佳划分属性。

  3. 剪枝:生成的决策树可能存在过拟合的问题,需要进行剪枝以提高泛化能力。

b07f72c547ff4d539a59c39a004435d2.png

e9c94c95751e419f9c83632edb240157.png

上图针对分类问题所作的图,显然,属性选择的不同会带来分类的不同效果,从我们感官上来分析,选择特征X1要优于选择特征X2。

决策树学习采用分而治之的策略,通过贪婪搜索来识别树中的最佳分割点。然后以自上而下的递归方式重复此拆分过程,直到所有或大多数记录都已分类到特定的类别标签下。

特征的选取不同,生成的子集不同,从图上我们可以看得出来选择特征X1要强于选择特征X2,但是如何量化的划分子集的效果,通过量化后数值大小来确定特征的选择呢,哎嘿!这就需要划分准则所做的事情。

暂不考虑数据集的选择和剪枝操作,对于最佳属性选择操作所使用的划分准则不同,可以将决策树算法分为以下4种:

  1. ID3算法:使用信息增益作为属性选择的判据,这种算法通常用于处理分类问题。
  2. C4.5算法:与ID3算法类似,但是使用信息增益比作为属性选择的依据,同时还支持处理缺失数据。
  3. CART算法:使用基尼指数或者均方误差(MSE)等判据作为属性选择依据,该算法既可以用于分类问题,也可以用于回归问题。
  4. CHAID算法:使用卡方检验作为属性选择判据,主要用于分类问题。

下面详细介绍下ID3和CART算法去生成决策树

ID3算法生成决策树(基于信息增益的决策树算法)

信息增益在我另一篇博客:(引流一下)【机器学习】信息量、香农熵、信息增益

3d42b78db562409cb0cb90e19e8c055a.png

信息增益的基本思想是:选择一个能够最大化训练数据集中信息增益的特征作为划分标准。信息增益的计算公式如下:

Gain(D,A)=H(D)-\sum_{v=1}^{V}\frac{|D_v|}{D}H(D_v)

其中,D表示训练数据集,f表示要计算信息增益的特征,V表示特征 f ff 的取值个数,D^v表示在特征f取值为v时,训练数据集D的子集。Ent(D)表示训练数据集D的熵,Ent(D^v)表示在特征f取值为v时,训练数据集D^v的熵。

那么利用信息增益,生成决策树流程为:

  1. 收集数据集,并确定每个样本的分类标签。
  2. 利用信息增益确定用来分裂数据集的最佳特征。
  3. 根据选择的特征将数据集分为子集,每个子集都具有相同的特征值。
  4. 对于每个子集,递归地重复步骤2-3,直到所有子集中的样本属于同一类别或达到预定义的停止条件。 构建决策树,
  5. 并将最终的分类结果与测试数据进行比较以评估决策树的准确性。

信息增益确定用来分裂数据集的最佳特征的过程如下:

  1. 计算训练数据集D的熵Ent(D)
  2. 对于每个特征f,计算特征D对训练数据集的条件熵Ent(D|f)
  3. 计算特征f对训练数据集D的信息增益Gain(D, f),                                                           即Gain(D, f) = Ent(D) - Ent(D|f)
  4. 选择信息增益最大的特征作为划分标准。

最后,根据选择的最佳特征,将训练数据集D分成若干个子集,每个子集对应于最佳特征的一个取值。这个过程就是数据集的划分。这些子集成为决策树的分支节点,它们继续递归地执行上述过程,直到满足预定义的停止条件,例如树的深度达到一定值,节点中的样本数量小于一定值等。

接下来,需要确定决策树的叶子节点的类别。有几种方法可以实现:

  • 选取叶子节点中出现最多的类别作为该节点的类别。
  • 对于叶子节点中的每个类别,计算该类别在训练数据集中出现的频率,选择频率最高的类别作为该节点的类别。
  • 对于叶子节点中的每个类别,计算该类别在训练数据集中出现的概率,选择概率最高的类别作为该节点的类别。

最终,得到的决策树就可以用于对新样本进行分类。

举例:小明出去玩?

数据拟定背景:小明想出去玩?

IDClassWindTempOutlook
1PlayWeakHotSunny
2PlayStrongHotSunny
3StayWeakHotRain
4PlayWeakMidOvercast
5StayStrongColdRain
6PlayWeakColdOvercast
7StayStrongColdRain
8PlayWeakMidSunny
9PlayWeakColdSunny
10PlayStrongMidOvercast
11StayWeakMidSunny
12StayStrongMidRain
13PlayWeakHotOvercast
14PlayWeakColdRain
  • 对于系统香农熵H(D)
ClassCount
play6
stay4

H(D)=-\sum p(x)·log_2{p(x)}=-(\frac{9}{14}log_2\frac{9}{14}+\frac{5}{14}log_2\frac{5}{14})=0.94

  • 计算关于Wind的信息增益
WeakStrong
Play72
Stay23

H(D_{weak})=-(\frac{7}{9}log_2\frac{7}{9}+\frac{2}{9}log_2\frac{2}{9})=0.764

H(D_{strong})=-(\frac{2}{5}log_2\frac{2}{5}+\frac{3}{5}log_2\frac{3}{5})=0.970
Gain(D,Wind)=H(D)-\sum_{v=1}^{V}\frac{|D_v|}{D}H(D_v)=H(D)-(\frac{9}{14}H(D_{weak})+\frac{5}{14}H(D_{strong}))=0.102

  • 计算关于Temperature的信息增益
HotMidCold
Play333
Stay122

H(D_{Hot})=-(\frac{3}{4}log_2\frac{3}{4}+\frac{1}{4}log_2\frac{1}{4})=0.811
H(D_{Mid})=-(\frac{3}{5}log_2\frac{3}{5}+\frac{2}{5}log_2\frac{2}{5})=0.970
H(D_{Cold})=-(\frac{3}{5}log_2\frac{3}{5}+\frac{2}{5}log_2\frac{2}{5})=0.970
Gain(D,Temp)=H(D)-\sum_{v=1}^{V}\frac{|D_v|}{D}H(D_v)=H(D)-(\frac{4}{14}H(D_{Hot})+\frac{5}{14}H(D_{Mid})+\frac{5}{14}H(D_{Cold}))=0.008

  • 计算关于Outlook的信息增益
SunnyOvercastRain
Play441
Stay104

Gain(D,Outlook)=H(D)-\sum_{v=1}^{V}\frac{|D_v|}{D}H(D_v)=H(D)-(\frac{5}{14}H(D_{Sunny})+\frac{4}{14}H(D_{Overcast})+\frac{5}{14}H(D_{Rain}))=0.424

  • 信息增益汇总
windTempOutlook
信息增益0.1020.0080.424

不难看出,小明去不去玩啊,温度只能减少0.008的不确定性,但是天气景观(Outlook)可以减少0.424的不确定性,那我们是不是说Outlook更重要一些,更适合作为重要决策节点。

选择标准就是:信息增益最大的那个作为决策属性,

经过第一轮的比较我们可以知道根节点就是最佳决策属性就是Outlook

接下来的步骤就是,将划分好的3个数据子集(D_{Sunny}D_{Overcast}D_{Rain}​)分别作为下一次的数据集合,进行上述操作,直至划分的子集纯度为1(其实就是不可在分,在数据的表现就是信息增益为0),这样我们就能得到一个完整的决策树。

如果数据集中有连续变量,可以将其转换为离散变量,例如将年龄按照一定的区间划分为不同的类别。这样做可以简化计算,并且能够更好地处理离散数据。

CART算法生成决策树(基于基尼系数|MSE的决策树算法)

在CART算法中,基尼系数和均方误差(MSE)都被用作度量划分质量的指标,选择最佳特征时,算法计算每个特征的基尼系数或者MSE,选择最小值对应的特征进行划分。

  • 基尼系数用于分类问题,它表示从数据集中随机选取两个样本,其类别不一致的概率,基尼系数越小表示数据集纯度越高。
  • 均方误差(MSE)用于回归问题,它表示预测值与实际值之间的平均误差的平方,均方误差越小表示预测值与实际值的差距越小。在回归问题中,CART算法选择平均值作为叶子节点的预测值。

95f4c0416d674b9faf2a162d2bf62619.png

假设数据集DK个类别,p_k表示属于第k类的样本在数据集D中的比例,那么D的基尼系数可以表示为:

Gini(D)=\sum_{k=1}^Kp_k(1-p_k)

D中只有一种类别时,基尼系数最小,为 0。因为此时p_k=1,而其他p_j都等于 0,因此1-p_k=0,整个求和式中只有一项,结果为 0。而当D中所有类别都出现相同的次数时,基尼系数最大,为1-1/K。因为此时p_k=1/K,每一项的值都相等,最终求和的结果为K \times (1/K)(1-1/K) = 1-1/K
 在决策树算法中,我们可以通过计算选择某个特征进行分割后子集的基尼系数来评估分割的质量,选取基尼系数最小的分割方法作为最终选择。
那么利用基尼系数,生成决策树流程为:

  • 收集数据集,并确定每个样本的分类标签。
  • 利用基尼系数确定用来分裂数据集的最佳特征。
  • 根据选择的特征将数据集分为子集,每个子集都具有相同的特征值。
  • 对于每个子集,递归地重复步骤2-3,直到所有子集中的样本属于同一类别或达到预定义的停止条件。 构建决策树,
  • 并将最终的分类结果与测试数据进行比较以评估决策树的准确性。

基于基尼系数确定用来分裂数据集的最佳特征的具体步骤如下:

  • 计算训练数据集D的基尼指数Gini(D){Gini}(D)=\sum_{k=1}^{|\mathcal{Y}|} \sum_{k^{\prime} \neq k} p_{k} p_{k^{\prime}}=\sum_{k=1}^{|\mathcal{Y}|} p_{k}\left(1-p_{k}\right)

其中,|\mathcal{Y}|是类别的个数,p_k是第k个类别在数据集D中出现的概率。

  • 对于每个特征A,对数据集D按特征A的不同取值进行划分,计算每个划分的基尼指数
    Gini_A(D)。划分的方式有多种,比如对于离散特征可以按取值分别划分,对于连续特征可以按阈值划分。
  • 选择基尼指数最小的划分作为最优划分特征。最小基尼指数的定义如下:

Gini\_index(D,A)=\sum_{v=1}^V\frac{D_v}{D}Gini(D_v)

其中,V是特征 A AA 的取值个数,D_v是数据集D中特征A取值为v的样本集合,|D_v|D_v中的样本个数。

  • 对于上一步得到的最优划分,将数据集D划分成若干个子集D_1,D_2,...,D_k,并将每个子集分别作为一个子节点,递归地生成决策树。

举例:

eaa1115730a14adc8e78a910597224cd.png7c1b6f55f94040c88a40314c820272ed.png

b7074db0e00d429ab2bc1a0a21a3d059.png

部分公式排版有变动(数学公式在CSDN无法直接迁移,所以采用了手动复原……)

不好直接问作者要原稿hhhhh

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值