精华内容
下载资源
问答
  • python计算信息熵、信息增益和信息增益率

    千次阅读 多人点赞 2020-04-04 22:13:36
    在这里,我将用python代码计算信息熵、信息增益和信息增益率。 以下代码基于python、numpy和pandas。 实现上述计算的代码一共11行。

    在这里,我将用python代码计算信息熵信息增益信息增益率

    以下代码基于python、numpy和pandas。

    没时间看的同学,可以直接跳到总结。

    往期博客:

    线性方程组的迭代法 python代码实现

    函数插值法之牛顿插值法 python代码实现

    数值积分 python代码实现

    数值微分 python代码实现

    信息熵

    什么是信息熵,怎么计算,一图盖之。

    信息熵

    首先

    import pandas as pd
    import numpy as np
    

    然后我们在此设置一个演示用的大学生贷款数据集。

    data = pd.DataFrame({'学历':['专科','专科','专科','专科','专科','本科','本科','本科','本科','本科','研究生','研究生','研究生','研究生','研究生'],
                         '婚否':['否','否','是','是','否','否','否','是','否','否','否','否','是','是','否'],
                         '是否有车':['否','否','否','是','否','否','否','是','是','是','是','是','否','否','否'],
                         '收入水平':['中','高','高','中','中','中','高','高','很高','很高','很高','高','高','很高','中'],
                         '类别':['否','否','是','是','否','否','否','是','是','是','是','是','是','是','否']})
    data[['学历','婚否','是否有车','收入水平','类别']]
    

    数据集如下图所示:

    贷款数据集

    定义函数

    定义函数这步我大多是参考和借鉴了下面这篇文章,所以我这篇文章也就不挂原创了。
    python详细步骤计算信息增益

    #定义计算信息熵的函数:计算Infor(D)
    def infor(data):
        a = pd.value_counts(data) / len(data)
        return sum(np.log2(a) * a * (-1))
    

    参数说明

    “data”就是我们要输入的数据集。

    实例运行

    计算信息熵主要是为了后两步做准备,所以这一步就不实例操作了。

    信息增益

    什么是信息增益,怎么计算,一图盖之。

    信息增益

    定义函数

    #定义计算信息增益的函数:计算g(D|A)
    def g(data,str1,str2):
        e1 = data.groupby(str1).apply(lambda x:infor(x[str2]))
        p1 = pd.value_counts(data[str1]) / len(data[str1])
        #计算Infor(D|A)
        e2 = sum(e1 * p1)
        return infor(data[str2]) - e2
    

    参数说明

    “str1”就是代表图中的“A”。

    “str2”就是代表图中的“D”。

    实例运行

    拿给出的实例试验一下:

    g(data,'学历','类别')
    

    得出如下结果:

    0.08300749985576883

    信息增益率

    什么是信息增益率,怎么计算,一图盖之。

    信息增益率

    定义函数

    #定义计算信息增益率的函数:计算gr(D,A)
    def gr(data,str1,str2):
        return g(data,str1,str2)/infor(data[str1])
    

    实例运行

    拿给出的实例试验一下:

    gr(data,'学历','类别')
    

    得出如下结果:

    0.05237190142858302

    总结

    三者的函数总结如下:

    #定义计算信息熵的函数:计算Infor(D)
    def infor(data):
        a = pd.value_counts(data) / len(data)
        return sum(np.log2(a) * a * (-1))
    
    #定义计算信息增益的函数:计算g(D|A)
    def g(data,str1,str2):
        e1 = data.groupby(str1).apply(lambda x:infor(x[str2]))
        p1 = pd.value_counts(data[str1]) / len(data[str1])
        #计算Infor(D|A)
        e2 = sum(e1 * p1)
        return infor(data[str2]) - e2
    
    #定义计算信息增益率的函数:计算gr(D,A)
    def gr(data,str1,str2):
        return g(data,str1,str2)/infor(data[str1])
    

    “data”就是我们要输入的数据集。

    “str1”就是代表图中的“A”。

    “str2”就是代表图中的“D”。

    其实信息增益率比信息增益更准确。

    展开全文
  • 信息熵、信息增益与信息增益率

    千次阅读 多人点赞 2019-05-10 11:16:41
    信息熵、信息增益与信息增益率信息熵、信息增益与信息增益率信息熵(Information Entropy)信息增益(Information Gain)信息增益率(Information Gain Ratio) 信息熵、信息增益与信息增益率 信息熵(Information Entropy)...

    信息熵、信息增益与信息增益率

    信息熵(Information Entropy)

    信息熵是用来评估样本集合的纯度的一个参数,就是说,给出一个样本集合,这个样本集合中的样本可能属于好多不同的类别,也可能只属于一个类别,那么如果属于好多不同的类别的话,我们就说这个样本是不纯的,如果只属于一个类别,那么,我们就说这个样本是纯洁的。
      而信息熵这个东西就是来计算一个样本集合中的数据是纯洁的还是不纯洁的。下面上公式:
       Ent(D)=k=1ypklog2pkEnt(D)=-\sum_{k=1}^{\left|y\right|}p_{k}log_{2}p_{k}
      下面解释一下公式的意思,其实很好理解,计算一个集合的纯度,就是把集合中每一个类别所占的比例pkp_k(k从1到 y\left | y \right |,其中 y\left | y \right | 表示类别的个数)乘上它的对数,然后加到一起,然后经过计算之后,可以得到一个数据集的信息熵,然后根据信息熵,可以判断这个数据集是否纯粹。信息熵越小的话,表明这个数据集越纯粹。信息熵的最小值为0,此时数据集D中只含有一个类别。

    信息增益(Information Gain)

    下面来介绍信息增益,所谓的信息增益,是要针对于具体的属性来讲的,比如说,数据集D中含有两个类别,分别是好人和坏人,那么,随便选择一个属性吧,比如说性别,性别这个属性中包含两个值,男人和女人,如果用男人和女人来划分数据集D的话,会得到两个集合,分别是DmanD_{man}DwomanD_{woman}。划分后的两个集合中各自有 好人和坏人,所以可以分别计算划分后两个集合的纯度,计算之后,把这两个集合的信息熵求加权平均DmanDEnt(Dman)+DwomanDEnt(Dwoman)\frac{D_{man}}{D} Ent(D_{man})+\frac{D_{woman}}{D} Ent(D_{woman}),跟之前没有划分的时候的信息熵Ent(D)Ent(D)相比较,用后者减去前者,得到的就是属性-性别对样本集D划分所得到的信息增益。可以通俗理解为,信息增益就是纯度提升值,用属性对原数据集进行划分后,得到的信息熵的差就是纯度的提升值。信息增益的公式如下:

    Gain(D,a)=Ent(D)v=1VDvDEnt(Dv)Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{\left | D^{v} \right |}{\left | D \right |}Ent(D^{v})  
      先解释一下上式中的参数,D是数据集,a是选择的属性,a中一共有V个取值,用这个V取值去划分数据集D,分别得到数据集D1D_1DVD_V,分别求这V个数据集的信息熵,并将其求加权平均。两者的差得到的就是信息增益。
      那么这个信息增益有什么用呢?有用,可以根据信息增益值的大小来判断是否要用这个属性a去划分数据集D,如果得到的信息增益比较大,那么就说明这个属性是用来划分数据集D比较好的属性,否则则认为该属性不适合用来划分数据集D。这样有助于去构建决策树。
      著名的算法ID3就是采用信息增益来作为判断是否用该属性划分数据集的标准。

    信息增益率(Information Gain Ratio)

    为什么要提出信息增益率这种评判划分属性的方法?信息增益不是就很好吗?其实不然,用信息增益作为评判划分属性的方法其实是有一定的缺陷的,书上说,信息增益准则对那些属性的取值比较多的属性有所偏好,也就是说,采用信息增益作为判定方法,会倾向于去选择属性取值比较多的属性。那么,选择取值多的属性为什么就不好了呢?举个比较极端的例子,如果将身份证号作为一个属性,那么,其实每个人的身份证号都是不相同的,也就是说,有多少个人,就有多少种取值,它的取值很多吧,让我们继续看,如果用身份证号这个属性去划分原数据集D,那么,原数据集D中有多少个样本,就会被划分为多少个子集,每个子集只有一个人,这种极端情况下,因为一个人只可能属于一种类别,好人,或者坏人,那么此时每个子集的信息熵就是0了,就是说此时每个子集都特别纯。这样的话,会导致信息增益公式的第二项v=1VDvDEnt(Dv)\sum_{v=1}^{V}\frac{\left | D^{v} \right |}{\left | D \right |}Ent(D^{v})整体为0,这样导致的结果是,信息增益计算出来的特别大,然后决策树会用身份证号这个属性来划分原数据集D,其实这种划分毫无意义。因此,为了改变这种不良偏好带来的不利影响,提出了采用信息增益率作为评判划分属性的方法。
      公式如下:
       Gain_ratio(D,a)=Gain(D,a)IV(a)Gain\_ratio(D,a)=\frac{Gain(D,a)}{IV(a)}
      其中IV(a)IV(a)的计算方式如下:
       IV(a)=v=1VDvDlog2DvDIV(a)=-\sum_{v=1}^{V}\frac{\left | D^v \right |}{\left | D \right |}log_2\frac{\left | D^v \right |}{\left | D \right |}
      IV(a)IV(a)被称为是的“固有值”,这个IV(a)IV(a)的公式是不是很熟悉啊,简直和信息熵的计算公式一毛一样,就是看属性a的纯度,如果a只含有少量的取值的话,那么a的纯度就比较高,否则的话,a的取值越多,a的纯度越低,IV(a)IV(a)的值也就越大,因此,最后得到的信息增益率就越低。
      采用信息增益率可以解决ID3算法中存在的问题(ID3会对那些属性的取值比较多的属性有所偏好,如西瓜的颜色有10种),因此将采用信息增益率作为判定划分属性好坏的方法称为C4.5。
      需要注意的是,增益率准则对属性取值较少的时候会有偏好,为了解决这个问题,C4.5并不是直接选择增益率最大的属性作为划分属性,而是之前先通过一遍筛选,先把信息增益低于平均水平的属性剔除掉,之后从剩下的属性中选择信息增益率最高的,这样的话,相当于两方面都得到了兼顾。 (结合信息增益与信息增益率使用)

    作者:DawnChau
    来源:CSDN
    原文:https://blog.csdn.net/u012351768/article/details/73469813
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • C4.5——信息增益率

    千次阅读 2013-12-30 11:16:14
    说明一下如何计算信息增益率。 熟悉了ID3算法后,已经知道如何计算信息增益,计算公式如下所示(来自Wikipedia): 或者,用另一个更加直观容易理解的公式计算: 按照类标签对训练数据集D的属性集A进行划分...

    说明一下如何计算信息增益率。
    熟悉了ID3算法后,已经知道如何计算信息增益,计算公式如下所示(来自Wikipedia):
    info-gain
    或者,用另一个更加直观容易理解的公式计算:

    • 按照类标签对训练数据集D的属性集A进行划分,得到信息熵:

    info

    • 按照属性集A中每个属性进行划分,得到一组信息熵:

    infoA

    • 计算信息增益

    然后计算信息增益,即前者对后者做差,得到属性集合A一组信息增益:
    gain
    这样,信息增益就计算出来了。

    • 计算信息增益率

    下面看,计算信息增益率的公式,如下所示(来自Wikipedia):
    IGR
    其中,IG表示信息增益,按照前面我们描述的过程来计算。而IV是我们现在需要计算的,它是一个用来考虑分裂信息的度量,分裂信息用来衡量属性分 裂数据的广度和均匀程序,计算公式如下所示(来自Wikipedia):
    IV
    简化一下,看下面这个公式更加直观:
    H(V)
    其中,V表示属性集合A中的一个属性的全部取值。

    我们以一个很典型被引用过多次的训练数据集D为例,来说明C4.5算法如何计算信息增益并选择决策结点。

    上面的训练集有4个属性,即属性集合A={OUTLOOK, TEMPERATURE, HUMIDITY, WINDY};而类标签有2个,即类标签集合C={Yes, No},分别表示适合户外运动和不适合户外运动,其实是一个二分类问题。
    我们已经计算过信息增益,这里直接列出来,如下所示:
    数据集D包含14个训练样本,其中属于类别“Yes”的有9个,属于类别“No”的有5个,则计算其信息熵:

    1 Info(D) = -9/14 * log2(9/14) - 5/14 * log2(5/14) = 0.940

    下面对属性集中每个属性分别计算信息熵,如下所示:

    1 Info(OUTLOOK) = 5/14 * [- 2/5 * log2(2/5) – 3/5 * log2(3/5)] + 4/14 * [ - 4/4 * log2(4/4) - 0/4 * log2(0/4)] + 5/14 * [ - 3/5 * log2(3/5) – 2/5 * log2(2/5)] = 0.694
    2 Info(TEMPERATURE) = 4/14 * [- 2/4 * log2(2/4) – 2/4 * log2(2/4)] + 6/14 * [ - 4/6 * log2(4/6) - 2/6 * log2(2/6)] + 4/14 * [ - 3/4 * log2(3/4) – 1/4 * log2(1/4)] = 0.911
    3 Info(HUMIDITY) = 7/14 * [- 3/7 * log2(3/7) – 4/7 * log2(4/7)] + 7/14 * [ - 6/7 * log2(6/7) - 1/7 * log2(1/7)] = 0.789
    4 Info(WINDY) = 6/14 * [- 3/6 * log2(3/6) – 3/6 * log2(3/6)] + 8/14 * [ - 6/8 * log2(6/8) - 2/8 * log2(2/8)] = 0.892

    根据上面的数据,我们可以计算选择第一个根结点所依赖的信息增益值,计算如下所示:

    1 Gain(OUTLOOK) = Info(D) - Info(OUTLOOK) = 0.940 - 0.694 = 0.246
    2 Gain(TEMPERATURE) = Info(D) - Info(TEMPERATURE) = 0.940 - 0.911 = 0.029
    3 Gain(HUMIDITY) = Info(D) - Info(HUMIDITY) = 0.940 - 0.789 = 0.151
    4 Gain(WINDY) = Info(D) - Info(WINDY) = 0.940 - 0.892 = 0.048

    接下来,我们计算分裂信息度量H(V):

    • OUTLOOK属性

    属性OUTLOOK有3个取值,其中Sunny有5个样本、Rainy有5个样本、Overcast有4个样本,则

    1 H(OUTLOOK) = - 5/14 * log2(5/14) - 5/14 * log2(5/14) - 4/14 * log2(4/14) = 1.577406282852345
    • TEMPERATURE属性

    属性TEMPERATURE有3个取值,其中Hot有4个样本、Mild有6个样本、Cool有4个样本,则

    1 H(TEMPERATURE) = - 4/14 * log2(4/14) - 6/14 * log2(6/14) - 4/14 * log2(4/14) = 1.5566567074628228
    • HUMIDITY属性

    属性HUMIDITY有2个取值,其中Normal有7个样本、High有7个样本,则

    1 H(HUMIDITY) = - 7/14 * log2(7/14) - 7/14 * log2(7/14) = 1.0
    • WINDY属性

    属性WINDY有2个取值,其中True有6个样本、False有8个样本,则

    1 H(WINDY) = - 6/14 * log2(6/14) - 8/14 * log2(8/14) = 0.9852281360342516

    根据上面计算结果,我们可以计算信息增益率,如下所示:

    1 IGR(OUTLOOK) = Info(OUTLOOK) / H(OUTLOOK) = 0.246/1.577406282852345 = 0.15595221261270145
    2 IGR(TEMPERATURE) = Info(TEMPERATURE) / H(TEMPERATURE) = 0.029 / 1.5566567074628228 = 0.018629669509642094
    3 IGR(HUMIDITY) = Info(HUMIDITY) / H(HUMIDITY) = 0.151/1.0 = 0.151
    4 IGR(WINDY) = Info(WINDY) / H(WINDY) = 0.048/0.9852281360342516 = 0.048719680492692784

    根据计算得到的信息增益率进行选择属性集中的属性作为决策树结点,对该结点进行分裂。

    C4.5算法的优点是:产生的分类规则易于理解,准确率较高。
    C4.5算法的缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。

    参考链接

    展开全文
  • 今天在课堂上给大家讲到信息熵、信息增益和信息增益率的时候,很多同学都不理解,对数学公式很敬畏,其实不然,接下来我就使用Python原生代码实现信息熵、信息增益、信息增益率计算!!! 1.信息熵: 1.1 信息熵...

    今天在课堂上给大家讲到信息熵、信息增益(在特征项较多的数据集中,对某些特征有明显的偏好,ID3 决策树学习算法 就是以信息增益为准则来选择划分属性。)和信息增益率(标识某个特征的重要程度,依据C4.5决策树算法)的时候,很多同学都不理解,对数学公式很敬畏,其实不然,接下来我就使用Python原生代码实现信息熵、信息增益、信息增益率的计算!!!

    1.信息熵:

    1.1 信息熵简介及公式:

    1948年香农提出了信息熵(Entropy)的概念。
    信息理论:
    1、从信息的完整性上进行的描述:
    当系统的有序状态一致时,数据越集中的地方熵值越小,数据越分散的地方熵值越大。
    2、从信息的有序性上进行的描述:
    当数据量一致时,系统越有序,熵值越低;系统越混乱或者分散,熵值越高。
    “信息熵” (information entropy)是度量样本集合纯度最常用的一种指标。

    信息熵的公式为:
    在这里插入图片描述

    说明:log不是自然对数,而是以2为底的对数

    • 代码实现信息熵的计算:
    import numpy as np
    import pandas as pd
    
    # 1. 准备数据
    data = pd.DataFrame(
        {'学历': ['专科', '专科', '专科', '专科', '专科', '本科', '本科', '本科', '本科', '本科', '研究生', '研究生', '研究生', '研究生', '研究生'],
         '婚否': ['否', '否', '是', '是', '否', '否', '否', '是', '否', '否', '否', '否', '是', '是', '否'],
         '是否有车': ['否', '否', '否', '是', '否', '否', '否', '是', '是', '是', '是', '是', '否', '否', '否'],
         '收入水平': ['中', '高', '高', '中', '中', '中', '高', '高', '很高', '很高', '很高', '高', '高', '很高', '中'],
         '类别': ['否', '否', '是', '是', '否', '否', '否', '是', '是', '是', '是', '是', '是', '是', '否']})
    
    # 2. 定义信息熵函数
    # 定义计算信息熵的函数:计算Infor(D)
    def infor(data):
        a = pd.value_counts(data) / len(data)
        return sum(np.log2(a) * a * (-1))
    
    # 数据测试
    # print(infor(data["学历"]))   #测试结果为: 1.584962500721156
    

    2. 信息增益

    2.1 信息增益简介

    信息增益:以某特征划分数据集前后的熵的差值。熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏。
    信息增益 = entroy(前) - entroy(后)
    注:信息增益表示得知特征X的信息而使得类Y的信息熵减少的程度

    2.2 信息增益公式
    在这里插入图片描述

    2.3 Python代码实现信息增益的计算

    	# 3. 定义信息增益函数
    	# 定义计算信息增益的函数:计算g(D|A)
    	def g(data, str1, str2):
    	    e1 = data.groupby(str1).apply(lambda x: infor(x[str2]))
    	    p1 = pd.value_counts(data[str1]) / len(data[str1])
    	    # 计算Infor(D|A)
    	    e2 = sum(e1 * p1)
        return infor(data[str2]) - e2
    	print("学历信息增益:{}".format(g(data, "学历", "类别")))
    	# 输出结果为:学历信息增益:0.08300749985576883
    

    3. 信息增益率

    3.1 信息增益率简介
    增益率:增益率是用前面的信息增益Gain(D, a)和属性a对应的"固有值"(intrinsic value) [Quinlan , 1993J的比值来共同定义的。
    3.2 信息增益率公式
    在这里插入图片描述
    属性 a 的可能取值数目越多(即 V 越大),则 IV(a) 的值通常会越大.

    3.3 Python代码实现信息增益率计算

    	# 4. 定义信息增益率函数
    	# 定义计算信息增益率的函数:计算gr(D,A)
    	def gr(data, str1, str2):
    	    return g(data, str1, str2) / infor(data[str1])
    
    
    	print("学历信息增益率:", gr(data, "学历", "类别"))
    	# 输出结果为:学历信息增益率: 0.05237190142858302
    

    说明:以上代码实现思路仅供提升班级教学效果使用,如果您有幸刷到我的博客,万分荣幸,本人通过梳理本篇博客方便本籍学生理解的同时,自己也有所提升,这种感觉非常棒。当然以上思路仅为一家之言,如有不同见解欢迎各路大神评论区交流指正。

    ​​

    展开全文
  • 信息增益与信息增益率详解

    万次阅读 2015-03-17 23:45:17
    熟悉决策树算法的人都知道ID3以及C4.5两种算法,当然也非常清楚信息增益以及信息增益率两个概念。 信息增益:节点M的信息熵E1与其全部子节点信息熵之和E2的差。 信息增益率:节点信息增益与节点分裂信息度量的比值。...
  • 信息增益、Gini、信息增益率
  • 信息增益和信息增益率

    千次阅读 2018-09-12 14:11:00
    信息增益偏向取值较多的特征。(极端情况,把序号当做特征) 信息增益率偏向取值较少的特征。   C4.5 找出信息增益高于平均水平的特征,然在在这些特征中再选择信息增益率最高的特征。...
  • 信息增益、信息增益率、Gini

    千次阅读 2015-12-08 15:42:10
    1、 C4.5继承了ID3的优点,并改进了:(1)使用信息增益率来选择属性,克服了用信息增益选择属性时偏向值多的不足;(2)在构树过程中进行剪枝;(3)能够完成对连续属性的离散化处理;(4)能够对不完整数据进行...
  • 在使用决策树的时候,我们通常通过信息增益,信息增益率,Gini三个指标来选择特征,下面详细介绍这三个指标。http://blog.csdn.net/xuxurui007/article/details/21788551
  • 找了下,没找到现成的代码,自己写了个,速度还能接受,可以用来做简单的特征选择 ... //信息熵 def entropyRDD(data:RDD[String])={ val size=data.count() val p=data.map(x=>(x,1)).r...
  • 决策树算法中:信息熵、信息增益、信息增益率和基尼指数的计算 节选自周志华《机器学习》P75-P79页 文末附上本人手工计算过程,方便理解 ...
  • 信息增益率

    千次阅读 2019-07-05 17:41:13
    信息熵,条件熵,信息增益参考博文:https://blog.csdn.net/u010916338/article/details/91432832 如下表所示:满足什么情况才去玩高尔夫 ? Day Temperatrue Outlook Humidity Windy PlayGolf? ...
  • 信息增益率:信息增益/属性的熵(偏向类别数目少的属性)4.基尼值:1-集和各类别值的概率平方和(随机抽取两个样本其类别不一致的概率) 1 - sum(pi**2)5.基尼系数:按照属性a划分后各子集的加权基尼和ID3:判别式...
  • 信息增益 1.问题引入 首先,我们引入需进行学习的数据集,如下, 接着摆在我们面前的是首先选择哪个特征,其次选择哪个特征,…,最后选择哪个特征。(就是先选择好的特征,再选择坏的特征) 问题引入: 怎么知道...
  • 2.2决策树之信息增益率

    千次阅读 2016-02-08 11:07:05
    信息增益率计算公式:Gain-ratio=Gain(A)/I G(A)即Gain(S, A)=E(S)–E(S, A)   如下图所示:属性A有五个取值,每个取值对应一个实例,则I(1,1,1,1,1)=-1/5*log(1,5)*5 即:信息增益率计算在掌握了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,353
精华内容 7,741
关键字:

如何计算信息增益率