决策树的生成
从数据集构造决策树算法所需要的子功能模块,其工作原理如下:得到原始数据集,然后基于最好的属性值划分数据集,由于特征值可能多于两个,因此可能存在大于两个分支的数据集划分。第一次划分之后,数据集被向下传递到树的分支的下一个结点。在这个结点上,我们可以再次
划分数据,因此我们可以采用递归的原则处理数据集。
递归结束的条件是:
1) 程序遍历完所有划分数据集的属性;
2)每个分支下的所有实例都具有相同的分类;
3)当前结点包含的样本集合为空时,不能划分。
在第2种情形下,我们把当前结点标记为叶结点,并将其类别设定为该结点所含样本最多的类别,任何到达叶结点的数据必然属于叶结点的分类;在第3种情形下,同样把当前结点标记为叶结点,但将其类别设定为其父结点所含样本最多的类别。
ID3算法
ID3算法原型见于 J.R Quinlan 的博士论文,是基础理论较为完善,使用较为广泛的决策树模型,在此基础上 J.R Quinlan 进行优化后,陆续推出了C4.5 和 C5.0 决策树算法,我们先从ID3开始,再讨论如何从ID3逐渐优化至C4.5。
ID3算法的核心是在决策树各个结点应用信息增益准则选择特征,递归地构建决策树。具体方法是:
1)从根结点开始,对结点计算所有可能的特征的信息增益;
2)选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;
3)再对子结点调用以上方法,构建决策树;
4)直到所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树。
代码实现
#ID3算法
"""
函数功能:基于最⼤信息增益切分数据集,递归构建决策树
参数说明:
dataSet:原始数据集(最后一列是标签)
返回:
myTree:字典形式的树
"""
def createTree(dataSet