决策树 — Decision Tree
来源:互联网 发布:js埋点代码收集脚本 编辑:程序博客网 时间:2024/06/03 14:33
决策树是一种分类算法。我们将通过一个经典的例子逐步了解决策树。假设我们要根据天气状况决策是否进行羽毛球训练,且有14天的历史数据供我们建立模型。如下:
决策树,顾名思义,就是要构建出一棵树状模型,将训练集中的不同类数据分隔开,尽可能地让叶子节点包含”纯“的同类数据。内点(非叶子节点)是特征项,分支是父节点特征不同的取值,树叶(叶子节点)是分类结果。自此,迎来了构建决策树过程中的第一个问题,根节点如何选择?经典的ID3算法引入了概念——熵,并用信息增益的大小作为选择根节点的标准。
定义一:
熵,用以描述某一集合、状态的不确定性。集合中的样本越统一,熵值越小;样本越随机,熵值越大。状态越稳定,熵值越小,反之熵值越大。公式如下:
Entropy(S)≡∑i=1c−pilog2pi
其中,pi 表示某集合中类别i 所占比列,或者是某状态现象i 出现的概率。定义0log0=0 。
以文章开头的决策是否进行羽毛球训练为例。当历史数据中
历史数据中的熵值为:
定义二:
集合
S 在特征A 下的信息增益定义为集合S 通过特征A 分支演变成集合Sv 的熵值减小(即集合S 中的样本由随机变得统一)。公式如下:
Gain(S,A)≡Entropy(S)−∑v∈Values(A)|Sv||S|Entropy(Sv)
以文章开头的决策是否进行羽毛球训练为例。历史数据在特征
ID3算法通过计算每个特征的信息增益,选择信息增益最大(分类效果最好)的特征作为当前树的节点。构建过树节点的特征将不再加入到信息增益的计算中。以文章开头的决策是否进行羽毛球训练为例,构建决策树模型的根节点。先计算每个特征的信息增益:
计算得知,特征
继续计算集合
选择信息增益最大的
如此重复,最后此例完整的决策树如下:
细心的读者会发现,尽管特征
定义三:
信息增益率,通过引入split information项来抵消过大的信息增益。split information公式如下:
SplitInformation(S,A)≡−∑i=1c|Si||S|log2|Si||S|
信息增益率公式如下:
GainRatio(S,A)≡Gain(S,A)SplitInformation(S,A)
以羽毛球训练为例,
除此之外,决策树的规模过大也会导致树模型过拟合。到一定程度,树模型的分类准确率会随着树规模的增大而递减。因此,决策树的建立需要受剪枝策略的限制。剪枝策略分为前剪枝和后剪枝:
* 前剪枝:限制树的深度,或者规定叶子节点的最小样本数。(实施难度较小,但是很难提前预知树模型的最佳规模)
* 后剪枝:先构建出一棵完整的决策树,再根据剪枝不影响树模型分类准确率的前提,对树进行剪枝。(理论上效果比前剪枝好,但是实施难度较大)
最后,除了可以通过信息增益和信息增益率来选择特征节点外,还可以基于某特征获取成本的考虑来选择特征节点。这是基于实际的考虑,例如:病人病症的分类预测。某些检查可能十分昂贵,因此,需要尽可能地利用普通检查的结果来做分类。此种考虑常用的计算公式如下:
或者:
其中,
补充
除了将决策树应用于分类问题之外,还可以将其输出作为其它机器学习算法的输入,这个思想很重要!!!
构建一个大的决策树容易导致树模型过拟合。因此,我们可以基于特征的若干子集构建若干个小决策树,每个小决策树就像是它所处特征集里的“专家”。每个“专家”基于自己的知识给某条数据返回一个
- 决策树 — Decision Tree
- 3.决策树Decision Tree
- 决策树(Decision Tree)
- 决策树(Decision Tree)
- 决策树(Decision Tree)
- 决策树decision tree分析
- 决策树(Decision Tree)
- 决策树Decision Tree
- 决策树Decision tree简析
- Decision Tree决策树
- 决策树(Decision tree)
- 决策树(Decision Tree)
- 决策树(Decision tree)
- 决策树(decision tree)
- 决策树Decision tree
- 决策树(Decision Tree)
- 决策树(Decision Tree)
- 决策树decision tree
- 共同学习Java源代码-多线程与并发-FutureTask类(二)
- POJ 1321 棋盘问题(DFS)
- unity场景切换、截屏、打开网址、退出应用程序
- C/C++之内存对齐
- 【C++温故】(2) 类的继承(一)
- 决策树 — Decision Tree
- 开始数据结构总复习 全部的数据结构代码
- 安装windows7导致Ubuntu启动项消失的问题的又一解决办法
- 每日练习|Day018
- 程序是怎么跑起来的?(2)---2进制
- 《天才在左疯子在右》读后感
- MongoDB用mongoimport导入大文件报错
- 解决 VS 跳转定义和 Resharper 重复
- 实现资源异步加载构想