ID3决策树的Python代码实现
计算数据集的熵
- 输入数据集
- 遍历feature中的每一个值,并计数
- 根据计数计算概率和熵
def cal_entropy(data,feature):
"""
计算熵的函数
输入:数据集的某一个feature
输出:数据集这个feature的熵
"""
data_size = len(data)
# 创建一个用来储存计数的字典
count = {}
# 找出这个特征的所有取值的列表
feature_value = set(data[feature])
# 下面开始遍历,并且记录每个类别出现的次数
for f in feature_value:
# 如果某个feature中的类别重复出现,则计数值+1
# 如果某个feature中的类别第一次出现,则设置初始值为0
count[f] += 1 if f in count.keys() else count[f] = 0
# 计数完成之后,开始计算概率和熵
ent_sum = 0
for key in count:
# 某个类别出现的概率
prob = count[key]/data_size
# 计算这个类别的熵
ent = -prob*np.log(prob,2)
ent_sum += ent
return ent
对数据集进行划分
- 输入数据集和feature
- 对每一个feature计算熵
- 比较熵值,并找出熵最大的那个特征作为最佳的特征值
def feature_selction(data):
"""
特征选择函数
输入:数据集
输出:最佳特征
"""
# 计算原始数据集的熵
init_ent = cal_entropy(data)
# 准备收集每个feature的熵
feature_ent = {}
# 假设有一个列表里面是每一个特征名字
feature_list = ['feature1','feature2']
# 开始遍历每一个特征
for f in feature_list:
# 计算每一个feature的熵
ent = cal_entropy(data,f)
feature_ent[f] = ent
# 从中找出最佳特征来
best_feature = sorted(dict,key=lambda x:dict[x])[-1]
return best_feature
## 创建决策树
def create_tree(data,classes):
“””
创建决策树
输入:数据集,分类
输出:决策树
“””
# 首先将y的分类提取出来
label = set(data[label])
# 计算y每个分类的个数
from collections import Counter
label_count = Counter(label)
# 选择最好的特征,构建根结点
best_feature = feature_selction(data)
# 得到最好特征的值的列表
feature_value = set(data[best_feature])
#
node = classes[best_feature]
# 创建决策树字典用来储存
DT = {best_feature:{}}
# 迭代每个特征值进行分类储存
for value in feature_value:
DT[best_feature][value][feature] = feature
DT[best_feature][value][label] = label
“`