机器学习笔记5-决策树

机器学习笔记5-决策树

决策树是一种基本的分类与回归方法。决策树学习通常包括三个步骤:特征选择、决策树的生成和决策树的剪枝。一般一个决策树包含一个根结点,若干个内部结点和若干个叶结点。叶结点对应于决策结果,其它的每个结点则对应于一个属性测试。每个结点包含的样本集合根据属性测试的结果被分到子结点中。根结点包含样本全集。

  • 特征选择。特征选择会选取对训练数据具有分类能力的特征,这样可以提高决策树学习的效率。通常特征选择的准则是信息增益或信息增益比。
    (1)信息增益
    在信息论与概率统计中,熵(entropy)表示随机变量不确定性的度量,它由变量的分布决定,与变量的取值无关。假设X是一个取有限个值的离散随机变量,其概率分布为
    P ( X = x i ) = p i , i = 1 , 2 , ⋯   , n P(X = {x_i}) = {p_i},i = 1,2, \cdots ,n P(X=xi)=pi,i=1,2,,n则其熵定义为
    H ( X ) = − ∑ i = 1 n p i log ⁡ p i H(X) = - \sum\limits_{i = 1}^n {{p_i}\log {p_i}} H(X)=i=1npilogpi熵越大,随机变量的不确定性就越大。设有随机变量 ( X , Y ) (X,Y) (X,Y),其联合概率分布为
    P ( X = x i , Y = y i ) = p i j , i = 1 , 2 , ⋯   , n ; j = 1 , 2 , ⋯   , n P(X = {x_i},Y = {y_i}) = {p_{ij}},i = 1,2, \cdots ,n{\rm{; }}j = 1,2, \cdots ,n P(X=xi,Y=yi)=pij,i=1,2,,n;j=1,2,,n条件熵 H ( Y ∣ X ) H(Y|X) H(YX)表示在已知随机变量X的条件下随机变量 Y Y Y的不确定性,定义为X给定条件下Y的条件概率分布的熵对X的数学期望
    H ( Y ∣ X ) = ∑ i = 1 n p i H ( Y ∣ X = x i ) H(Y|X) = \sum\limits_{i = 1}^n {{p_i}} H(Y|X = {x_i}) H(YX)=i=1npiH(YX=xi) p i = P ( X = x i ) , i = 1 , 2 , ⋯   , n {p_i} = P(X = {x_i}),i = 1,2, \cdots ,n pi=P(X=xi),i=1,2,,n信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。特征A对训练数据集D的信息增益 g ( D , A ) g(D,A) g(D,A),定义为集合D的熵 H ( D ) H(D) H(D)与特征A给定条件下D的条件熵 H ( D ∣ A ) H(D|A) H(DA)之差,即
    g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)
    (2)信息增益比
    以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比可以对这一问题进行校正。特征A对训练数据集D的信息增益比 g R ( D , A ) g_R(D,A) gR(D,A)定义为信心增益 g ( D , A ) g(D,A) g(D,A)与训练数据集D关于特征A的值的熵 H A ( D ) H_A(D) HA(D)之比,即 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)

  • 决策树生成
    (1)ID3算法。利用信息增益选择特征,递归地构建决策树。具体地,从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同值建立子结点;再对子结点递归地调用以上方法,构建决策树。直到所有特征的信息增益均很小或没有特征可以选择为止。其中,建立子结点,计算新的信息增益是以子结点所包含的数据集为基础来计算的。
    (2)C4.5算法。该算法与ID3算法类似,但采用了信息增益比来选择特征。

  • 决策树的剪枝
    决策树学习时会过多考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树,造成过拟合。这时候就需要剪枝,在已生成的树上裁掉一些子树或叶结点,从而提高泛化能力。决策树的剪枝可以通过引入正则化来实现,如定义决策树的损失函数为:
    C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ {C_\alpha }(T) = \sum\limits_{t = 1}^{|T|} {{N_t}{H_t}(T) + \alpha |T|} Cα(T)=t=1TNtHt(T)+αT(可理解为叶结点的熵加正则化)
    其中叶节点的个数为 ∣ T ∣ |T| T,每个叶结点有 N t N_t Nt个样本点,其中k类的样本点有 N t k N_{tk} Ntk个, H t ( T ) = − ∑ k N t k N t log ⁡ N t k N t {H_t}(T) = - \sum\limits_k {\frac{{{N_{tk}}}}{{{N_t}}}\log \frac{{{N_{tk}}}}{{{N_t}}}} Ht(T)=kNtNtklogNtNtk,令 C ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) C(T) = \sum\limits_{t = 1}^{|T|} {N_t}{H_t}(T) C(T)=t=1TNtHt(T),这时 C α ( T ) = C ( T ) + α ∣ T ∣ C_\alpha(T)=C(T)+\alpha|T| Cα(T)=C(T)+αT C ( T ) C(T) C(T)表示模型对训练数据的预测误差, ∣ T ∣ |T| T表示模型复杂度。损失函数完成了两者的平衡。
    树的剪枝算法:(1)计算每个结点的熵;(2)递归地从树的结点回缩,计算回缩前后的损失函数,如果变小则进行剪枝,即将父结点变为新的叶结点;(3)返回(2)直到不能继续,得最小的子树。
    .

决策树应用非常广泛,在后面集成学习中,随机森林、梯度提升树(GBDT)的基分类器就是决策树。另外,通过决策树进行特征划分,还可以判断哪些特征是重要的哪些特征是不重要的。在特征数目很多需要进行筛选的情况下(比如说Kaggle的大部分比赛中),利用决策树进行筛选是一个不错的方法。

python的scikit-learn库集成了决策树模型DecisionTreeClassifier,可以方便地使用。DecisionTreeClassifier的重要输入参量包括max_depth(决策树最大深度),min_impurity_decrease(节点划分最小不纯度),min_samples_leaf(叶子节点最少样本数),min_samples_split(内部节点再划分所需最小样本数)等。在不确定最优参数的时候,可以通过grid_search来搜索最佳值。具体调参过程可以参考这篇博客。DecisionTreeClassifier有个属性feature_importances_,它会返回各个特征的重要程度。通过调用它便可对特征进行筛选。
以下是利用DecisionTreeClassifier实现的一小段演示代码,数据集是泰坦尼克号幸存者数据集:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier

titanic=pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
x=titanic[['pclass','age','sex']]
y=titanic['survived']
x['age'].fillna(x['age'].mean(),inplace=True)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state = 33)
vec=DictVectorizer(sparse=False)
#这里DictVectorizer可以将字符型的变量数值化,而数值型变量保持不变。也可以用pandas中的get_dummies来实现。
#当然也可以用map、apply等函数来操作
x_train = vec.fit_transform(x_train.to_dict(orient='record'))
x_test = vec.transform(x_test.to_dict(orient='record'))
dtc = DecisionTreeClassifier(criterion='entropy', max_depth=3, min_samples_leaf=5)
dtc.fit(x_train,y_train)
print(dtc.score(x_train,y_train))
print(dtc.score(x_test,y_test))

.
.
.
.
.
.
补充
CART算法
CART(分类与回归树)模型也是基于以上三个步骤,既可以用于分类,也可用于回归。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”。这样决策树递归地二分每个特征。

  • CART生成
    CART在特征选择时,对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则。
    (1)回归树的生成
    回归树对应着输入空间(即特征空间)的一个划分以及在划分单元上的输出值。当输入空间划分确定时,可以用平方误差 ∑ x i ∈ R m ( y i − f ( x i ) ) 2 \sum\limits_{{x_i} \in {R_m}} {{{({y_i} - f({x_i}))}^2}} xiRm(yif(xi))2来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值。易知,单元 R m R_m Rm上的最优输出值 f ( x i ) f(x_i) f(xi)是所有样本对应的输出 y i y_i yi的均值。
    在对输入空间进行划分时,选择第 j j j个变量 x ( j ) x^{(j)} x(j)和它取的值s,作为切分变量和切分点,并定义两个区域:
    R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } {R_1}(j,s) = {\rm{\{ }}x|{x^{(j)}} \le s{\rm{\} }} R1(j,s)={xx(j)s} R 2 ( j , s ) = { x ∣ x ( j ) ≥ s } {R_2}(j,s) = {\rm{\{ }}x|{x^{(j)}} \ge s{\rm{\} }} R2(j,s)={xx(j)s}
    求解 min ⁡ j , s [ m i n c 1 ∑ x i ∈ R 1 ( y i − c 1 ) 2 + m i n c 2 ∑ x i ∈ R 2 ( y i − c 2 ) 2 ] {\min _{j,s}}{\rm{[}}mi{n_{{c_1}}}{\sum\limits_{{x_i} \in {R_1}} {({y_i} - {c_1})} ^2} + mi{n_{{c_2}}}{\sum\limits_{{x_i} \in {R_2}} {({y_i} - {c_2})} ^2}{\rm{]}} minj,s[minc1xiR1(yic1)2+minc2xiR2(yic2)2],得到最优切分变量j和最优切分点s。具体地,遍历变量j,对固定的切分变量j扫描切分点s。然后通过递归的方法不断划分空间,生成决策树。
    (2)分类树的生成
    分类树采用基尼指数选择最优特征。假设有K个类,样本点属于第k类的概率为 p k p_k pk,则基尼指数定义为
    G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 {\rm{Gini(}}p{\rm{) = }}\sum\limits_{k = 1}^K {{p_k}(1 - {p_k})} = 1 - \sum\limits_{k = 1}^K {p_k^2} Gini(p)=k=1Kpk(1pk)=1k=1Kpk2如果样本集合D根据特征A是否取某一可能值a被分割成 D 1 D_1 D1 D 2 D_2 D2两部分,则在特征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 ) {\rm{Gini(D,A) = }}\frac{{\left| {{D_1}} \right|}}{{\left| D \right|}}{\rm{Gini(}}{D_1}{\rm{)}} + \frac{{\left| {{D_2}} \right|}}{{\left| D \right|}}{\rm{Gini(}}{D_2}{\rm{)}} Gini(D,A)=DD1Gini(D1)+DD2Gini(D2)基尼指数越大,样本集合的不确定性就越大,这一点与熵相似。生成树的生成算法与回归树类似:对数据集中每个特征A,对特征可能取得每个值a,根据“是”或“否”分为两部分,计算基尼指数。选择基尼指数最小的特征及对应的切分点生成两个子结点。如此往复循环。
  • CART剪枝
    分两步:首先从生成算法产生的决策树 T 0 T_0 T0底端开始不断剪枝,直到 T 0 T_0 T0的根结点,形成一个子树序列{ T 0 T_0 T0,…, T n T_n Tn};然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。
    (1)对于第一步剪枝,将 α \alpha α从小增大, 0 = α 0 &lt; α 1 &lt; α 2 &lt; ⋯ &lt; α n &lt; ∞ 0 = {\alpha _0} &lt; {\alpha _1} &lt; {\alpha _2} &lt; \cdots &lt; {\alpha _n} &lt; \infty 0=α0<α1<α2<<αn<,产生一系列的区间 [ α i , α i + 1 ) {\rm{[}}{\alpha _i},{\alpha _{i + 1}}{\rm{)}} [αi,αi+1),剪枝得到的子树序列对应着区间 α ∈ [ α i , α i + 1 ) , i = 0 , 1 , . . . , n \alpha \in {\rm{[}}{\alpha _i},{\alpha _{i + 1}}{\rm{)}},i=0,1,...,n α[αi,αi+1),i=0,1,...,n的最优子树序{ T 0 T_0 T0,…, T n T_n Tn},序列中的子树是嵌套的。
    (2)平方误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每棵子树{ T 0 T_0 T0,…, T n T_n Tn}都对应着一个参数 α 1 , α 2 , ⋯ &ThinSpace; , α n {\alpha _1} , {\alpha _2} , \cdots , {\alpha _n} α1,α2,,αn。所以,当最优子树确定时,对应的 α \alpha α也就确定了。

参考:
李航《统计学习方法》
周志华《机器学习》
https://blog.csdn.net/qq_41577045/article/details/79844709

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值