NJU机器学习导论课程笔记之决策树

 

目录

1 基本流程

2 划分选择

3 剪枝

4 C4.5算法中的连续与缺失值处理

5 多变量决策树

6 sklearn中的DecisionTreeClassifier


1 基本流程

    1. 决策树(decision tree):决策树是一类常见的机器学习方法,主要用于分类。一般的,一棵决策树包含一个根节点、若干个内部结点和若干个叶结点。叶结点对应于决策结果,其它每个节点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集。从根结点到每个叶结点的路径对应了一个判定测试序列。决策树学习的目的是为了产生一棵泛化能力强,即处理未见实例能力强的决策树。

    2. 基本算法:决策树的生成是一个递归过程,算法伪代码如下:

    #假设数据集为D,标签集为A,需要构造的决策树为tree
    def DecisionTree(D, A):
        if D中所有的标签都相同:
            return 标签
        if 样本中只有一个特征或者所有样本的特征都一样:
            对D中所有的标签进行计数
            return 计数最高的标签
        计算所有特征的信息增益
        选出最佳特征(best_feature)
        将best_feature作为tree的根结点
        得到best_feature在数据集中所有出现过的值的集合(value_set)
        for value in value_set:
            从D中筛选出best_feature=value的子数据集(sub_feature)
            if 子数据集(sub_feature)为空
                return None
            从A中筛选出best_feature=value的子标签集(sub_label)
            #递归构造tree
            tree[best_feature][value] = DecisionTree(sub_feature, sub_label)
        return tree

2 划分选择

    决策树学习的关键是如何选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的纯度(purity)越来越高。不同的决策树学习算法采用不同的指标来选择最优化分属性,如下表所示。

  算法名称        指标
   ID3算法     信息增益
  C4.5算法   信息增益率
 CART算法     基尼指数

    1. 信息增益

        (1) 信息熵(information entropy):度量样本集合纯度最常用的一种指标。假设当前样本集合D中第k类样本所占的比例为p_{k}(k=1,2,...,\left | \boldsymbol{y} \right |),则D的信息熵定义为

                                                                          \mathrm{Ent}(D)=-\sum_{k=1}^{\left | \boldsymbol{y} \right |}p_{k}\log _{2}p_{k}

\mathrm{Ent}(D)的值越小,则D的纯度越高。

        (2) 信息增益(information gain):假设离散属性a中由V个可能的取值\left \{ a^{1},a^{2},...,a^{V} \right \},若使用a来对样本集进行划分,则会产生V和分支结点,其中第v个分支结点包含了D中所有在属性a上取值为a^{v}的样本,记为D^{v}。信息增益定义为

                                                              \mathrm{Gain}(D,a)=\mathrm{Ent}(D)-\sum_{v=1}^{V}\frac{\left | D^{v} \right |}{\left | D \right |}\mathrm{Ent}(D^{v})

信息增益越大,则意味着使用属性来进行划分所获得的纯度提升越大。因此,选择信息增益大的属性作为划分属性。

    2. 增益率(gain ratio):信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,使用增益率来选择最优化分属性,增益率定义为

                                                                    \mathrm{Gain\underline{\, \, } ratio}(D,a)=\frac{\mathrm{Gain}(D,a)}{\frac{\left | D^{v} \right |}{\left | D \right |}\log _{2}\frac{\left | D^{v} \right |}{\left | D \right |}}

增益率准则对可取值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率对打的候选划分属性,而是先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

    3.基尼指数(Gini index):数据集D的纯度可用基尼值来度量

                                                                         \mathrm{Gini}(D)=1-\sum_{k=1}^{\left | \boldsymbol{y} \right |}p_{k}^{2}

直观来说,\mathrm{Gini}(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。\mathrm{Gini}(D)越小,则数据集D的纯度越高。类似地,基尼指数的定义为

                                                              \mathrm{Gini\underline{\, \, } index}(D)=\sum_{v=1}^{V}\frac{\left | D^{v} \right |}{\left | D \right |}\mathrm{Gini}(D^{v})

于是,我们在侯选属性集合A中,选择那个是的划分后基尼指数最小的属性作为最优化分属性。


3 剪枝

    剪枝(pruning)决策树学习算法对付过拟合的主要手段。在决策树学习中,有时会造成决策树分支过多,通过主动去掉一些分支来降低过拟合的风险。决策树简直的基本策略有预剪枝和后剪枝。

    1. 预剪枝(prepruning):是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶结点。预剪枝能够降低决策树的复杂度。这种预剪枝处理属于贪心思想,但是贪心有一定的缺陷,就是可能当前划分会降低泛化性能但在其基础上进行的后续划分却有可能导致性能显著提高。所以有可能会导致决策树出现欠拟合的情况。

    2. 后剪枝(postpruning):是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将子树替换为叶结点。后剪枝是从全局的角度来看待要不要剪枝,所以造成欠拟合现象的可能性比较小。但由于后剪枝需要先生成完整的决策树,然后再剪枝,所以后剪枝的训练时间开销更高。


4 C4.5算法中的连续与缺失值处理

    1. 连续值处理:采用二分法对连续属性进行处理。给定样本集D和连续属性a,假定a在D上出现了n个不同的取值,将这些值从小到大进行排序,记为  \left \{ a^{1},a^{2},...,a^{n} \right \}。我们考察包含n-1个元素的候选划分点集合

                                                                     T_{a}=\left \{ \frac{a^{i}+a^{i+1}}{2}\; | \; 1 \leq i\leq n-1\ \right \}

然后我们就可像离散属性值一样来考虑这些划分点,选取最优的划分点进行样本集合的划分。

                                                        \mathrm{Gain}(D,a)=\max \limits_{t\in T_{a}}\mathrm{Ent}(D)-\sum \limits_{\lambda \in\left \{ -,+ \right \}}\frac{\left | D_{t}^{\lambda } \right |}{\left | D \right |}\mathrm{Ent}( D_{t}^{\lambda })

    2. 缺失值处理:给定训练集D和属性a,令\tilde{D}表示D中在属性a上没有缺失的样本子集。假定属性a有V个可取值\left \{ a^{1},a^{2},...,a^{V} \right \},令\tilde{D}^{v}表示\tilde{D}中在属性a上取值为a^{v}的样本子集,\tilde{D}_{k}表示\tilde{D}中属于第k类的样本子集。我们为每个样本\boldsymbol{x}赋予一个权重w_{\boldsymbol{x}},初始值均为1,并定义

                                                                                     \rho =\frac{\sum_{\boldsymbol{x}\in \tilde{D}}^{\, }w_{\boldsymbol{x}}}{\sum_{\boldsymbol{x}\in D}^{\, }w_{\boldsymbol{x}}}

                                                                    \tilde{p}_{k} =\frac{\sum_{\boldsymbol{x}\in \tilde{D}_{k}}^{\, }w_{\boldsymbol{x}}}{\sum_{\boldsymbol{x}\in \tilde{D}}^{\, }w_{\boldsymbol{x}}}\; \;\; \; \; \; (1\leq k\leq \left | \boldsymbol{y} \right |)

                                                                    \tilde{r}_{v} =\frac{\sum_{\boldsymbol{x}\in \tilde{D}^{v}}^{\, }w_{\boldsymbol{x}}}{\sum_{\boldsymbol{x}\in \tilde{D}}^{\, }w_{\boldsymbol{x}}}\; \;\; \; \; \; (1\leq v\leq \left | V \right |)

基于上述定义,信息熵、信息增益计算式推广为

                                                                        \mathrm{Ent}(\tilde{D})=-\sum_{k=1}^{\left | \boldsymbol{y} \right |}\tilde{p}_{k}\log _{2}\tilde{p}_{k}

                                                       \mathrm{Gain}(D,a)=\rho \times (\mathrm{Ent}(\tilde{D})-\sum_{v=1}^{V}\tilde{r}_{v}\mathrm{Ent}(\tilde{D}^{v}))

若样本\boldsymbol{x}在划分属性a上已知,则将\boldsymbol{x}划入与其取值对应的子结点,样本权值w_{\boldsymbol{x}}不变;否则,将\boldsymbol{x}同时划入所有子结点,且样本权值在属性值a^{v}对应的子结点中调整为\tilde{r}_{v}\cdot w_{\boldsymbol{x}}。直观地看,这就是让同一个样本以不同的概率划入到不同的子结点中去。


5 多变量决策树

    多变量决策树(multivariate decision tree)是能实现“斜划分”甚至更复杂划分的决策树。在实现“斜划分”的决策树中,飞叶结点不再是仅对某个属性,而是对属性的线性组合进行测试。与传统的单变量决策树(univariate decision tree)不同,在多变量决策树的学习过程中,不是为每个非叶结点寻找一个最优化分属性,而是试图建立一个合适的线性分类器。如下图所示


6 sklearn中的DecisionTreeClassifier类

    DecisionTreeClassifier的构造函数中有两个常用的参数可以设置:

    ● criterion:划分节点时用到的指标。有gini(基尼系数),entropy(信息增益)。若不设置,默认为gini
    ● max_depth:决策树的最大深度,如果发现模型已经出现过拟合,可以尝试将该参数调小。若不设置,默认为None

    和sklearn中其他分类器一样,DecisionTreeClassifier类中的fit函数用于训练模型,fit函数有两个向量输入:

    ● X:大小为[样本数量,特征数量]的ndarray,存放训练样本
    ● Y:值为整型,大小为[样本数量]的ndarray,存放训练样本的分类标签

    DecisionTreeClassifier类中的predict函数用于预测,返回预测标签,predict函数有一个向量输入:

    ● X:大小为[样本数量,特征数量]的ndarray,存放预测样本

    DecisionTreeClassifier的使用代码如下:

from sklearn.tree import DecisionTreeClassifier
clf = tree.DecisionTreeClassifier()
clf.fit(X_train, Y_train)
result = clf.predict(X_test)

未完待续......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值