决策树
来源:互联网 发布:dx修复软件 编辑:程序博客网 时间:2024/06/02 04:39
备注:以下内容大多来自《机器学习实战》、《统计学习方法》、《机器学习》以及自己个人的见解,方便日后巩固学习
* markdown公式编辑参考:http://blog.csdn.net/ethmery/article/details/50670297
1.理论
1.1 决策树简介
- 特征选择
- 决策树的生成
- 决策树的剪枝
1.1.1 特征选择
条件熵 H(Y|X):
信息增益:
特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与 特征A给定条件下D的经验条件熵H(D|A),即
信息增益比:
其中,
1.1.2决策树的生成
ID3算法:核心是在决策树各个节点熵应用信息增益准则选择特征,递归的构建决策树
C4.5算法:ID3算法只有树的生成,所以该算法生成的树容易产生过拟合,C4。5算法对ID3算法进行了改进,在生成过程中,用信息增益比来选择特征。
CART(classification and regression tree)算法:使用“基尼指数”来选择划分属性
1.1.3决策树的剪枝
- 为了防止过拟合,从已经生成的树上裁剪掉一些子树或者叶节点,并将其根节点或者父结点作为新的叶节点,分为预剪枝和后剪枝
- 决策树的剪枝通常通过极小化决策树整体的损失函数或代价函数来实现。
- 也可以通过动态规划来实现
2.实践
2.1决策树的一般流程:
收集数据>准备数据>分析数据>训练算法>测试算法>使用算法
信息增益:
在划分数据集之前之后信息发生的变化成为信息增益,获得信息增益最高的特征就是最好的选择。
熵定义为信息的期望值,符号
2.2使用递归构造决策树:
- 得到原始数据集后,基于最好的属性值划分数据集,由于特征值可能多于两个,因此可能存在大于两个分支的数据集划分,第一次划分之后,数据将被向下传递到树分支的下一个节点,在这个节点上,我们可以再次划分数据。
- 递归结束的条件是:程序遍历玩所有划分数据集的属性,或者每个分支下的所有实例都具有相同的分类。如果所有实例具有相同的分类,则得到一个叶子节点或者终止块。任何达到叶子节点的数据必然数据叶子节点的分类。
2.3使用Matplotlib绘制树形图
###python获取叶节点的数目和树的层数
import matplotlib.pyplot as plt
def getNumLeafs(myTree):
numLeafs = 0
firstStr = myTree.keys()[0]
secondDict = myTree[firstStr]
for key in secondDict.keys():
if type(secondDict[key]).__name__=='dict':#test to see if the nodes are dictonaires, if not they are leaf nodes
numLeafs += getNumLeafs(secondDict[key])
else: numLeafs +=1
return numLeafs
def getTreeDepth(myTree):
maxDepth = 0
firstStr = myTree.keys()[0]
secondDict = myTree[firstStr]
for key in secondDict.keys():
if type(secondDict[key]).__name__=='dict':#test to see if the nodes are dictonaires, if not they are leaf nodes
thisDepth = 1 + getTreeDepth(secondDict[key])
else: thisDepth = 1
if thisDepth > maxDepth: maxDepth = thisDepth
return maxDepth
决策树的存储
- 构造决策树是很耗时的任务,即使处理很小的数据集,也要花费几秒的时间,如果数据集很大,将会耗费很多计算时间。然而用创建好的决策树解决分类问题,则可以很快完成。因此,为了节省计算时间,最好能够在每次执行分类时调用已经构造好的决策树,需要使用python模块pickle序列化对象。序列化对象可以在磁盘上保存对象,并在需要的时候读取出来,任何对象都可以执行序列化操作,字典对象也不例外。