决策树-特征属性选择划分

       决策树是一个树结构(可以是二叉树或非二叉树),其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个输出类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

决策树学习通常包含这几个方面:特征选择、决策树生成、决策树剪枝、缺失值/异常值处理、决策树集成学习。

决策树-特征属性选择划分

决策树-缺失值和连续值处理及属性划分

决策树-不同的决策树模型对比

决策树-避免过拟合预剪枝和后剪枝对比区别

决策树-算法小结及常见问题


    

特征选择,就是决策树的构造过程,为了找到最优的划分特征,我们需要先了解一些信息论的知识。

目录

信息熵(Information Entropy)

条件熵(Conditional Entropy)

信息增益(Information Gain)

信息增益比/增益率(Information Gain-ratio)

基尼系数(Gini)

其他


       决策树构建过程中,需要将特征作为决策树中的节点,其中特征(属性)的划分,目的是保证节点的纯度越来越高,划分样本的能力越强,特征区分效果越好。

信息熵越小,纯度越高,特征划分效果越好;

信息增益越大,纯度越高,特征划分效果越好;

基尼系数越小,纯度越高,特征划分效果越好;

 

信息熵(Information Entropy

       信息是个很抽象的概念。人们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少。比如一本五十万字的中文书到底有多少信息量。直到1948年,香农提出了“信息熵”的概念,才解决了对信息的量化度量问题。信息熵这个词是香农从热力学中借用过来的。热力学中的热熵是表示分子状态混乱程度的物理量。香农用信息熵的概念来描述信源的不确定度

信息熵是用来衡量一个随机变量出现的期望值,一个变量的信息熵越大,那么他出现的各种情况也就越多,也就是包含的内容多(所以在机器学习中信息熵越小越好)。

       我们要描述他就需要付出更多的表达才可以,也就是需要更多的信息才能确定这个变量。在实际的情况中,每种可能情况出现的概率并不是相同的,所以熵(entropy)就用来衡量整个系统的平均信息量。熵只有特征的种类和概率有关系,与取值没有关系。

对于一个取有限个值的随机变量X,如果其概率分布为:

那么随机变量X的熵可以用以下公式描述:

举个例子,如果一个分类系统中,类别的标识是c,取值情况是 c1,c2,⋯,cn;其中n为类别的总数。那么此分类系统的熵为:

更特别一点,如果是个二分类系统,那么此系统的熵为:

其中p(c0)、p(c1)分别为正负样本出现的概率。

 

示例1:世界杯决赛的两支球队中,哪支球队将获得冠军?

在对球队实力没有任何了解的情况下,每支球队夺冠的概率都是1/2,所以谁获得冠军这条信息的信息量是

如果信息是四强中的球队谁获得了冠军,它的信息量是

其实这正好对应了计算机对数字的表示,如果用二进制表示,每一位出现0和1的概率都是1/2,所以每一位的信息量是1bit。如果用十六进制表示,每一位出现任意一个符号的概率是1/16,所以每一位能表示

所以1位十六进制的信息量,和4位二进制信息量是相同的。

熵是平均信息量,也可以理解为不确定性。例如进行决赛的巴西和南非,假设根据经验判断,巴西夺冠的几率是80%,南非夺冠的几率是20%,则谁能获得冠军的信息量就变为:

 

小于1 bit了,经验减少了判断所需的信息量,消除了不确定性。

而且通过计算可以发现,巴西夺冠的几率越高,计算出的熵就越小,即越是确定的情况,不确定性越小,信息量越少。如果巴西100%夺冠,那么熵是0,相当于没有任何信息。当两队几率都是50%最难判断,所熵达到最大值1。其实之前的 - log2 1/2 = 1 bit 是简化了的计算过程,其结果也是通过熵的公式来计算的

计算信息量要综合考虑每种结果的可能性。

另一个会迷惑的问题是熵会大于1吗?答案当然是肯定的,刚刚计算的最大值为1bit,是因为最终的结果只有两种情况。在有四支球队的时候,其最大值就是

当四支球队夺冠概率不等的时候,熵会小于2 bit。

 

条件熵(Conditional Entropy)

如果投掷一枚均匀的筛子,那么筛子出现1-6的概率是相等的,此时,整个系统的熵可以表述为:

如果我们加一个特征,告诉你掷筛子的结果出来是偶数,因为掷筛子出来为偶数的结果只可能为2,4,6,那么此时系统的熵为:

因为我们加了一个特征x:结果为偶数,所以整个系统的熵减小,不确定性降低。

 

信息增益(Information Gain

在信息增益中,衡量标准是看特征能够为分类系统带来多少信息,带来的信息越多,该特征越重要。对一个特征而言,系统有它和没它时信息量将发生变化,而前后信息量的差值就是这个特征给系统带来的信息量。所谓信息增益

系统含有特征 t 的时候信息量很好计算,就是刚才的式子,它表示的是包含所有特征时系统的信息量。对应到我们的系统中,就是下面的等价:

(1)系统不包含特征 t ;

(2)系统虽然包含特征t,但是t已经固定了,不能变化。我们计算分类系统不包含特征t的时候,就使用情况

(3)来代替,就是计算当一个特征t不能变化时,系统的信息量是多少。这个信息量其实也有专门的名称,就叫做 “ 条件熵 ” ,条件,自然就是指 “ t 已经固定 ” 这个条件。

例如一个特征X,它可能的取值有 n 多种(x1,x2,……,xn),当计算条件熵而需要把它固定的时候,要把它固定在哪一个值上呢?答案是每一种可能都要固定一下,计算n个值,然后取均值才是条件熵。而取均值也不是简单的 加一加然后除以n,而是要用每个值出现的概率来算平均(简单理解,就是一个值出现的可能性比较大,固定在它上面时算出来的信息量占的比重就要多一些)。

因此有这样两个条件熵的表达式:

这是指特征X被固定为值 xi 时的条件熵,

这是指特征X被固定时的条件熵,注意与上式在意义上的区别。从刚才计算均值的讨论可以看出来,第二个式子与第一个式子的关系就是:

具体到我们文本分类系统中的特征 t,t 有几个可能的值呢?注意 t 是指一个固定的特征,比如他就是指关键词“经济”或者“体育”,当我们说特征“经济”可能的取值时,实际上只有两个,“经济”要么出现,要么不出现。一般的,t 的取值只有 t(代表 t 出现)和(代表 t 不出现),注意系统包含 t 但 t 不出现与系统根本不包含 t 可是两回事。

因此固定t时系统的条件熵就有了,为了区别 t 出现时的符号与特征 t 本身的符号,我们用 T 代表特征,而用 t 代表 T 出现,那么:

与刚才的式子对照一下,含义很清楚对吧,P(t)就是T出现的概率,就是T不出现的概率。这个式子可以进一步展开,其中的

另一半就可以展开为:

因此特征T给系统带来的信息增益就可以写成系统原本的熵与固定特征T后的条件熵之差:

公式中的东西看上去很多,其实也都很好计算。比如P(Ci),表示类别Ci出现的概率,其实只要用1除以类别总数就得到了(这是说你平等的看待每个类别而忽略它们的大小时这样算,如果考虑了大小就要把大小的影响加进去)。再比如P(t),就是特征T出现的概率,只要用出现过T的文档数除以总文档数就可以了,再比如P(Ci|t)表示出现T的时候,类别Ci出现的概率,只要用出现了T并且属于类别Ci的文档数除以出现了T的文档数就可以了。

从以上讨论中可以看出,信息增益也是考虑了特征出现和不出现两种情况,与开方检验一样,是比较全面的,因而效果不错。但信息增益最大的问题还在于它只能考察特征对整个系统的贡献,而不能具体到某个类别上,这就使得它只适合用来做所谓“全局”的特征选择(指所有的类都使用相同的特征集合),而无法做“本地”的特征选择(每个类别有自己的特征集合,因为有的词,对这个类别很有区分度,对另一个类别则无足轻重)。

下面举个例子,依然用天气预报数据集:在这个例子中,最后一列指是否出去玩,这里作为我们所要预测的标记值(label),而前四列就是我们需要借助的数据,每一列都是一个特征(feature)。

示例2:

在这个例子中,最后一列指是否出去玩,这里作为我们所要预测的标记值(label),而前四列就是我们需要借助的数据,每一列都是一个特征(feature)属性。初始状态下,label列总共为14行,有9个yes和5个no,所以label列初始信息熵为:

假设我们先划分outlook这一列,分成sunny、rain、overcast三类,数量分别为5:5:4,考虑到每个类别下对应的label不同,可以计算出划分后的信息熵:

其中E(S1)、E(S2)、E(S3)分别为每个类别下对应的label列的熵。

而信息增益(Info-Gain)就是指划分前后信息熵的变化:

在ID3算法中,信息增益(Info-Gain)越大,划分越好,决策树算法本质上就是要找出每一列的最佳划分以及不同列划分的先后顺序及排布。

 

示例3:

在测试样本中,一共有17个样本,正例8个,反例9个,则决策树的根节点的信息熵(初始信息熵label的信息熵为:

求出每个特征的信息增益:

以此类推,通过计算信息增益来生成决策树。

信息增益做特征选择的优缺点:

优点:

  • 信息增益考虑了特征出现与不出现的两种情况,比较全面,一般而言效果不错;
  • 使用了所有样例的统计属性,减小了对噪声的敏感度;
  • 容易理解,计算简单;

缺点:

  • 信息增益考察的是特征对整个系统的贡献,没有到具体的类别上,所以一般只能用来做全局的特征选择,而没法针对单个类别做特征选择;
  • 只能处理离散型的属性值,没法处理连续值的特征(这个是与基尼系数的区别);
  • 算法天生偏向选择分支多的属性,容易导致overfitting;

 

信息增益比/增益率(Information Gain-ratio

前面提到,信息增益的一个大问题就是偏向选择分支多的属性导致overfitting,那么我们能想到的解决办法自然就是对分支过多的情况进行惩罚(penalty)了。于是我们有了信息增益比,或者说信息增益率:

特征X的熵:

特征X的信息增益 :

那么信息增益比为:

根据前文的例子,Info-Gain在面对类别较少的离散数据时效果较好,上例中的outlook、temperature等数据都是离散数据,而且每个类别都有一定数量的样本,这种情况下使用ID3与C4.5的区别并不大。但如果面对连续的数据(如体重、身高、年龄、距离等),或者每列数据没有明显的类别之分(最极端的例子的该列所有数据都独一无二),在这种情况下,我们分析信息增益(Info-Gain)的效果:

根据公式

E(S)为初始label列的熵,并未发生变化,则IGain(S,A)的大小取决于E(A)的大小,E(A)越小,IGain(S,A)越大,而根据前文例子,

若某一列数据没有重复(连续值中没有重复,重复率很低),ID3算法倾向于把每个数据自成一类,此时

这样E(A)为最小,IGain(S,A)最大,程序会倾向于选择这种划分,这样划分效果极差。

为了解决这个问题,引入了信息增益率(Gain-ratio)的概念,计算方式如下:

这里Info为划分行为带来的信息,信息增益率如下计算:

这样就减轻了划分行为本身的影响。

 

基尼系数(Gini

Gini系数是一种与信息熵类似的做特征选择的方式,可以用来数据的不纯度。在CART(Classification and Regression Tree)算法中利用基尼指数构造二叉决策树。

Gini系数的计算方式如下:

其中,D表示数据集全体样本,pi表示每种类别出现的概率。取个极端情况,如果数据集中所有的样本都为同一类,那么有p0=1,Gini(D)=0,显然此时数据的不纯度最低。

与信息增益类似,我们可以计算如下表达式:

上面式子表述的意思就是,加入特征X以后,数据不纯度减小的程度。很明显,在做特征选择的时候,我们可以取ΔGini(X)最大的那个。

计算流程:

  • 计算每个节点的基尼得分
  • 计算划分出的所有节点基尼得分的加权平均和
  • 比较各种划分方式所得到的所有节点的基尼平均和,Gini加权平均和超过父节点的Gini得分,并且Gini加权平均和最大的划分方式作为最终的划分方式。

(1)如何计算划分出的某一个子节点的Gini得分

一个子节点的Gini得分=节点中各类别记录数所占的百分比的平方和。

比如:一个决策树的目标变量有两个分类A和B,一个子节点,A的记录占比是80%,B的记录占比是20%,那么,本节点的Gini得分为

0.8*0.8+0.2*0.2=0.64+0.04 = 0.68。

 

(2)如何计算划分出的所有子节点的Gini加权平均和

1)计算每个子节点的Gini得分;

2)计算每个子节点的Gini得分加权平均值;

一个子节点的Gini得分加权平均值=节点Gini得分*节点记录数占所有子节点总记录数的比例。比如:一个子节点的Gini得分是0.68,本节点有3000个记录,另外还有两个子节点,记录数分别为5000和2000,那么,本节点的Gini得分加权平均值是:

0.68*3000/(3000+5000+2000)=0.68*0.3= 0.204

 

在决策树算法中,ID3使用信息增益,C4.5使用信息增益比,CART使用基尼系数

 

其他

基于熵减少的划分算法

(1)什么是熵

(2)目标:划分出的所有子节点的熵的加权平均和最小。

(3)过程:

1)计算划分出的每个子节点的熵;

2)计算划分出的所有子节点的熵的加权平均和;

3)比较各种划分方式所得到的所有子节点的熵加权平均和,熵加权平均和超过父节点的熵,并且熵加权平均和最大的划分方式作为最终的划分方式。

(4)如何计算划分出的某一个子节点的熵

一个子节点的熵=节点中各类别记录数所占的百分比乘以该比例的以2为底的对数,然后在把各类别的这个结果相加,然后再乘以-1,即取相反数。比如:一个决策树的目标变量有两个分类A和B,一个子节点,A的记录占比是80%,B的记录占比是20%,那么,本节点的熵=-1*(0.8*log20.8+0.2*log20.2)。

(5)如何计算划分出的所有子节点的熵

1)计算每个子节点的熵;

2)计算每个子节点的熵加权平均值;

一个子节点的熵加权平均值=节点熵*节点记录数占所有子节点总记录数的比例。

比如:一个子节点的熵是0.32,本节点有3000个记录,另外还有两个子节点,记录数分别为5000和2000,那么,本节点的熵加权平均值是:

0.32 *3000/(3000+5000+2000)=0.32*0.3= 0.096

3)计算所有子节点的熵加权平均值的和。

 

基于卡方检验的划分算法

(1)什么是卡方检验

卡方检验室统计学里的一种检验统计显著性的检验方法。其目标是检验某个划分不可能是由偶然因素和随机产生的可能性。

(2)目标:划分出的所有子节点的卡方值最大。

(3)过程:

1)计算划分出的每个子节点的卡方值;

2)计算划分出的所有子节点的卡方值的和;

3)比较各种划分方式所得到的所有子节点的卡方值的和,卡方值的和最大的划分方式作为最终的划分方式。

(4)如何计算划分出的某一个子节点的卡方值

(5)划分出的所有子节点的卡方就是每个子节点卡方的和。

(6)使用卡方检验的决策树算法:CHAID。

 

基于方差的划分算法

(1)基于方差的划分算法主要应用于决策树应用于预测数值型变量的情况下。

(2)目标是子节点的方差减少。

 

基于F检验的划分算法

简单介绍一下,基于F检验的方法,目标是使划分的F检验值变大,越大,说明划分效果越好。

 

 

 

 

 

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
决策树是一种常用的机器学习算法,用于解决分类和回归问题。在构建决策树模型时,需要选择合适的特征划分数据集,以便更好地进行预测。 在Python中,可以使用sklearn库中的DecisionTreeClassifier和DecisionTreeRegressor来构建决策树模型。特征选择决策树构建过程中的一个重要步骤,常用的特征选择算法包括信息增益、信息增益比、基尼指数等。 在sklearn库中,可以使用feature_importances_属性来获取特征的重要性度量。该属性返回一个数组,数组的每个元素对应于每个特征的重要性得分。得分越高,表示该特征在构建决策树模型时的重要性越高。 以下是使用决策树模型进行特征选择的示例代码: from sklearn.tree import DecisionTreeClassifier # 定义特征矩阵X和目标向量y # 创建决策树分类器 clf = DecisionTreeClassifier() # 训练模型 clf.fit(X, y) # 获取特征重要性得分 importances = clf.feature_importances_ # 输出特征重要性得分 for i, importance in enumerate(importances): print("Feature %d: %f" % (i, importance)) 通过以上代码,我们可以得到每个特征的重要性得分,并根据得分进行特征选择。相对于重要性得分较低的特征,我们可以考虑将其从特征集中删除,以简化模型并提高预测性能。 需要注意的是,特征选择是一个比较主观的过程,具体的选择方法和指标可能因数据集和问题而异。因此,我们可以根据实际情况,灵活选择特征选择算法和指标,以获得更好的模型效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值