本文不涉及决策树算法的原理,只通过python代码实现算法,并且没有用到机器学习库,根据算法流程一步一步实现。
决策树
本文使用ID3算法实现决策树。
计算熵
首先是计算香农熵,需要了解计算公式
# 计算数据集的香农熵
def ent(data):
num = len(data) # 数据的数量
count = {
}
# 计算标签数量
for d in data:
label = d[-1] # 获得数据标签
if label not in count.keys(): count[label] = 0 # 增加数据标签
count[label] += 1
entropy = 0.0
# 计算熵
for key in count:
prob = float(count[key]) / num
entropy -= prob * math.log(prob, 2) #log base 2
return entropy
划分数据集
根据特征和值,得到数据子集
# 划分数据集
def splitData(data, axis, value):
set = []
for d in data:
# 发现符合特征的数据
if d[axis] == value:
# 删除axis以外的特征
newD = d[:axis]
newD.extend(d[axis + 1:])
# 加入数据集
set.append(newD)
return set
选择最好的划分方式
找到最好划分的特征
# 选择最好的数据集划分方式
def bestSplit(data):
num = len(data[0]) - 1 # 特征的数量
entropy = ent(data) # 现在的信息熵
bestInfoGain = 0.0 # 最佳信息增益
bestFeature = -1 # 最佳划分特征
# 遍历每个特征
for i in range(num):
list = [d[i] for d in data] # 特征列表
value = set(list) # 特征值集合,每个值只有一个
newEntropy = 0.0
# 遍历每个特征值,划分数据
for v in value: