优点
- 可以处理缺失值。
- 特征只能使用一次。
- 可以剪枝,可以避免过拟合问题。
缺点
- 不适合大数据集的训练,因为受内存大小影响。
计算流程
对于单个特征 A, 我们做如下假设:
- 有两个判断值
yes
和no
, 概率分别为 p y p_y py和 p n p_n pn。 - 有三组值
a
,b
,c
, 各组的比例分别为 r a r_a ra、 r b r_b rb、 r c r_c rc,各个组内yes
和no
的比例分别为 r a y r_{ay} ray、 r a n r_ {an} ran、 r b y r_{by} rby、 r b n r_{bn} rbn、 r c y r_{cy} rcy、 r c n r_{cn} rcn。
那么该特征的熵增比的计算流程如下:
- 计算初始熵: h ( i n i t ) = − ( p y ∗ log 2 p y + p n ∗ log 2 p n ) h(init)=-(p_y*\log_2{p_y}+p_n*\log_2{p_n}) h(init)=−(py∗log2py+pn∗log2pn)。
- 计算分组的条件熵: h ( D ∣ A ) = r a ( − ( r a y ∗ log 2 r a y + r a n ∗ log 2 r a n ) ) + r b ( − ( r b y ∗ log 2 r b y + r b n ∗ log 2 r b n ) ) + r c ( − ( r c y ∗ log 2 r c y + r c n ∗ log 2 r c n ) ) h(D|A)=r_a(-(r_{ay}*\log_2{r_{ay}}+r_{an}*\log_2{r_{an}})) + r_b(-(r_{by}*\log_2{r_{by}}+r_{bn}*\log_2{r_{bn}})) + r_c(-(r_{cy}*\log_2{r_{cy}}+r_{cn}*\log_2{r_{cn}})) h(D∣A)=ra(−(ray∗log2ray+ran∗log2ran))+rb(−(rby∗log2rby+rbn∗log2rbn))+rc(−(rcy∗log2rcy+rcn∗log2rcn))。
- 计算熵增: g ( A ) = h ( i n i t ) − h ( D ∣ A ) g(A)=h(init)-h(D|A) g(A)=h(init)−h(D∣A)。
- 计算熵增比: g a i n _ r a t i o = g ( A ) / ( − r a log 2 r a − r b log 2 r b − r c log 2 r c ) gain\_ratio=g(A)/(-r_a\log_2{r_a}-r_b\log_2{r_b}-r_c\log_2{r_c}) gain_ratio=g(A)/(−ralog2ra−rblog2rb−rclog2rc)。
一下是一个简单代码示例:
import numpy as np
import pandas as pddf = pd.DataFrame({"wage": [1, 0, 1, 0, 0, 1, 0, 0],"press": [1, 1, 0, 1, 1, 1, 0, 0],"platform": [2, 0, 0, 0, 1, 1, 2, 1],"work": ["好", "好", "好", "好", "不好", "好", "不好","不好"]})# 计算信息熵
def cal_entropy(p_arr):return sum(-p * np.log2(p) for p in p_arr)# 计算工资特征的初始熵
init_entropy_wage = cal_entropy([5 / 8, 3 / 8])
# 计算工资列特征的信息熵
entropy_wage = (3 / 8 * cal_entropy([3 / 3]) +5 / 8 * cal_entropy([2 / 5, 3 / 5]))
# 计算工资的熵增
gain_entropy_wage = init_entropy_wage - entropy_wage
print(gain_entropy_wage)
# 计算工资的熵增比,利用熵增除以特征分组比例的信息熵,这里的分组熵和初始熵计算值是一样的
gain_ratio_wage = gain_entropy_wage / cal_entropy([5 / 8, 3 / 8])
print(gain_ratio_wage)