在這裏,我將用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”。
其實信息增益率比信息增益更準確。