机器学习 决策树的介绍和构造

决策树

在如今机器学习领域,树可以说是最为重要的模型,在提高模型的准确率上有巨大威力的XGboost 都是基于树模型的,随机森林(包括多个决策树的分类器)也是基于树模型。

树模型

  • 决策树,顾名思义就是和树一样,决策树从根结点开始一步步通过特征走到叶子节点
  • 所有的数据最终都会落到叶子节点上,即可以做分类也可以做回归

下图就是一个简单的树模型,想要找到喜欢打游戏的人,通过对年龄和性别这两个特别,对五个人进行决策,最后得到结果,五个人都落到了叶子节点上。

在这里插入图片描述

  • 训练阶段:从给定数据集构造出一棵树(从根节点开始选择特征)
  • 测试阶段:根据构造的树模型从上到下走一遍就行了

一旦构建好了 决策树,那么分类就很容易了,只需要走一遍就行了,那么难点就在于怎么构建一棵树,需要考虑的问题还有很多!

如何切分特征(选择节点)

  • 问题:根节点的选择该用哪个特征呢?接下去呢?如何划分呢?
  • 目标:通过一种衡量标准,来计算通过不同特征进行分支选择后的分类情况,找出来最好的那个当作根节点。

衡量标准-熵

  • :熵是表示随机变量不确定性的度量(熵值越大,越不稳定,熵值越低,越稳定)
    - 公式:

例子:
A集合{1,1,1,1,1,1,1,1,2,2}
B集合{1,2,3,4,5,6,7,8,9,1}
显然A的熵值要低,因为A只要两种类别,相别稳定一点,而B类别太多,熵值要高一点。
根据公式熵值的图如下
当P=0或者1时,H(P)=0,随机变量完美没有不确定性,很稳定
当P=0.5,H(P)=1,此时随机变量的不确定性最大(类型于抛硬币)
在这里插入图片描述

信息增益

信息增益:表示特征X使得类Y的不确定性减少的程度(比如你原来的数据中,数据的熵值是10,当你做完一个决策之后,熵值变成了8,我们就说信息增益是2,我们希望是信息增益越大越好)

下面我们来用信息增益构造一棵决策树(4个特征,天气,温度,湿度,风度,最后是标签)
在这里插入图片描述

问题来了,哪个是根节点呢?
我们要通过信息增益来构造一棵树我们先用熵值来看一看原来数据的混乱程度。根据公式,

  • 历史数据 14天中有9天打球,5天不打球,所以熵应为:

在这里插入图片描述

  • 4个特征逐一分析,先从outlook开始:

在这里插入图片描述
outlook=sunny 时,熵值为0.971
outlook=overcast时,熵值为0
outlook=rainy时,熵值为0.971

  • 根据数据统计,取值为sunny,overcast,rainy的概率分别为5/14 , 4/14 , 5/14
  • 熵值计算:5/14✖0.971 + 4/14✖0 + 5/14✖0.97 1 = 0.693
    (增益(temperature) = 0.029 , 增益(humidity) = 0.152 , 增益(windy) = 0.048 )
  • 系统的熵值从0.94下降到了0.693,增益为0.247
  • 其他特征的增益也可以算出来,这样先把信息增益最大的当作根节点,然后再用相同的方法找出子节点,这样一棵树就能陆陆续续构造出来了

决策树算法

  • ID3:信息增益(我们上面构造树的方法)
    我们想一下,用这种方法有没有什么坏处呢?
    如果有一列特征的数据是(1,2,3,4,5,6,7,8,9),进行决策,然后计算熵值,因为分类后分成9份,每份都只有一个数,这时会发现熵值为0,信息增益非常大,把他当作根节点,可是这样分完全没有意义,所以我们用下面的算法。

  • C4.5信息增益率(解决了ID3的问题,考虑了自身熵,信息增益/自身熵),需要注意,信息增益率对数目较少的属性有所偏好,所以一般通过下面三个步骤:

    • 计算信息增益
    • 选出信息增益高于它们平均值的属性
    • 计算信息增益率,选出最高
  • CART:使用GINI系数来做衡量标准(Gini系数类似于熵,Gini系数越小,数据越稳定,Gini系数越大,数据越混乱)。
    - GINI系数:
    无论是分类树还是回归树,CART都要选择使子节点的GINI值或者回归方差最小的属性作为分裂的方案。
    分类树:
    在这里插入图片描述
    回归树求方差(方差越大,表示该节点的数据越分散,预测的效果就越差。如果一个节点的所有数据都相同,那么方差就为0,此时可以很肯定得认为该节点的输出值;如果节点的数据相差很大,那么输出的值有很大的可能与实际值相差较大。):
    4ubmV0L3dlaXhpbl80MzE3MjY2MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
    在这里插入图片描述
    举一个例子:
    对于离散型属性,理论上有多少个离散值就应该分裂成多少个节点。但CART是一棵二叉树,每一次分裂只会产生两个节点,怎么办呢?很简单,只要将其中一个离散值独立作为一个节点,其他的离散值生成另外一个节点即可。这种分裂方案有多少个离散值就有多少种划分的方法,举一个简单的例子:如果某离散属性一个有三个离散值“学生”、“老师”、“上班族”,则该属性的分裂方法有{“学生”}、{“老师”,“上班族”},{“老师”}、{“学生”,“上班族”},{“上班族”}、{“学生”,“老师”,分别计算每种划分方法的基尼值或者样本方差确定最优的方法。
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

连续值

我们遇到的都是离散值,那遇到连续值怎么办?
比如下图,我们可以对数据进行分割,也就是‘离散化的过程’。

在这里插入图片描述

决策树剪枝策略

  • 为什么要剪枝:如果我们一直分下去,每个数据我们都能分得开,这样过拟合风险很大(就像每个叶子节点一个数据)
  • 剪枝策略:预剪枝,后剪枝
  • 预剪枝:边建立决策树边进行剪枝的操作(用得更多,更实用)
  • 后剪枝:当建立完决策树后来进行剪枝操作

预剪枝:

我们可以通过预剪枝来限制决策树过拟合
比如:限制深度,限制叶子节点个数,叶子节点样本数,信息增益率

后剪枝:

通过一定的衡量标准 (叶子节点越多,损失越大) (|Tleaf|是叶子节点个数)
在这里插入图片描述
当一棵树构造完,类似是这样子,可以通过可视化展示看你的决策树是什么样子的
在这里插入图片描述

总结

决策树是一种很实用的算法,很多模型都是基于决策树的,构造一颗决策树需要知道怎么构造一颗决策树,认识并知道信息增益是怎么计算的,还有信息增益率和Gini系数,并且遇到过拟合问题要知道通过剪枝来预防这种问题。

猜你喜欢

转载自blog.csdn.net/weixin_43172660/article/details/82995442