信息增益以及增益率划分属性

信息增益以及增益率划分属性信息增益先来定义 信息熵 informatione 它是度量样本集合纯度最常用的一种指标 假定当前样本集合 D 中的第 k 类样本所占的比例为 k 1 2 3 则 D 的信息熵为

信息熵

          信息熵 (information entropy)是度量样本集合纯度最常用的一种指标。假定当前样本集合D 中的第k 类样本所占的比例为p_{k} (k = 1,2…|\gamma |), 则 D 的信息熵为 

                                                                         Ent(D) = - \sum_{k=1}^{|\gamma |}p_{k}\log_{2}p_{k}

  Ent(D) 的值越小,则D的纯度越高 . 

  • 计算信息熵时约定 : 如果 p = 0,则 p\log_{2}p = 0
  • Ent(D)的最小值是0,最大值是\log_{2}|\gamma |
  • |X| 表示X的数量,比如|D|表示样本D的数量,下同.

假定随机变量X有两个取值0和1

X 0 1
p(x) p 1-p

则图像是,

信息增益以及增益率划分属性

import matplotlib.pyplot as plt import numpy as np import seaborn as sns x = np.arange(0,1,0.01) y = -x*np.log2(x) -(1-x)*np.log2(1-x) sns.set() plt.grid(visible=True, which='major', linestyle='-') plt.grid(visible=True, which='minor', linestyle='--', alpha=0.5) plt.minorticks_on() plt.xlabel('x') plt.ylabel('H(x)') plt.plot(x,y) # plt.show() plt.savefig('./h.png') 

条件熵

    概率定义: 随机变量X在给定条件下随机变量Y的条件熵,公式如下,

                                                       \displaystyle H(Y|X) = \sum p(x) H(Y|X=x)

或者换一种符号表示,

                                                        \displaystyle Ent(D|D^{v}) = \sum_{v=1}^{V} \frac{|D^{v}|}{|D|} Ent(D^{v})

        假定离散属性 a(西瓜的色泽)有V 个可能的取值{
a^{1},a^{2},...,a^{V}} (比如 {青绿,乌黑,浅白,墨绿 ..  })等等吧  ,如果使用a 来对样本集D(西瓜) 进行划分 ,则会产生 V 个分支节点,其中第v 个分支节点包含了D 中所有在属性a上的取值为 a^{v}的样本 ,记作D^{v} .

信息增益

         根据信息熵的计算公式, 我们可以计算出D^{v}的信息熵 ,再考虑到不同的分支节点所包含的样本数不同,给分支节点赋予权重 \frac{|D^{v}|}{|D|},也就是样本数越多的分支节点影响越大,于是可以计算出用 a 属性对样本D进行划分所获得的”信息增益”(information gain)                       

                                                       Gain(D,a) = Ent(D)-Ent(D|D^{v})

代入,

                                                       Gain(D,a) = Ent(D)-\sum_{v=1}^{V} \frac{|D^{v}|}{|D|} Ent(D^{v})

          一般来说, 信息增益越大,则意味着使用属性a进行划分所获得的”纯度提升”越大  .因此可以用信息增益来进行决策树的划分属性选择. 

           下面以西瓜数据集为例, 该数据集包含17个样本,用以学习一棵能预测没刨开的是不是好瓜的决策树. 显然 |\mathcal{Y}|=2  , 下图中可以看到,正例 占 8/17 , 反例占 9/17,

                  Ent(D) = -\sum_{k=1}^{2}p_{k}\log_{2}p_{k} =-(\frac{8}{17}\log_{2}\frac{8}{17} + \frac{9}{17}\log_{2}\frac{9}{17}) =0.998

信息增益以及增益率划分属性

                     

然后我们计算出当前属性集合{色泽,根蒂,敲声,纹理,脐部,触感} 中每个属性的信息增益. 以属性”色泽” 为例 ,它有两个可能的取值 :{青绿,乌黑,浅白} .使用该属性对D进行划分, 则可得到 3个 子集 ,分别记为 D1 (色泽=青绿) D2(色泽=乌黑) D3(色泽=浅白).

          子集D1 包含的编号{1,4,6,10,13,17} , 正例(是)占 p1 = 3/6 ,反例(否) 占 p2 = 3/6  ; 

          子集D2 包含的编号 {2,3,7,8,9,15} , 正例占 p1 = 4/6 , 反例占 p2 = 2/6 ; 

          子集D3 包含的编号 {5,11,12,14,16} ,正例占p1 =  1/5 , 反例占p2 =  4/5 ; 

可计算出”色泽”划分之后所获得的信息熵为: 

             

信息增益以及增益率划分属性

  于是 , 计算出属性 ” 色泽”的信息增益为 : 

信息增益以及增益率划分属性

     显然这里 Gain(D,纹理) = 0.381 信息增益最大, 于是他被选为划分属性. 

     

信息增益以及增益率划分属性

       然后,决策树学习算法将每一个分支节点做进一步划分. 以图中的一个分支节点(“纹理= 清晰”) 为例, 该节点包含的样例集合 D^{1} 中有编号 {1,2,3,4,5,8,10,15} 的9 个样例,可用的属性集合为 { 色泽,根蒂,敲声,脐部,触感}; 基于 D^{1}计算出各属性的信息增益:

信息增益以及增益率划分属性

     “根蒂” , “脐部” , “触感” 3 个属性均取得最大的信息增益 ,可用选择其中一个作为划分属性, 最终得到:

  

信息增益以及增益率划分属性

增益率

       事实上用信息增益准则对可取值数目较多的属性有所偏好,为了减少这种偏好可能带来的不利影响,我们会使用 “增益率” ,来选择最优划分属性  , 增益率定义为 : 

                                                         G_{ain \,ratio}(D,a) = \frac{Gain(D,a)}{IV(a)}

其中 

                                                       IV(a) = -\sum_{v=1}^{V} \frac{|D^{v}|}{|D|}\log_{2}\frac{|D^{v}|}{|D|}

称为属性 a 的”固有值” ,属性a 取值数目越多(V越大) ,则 IV(a) 的值通常越大, 需要注意的是增益率准则对可取值数目较少的属性有所偏好,信息增益对可取值数目多的属性有所偏好, 折中一下就是先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的. 

摘自 : 西瓜书

参考 : [机器学习]信息&熵&信息增益 – 风痕影默 – 博客园

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230008.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:20
下一篇 2026年3月16日 下午3:21


相关推荐

  • 多态概念总结

    多态概念总结以下全部总结讲解或代码举例在 VS2010 编译器下进行 一 基本概念多态 具有多种形式或形态的情形 最初来源于希腊语 在 C 中有广泛的含义 多态分类图 静态多态 编译器在编译期间完成的 编译器根据函数实参的类型 可能会进行隐式类型的转换 可推断出要调用哪一个函数 如果有对应的函数就调用该函数 否则出现编译错误 举例如上图函数重载实现静态多态 classA publ

    2026年3月19日
    3
  • Thread的join方法[通俗易懂]

    Thread的join方法[通俗易懂]Thread中的join方法主要的作用是让jion的线程加入当前线程,等加入的线程执行完之后才会执行当前线程。接下来看个例子:publicclassTestJoin{publicstaticvoidmain(String[]args)throwsInterruptedException{Threadt1=newThread(()->{try{Thr

    2022年6月3日
    34
  • sql常用函数大全

    sql常用函数大全转载自:https://blog.csdn.net/mrtwofly/article/details/53939400一、数学函数ABS(x)  返回x的绝对值BIN(x)  返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x)  返回大于x的最小整数值EXP(x)  返回值e(自然对数的底)的x次方FLOOR(x)  返回小于x的最大整数值GREATEST(x1,…

    2022年6月22日
    28
  • Anaconda之conda换国内源

    Anaconda之conda换国内源三种方法教你百分百成功更换 conda 源

    2026年3月17日
    2
  • 【C++ 程序】 数字推盘游戏(15-puzzle)(EasyX图形界面)

    【C++ 程序】 数字推盘游戏(15-puzzle)(EasyX图形界面)也是比较简单的程序 基于我的博客 C 程序 数字推盘游戏 15 puzzle 的逻辑 运用我的博客 C 程序 井字棋游戏 人 VSLv3 电脑 战绩统计版 EasyX 图形界面 的 EasyX 使用技巧完成此程序 程序 Thisisasimpl puzzlegame include iostream include vector include Windows h include string string Windows h vector iostream

    2026年3月18日
    3
  • linux ubuntu安装_vscode electron

    linux ubuntu安装_vscode electron环境:ubuntux86_64apache2.4mysql5.7php7.0方法一:这个方法是我安装成功的方法,所以写在第一个.步骤:1.在官网https://code.visualstudio.com/Download下载相应的deb包到自己电脑上我下载的是64bit的.2.打开相应目录的终端,执行命令sudodpkg-icode_1.2…

    2026年1月15日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号