信息熵,信息增益,信息增益率的Python实现及其中用到的numpy,pandas函数

1. 定义数据集

import numpy as np
import pandas as pd

data = pd.DataFrame(
    {'学历': ['专科', '专科', '专科', '专科', '专科', '本科', '本科', '本科', '本科', '本科', '研究生', '研究生', '研究生', '研究生', '研究生'],
     '婚否': ['否', '否', '是', '是', '否', '否', '否', '是', '否', '否', '否', '否', '是', '是', '否'],
     '是否有车': ['否', '否', '否', '是', '否', '否', '否', '是', '是', '是', '是', '是', '否', '否', '否'],
     '收入水平': ['中', '高', '高', '中', '中', '中', '高', '高', '很高', '很高', '很高', '高', '高', '很高', '中'],
     '类别': ['否', '否', '是', '是', '否', '否', '否', '是', '是', '是', '是', '是', '是', '是', '否']})
  • pandas.DataFrame()
print(data)
     学历 婚否 是否有车 收入水平 类别
0    专科  否    否    中  否
1    专科  否    否    高  否
2    专科  是    否    高  是
3    专科  是    是    中  是
4    专科  否    否    中  否
5    本科  否    否    中  否
6    本科  否    否    高  否
7    本科  是    是    高  是
8    本科  否    是   很高  是
9    本科  否    是   很高  是
10  研究生  否    是   很高  是
11  研究生  否    是    高  是
12  研究生  是    否    高  是
13  研究生  是    否   很高  是
14  研究生  否    否    中  否

2. 定义信息熵函数

信息熵的定义为:
信息熵的定义

#信息熵函数
def infor(data):
    a = pd.value_counts(data) / len(data)
    return -sum(np.log2(a) * a)
  • pandas.value_counts()
print(pd.value_counts(data["学历"]))
专科     5
本科     5
研究生    5
Name: 学历, dtype: int64

3. 定义信息增益函数

信息增益的定义为:
在这里插入图片描述

#信息增益函数
def gain(data, str1, str2):
    Ent_Dv = data.groupby(str1).apply(lambda x: infor(x[str2]))
    p1 = pd.value_counts(data[str1]) / len(data[str1])
    Ent_D_a = sum(p1 * Ent_Dv)
    Ent_D = infor(data[str2])
    return Ent_D - Ent_D_a
  • data.groupby()
for group in data.groupby("学历"):
    print(group)
('专科',    学历 婚否 是否有车 收入水平 类别
0  专科  否    否    中  否
1  专科  否    否    高  否
2  专科  是    否    高  是
3  专科  是    是    中  是
4  专科  否    否    中  否)
('本科',    学历 婚否 是否有车 收入水平 类别
5  本科  否    否    中  否
6  本科  否    否    高  否
7  本科  是    是    高  是
8  本科  否    是   很高  是
9  本科  否    是   很高  是)
('研究生',      学历 婚否 是否有车 收入水平 类别
10  研究生  否    是   很高  是
11  研究生  否    是    高  是
12  研究生  是    否    高  是
13  研究生  是    否   很高  是
14  研究生  否    否    中  否)
  • data.groupby().apply(lamda x: infor(x[str2]) )

分别对每个组进行infor(x[str2])操作

print(Ent_Dv)
学历
专科     0.970951
本科     0.970951
研究生    0.721928
dtype: float64

4. 定义信息增益率函数

信息增益率的定义为:
在这里插入图片描述

#信息增益率函数
def gainRatio(data, str1, str2):
    return gain(data, str1, str2) / infor(data[str1])
print("学历信息增益率:", gainRatio(data, "学历", "类别"))

学历信息增益率: 0.05237190142858302
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是用Pythonpandas库编写一个计算连续值信息增益函数的示例代码: ``` import numpy as np import pandas as pd def calculate_continuous_ig(data, feature, label): # 分类数 classes = np.unique(data[label]) # 数据集的总信息熵 total_entropy = calculate_entropy(data[label]) # 按特征值排序后的数据 sorted_data = data.sort_values(by=feature) # 计算每个分割点的信息增益 split_ig = [] for i in range(1, len(sorted_data)): if sorted_data.iloc[i, :][feature] != sorted_data.iloc[i-1, :][feature]: split_value = (sorted_data.iloc[i, :][feature] + sorted_data.iloc[i-1, :][feature]) / 2 less_than_split = sorted_data[sorted_data[feature] <= split_value] greater_than_split = sorted_data[sorted_data[feature] > split_value] less_than_p = len(less_than_split) / len(data) greater_than_p = len(greater_than_split) / len(data) less_than_entropy = calculate_entropy(less_than_split[label]) greater_than_entropy = calculate_entropy(greater_than_split[label]) split_ig.append(total_entropy - (less_than_p * less_than_entropy + greater_than_p * greater_than_entropy)) # 返回最大信息增益和对应的分割值 if split_ig: max_ig = max(split_ig) split_index = split_ig.index(max_ig) split_value = (sorted_data.iloc[split_index, :][feature] + sorted_data.iloc[split_index-1, :][feature]) / 2 else: max_ig = 0 split_value = None return max_ig, split_value def calculate_entropy(label): classes = np.unique(label) entropy = 0 for c in classes: p = len(label[label==c]) / len(label) entropy -= p * np.log2(p) return entropy ``` 这段代码实现了一个名为`calculate_continuous_ig`的函数,它接收三个参数,分别是数据集`data`、要计算信息增益的连续特征名称`feature`和标签列名称`label`。函数的主要思路是对特征值排序后,计算每个分割点的信息增益,最后返回最大信息增益和对应的分割值。 由于这是一个连续值特征,我们需要找到一个合适的分割点将其离散化成多个二元特征,因为信息增益只能够用于离散值特征的计算。我们通过计算每个分割点对应的信息增益,并找到其的最大值,从而确定了最优的分割点。 在示例代码,我们使用了numpypandas两个库,并定义了另一个计算信息熵函数`calculate_entropy`,用来计算指定标签列的信息熵

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值