1 导入模块与数据
2 信息熵
(1)公式
(2)编写函数
def entrop(x):
'''
计算信息熵,x 是一个Series对象
'''
# 计算各个类别所占的比例
prob = pd.value_counts(x)/len(x)
# 计算并返回熵
return sum(np.log2(prob)*prob*(-1))
pd.value_counts()的用法
(3)验证函数
可以看到,两次计算的结果完全一致
3 条件信息熵
(1)编写函数
def entrop_columns(x):
'''
计算表格x每个字段(除最后一个字段)的条件信息熵
'''
# 将 x 中除了最后一个字段外的其他字段提取出来
cols = x.columns[:-1]
target = x.columns[-1]
# 定义一个空列表
entropy = []
# 逐个字段计算条件信息熵
for feature in cols:
# 按照当前字段对表格进行分组
gb = x.groupby(feature)
# 定义 s 用来收集当前字段各个类别的信息熵
s = 0
for f, f_data in gb:
# f 为类别,f_data 为表格
# 计算当前类别条件下,不同目标值的概率
prob = pd.value_counts(f_data[target]) / len(f_data[target])
# 计算当前类别的概率
f_p = x[x[feature]==f].shape[0]/x.shape[0]
# sum(np.log2(prob)*prob*(-1)) 就是当前类别的信息熵
# 将当前类别的信息熵乘以类别概率
s += sum(np.log2(prob)*prob*(-1)) * f_p
# 收集当前字段的条件熵
entropy.append(s)
return np.array(entropy)
(2)验证函数
制作数据
查看分组情况
验证
可以看到,两次计算的结果一致。
有了信息熵和条件信息熵,就能计算信息增益,即 信息增益 = 信息熵 - 条件信息熵
4 基尼系数
(1)公式
样本分布越集中,则基尼系数越小,当所有样本都是一个类别是,基尼系数为0;样本分布越均匀,则基尼系数越大。
(2)编写函数
def gini(x):
'''
计算基尼系数,x 是一个Series对象
'''
# 计算各个类别所占的比例
prob = pd.value_counts(x)/len(x)
# 计算并返回熵
return sum(prob*(1-prob))
(3)验证函数
可以看到,两次的计算结果完全一致