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”。

其實信息增益率比信息增益更準確。

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