python计算信息熵、信息增益和信息增益率

在这里,我将用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”。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章