《数据挖掘导论》Pangaea-Ning Tan 读书笔记——(第四章决策树,决策树的原理+python实现)

数据挖掘 专栏收录该内容
3 篇文章 0 订阅

第四章 决策树

一,决策树归纳

1.决策树工作原理

决策树分为根节点内部结点和叶节点,

  • 例子:判断一个生物是哺乳动物还是非哺乳动物
    可以构建这样的决策树
恒温
冷血
体温
胎生
非哺乳
哺乳动物
非哺乳动物

在判断动物是否哺乳动物的例子中,我们通过构建上面的决策树,首先根据体温是否恒温分为恒温和冷血,冷血动物肯定是非哺乳动物,又分为了是否胎生,如果是胎生则分为哺乳动物,不是胎生分为非哺乳动物。

体温的节点为根节点(只出不进);
胎生的节点为内部节点(有进有出);
其它的三个节点为叶节点(只进不出);

2.设计问题

那么构建决策数分类器需要解决的问题为:

  • 1.如何分裂训练记录?
  • 2.如果停止分裂过程?

下面我们来解决这两个问题

3.选择最佳划分的度量

当一个样本具有多个属性,我们应该按照哪个属性进行分类数据?

不纯性
我们通过定义不纯性,来判断按照某个属性分类结果的好坏。
常用的不纯性有以下几种:
E n t r o p y ( t ) = − ∑ i = 0 c − 1 p ( i ∣ t ) l o g 2 P ( i ∣ t ) G i n i ( t ) = 1 − ∑ i = 0 c − 1 [ p ( i ∣ t ) ] 2 C l a s s i f i c a t i o n   e r r o r ( t ) = 1 − m a x [ p ( i ∣ t ) ] Entropy(t)=-\sum_{i=0}^{c-1}p(i|t)log_2P(i|t)\\ {}\\ Gini(t)=1-\sum_{i=0}^{c-1}[p(i|t)]^2\\ {}\\ Classification \ error(t)=1-max[p(i|t)] Entropy(t)=i=0c1p(it)log2P(it)Gini(t)=1i=0c1[p(it)]2Classification error(t)=1max[p(it)]
下面通过三个节点的分类结果,分别计算三种不纯性。

节点N1计数
类=00
类=16

E n t r o p y ( t ) = − ( 0 / 6 ) l o g 2 ( 0 / 6 ) − ( 6 / 6 ) l o g 2 ( 6 / 6 ) = 0 G i n i ( t ) = 1 − ( 0 / 6 ) 2 − ( 6 / 6 ) 2 = 0 C l a s s i f i c a t i o n   e r r o r ( t ) = 1 − m a x [ 0 / 6 , 6 / 6 ] = 0 Entropy(t)=-(0/6)log_2(0/6)-(6/6)log_2(6/6)=0 \\ {}\\ Gini(t)=1-(0/6)^2-(6/6)^2=0\\ {}\\ Classification \ error(t)=1-max[0/6,6/6]=0 Entropy(t)=(0/6)log2(0/6)(6/6)log2(6/6)=0Gini(t)=1(0/6)2(6/6)2=0Classification error(t)=1max[0/6,6/6]=0

节点N2计数
类=01
类=15

E n t r o p y ( t ) = − ( 1 / 5 ) l o g 2 ( 1 / 5 ) − ( 5 / 6 ) l o g 2 ( 5 / 6 ) = 0.278 G i n i ( t ) = 1 − ( 1 / 6 ) 2 − ( 5 / 6 ) 2 = 0.650 C l a s s i f i c a t i o n   e r r o r ( t ) = 1 − m a x [ 1 / 6 , 5 / 6 ] = 0.167 Entropy(t)=-(1/5)log_2(1/5)-(5/6)log_2(5/6)=0.278 \\ {}\\ Gini(t)=1-(1/6)^2-(5/6)^2=0.650\\ {}\\ Classification \ error(t)=1-max[1/6,5/6]=0.167 Entropy(t)=(1/5)log2(1/5)(5/6)log2(5/6)=0.278Gini(t)=1(1/6)2(5/6)2=0.650Classification error(t)=1max[1/6,5/6]=0.167

节点N2计数
类=03
类=13

E n t r o p y ( t ) = − ( 3 / 5 ) l o g 2 ( 3 / 5 ) − ( 3 / 6 ) l o g 2 ( 3 / 6 ) = 0.5 G i n i ( t ) = 1 − ( 3 / 6 ) 2 − ( 3 / 6 ) 2 = 1 C l a s s i f i c a t i o n   e r r o r ( t ) = 1 − m a x [ 3 / 6 , 3 / 6 ] = 0.5 Entropy(t)=-(3/5)log_2(3/5)-(3/6)log_2(3/6)=0.5 \\ {}\\ Gini(t)=1-(3/6)^2-(3/6)^2=1\\ {}\\ Classification \ error(t)=1-max[3/6,3/6]=0.5 Entropy(t)=(3/5)log2(3/5)(3/6)log2(3/6)=0.5Gini(t)=1(3/6)2(3/6)2=1Classification error(t)=1max[3/6,3/6]=0.5

由上面的三个节点的不纯度的计算,可以深刻的理解不纯性度量的定义,第一个节点,完全的把数据全部分开了,6个数据全部分为了1类,即是“纯”的,又可以称为零不纯性。
第三个节点每一类都分为0.5,这个时候的分类结果最差,所以无论是那种不纯性度量的结果都是最大的。

为了确定测试条件的效果,我们需要比较父节点(划分前)的不纯程度和子节点(划分后)的不纯度,它们的差越大,测试条件的效果就越好。增益就是一种可以用来确定划分效果的标准:
Δ = I ( p a r e n t ) − ∑ j = 1 k N ( v j ) N I ( v j ) \Delta=I(parent)-\sum_{j=1}^k\frac{N(v_j)}{N}I(v_j) Δ=I(parent)j=1kNN(vj)I(vj)
当选择熵Entropy作为上式的不纯度度量时,熵的差就是所谓的信息增益

决策树算法

决策树算法
TreeGrowth(E,F)
1: if stopping_cond(E,F)=true then
2: leaf=createNode()

二,过拟合问题

可能引起过拟合的原因

  • 1.噪声导致的过拟合
  • 2.缺乏代表性样本导致的过拟合

1.泛化误差的估计

1.使用再代入估计
再代入估计方法假设训练数据集可以很好地代表整体数据,因而,可以使用训练误差提供对泛化误差的乐观估计。在这样的前提条件下,决策树归纳算法简单地选择产生最低训练误差的模型作为最终的模型。然而,训练误差通常是泛化误差的一种很差的估计。

2.结合模型复杂度
定义1 奥卡姆剃刀、节俭原则
给定两个具有相同泛化误差的模型,较简单的模型比较复杂的模型更可取。
悲观误差评估
使用训练误差于模型复杂度惩罚项计算泛化误差。
e g ( T ) = ∑ i = 1 k [ e ( t i ) + Ω ( t i ) ] ∑ i = 1 k n ( t i ) e_g(T)=\frac{\sum_{i=1}^{k}[e(t_i)+\Omega(t_i)]}{\sum_{i=1}^{k}n(t_i)} eg(T)=i=1kn(ti)i=1k[e(ti)+Ω(ti)]

3.结合统计上界
泛化误差也可以用训练误差的统计修正来估计,因为泛化误差倾向于比训练误差大,所以统计修正通常是计算训练误差的上界。

2.处理决策树中的过拟合问题

1.先剪枝

在这种罚法中,树增长算法在产生完全拟合整个训练数据集的完全增长的决策树之前就停止树的生长。即当观察到的不纯性度量的增益低于某个阈值时就停止扩展叶节点。然而,这种方法的难点就在于阈值的选取。

2.后剪枝

在该方法中,初始决策树按照最大规模生长,然后进行剪枝步骤,按照子弟向熵的方法修剪完全增长的决策树。修建的方法有两种。

(1)

用新的叶节点替换子树,该叶节点的类标号由子树下记录中的多数类确定。

(2)

用子树中最常使用的分支代替子树。当模型不能在改进时终止修剪步骤。

三、评估分类器的性能

1.保持方法

即将数据分为训练集和验证集,在训练集上训练数据,在验证集上检验模型的准确性。、
但是这种方法高度依赖于数据集的划分,和数据集比例的构成。

2.随机二次抽样

可以多次重复保持方法来改进对分类器性能的估计,这种方法称作随机二次抽样。

3.交叉验证

在该方法中,每个记录用于训练的次数相同,并且恰好检验一次,假设把数据分为大小相同的两个子集,首先,我们选择一个子集作为训练集,而另一个作为验证集,然后交换两个数据集的角色,这种方法叫做二折交叉验证。可以推广到k折交叉验证,这种方法的计算成本会非常大。

4.自助法

前面的方法都是假定训练记录不放回抽样,在自主方法种,训练记录采用的时又放回抽样,即已经选作训练的记录将放的原来的记录之中,使得它等几率的被重复抽取。

四 比较两种分类器的方法

有时不同模型的分类器进行比较并不是统计显著的,比如A在50的数据集上的准确率为85% 分类器B在500的数据集上的准确率为75%,那么A和B哪个分类器更好。这一节来解决这个问题。

1.估计准确度的置信区间

根据检验记录反推出准确率的置信区间,通过将分类任务用二项式实验建模来推导置信区间。二项式时间的特性如下:
(1)实验由N个独立的实验组成,其中每个实验由两种可能的结果:成功或失败
(2)每个实验成功的概率p是常数。
二项式实验的一个例子是统计N词抛硬币正面朝上的次数。如果X是N次实验观察到的成功次数,则X取一个定值v的概率由均值Np,方差为 N p ( 1 − p ) Np(1-p) p(1p)的二项分布给出:
P ( X = v ) = C N v p v ( 1 − p ) N − v P(X=v)=C_N^vp^v(1-p)^{N-v} P(X=v)=CNvpv(1p)Nv

例如,如果硬币是均匀的(P=0.5),抛50次硬币,正面朝上20次的概率为
P ( X = 20 ) = C 30 20 0. 5 20 ( 1 − 0.5 ) 30 = 0.0419 P(X=20)=C^{20}_{30}0.5^{20}(1-0.5)^{30}=0.0419 P(X=20)=C30200.520(10.5)30=0.0419
如果多次重复该实验,正面朝上期望平均次数为50x0.5=25,方差为50x0.5x0.5=12.5
预测检验记录类标号的任务也可以看作是二项式实验。给定一个包含N个记录的检验集,令X是被模型正确预测的记录数,p是模型真正准确率。通过把预测任务用二项式实验建模,X服从均值为Np,方差为Np(1-Np)的二项分布。可以证明经验准确率acc=X/N也是均值为p,方差为p(1-p)/N的二项缝补,景观可以用二项分布来估计acc的置信区间,但是当N充分大时,通常用正太分布来近似,更具正态分布,可以推导出acc的置信区间:
P ( − Z α / 2 ≤ a c c − p p ( 1 − p ) / N ≤ Z 1 − α / 2 ) = 1 − α P(-Z_{\alpha/2}\leq \frac{acc-p}{\sqrt{p(1-p)/N}}\leq Z_{1-\alpha/2})=1-\alpha P(Zα/2p(1p)/N accpZ1α/2)=1α
其中 Z α / 2 Z_{\alpha/2} Zα/2 Z 1 − α / 2 Z_{1-\alpha/2} Z1α/2分别在置信水平 ( 1 − α ) (1-\alpha) (1α)下由标准正态分布得到的上界和下界。

2. 比较两个模型的性能

考虑一对模型M1和M2,它们在两个独立的验证集D1和D2上进行评估,令n1是D1中的记录数,n2是D2中的记录数。另外,假设M1在D1上的错误率为e1,M2在D2上的错误率为e2.目标是检验e1与e2的观察差是否是统计显著的。

假设n1和n2都充分大,e1和e2可以使用正态分布来近似。如果用d=e1-e2表示错误率的观测差,则d服从均值为dt(其实际差),方差为 σ d 2 \sigma^2_d σd2的正态分布。d的方差为:
σ d 2 = σ ^ d 2 = e 1 ( 1 − e 1 ) n 1 + e 2 ( 1 − e 2 ) n 2 \sigma^2_d=\hat{\sigma}^2_d=\frac{e_1(1-e_1)}{n_1}+\frac{e_2(1-e_2)}{n_2} σd2=σ^d2=n1e1(1e1)+n2e2(1e2)
其中 e 1 ( 1 − e 1 ) / n 1 e_1(1-e_1)/n_1 e1(1e1)/n1 e 2 ( 1 − e 2 ) / n 1 e_2(1-e_2)/n_1 e2(1e2)/n1是错误率的方差。最后在置信水平 ( 1 − α ) % (1-\alpha)\% (1α)%下,可以证明实际差 d t d_t dt的置信区间由下式给出:
d t = d ± z α / 2 σ ^ d d_t=d\pm z_{\alpha/2}\hat{\sigma}_d dt=d±zα/2σ^d

3.比较两种分类法的性能

假设我们想用k折交叉验证的方法比较两种分类法的性能。首先,把数据集D划分为K个大小相等部分,然后,使用每种分类法,在k-1份数据上构建模型,并在剩余的划分上进行验证,这个步骤重复k测,每次使用不同的划分进行验证。
令Mij表示分类计数Li在第j次迭代产生的错误率,注意,每对模型M1j和M2j在相同的划分j上进行验证。用e1j和e2j分别表示他们的错误率,它们在第j折上的错误率之差可以记作 d j = e 1 j − e 2 j d_j=e_{1j}-e_{2j} dj=e1je2j,如果k充分大,则 d j d_j dj服从均值为 d t c v d_t^{cv} dtcv(错误率的真实差),方差为 σ c v \sigma^{cv} σcv的正态分布。与前面的方法不同,观察的差的总方差用下式进行估计:
σ ^ d c v 2 = ∑ j = 1 k ( d j − d ˉ ) 2 k ( k − 1 ) \hat{\sigma}^2_{d^{cv}}=\frac{\sum_{j=1}^k(d_j-\bar{d})^2}{k(k-1)} σ^dcv2=k(k1)j=1k(djdˉ)2
其中, d ˉ \bar{d} dˉ是平均差,对于这个方法,我梦需要用t分布计算 d t c v d_t^{cv} dtcv的置信区间:
d t c v = d ˉ ± t ( 1 − α ) k − 1 σ ^ d c v d_t^{cv}=\bar{d}\pm t_{(1-\alpha)k-1}\hat{\sigma}_{d^{cv}} dtcv=dˉ±t(1α)k1σ^dcv
系数 t ( 1 − α ) , k − 1 t_{(1-\alpha),k-1} t(1α),k1可以通过两个参数(置信区间 ( 1 − α ) (1-\alpha) (1α)和自由度k-1)查概率表得到。

五、代码实现

使用python中的sklearn对决策树模型进行实现

from sklearn import tree
from sklearn.datesets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
import graphviz
# 加载数据
wine = load_wine()
# 划分数据集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3)

# 建立决策树模型
clf=tree.DecisionTreeClassifier(criterion="entropy)#选取熵作为不纯度度量
# 训练模型
clf=clf.fit(Xtrain,Ytrain)

# 预测测试集
clf.predicts(Xtest,Ytest)
# 查看预测集上的得分
score = clf.score(Xtest,Ytest)

# 查看决策树种属性的重要程度
feature_name=wine.feature_names
[*zip(feature_name,clf.feature_importances_)]

# 决策树可视化
dot_data = tree.export_graphviz(clf,feature_names = wine.feature_names
                               ,class_names=["琴酒","雪莉","贝尔摩德"]
                               ,filled= True # 节点颜色
                               ,rounded=True # 节点图形,是否为圆
                               ,out_file=None)
graph=graphviz.Source(dot_data)
graph

在这里插入图片描述
剪枝参数

关于防止过拟合,决策树通过剪枝来处理,常用的几个剪枝的属性:

  • max_depth
  • min_samples_leaf
  • min_samples_split
  • max_features
  • min_impurity_decrease

处理数据偏倚

  • class_weight
  • min_weight_fraction_leaf

常用数据接口

  • fit
  • score
  • apply
  • predict

sklearn 中文帮助文档
sklearn官网

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值