从sklearn的角度理解决策树

决策树

废话不多说直接看API:

from sklearn.tree import DecisionTreeClassifier

tree = DecisionTreeClassifier(criterion='gini', 
                              splitter='best',
                              max_depth=None,
                              min_samples_split=2,
                              min_samples_leaf=1,
                              min_weight_fraction_leaf=0,
                              max_features=None,
                              random_state=0,
                              max_leaf_nodes=None,
                              min_impurity_decrease=0,
                              min_impurity_split=None,
                              class_weight=None,
                              presort=False)

我们可以通过设置各种参数来构建优化决策树:

特征选择参数

1 criterion,指定决策树的特征选择方法,这里默认是基尼指数,除此之外,还有信息增益以及信息增益率。基尼指数:从数据集中随机抽取两个样本,其类别标记不一致的概率。基尼指数越小,数据集的纯度越高。那么如何选择这两个参数呢?一般而言,数据维度较高,噪音较多选择基尼指数;而当决策树的拟合程度不够时,可以尝试下使用信息熵(信息熵对不纯度更加地敏感)。

信息增益率的分母是基于不同的特征计算系统的熵。以颜色为例,颜色特征包含:浅白,乌黑,青绿。那么分母的熵分别在这三个颜色特征熵计算好瓜与坏瓜的熵。

随机性参数

2 splitter,指定每一个节点的划分方法,支持“best”和“random”

3 random_state,固定训练与测试的样本,避免每次的结果都不同

剪枝参数

4 max_depth,发现树的深度达到最大深度了,那么将当前节点作为叶子节点,停止继续划分。

5 min_samples_split,某个分裂节点的样本数目非常少,不适合继续分裂。

6 max_leaf_nodes,叶子节点的数目已经达到预先设置的阈值,不可继续划分,增加新的叶子节点。

7 min_samples_leaf,每一个叶子节点(不可划分)最少的样本数,可以是整数,也可以是浮点数,百分比样本数。

8 max_features,寻找最优划分的最大特征数。

9 min_impurity_decrease,通过特征选择方法,每一个决策的特征对决策结果的提升必须大于指定阈值。

10 min_impurity_split,早期停止的方法,防止过拟合,纯度提升比较少,就不再继续往下划分了。

样本不均匀参数

11 class_weight,解决样本不均匀的情况

12 presort,预排序,帮助找到最优的划分,但是对于大数据集来说会降低训练的速度

通过一个简单的栗子,我们来了解一下决策树,之前在学习决策树的时候,书本知识看了好几遍,但是并没有什么直观的感受,因此很快就会忘了。

数据集:

discrete_source =     [[1, 0, 0, 0, 0, 0],
                      [0, 0, 1, 0, 0, 0],
                      [0, 0, 0, 0, 0, 0],
                      [1, 0, 1, 0, 0, 0],
                      [2, 0, 0, 0, 0, 0],
                      [1, 1, 0, 0, 1, 1],
                      [0, 1, 0, 1, 1, 1],
                      [0, 1, 0, 0, 1, 0],
                      [0, 1, 1, 1, 1, 0],
                      [1, 2, 2, 0, 2, 1],
                      [2, 2, 2, 2, 2, 0],
                      [2, 0, 0, 2, 2, 1],
                      [1, 1, 0, 1, 0, 0],
                      [2, 1, 1, 1, 0, 0],
                      [0, 1, 0, 0, 1, 1],
                      [2, 0, 0, 2, 2, 0],
                      [1, 0, 1, 1, 1, 0]]
 target =     [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
'''
source中,每一列分别表示:色泽,根蒂,敲声,纹理,脐部,触感;每一列中的数值如下。
色泽:乌黑-0, 青绿-1, 浅白-2
根蒂:蜷缩-0, 稍蜷-1, 硬挺-2
敲声:浊响-0, 沉闷-1, 清脆-2
纹理:清晰-0, 稍糊-1, 模糊-2
脐部:凹陷-0, 稍凹-1, 平坦-2
触感:硬滑-0, 软粘-1
target中, 1表示好瓜,0表示坏瓜
'''

这里还是先上一张图,用图来解释:
在这里插入图片描述
在这里插入图片描述

根节点通过信息熵的方法,选取的特征为“纹理”,由条件“texture<=0.5”,将纹理特征为0的样本,以及纹理特征为1和2的样本划分成两个部分,样本数分别时9,8,在纹理为0的条件下,找到子样本(9个),通过这9个样本计算出导致信息增益最大的特征,继续上述的操作。在决策树的第三层,可以看到两个叶子节点,分别时通过“触感”以及“颜色”得到,当touch =0 时,即触感是硬滑的,表明是好瓜;然而,当颜色为青绿或者浅白时,都是坏瓜(当然这两个决策子是在纹理特征判断后的基础上,也就是说在纹理清晰的条件下,触感是硬滑的那么这个瓜是好瓜)。

上图结果基于西瓜书的数据,这里并没有进行剪枝等操作,可以看到在较为深层的叶子节点的样本数较少,也就是说越到深层的条件越严苛(限制条件较多),这会导致决策树模型的泛化性能不够理想,因此可以通过剪枝操作,使得网络模型更加地简洁高效,同时泛化性能也更加地好。

ok,来看一下结果:
在这里插入图片描述

这里,我们做了两个改动:

1 中间节点继续分裂节点的最小样本树设置为3

2 叶子节点的最少样本数为3,少于3

再次改动下:

1 中间节点继续分裂节点的最小样本树设置为3

2 叶子节点的最少样本数为3,少于2

在这里插入图片描述

对比两张图,可以发现,决策的样本特征并没有发生改变,变化的仅仅是样本的条件,得到符合要求的样本数。

西瓜数据中除了上述的颜色,触感等离散特征,还存在这连续属性的特征,如含糖量,密度。那么我们再使用一下这样的特征进行一次分类吧。首先,还是观察一下数据:

continous_source = [[.697, .46], [.774, .376], [.634, .264], [.608, .318],
                  [.556, .215], [.403, .237], [.481, .149], [.437, .211],
                  [.666, .091], [.243, .267], [.245, .057], [.343, .099],
                  [.639, .161], [.657, .198], [.36, .37], [.593, .042],
                  [.719, .103]]
target =     [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
'''
第一列表示西瓜的密度,第二列表示西瓜的含糖量
'''

直观地感受一下含糖量以及密度不同地西瓜的数据分布吧:

在这里插入图片描述
绿色的是好瓜,红色的是坏瓜,

在这里插入图片描述

增加了密度和含糖量这两个特征后,可以看到现在的决策特征,与之前相比发生了很大的变化,这里的离散特征只剩下根蒂,含糖量与密度特征,在决策树中都有所体现,保留下来的特征都是更有利于区分好瓜与坏瓜的特征,可见外表的特征对于判断西瓜的好坏还是不如内在的特征。

这里提出一个问题:

在进行上述的实验中,无论是离散特征还是连续特征,怎么选定这些特征的呢?

首先无论是离散特征还是连续特征,由于其特征值是已知的(如0,1,2可以依次选择0.5,1.5划分,不过这是离散值,可能存在问题,需要考虑下(貌似这里对离散值也是像连续值那样进行排序的),不过,假设这些特征是连续的,那么取中间值作为划分边界就不存在问题了),因此我们可以通过特征值将这些特征样本划分成两拨,然后对划分开的两拨样本计算基尼指数或者信息增益。

总结:

本文主要是通过sklearn的工具包,以西瓜数据为例,构建决策树,来划分好瓜与坏瓜,特征提取的准则主要包含基尼指数与信息熵(在sklearn工具包中,离散数据划分区间的方式与连续数据一致)。在构建决策树的过程中,可能会得到很多个分叉的中间节点,这往往会导致模型过拟合。而缓解过拟合的方法,可以通过剪枝的方式,减少决策树的枝杈,提高模型的泛化性能。

面对更加复杂的数据,单单使用一棵决策树是很难得到较好的拟合效果,因此,会使用到集成模型,而本文是集成模型的基础,集成模型简单来说,就是使用多个决策树分别从不同的角度去划分数据,拟合数据,以达到更好的结果。换话句话说:即,三个臭皮匠,顶个诸葛亮。

拟合。而缓解过拟合的方法,可以通过剪枝的方式,减少决策树的枝杈,提高模型的泛化性能。

面对更加复杂的数据,单单使用一棵决策树是很难得到较好的拟合效果,因此,会使用到集成模型,而本文是集成模型的基础,集成模型简单来说,就是使用多个决策树分别从不同的角度去划分数据,拟合数据,以达到更好的结果。换话句话说:即,三个臭皮匠,顶个诸葛亮。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值