一、什么是决策树
决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。
二、划分依据
2.1、熵
信息理论:
1、当系统的有序状态一致时,数据越集中的地方熵值越小,数据越分散的地方熵值越大。这是从信息的完整性上进行的描述。
2、当数据量一致时,系统越有序,熵值越低;系统越混乱或者分散,熵值越高。这是从信息的有序性上进行的描述。
2.1.1、图解
2.1.2、事例
假如有 16 支球队,分别编号,先问是否在 1-8 之间,如果是就继续问是否在1-4 之间,以此类推,直到最后判断出冠军球队是哪只。如果球队数量是 16,我们需要问 4 次来得到最后的答案。那么世界冠军这条消息的信息熵就是 4。
如果有32个球队,准确的信息量应该是:H = -(p1 * logp1 + p2 * logp2 + … + p32 * logp32),其中 p1, …, p32 分.别是这 32 支球队夺冠的概率。当每支球队夺冠概率相等都是 1/32 的时:H = -(32 * 1/32 * log1/32) = 5。每个事件概率相同时,熵最大,这件事越不确定
。
两种判断方法的比较
最后一种叫分类误差
2.1.3、信息增益
信息增益:以某特征划分数据集前后的熵的差值。熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大
。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏。
2.1.4、信息增益率
2.2、基尼值和基尼指数
2.2.1、节点的不纯度impurity
2.2.2、基尼值Gini(D)/Gini系数
基尼值Gini(D):从数据集D中随机抽取两个样本,起类别标记不一致的概率,故,Gini
(D)值越小,数据集D的纯度越高。
2.2.3、基尼指数Gini_index(D)/(Gini系数增益)
基尼指数Gini_index(D):一般,选择使划分后基尼系数最小的属性作为最优化分属
性。
取Gini系数增益值最大的属性作为决策树的根节点属性。
看不懂没事儿,我们做一道题就知道了
2.2.4、事例
最大化增益
等价于最小化子女结点的不纯性度量(Gini系数)的加权平均值,现在我们
希望最大化Gini系数的增益
三、总结
C4.5采用信息增益率来作为分支特征的选择标准,而CART则采用Gini系数;
C4.5不一定是二叉树,但CART一定是二叉树。
3.1、步骤
决策树构建的基本步骤如下:
1、开始讲所有记录看作一个节点
2、遍历每个变量的每一种分割方式,找到最好的分割点
3、分割成两个节点N1和N2
4.、对N1和N2分别继续执行2-3步,直到每个节点足够“纯”为止。
3.2、分类
决策树的变量可以有两种:
1、数字型(Numeric):变量类型是整数或浮点数,如前面例子中的“年收入”。用“>=”,“>”,“<”或“<=”作为分割条件(排序后,利用已有的分割情况,可以优化分割算法的时间复杂度)。
2、名称型(Nominal):类似编程语言中的枚举类型,变量只能重有限的选项中选取,比如前面例子中的“婚姻情况”,只能是“单身”,“已婚”或“离婚”,使用“=”来分割。
3.3、评估
如何评估分割点的好坏?
如果一个分割点可以将当前的所有节点分为两类,使得每一类都很“纯”,也就是同一类的记录较多,那么就是一个好分割点。
3.4、常见树的类型
ID3 处理分类型的变量
C4.5 处理连续型变量,可以处理缺失值
CART 既能做分类,也能做回归,但是只能做二分类树
三者比较
四、剪枝
为什要剪枝
•随着树的增长, 在训练样集上的精度是单调上升的, 然而在独立的测试样例上测出的精度先上升后下降。
•原因1:噪声、样本冲突,即错误的样本数据。
•原因2:特征即属性不能完全作为分类标准。
•原因3:巧合的规律性,数据量不够大。
预剪枝
(1)每一个结点所包含的最小样本数目,例如10,则该结点总样本数小于10时,则不再分;
(2)指定树的高度或者深度,例如树的最大深度为4;
(3)指定结点的熵小于某个值,不再划分。随着树的增长, 在训练样集上的精度是单调上升的, 然而在独立的测试样例上测出的精度先上升后下降。
后剪枝
主要有四种:
(1)REP-错误率降低剪枝
(2)PEP-悲观剪枝
(3)CCP-代价复杂度剪枝
(4)MEP-最小错误剪枝
五、决策树可视化安装
六、代码部分
from sklearn.datasets import load_iris # 导入类库
from sklearn import tree
import pydotplus
import sys
import os
os.environ["PATH"] += os.pathsep + 'D:/GRAPHVIZ/bin'
#注意后面的路径是你自己的graphviz的bin目录。
iris = load_iris() # 载入sciki-learn的自带数据
clf = tree.DecisionTreeClassifier() # 载入决策树分类模型
clf = clf.fit(iris.data, iris.target) # 决策树拟合,得到模型
with open("iris.dot",'w') as f: # 将模型存入dot文件iris.dot
f = tree.export_graphviz(clf, out_file=f)
# 第一种方式,用graphviz的dot命令生成决策树的可视化文件
#在命令行执行 dot -Tpdf iris.dot -o iris.pdf,
#执行完成后当前目录就可以看到决策树的可视化文件iris.pdf.
#打开可以看到决策树的模型图。
# 第二种方式,用pydotplus生成iris.pdf
dot_data = tree.export_graphviz(clf, out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("iris.pdf")