优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据
缺点:可能会产生过度匹配的问题
适用数据类型:数值型和标称型
在构造决策树时,我们需要解决的第一个问题就是当前是那个特征在决定决策树的划分。为了找到起决定性的特征,划分出最好的结果,我们必须评估每个特征。
所以构建决策树的流程就是,首先判断数据是否是同一个类型的,如果不是,找到划分这些数据起决定性因素的特征,按照这个特征来划分数据,划分完成后的数据,接着判断是否属于同一类别,如果是就返回这个类别节点,如果不是,继续寻找最好的特征来划分数据。
伪代码:
检测数据集中的每个子项是否属于同一分类:
if so return 类标签;
else
寻找划分数据集的最好的特征
划分数据集
创建分支节点
for 每个划分的子集
递归调用次伪代码并增加返回结果到分支节点上去
return 分枝结点
树构造算法只适用于标称型数据,因此数值型数据需要离散化
用到的一些技术:
1. 信息熵,划分数据的重要原则是将无序的数据变的更加有序。划分数据的方式有很多,组织杂乱无章数据的一种方法就是使用信息度量论度量信息,信息论是量化处理信息的分支科学。我们可以在划分数据之前使用信息论量化度量信息的内容。
信息增益是熵的减少或者是数据无序度的减少。
在划分数据之前之后信息发生的变化称为信息增益,知道如何计算信息增益,我们就可以计算每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的特征。
信息熵计算公式:p(xi) * log p(xi) i为下标,i从1加到n n为分类的数量
计算信息熵的程序代码思路:
1.获得样本总数量
2.计算各个标签出现的次数
3.对每一个标签,计算他出现的概率 用标签出现的次数 / 样本的总数量
4.使用公式计算该标签的信息熵
5.将所有标签的熵求加和的相反数
另一个度量集合无序程度的方法是基尼不纯度(Gini impurity),简单的说就是从一个数据集中随机选取子项,度量其被错误分类其他组里概率。
2. 数据集划分方式,给定某个特征的某个特征值,遍历数据集按照该特征的特征值将数据分为两部分。
3.寻找最佳特征伪代码:
得到所有的特征
计算整个数据集的信息熵
初始化最佳划分信息熵和最佳特征
遍历所有的特征
取数据集上该特征对应的所有值
使用集合筛掉重复值
初始化该特征下的新增信息熵
遍历无重复的特征对应的值
对该值进行对数据集的划分
计算划分后的数据集特征信息熵
将每个特征值划分得到的特征信息熵加和
使用该特征值划分数据得到的熵等于整个数据集的信息熵减去该特征每个特征值得到的信息熵加和
如果该特征值划分数据得到的熵大于最佳划分信息熵
记录该最佳划分信息熵
记录该最佳特征
返回最佳特征
4.当所有特征都是用完毕,但是类标签还是不唯一的时候使用多数表决的办法来决定,计算这些不同的类标签的数量,返回数量较大的那个类标签
5.构建树伪代码:
获取数据最后一列标签值
如果标签的值全都一样了就返回该标签值退出
如果特征只有一个了,就使用第四步用多数表决的办法返回类别
获取最佳特征
根据最佳特征的下标获取最佳特征的描述
创建树字典 {最佳标签描述:{}}
删除该标签label
获取该特征下的所有特征值,并使用set过滤重复值
遍历无重复的特征值
构建子标签集,为删除上一个最佳特征标签的所有标签
递归调用构建树 数字典 = 递归调用返回值
返回树字典
6.预测伪代码
首先找到树的第一个分类特征也就是第一个key
根据该key,在特征标签集合里面找到对应标签的下标
根据key获得子节点的字典
遍历子节点字典
如果测试向量对应该伪代码第二步下标的值等于子节点的key
判断该子节点是否还是字典,如果是就递归,如果不是返回值
构造决策树是很耗时的任务,即使处理很小的数据集,也要花费几秒的时间,如果数据集很大会花费更多的时间,然而用创建好的决策树解决问题则可以很快完成。可以使用python的pickle模块,将树模型保存在需要的时候加载出来。
import pickle
储存:
fw = open(filename,‘w’)
pickle.dump(tree,fw)
fw.close()
读取:
fr = open(filename)
return pickle.load(fr)
本次使用的算法成为ID3,该算法无法直接处理数值型数据。
代码路径:https://github.com/HanGaaaaa/MLAProject/tree/master/Dt