在这里,我将用python代码计算信息熵、信息增益和信息增益率。
以下代码基于python、numpy和pandas。
没时间看的同学,可以直接跳到总结。
往期博客:
信息熵
什么是信息熵,怎么计算,一图盖之。
首先
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”。
其实信息增益率比信息增益更准确。