笔记之决策树及python实现

1 概述

  决策树是一种基本的分类与回归方法。这里主要讨论用于分类的决策树。

2 算法特点

  • 优点:计算复杂度不高,输出结果易于理解,对中间值的确实不敏感。可以处理不相关特征数据。
  • 缺点:可能会产生过度匹配问题。
  • 适用数据类型:数值型和标称型。

3 算法原理

  分类决策树模型是表示基于特征对实例进行分类的树形结构。决策树可以转换成一个if-then规则的集合,也可以看作是定义在特征空间划分上的类的条件概率分布。
在这里插入图片描述

4 构造决策树

  在构造决策树前,先抛出两个问题:

  • 如何确认由上到下的每一个非叶结点,假定每个非叶结点表示一个用于分类的特征,那么如何确认它在结点的位置呢?
  • 当叶子结点足够多的时候,往往对训练样本的数据分类很准确,但对未知的测试数据分类缺没有那么准确,即出现过拟合现象,那么该如何避免呢?

  构造决策树主要方式:
 ❐用决策树的生成算法来选择特征作为结点的特征
 ❐用决策树的剪枝来简化生成的决策树

4.1 决策树的生成算法

  在使用生成算法前,必须要搞清楚三个重要概念:熵、信息增益、信息增益比。

(1)熵

熵是表示随机变量不确定性的度量,设 X X X是一个离散的型随机变量,其概率分布为:
P ( X = x i ⃗ ) = p i , i = 1 , 2 , ⋯   , n P(X=\vec{x_{i}})=p_{i},i=1,2,\cdots ,n P(X=xi )=pi,i=1,2,,n
则随机变量 X X X的熵定义为
H ( X ) = − ∑ i = 1 n p i l o g p i H(X)=-\sum_{i=1}^{n}p_{i}logp_{i} H(X)=i=1npilogpi
其中式中对数一般以2为底。

熵的作用是啥?直白的说就是表示样本中的混乱程度,熵值越大越混乱。举个例子:

A = [11111]
B = [12345]
H(A) = -log1=0
H(B) = -5(1/5*log1/5)

很显然B的熵值要大于A的熵值,也就是说B的混乱程度更高。

(2)样本集合D对特征A的信息增益(ID3)

g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)
H ( D ) = − ∑ k = 1 K ∣ C k ∣ D l o g 2 ∣ C k ∣ D H(D)=-\sum_{k=1}^{K}\frac{|C_{k}|}{D}log_{2}\frac{|C_{k}|}{D} H(D)=k=1KDCklog2DCk
H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ D H ( D i ) H(D|A)=\sum_{i=1}^{n}\frac{|D_{i}|}{D}H(D_{i}) H(DA)=i=1nDDiH(Di)
其中, H ( D ) H(D) H(D)是数据集D的熵, H ( D i ) H(D_{i}) H(Di)是数据集 D i D_{i} Di的熵, H ( D ∣ A ) H(D|A) H(DA)是数据集D对特征A的条件熵。 H ( D i ) H(D_{i}) H(Di)是D中特征A取第 i i i个值的样本自己, H ( C k ) H(C_{k}) H(Ck) D D D中属于第 k k k类的样本子集, n n n是特征A取值的个数,K是类的个数。
示例:采用《统计学习方法》书中示例
在这里插入图片描述
首先计算出经验熵 H ( D ) H(D) H(D),从表类别字段可以看到总共有两个分类,有9个,有6个。
H ( D ) = − 9 15 l o g 2 9 15 − 6 15 l o g 2 6 15 = 0.971 H(D)= -\frac{9}{15}log_{2}\frac{9}{15}-\frac{6}{15}log_{2}\frac{6}{15}=0.971 H(D)=159log2159156log2156=0.971
然后求取信息增益值,寻找最优特征
g ( D , ′ 年 龄 ′ ) = H ( D ) − [ 5 15 H ( ′ 青 年 ′ ) + 5 15 H ( ′ 中 年 ′ ) + 5 15 H ( ′ 老 年 ′ ) ] = 0.971 − [ 5 15 ( − 2 5 l o g 2 2 5 − 3 5 l o g 2 3 5 ) + 5 15 ( − 3 5 l o g 2 3 5 − 2 5 l o g 2 2 5 ) + 5 15 ( − 4 5 l o g 2 4 5 − 1 5 l o g 2 1 5 ) ] = 0.0803 g(D,'年龄')=H(D) -[\frac{5}{15}H('青年')+\frac{5}{15}H('中年')+\frac{5}{15}H('老年')] =0.971-[\frac{5}{15}(-\frac{2}{5}log_{2}\frac{2}{5}-\frac{3}{5}log_{2}\frac{3}{5})+ \frac{5}{15}(-\frac{3}{5}log_{2}\frac{3}{5}-\frac{2}{5}log_{2}\frac{2}{5}) +\frac{5}{15}(-\frac{4}{5}log_{2}\frac{4}{5}-\frac{1}{5}log_{2}\frac{1}{5})]=0.0803 g(D,)=H(D)[155H()+155H()+155H()]=0.971[155(52log25253log253)+155(53log25352log252)+155(54log25451log251)]=0.0803
g ( D , ′ 年 龄 ′ ) = 0.083 g(D,'年龄')=0.083 g(D,)=0.083
同理求得:
g ( D , ′ 有 工 作 ′ ) = 0.324 g(D,'有工作')=0.324 g(D,)=0.324
g ( D , ′ 有 自 己 的 房 子 ′ ) = 0.420 g(D,'有自己的房子')=0.420 g(D,)=0.420
g ( D , ′ 信 贷 情 况 ′ ) = 0.363 g(D,'信贷情况')=0.363 g(D,)=0.363
很明显特征有自己的房子的信息增益值最大,所以该特征作为分类的最优特征。

(3)样本集合D对特征A的信息增益比(C4.5)

g R ( D , A ) = g ( D , A ) H A ( D ) g_{R}(D,A)=\frac{g(D,A)}{H_{A}(D)} gR(D,A)=HA(D)g(D,A)
其中, g ( D , A ) g(D,A) g(D,A)是信息增益, H A ( D ) H_{A}(D) HA(D)是D关于特征A的值的熵。
示例:
g ( D , ′ 年 龄 ′ ) = 0.083 g(D,'年龄')=0.083 g(D,)=0.083
H ′ 年 龄 ′ ( D ) = 5 15 H ( ′ 青 年 ′ ) + 5 15 H ( ′ 中 年 ′ ) + 5 15 H ( ′ 老 年 ′ ) = 5 15 ( − 2 5 l o g 2 2 5 − 3 5 l o g 2 3 5 ) + 5 15 ( − 3 5 l o g 2 3 5 − 2 5 l o g 2 2 5 ) + 5 15 ( − 4 5 l o g 2 4 5 − 1 5 l o g 2 1 5 ) = 0.888 H_{'年龄'}(D) =\frac{5}{15}H('青年')+\frac{5}{15}H('中年')+\frac{5}{15}H('老年')=\frac{5}{15}(-\frac{2}{5}log_{2}\frac{2}{5}-\frac{3}{5}log_{2}\frac{3}{5})+ \frac{5}{15}(-\frac{3}{5}log_{2}\frac{3}{5}-\frac{2}{5}log_{2}\frac{2}{5}) +\frac{5}{15}(-\frac{4}{5}log_{2}\frac{4}{5}-\frac{1}{5}log_{2}\frac{1}{5})=0.888 H(D)=155H()+155H()+155H()=155(52log25253log253)+155(53log25352log252)+155(54log25451log251)=0.888
g R ( D , A ) = g ( D , ′ 年 龄 ′ ) H ′ 年 龄 ′ ( D ) = 0.093 g_{R}(D,A)=\frac{g(D,'年龄')}{H_{'年龄'}(D) }=0.093 gR(D,A)=H(D)g(D,)=0.093
为啥要引入信息增益比呢?
ID3算法有一定的缺陷,比如说如何将表中ID作为一个分类特征
那么使用ID3得到的结果为: g ( D , ′ I D ′ ) = H ( D ) − 0 = 0.971 g(D,'ID')=H(D) - 0=0.971 g(D,ID)=H(D)0=0.971,则算法认为ID的信息增益最为显著,所以判定特征ID为重要特征,这显然是有误的,而使用信息增益比的C4.5算法则不会出现这种情况。

(4)样本集合D的基尼指数(CART)

G i n i ( D ) = 1 − ∑ K k = 1 ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D)=1-\sum_{K}^{k=1}\left ( \frac{|C_{k}|}{|D|} \right )^{2} Gini(D)=1Kk=1(DCk)2
特征A条件下集合D的基尼指数:
G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) Gini(D,A)=\frac{|D_{1}|}{|D|}Gini(D_{1}) + \frac{|D_{2}|}{|D|}Gini(D_{2}) Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)
假设有 K K K个分类,样本属于第 k k k类的概率为 p k = p ( y = c k ) p_{k}=p(y=c_{k}) pk=p(y=ck)则概率分布的基尼指数为:
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 k p k 2 Gini(p)=\sum_{k=1}^{K}p_{k}(1-p_{k})=1-\sum_{k=1}^{k}p_{k}^{2} Gini(p)=k=1Kpk(1pk)=1k=1kpk2
对于二分类问题,若样本点属于第1个类得概率为p,则概率分布得基尼指数为: G i n i ( p ) = 2 p ( 1 − p ) Gini(p)=2p(1-p) Gini(p)=2p(1p)

示例:
字段年龄
G i n i ( D , ‘ 年 龄 ‘ = ′ 青 年 ′ ) = 5 15 ( 2 × 2 5 × ( 1 − 2 5 ) ) + 10 15 ( 2 × 7 10 × ( 1 − 7 10 ) ) = 0.44 Gini(D,`年龄`='青年')=\frac{5}{15}(2\times \frac{2}{5}\times (1-\frac{2}{5}))+\frac{10}{15}(2\times \frac{7}{10}\times (1-\frac{7}{10}))=0.44 Gini(D,=)=155(2×52×(152))+1510(2×107×(1107))=0.44
G i n i ( D , ‘ 年 龄 ‘ = ′ 中 年 ′ ) = 0.48 Gini(D,`年龄`='中年')=0.48 Gini(D,=)=0.48
G i n i ( D , ‘ 年 龄 ‘ = ′ 老 年 ′ ) = 0.44 Gini(D,`年龄`='老年')=0.44 Gini(D,=)=0.44
字段有工作
G i n i ( D , ‘ 有 工 作 ‘ = ′ 是 ′ ) = 0.32 Gini(D,`有工作`='是')=0.32 Gini(D,=)=0.32
字段有自己的房子
G i n i ( D , ‘ 有 自 己 的 房 子 ‘ = ′ 是 ′ ) = 0.27 Gini(D,`有自己的房子`='是')=0.27 Gini(D,=)=0.27
字段信贷情况
G i n i ( D , ‘ 信 贷 情 况 ‘ = ′ 非 常 好 ′ ) = 0.36 Gini(D,`信贷情况`='非常好')=0.36 Gini(D,=)=0.36
G i n i ( D , ‘ 信 贷 情 况 ‘ = ′ 好 ′ ) = 0.47 Gini(D,`信贷情况`='好')=0.47 Gini(D,=)=0.47
G i n i ( D , ‘ 信 贷 情 况 ‘ = ′ 一 般 ′ ) = 0.32 Gini(D,`信贷情况`='一般')=0.32 Gini(D,=)=0.32
基尼指数表示:样本集合中,随机选中一个样本,该样本被分错的概率。基尼指数越小,表示越不容易分错。由结果可知有自己的房子得基尼指数最小,所以选取有自己的房子 = 是为最优得切分点,于是根节点生成了两个子结点,一个是叶子结点,一个是下一个最优切分点有工作 = 是以此类推。
在这里插入图片描述

4.2 决策树的剪枝

由于生成得决策树存在过拟合问题,需要对它进行剪枝,以简化学到决策树。
决策树剪枝策略:
预剪枝:限制深度,叶子结点得个数,叶子结点样本数,信息增益等;一般
后剪枝:通过衡量标准,如损失函数
C a ( T ) = C ( T ) + a ∣ T ∣ C_{a}(T)=C(T)+a|T| Ca(T)=C(T)+aT
其中,T为任意子树, C ( T ) C(T) C(T)为训练数据得预测误差(如基尼指数), ∣ T ∣ |T| T为叶子结点个数, a ≥ 0 a\geq 0 a0的超参数,叶子结点越多损失越大。

5 python实现

git地址:https://github.com/lingxiaaisuixin/MarchineLearning/tree/master/DecisionTree
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值