第三章:决策树
决策树就是一个树状结构的判别模式:这棵树的每个非叶节点都包含一个判断条件,每个叶节点都是一种特定的分出来的类别。
优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据
缺点:可能产生匹配过度
关于优缺点,个人理解:对中间值的缺失不敏感就是说可以处理有缺失值的特征数据,匹配过度应该是对于分出来的类别中存在父子类这种情况来说的
一、决策树总体过程
文字描述:不断地对正在处理的数据集进行划分,找出最佳的特征及其特征的具体阈值进行划分(如何判断最佳:可以有自己的评判标准,书中给出的是用信息熵来确定是否分类最佳),直到当前处理的数据集都属于一个类别(注:数据的类别已知)
伪代码:
createTree(DataSet): if (数据集中数据为同一分类) 返回类标签 else 寻找最佳划分特征 根据最佳划分特征划分数据集 对每个划分的子集 创建节点 调用此函数并将结果添加到树中 返回当前节点
二、编程过程中的关键问题
1. 最佳特征判别标准:使用信息论度量信息
在划分数据集之前之后信息发生的变化称为信息增益,而计算信息增益需要知道集合信息的度量方式,即香农熵(简称熵):
信息的定义:
l(x) = -log(p(x))
熵的定义:所有类别所有可能值包含的信息期望值(期望:p(x)*l(x) ):
H = Sum(p(xi)*l(xi))
理解:(想看详细的:信息增益)熵,通俗点说就是“不确定性”,当你的选择很少,少到极限就是只有一个选择(没有选择),此时不确定性为0,此时熵最小亦为0;当你的各个选择的概率相同时,你最不确定,此时熵最大为1 。
因此,只需要在每次划分前后比对熵的大小,熵减少最大的那种划分方案即为当前的最佳划分方案
注意:划分前还好,就一个当前数据集,一个集合直接按公式计算即可;划分后需要按‘Sum(划分后的集合的熵 * 划分集系数)’来计算,划分集系数等于划分后的集合长度占原数据集长度的比值
2. 树的构建过程: 使用python字典数据结构
creatTree(DataSet): BestLabel = 最佳划分特征对应的标签名 Tree = {BestLabel:{}} for each value in BestFeature.values(): Tree[BestLabel][value] = createTree(SubDataSet) return Tree
在递归的过程中以字典的方式实现了决策树的构建,在此还是不推荐大家直接去type书上的代码,自己动手实践一下,熟悉这种编程的思路对自己更加有益(至少对笔者是这样)