决策树

来源:互联网 发布:dx修复软件 编辑:程序博客网 时间:2024/06/02 04:39

备注:以下内容大多来自《机器学习实战》、《统计学习方法》、《机器学习》以及自己个人的见解,方便日后巩固学习
* markdown公式编辑参考:http://blog.csdn.net/ethmery/article/details/50670297

1.理论

1.1 决策树简介

  • 特征选择
  • 决策树的生成
  • 决策树的剪枝

1.1.1 特征选择

条件熵 H(Y|X):
H(Y|X)=ni=1piH(Y|X=xi)
信息增益
特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与 特征A给定条件下D的经验条件熵H(D|A),即g(DA)=H(D)H(D|A),信息增益大的特征具有更强的分类能力。
信息增益比
gR(D,A)=g(D,A)HA(D)
其中,HA(D)=ni=2|Di||D|log2|Di||D|

1.1.2决策树的生成

ID3算法:核心是在决策树各个节点熵应用信息增益准则选择特征,递归的构建决策树
C4.5算法:ID3算法只有树的生成,所以该算法生成的树容易产生过拟合,C4。5算法对ID3算法进行了改进,在生成过程中,用信息增益比来选择特征。
CART(classification and regression tree)算法:使用“基尼指数”来选择划分属性

1.1.3决策树的剪枝

  • 为了防止过拟合,从已经生成的树上裁剪掉一些子树或者叶节点,并将其根节点或者父结点作为新的叶节点,分为预剪枝和后剪枝
  • 决策树的剪枝通常通过极小化决策树整体的损失函数或代价函数来实现。
  • 也可以通过动态规划来实现

2.实践

2.1决策树的一般流程:

收集数据>准备数据>分析数据>训练算法>测试算法>使用算法

信息增益:

在划分数据集之前之后信息发生的变化成为信息增益,获得信息增益最高的特征就是最好的选择。
熵定义为信息的期望值,符号xi的信息定义为:l(xi)=log2p(xi) 其中 p(xi)是选择该分类的概率。为了计算熵,公式为:H=ni=1p(xi)log2p(xi)

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序列化对象。序列化对象可以在磁盘上保存对象,并在需要的时候读取出来,任何对象都可以执行序列化操作,字典对象也不例外。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 骨折后我抽烟了怎么办 五年级科学考不好怎么办 考试连续考差了怎么办 客户说没考虑好怎么办 小孩生殖器痒经常用手抓怎么办 孩子在幼儿园生殖器官受伤怎么办? 被骗了3000块钱怎么办 小说 月经来了想体检怎么办 尿检的时候遇上月经期怎么办 消防兵改革那新兵怎么办 教师资格证体检有问题怎么办 检兵合格还在上学怎么办 运动后肌肉肿了怎么办 打架用力过猛肌肉疼痛怎么办 军检只要一项不合格怎么办 体检身高差一厘米怎么办 体检身高差两公分怎么办 体检身高差10厘米怎么办 孩子的爸爸总是打游戏怎么办 拉屎屁眼疼还有血怎么办 家里冼澡要等好多冷水怎么办 孕晚期小孩头大怎么办 报考警校体检不合格退回怎么办? 入职体检视力0.1怎么办 屁扒骨折疼要怎么办 宝宝发高烧怎么办能快速退烧 屁股上长了纹路怎么办 手机充电头歪了怎么办 屁股挠烂了化脓怎么办 手机充电那坏了怎么办 孩子在学校被老师冤枉怎么办 初中学校不好我该怎么办 天气太热屁股淹了怎么办 骑车骑的屁股疼怎么办 爬山时屁股摔紫青了怎么办 宝宝不肯脱裤子拉粑粑怎么办 国家对无地农民怎么办 生完孩子骨架变大怎么办 17岁长高很慢怎么办? 出月子腿着凉了怎么办 脚着凉了脚疼怎么办