文章目录
1.熵、条件熵
2.信息增益、ID3算法
1)信息增益
2)ID3算法构建决策树
3.ID3决策树的代码实现
import operator
import numpy as np
# 定义加载数据的函数
def loaddata():
dataSet = [[0, 0, 0, 0, 'no'],
[0, 0, 0, 1, 'no'],
[0, 1, 0, 1, 'yes'],
[0, 1, 1, 0, 'yes'],
[0, 0, 0, 0, 'no'],
[1, 0, 0, 0, 'no'],
[1, 0, 0, 1, 'no'],
[1, 1, 1, 1, 'yes'],
[1, 0, 1, 2, 'yes'],
[1, 0, 1, 2, 'yes'],
[2, 0, 1, 2, 'yes'],
[2, 0, 1, 1, 'yes'],
[2, 1, 0, 1, 'yes'],
[2, 1, 0, 2, 'yes'],
[2, 0, 0, 0, 'no']]
feature_name = ['age', 'job', 'house', 'credit']
return dataSet, feature_name
# 定义计算数据集的熵的函数
def entropy(dataSet):
# 数据量
m = len(dataSet)
# 标签不同类别的计数字典
labelCounts = {
}
# 循环数据集
for featVec in dataSet:
currentLabel = featVec[-1]
# 标签类别计数-如果字典中不存在则值为0,否则值加1
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
# 定义一个自变量来保存熵
e = 0.0
# 根据公式计算熵
for key in labelCounts:
prob = float(labelCounts[key]) / m
e -= prob * np.log2(prob)
return e
# 定义划分数据集的函数-得到对应于axis与values的数据集
def splitDataSet(dataSet, axis, value):
# 按轴与值划分好的数据集
retDataSet = []
# 循环数据集
for featVec in dataSet:
# 当前数据按轴取出的数据符合传入的value值
if featVec[axis] == value:
temDataSet = featVec[:axis]
temDataSet.extend(featVec[axis + 1:])
retDataSet.append(temDataSet)
return retDataSet
#