Python代码实现信息熵、信息增益、信息增益率的计算

今天在课堂上给大家讲到信息熵、信息增益(在特征项较多的数据集中,对某些特征有明显的偏好,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

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

​​

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值