定义
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部结点和叶节点。内部结点表示一个特征或属性,叶节点表示一个类。
算法结构
决策树在逻辑上以树的形式存在,包含根节点、内部结点和叶节点。
根节点:包含数据集中的所有数据的集合
内部节点:每个内部节点为一个判断条件,并且包含数据集中满足从根节点到该节点所有条件的数据的集合。根据内部结点的判断条件测试结果,对应的数据的集合将分到两个或多个子节点中。
叶节点:最终的类别。
一般流程
- 通过任意方法收集数据
- 数据离散化
- 检查完成后的构造树是否符合预期
- 构成树的数据结构
- 使用经验书计算错误率
- 使用算法
信息增益
在建立决策树之前,我们需要先学习一个非常重要的概念,那就是信息熵。
一条信息的信息量大小和它的不确定性有直接的关系,要搞清楚一件非常非常不确定的事情,或者是我们一无所知的事情,需要了解大量信息==>信息量的度量就等于不确定性的多少。
熵定义为信息的期望值,如果待分类的事物可能划分在多个类之中,则符号xi的信息定义为:
为选择该分类的概率
为了计算熵,需要计算所有类别的可能值包含的信息期望值,通过以下公式得到
n为分类数目,随机数目的不确定性随熵增大而增大
代码实现
from math import log
def createDataSet():
dataSet = [[1, 1, 'yes'],
[1, 1, 'yes'],
[1, 0, 'no'],
[0, 1, 'no'],
[0, 1, 'no']]
labels = ['no surfacing','flippers']
#change to discrete values
return dataSet, labels
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {}
for featVec in dataSet: #the the number of unique elements and their occurance
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0.0
for key in labelCounts:
prob = float(labelCounts[k