机器学习笔记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
    则其熵定义为
    H ( X ) = i = 1 n p i log p i H(X) = - \sum\limits_{i = 1}^n {{p_i}\log {p_i}}
    熵越大,随机变量的不确定性就越大。设有随机变量 ( 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
    条件熵 H ( Y X ) H(Y|X) 表示在已知随机变量X的条件下随机变量 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})
    p i = P ( X = x i ) , i = 1 , 2 ,   , n {p_i} = P(X = {x_i}),i = 1,2, \cdots ,n
    信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。特征A对训练数据集D的信息增益 g ( D , A ) g(D,A) ,定义为集合D的熵 H ( D ) H(D) 与特征A给定条件下D的条件熵 H ( D A ) H(D|A) 之差,即
    g ( D , A ) = H ( D ) H ( D A ) g(D,A)=H(D)-H(D|A)
    (2)信息增益比
    以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比可以对这一问题进行校正。特征A对训练数据集D的信息增益比 g R ( D , A ) g_R(D,A) 定义为信心增益 g ( D , A ) g(D,A) 与训练数据集D关于特征A的值的熵 H A ( D ) H_A(D) 之比,即 g R ( D , A ) = g ( D , A ) H A ( D ) {g_R}(D,A) = \frac{{g(D,A)}}{{{H_A}(D)}}

  • 决策树生成
    (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|} (可理解为叶结点的熵加正则化)
    其中叶节点的个数为 T |T| ,每个叶结点有 N t N_t 个样本点,其中k类的样本点有 N t k N_{tk} 个, 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}}}} ,令 C ( T ) = t = 1 T N t H t ( T ) C(T) = \sum\limits_{t = 1}^{|T|} {N_t}{H_t}(T) ,这时 C α ( T ) = C ( T ) + α T C_\alpha(T)=C(T)+\alpha|T| C ( T ) C(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}} 来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值。易知,单元 R m R_m 上的最优输出值 f ( x i ) f(x_i) 是所有样本对应的输出 y i y_i 的均值。
    在对输入空间进行划分时,选择第 j 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{\} }} R 2 ( j , s ) = { x x ( j ) s } {R_2}(j,s) = {\rm{\{ }}x|{x^{(j)}} \ge s{\rm{\} }}
    求解 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{]}} ,得到最优切分变量j和最优切分点s。具体地,遍历变量j,对固定的切分变量j扫描切分点s。然后通过递归的方法不断划分空间,生成决策树。
    (2)分类树的生成
    分类树采用基尼指数选择最优特征。假设有K个类,样本点属于第k类的概率为 p k p_k ,则基尼指数定义为
    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}
    如果样本集合D根据特征A是否取某一可能值a被分割成 D 1 D_1 D 2 D_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 ) {\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{)}}
    基尼指数越大,样本集合的不确定性就越大,这一点与熵相似。生成树的生成算法与回归树类似:对数据集中每个特征A,对特征可能取得每个值a,根据“是”或“否”分为两部分,计算基尼指数。选择基尼指数最小的特征及对应的切分点生成两个子结点。如此往复循环。
  • CART剪枝
    分两步:首先从生成算法产生的决策树 T 0 T_0 底端开始不断剪枝,直到 T 0 T_0 的根结点,形成一个子树序列{ T 0 T_0 ,…, T n T_n };然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。
    (1)对于第一步剪枝,将 α \alpha 从小增大, 0 = α 0 < α 1 < α 2 < < α n < 0 = {\alpha _0} < {\alpha _1} < {\alpha _2} < \cdots < {\alpha _n} < \infty ,产生一系列的区间 [ α i , α i + 1 ) {\rm{[}}{\alpha _i},{\alpha _{i + 1}}{\rm{)}} ,剪枝得到的子树序列对应着区间 α [ α i , α i + 1 ) , i = 0 , 1 , . . . , n \alpha \in {\rm{[}}{\alpha _i},{\alpha _{i + 1}}{\rm{)}},i=0,1,...,n 的最优子树序{ T 0 T_0 ,…, T n T_n },序列中的子树是嵌套的。
    (2)平方误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每棵子树{ T 0 T_0 ,…, T n T_n }都对应着一个参数 α 1 , α 2 ,   , α n {\alpha _1} , {\alpha _2} , \cdots , {\alpha _n} 。所以,当最优子树确定时,对应的 α \alpha 也就确定了。

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

猜你喜欢

转载自blog.csdn.net/zhennang1427/article/details/85158171