机器学习之决策树

1. 信息论基础

信息量大小的度量,即表示随机变量不确定性的度量。

H(p)=H(X)=i=1npilogpiH(p)=H(X)=-\sum_{i=1}^{n}p_i\log p_iH(p)=H(X)=−∑i=1n​pi​logpi​

联合熵

联合熵就是度量一个联合分布的随机系统的不确定度。

分布为p(x,y)p(x,y)p(x,y)的一对随机变量(X,Y),其联合熵定义为:

H(X,Y)=xXyYp(x,y)logp(x,y)=E[log1p(x,y)]H(X,Y)=−∑_{x∈X}∑_{y∈Y}p(x,y)logp(x,y)=E[log\frac{1}{p(x,y)}]H(X,Y)=−∑x∈X​∑y∈Y​p(x,y)logp(x,y)=E[logp(x,y)1​]

条件熵

条件熵H(YX)H(Y|X)H(Y∣X)表示在已知随机变量XXX的条件下随机变量YYY的不确定性

H(YX)=i=1npiH(YX=xi)H(Y|X)=\sum_{i=1}^np_iH(Y|X=x_i)H(Y∣X)=∑i=1n​pi​H(Y∣X=xi​)

其中 pi=P(X=xi),i=1,2,,np_i=P(X=x_i),i=1,2,\dots ,npi​=P(X=xi​),i=1,2,…,n

信息增益

特征A对训练数据集D的信息增益 g(D,A), 定义为集合D的经验熵H(D)与特征A给定条件下 D的经验条件熵H(D|A)之差。

g(D,A)=H(D)H(DA)g(D,A)=H(D)-H(D|A)g(D,A)=H(D)−H(D∣A)

基尼不纯度

将来自集合中的某种结果随机应用于集合中某一数据项的预期误差率。

Gini(p)=k=1Kpk(1pk)=1k=1Kpk2Gini(p) = \sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2Gini(p)=∑k=1K​pk​(1−pk​)=1−∑k=1K​pk2​

2. 决策树的不同分类算法

ID3算法

**划分策略:**信息增益

g(D,A)=H(D)H(DA)g(D,A)=H(D)-H(D|A)g(D,A)=H(D)−H(D∣A)

**输入:**训练数据集DDD, 特征集AAA,阈值ϵ\epsilonϵ

**输出:**决策树TTT

  1. 如果DDD属于同一类CkC_kCk​,TTT为单节点树,类CkC_kCk​作为该节点的类标记,返回TTT
  2. 如果AAA是空集,置TTT为单节点树,实例数最多的类作为该节点类标记,返回TTT
  3. 计算ggg, 选择信息增益最大的特征AgA_gAg​
  4. 如果AgA_gAg​的信息增益小于ϵ\epsilonϵ,TTT为单节点树,DDD中实例数最大的类CkC_kCk​作为类标记,返回TTT
  5. AgA_gAg​划分若干非空子集DiD_iDi​,
  6. DiD_iDi​训练集,AAgA-A_gA−Ag​为特征集,递归调用前面步骤,得到TiT_iTi​,返回TiT_iTi​

C4.5

**划分策略:**信息增益比

​ $ g_R(D,A)=\frac{g(D,A)}{H_A(D)}\
H_A(D)=-\sum_{i=1}^n\frac{D_i}{D}log_2\frac{D_i}{D}$

**输入:**训练数据集DDD, 特征集AAA,阈值ϵ\epsilonϵ
**输出:**决策树TTT

  1. 如果DDD属于同一类CkC_kCk​,TTT为单节点树,类CkC_kCk​作为该节点的类标记,返回TTT
  2. 如果AAA是空集, 置TTT为单节点树,实例数最多的作为该节点类标记,返回TTT
  3. 计算ggg, 选择信息增益比最大的特征AgA_gAg​
  4. 如果AgA_gAg​的信息增益比小于ϵ\epsilonϵ,TTT为单节点树,DDD中实例数最大的类CkC_kCk​作为类标记,返回TTT
  5. AgA_gAg​划分若干非空子集DiD_iDi​,
  6. DiD_iDi​训练集,AAgA-A_gA−Ag​为特征集,递归调用前面步骤,得到TiT_iTi​,返回TiT_iTi​
    ID3和C4.5在生成上,差异只在准则的差异。

CART分类树

1. 回归树

**输入:**训练数据集DDD,停止计算的条件

**输出:**回归树f(x)f(x)f(x)

步骤:

  1. 遍历变量jjj,对固定的切分变量jjj扫描切分点sss,得到满足上面关系的(j,s)(j,s)(j,s)

    minj,s[minc1xiR1(j,s)(yic1)2+minc2xiR2(j,s)(yic2)2]\min\limits_{j,s}\left[\min\limits_{c_1}\sum\limits_{x_i\in R_1(j,s)}(y_i-c_1)^2+\min\limits_{c_2}\sum\limits_{x_i\in R_2(j,s)}(y_i-c_2)^2\right]j,smin​[c1​min​xi​∈R1​(j,s)∑​(yi​−c1​)2+c2​min​xi​∈R2​(j,s)∑​(yi​−c2​)2]

  2. 用选定的(j,s)(j,s)(j,s), 划分区域并决定相应的输出值

     R1(j,s)={xx(j)s},R2(j,s)={xx(j)>s}c^m=1NxiRm(j,s)yj,xRm,m=1,2 R_1(j,s)=\{x|x^{(j)}\leq s\}, R_2(j,s)=\{x|x^{(j)}> s\} \\ \hat{c}_m= \frac{1}{N}\sum\limits_{x_i\in R_m(j,s)} y_j, x\in R_m, m=1,2 R1​(j,s)={x∣x(j)≤s},R2​(j,s)={x∣x(j)>s}c^m​=N1​xi​∈Rm​(j,s)∑​yj​,x∈Rm​,m=1,2

  3. 对两个子区域调用(1)(2)步骤, 直至满足停止条件

  4. 将输入空间划分为MMM个区域R1,R2,,RMR_1, R_2,\dots,R_MR1​,R2​,…,RM​,生成决策树:

    f(x)=m=1Mc^mI(xRm)f(x)=\sum_{m=1}^M\hat{c}_mI(x\in R_m)f(x)=∑m=1M​c^m​I(x∈Rm​)

2.分类树

与ID3和C4.5过程类似,划分策略不同

划分策略:

Gini(p)=k=1Kpk(1pk)=1k=1Kpk2Gini(p) = \sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2Gini(p)=∑k=1K​pk​(1−pk​)=1−∑k=1K​pk2​

应用场景

1 广义点说任何一个行业都可能出现适合决策树的应用分析目标,比如:在用决策树进行用户分级评估的时候,凡是积累了一定量的客户资源和数据,涉及对自己行业客户进行深入分析的企业和分析者都可能具备使用决策树的条件。
2 一般来说决策树的应用用往往都是和某一应用分析目标和场景相关的,比如:金融行业可以用决策树做贷款风险评估,保险行业可以用决策树做险种推广预测,医疗行业可以用决策树生成辅助诊断处置模型等等,当一个决策树的应用分析目标和场景确定,那该应用分析目标和场景所处的行业也就自然成为了决策树的应用领域。

3.回归树原理

划分的准则是平方误差最小化

4. 决策树防止过拟合手段

1.样本原因

合理、有效地抽样,用相对能够反映业务逻辑的训练集去产生决策树;

2.构建决策树的方法原因

(1)先剪枝(prepruning)

通过提前停止树的构建而对树“剪枝”,一旦停止,节点就成为树叶。该树叶可以持有子集元组中最频繁的类;

先剪枝的方法

有多种不同的方式可以让决策树停止生长,下面介绍几种停止决策树生长的方法:

限制决策树的高度和叶子结点处样本的数目

1.定义一个高度,当决策树达到该高度时就可以停止决策树的生长,这是一种最为简单的方法;
2.达到某个结点的实例具有相同的特征向量,即使这些实例不属于同一类,也可以停止决策树的生长。这种方法对于处理数据中的数据冲突问题非常有效;
3.定义一个阈值,当达到某个结点的实例个数小于该阈值时就可以停止决策树的生长;
4.定义一个阈值,通过计算每次扩张对系统性能的增益,并比较增益值与该阈值的大小来决定是否停止决策树的生长。

(2)后剪枝(postpruning)

它首先构造完整的决策树,允许树过度拟合训练数据,然后对那些置信度不够的结点子树用叶子结点来代替,该叶子的类标号用该结点子树中最频繁的类标记。

REP方法

一个训练集用来形成学习到的决策树,一个分离的验证集用来评估这个决策树在后续数据上的精度,确切地说是用来评估修剪这个决策树的影响。

PEP悲观错误剪枝

悲观错误剪枝法是根据剪枝前后的错误率来判定子树的修剪

5. 模型评估

评估分类器的性能

1、保持方法

保持(Holdout)方法中,将被标记的原始数据划分成两个不想交的集合,分别称为训练集合检验集。在训练数据集上归纳分类模型,在检验集上评估模型的性能。训练集和检验集的划分比例通常根据分析家的判断(例如,50-50,或者2/3作为训练集、1/3作为检验集)。分类器的准确率根据模型在检验集上的准确率估计。

2、随机二次抽样

可以多次重复保持方法来改进对分类器性能的估计,这种方法称作随机二次抽样(random subsampling)。设acciacci是第ii次迭代的模型准确率,总准确率是accsub=∑ki=1acci/kaccsub=∑i=1kacci/k。随机二次抽样也会遇到一些与保持方法同样的问题,因为在训练阶段也没有利用尽可能多的数据。并且,由于它没有控制每个记录用于训练和检验的次数,因此,有些用于训练的记录使用的频率可能比其他记录高很多。

3、交叉验证

替代随机二次抽样的一种方法是交叉验证(cross-validation)。在该方法中,每个记录用于训练的次数相同,并且恰好检验一次。为了解释该方法,假设把数据分为相同大小的两个子集,首先,我们选择一个子集作训练集,而另一个作检验集,然后交换两个集合的角色,原先作训练集的现在做检验集,反之亦然,这种方法叫做二折交叉验证。总误差通过对两次运行的误差求和得到。在这个例子中,每个样本各作一次训练样本和检验样本。k折交叉验证是对该方法的推广,把数据分为大小相同的k份,在每次运行,选择其中一份作检验集,而其余的全作为训练集,该过程重复k次,使得每份数据都用于检验恰好一次。同样,总误差是所有k次运行的误差之和。

4、自助法

以上方法都是假定训练记录采用不放回抽样,因此,训练集合检验集都不包含重复记录。在自助(bootstrap)方法中,训练记录采用有放回抽样,即已经选作训练的记录将放回原来的记录集中,使得它等机率地被重新抽取。如果原始数据有N个记录,可以证明,平均来说,大小为N的自助样本大约包含原始数据中63.2%的记录。这是因为一个记录被自助抽样抽取的概率是1(11/N)N1−(1−1/N)^N1−(1−1/N)N,当N充分大时,该概率逐渐逼近1e1=0.6321−e^{-1}=0.6321−e−1=0.632。没有抽中的记录就成为检验集的一部分,将训练集建立的模型应用到检验集上,得到自助样本准确率的一个估计εiε_iεi​。抽样过程重复b次,产生b个自助样本。

按照如何计算分类器的总准确率,有几种不同的自助抽样法。常用的方法之一是**.632自助(.632 bootstrap)**,它通过组合每个自助样本的准确率(εiεi)和由包含所有标记样本的训练集计算的准确率(accsacc_saccs​)计算总准确率accbootacc_{boot}accboot​:

accboot=1bi=2b(0.632εi+0.368accs)acc_boot = \frac{1}{b}\sum_{i=2}^b(0.632*ε_i + 0.368*acc_s)accb​oot=b1​∑i=2b​(0.632∗εi​+0.368∗accs​)

6. sklearn参数详解

sklearn.tree.DecisionTreeClassifier
        (criterion='gini', splitter='best', max_depth=None, min_samples_split=2, 
        min_samples_leaf=1,min_weight_fraction_leaf=0.0, max_features=None, 
        random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, 
        min_impurity_split=None, class_weight=None, presort=False)
参数 含义 其他
criterion 特征选择的标准 有信息增益和基尼系数两种
splitter 特征切分点选择标准 “best”:所有特征上递归。“random”随机选择一部分特征进行递归
max_depth 决策树最大深度 决策树模型先对所有数据集进行切分,再在子数据集上继续循环这个切分过程
min_samples_split 子数据集再切分需要的最小样本量 默认是2
min_samples_leaf 叶节点(子数据集)最小样本数 默认为1
min_weight_fraction_leaf 在叶节点处的所有输入样本权重总和的最小加权分数 如果不输入则表示所有的叶节点的权重是一致的。
max_features 特征切分时考虑的最大特征数量 默认是对所有特征进行切分
random_state 随机种子的设置
max_leaf_nodes 最大叶节点个数 数据集切分成子数据集的最大个数
min_impurity_decrease 切分点不纯度最小减少程度 如果某个结点的不纯度减少小于这个值,那么该切分点就会被移除。
min_impurity_split 切分点最小不纯度 来限制数据集的继续切分,小于这个阈值,那么该点的数据将不再进行切分
class_weight 权重设置 主要是用于处理不平衡样本
presort 是否进行预排序 默认是False

7.Python绘制决策树

使用graphviz画决策树

import graphviz
#  决策树画图
dot_data = export_graphviz(clf,out_file = None,    #clf为训练好的决策树分类器
                           feature_names=f_names,
                           class_names=["NL", "L"],
                           filled=True,
                           rounded=True,
                           special_characters=True)
graph = pydotplus.graph_from_dot_data((dot_data))
graph.write_pdf("dt_tree.pdf")
上一篇:openstack-networking-neutron(一)---端到端和点到点的理解


下一篇:SQL Server 2008导入、导出数据库