决策树是一种层次分支结果,学习策略是分而治之。

树模型

决策树回归与分类差别 决策树是回归还是分类_结点


树模型是有监督学习类算法中应用广泛的分类模型,同时可应分于分类问题和回归分类问题的树模型常被称为分类树,用于解决回归类问题的树模型被称作回归树,模型本身课解释性非常强。

分类决策树模型表示一种基于特征对实例进行分类的树形结构(包括二叉树和多叉树)。

决策树由结点(node)和有向边(directed edge)组成,树中包含三种结点:

  • 根结点(root node):包含样本全集。没有入边,但有零条或多条出边;
  • 内部结点(internal node):对应于属性测试条件,恰有一条入边,和两条或多条出边;
  • 叶结点(leaf node)或终结点(terminalnode):对应于决策结果,恰有一条入边,但没有出边。

学习算法

决策树的学习算法是贪心算法,决策树的模型本身结构,根节点出发,对特征进行学习,最后叶节点只包含一个分类,不允许叶节点出现其他多个分类。

决策树学习算法包含特征选择、决策树的生成与决策树的剪枝。

特征选择:

决策树学习的关键在如何选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分类结点所包含的样本尽可能属于同一类别, 即结点的 "纯度"(purity)越来越高。在分类树中,划分的优劣用不纯度度量(impurity-measure)定量分析。

1.熵

决策树回归与分类差别 决策树是回归还是分类_决策树回归与分类差别_02


2.基尼

决策树回归与分类差别 决策树是回归还是分类_决策树_03


3误分类误差

决策树回归与分类差别 决策树是回归还是分类_决策树回归与分类差别_04


这些都可以推K>2到 类,并且给定损失函数,误分类误差可以推广到最小风险。

下图显示了二元分类问题不纯性度量值得比较, p表示属于其中1个类的记录所占的⽐例。从图中可以看出,三种方法都在类分布均衡时(即当 p=0.5时)达到最大值,当所有记录都属于同一个类时(p等于1或0)达到最小值。

决策树回归与分类差别 决策树是回归还是分类_决策树回归与分类差别_05


以熵为例,python代码如下:

决策树回归与分类差别 决策树是回归还是分类_数据集_06


熵用来计算当前数据集的不纯度,熵越高,信息的不纯度就越高,则混合的数据就越多。

信息增益(用于计算叶节点的选取)

我们可以知道决策树最终的优化目标使得叶结点的总不纯度最低,即对应衡量不纯度的指标最低。换而言之,就是要求父节点信息熵和子节点总信息熵之差要最大。

公式为:

决策树回归与分类差别 决策树是回归还是分类_数据集_07


父节点和子节点的不纯度下降数可由下述公式进行计算:

决策树回归与分类差别 决策树是回归还是分类_数据集_08


划分数据集:

划分数据集的最佳准则是选择最大信息增益,也就是信息下降最快的方向。

python代码实现如下:

决策树回归与分类差别 决策树是回归还是分类_结点_09


根据列切分数据集

通过最佳切分函数返回最佳切分列的索引,我们就可以根据这个索引,构建一个按照给定列切分数据集的函数。python代码如下:

决策树回归与分类差别 决策树是回归还是分类_结点_10

决策树的生成:

目前我们已经学习了从数据集构造决策树算法所需要的功能模块,其工作原理如下:得到原始数据集,然后基于最好的属性值划分数据集,由于特征值可能多余两个,因此可能存在大于两个分类的数据集划分。第一次划分之后,数据集被向下传递到树的分支的下一个结点。在这个结点上,我们可以再次划分数据,因此我们可以采用递归的原则处理数据集。
递归结束的条件是:

  • 程序遍历完所有划分数据集的属性
  • 每个分支下的所有实例都具有相同的分类
  • 当前结点包含的样本集合为空,不能划分
    在第2种情形下,我们把当前结点标记为叶结点,并将其类别设定为该结点所含样本最多的类别,任何到达叶结点的数据必然属于叶结点的分类;在第3种情形下,同样把当前结点标记为叶结点,但将其类别设定为其父结点所含样本最多的类别。
    ID3算法建立决策树
    核心是以信息增益准则作为特征选择,递归的构建决策树,具体方法是:
  • 从根结点开始,对结点计算所有可能的特征的信息增益
  • 选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点
  • 再对⼦结点调子以上方法,构建决策树
  • 直到所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树
    python代码如下:

决策树的剪枝
所谓剪枝是指在决策树中去除部分叶结点,决策树是天生过拟合的算法模型,剪枝是为了防止过拟合。
常见的剪枝策略有 ”预剪枝“(Pre-Pruning)和 ”后见枝“(PostPruning)

  • 预剪枝:在决策树生成的过程中,对每个结点在划分前先进⾏估计,如果当前的结点划分不能带来决策树泛化性能(预测性能)的提升,则停止划分并且将当前结点标记为叶结点。
  • 后剪枝:先训练生成一颗完整的树,自底向上对非叶结点进行考察,如果将该结点对应的子树替换 为叶结点能带来决策树泛化能力的提升,则将该子树替换为叶结点。
  • 决策树在sklearn中的实现:https://nbviewer.jupyter.org/github/xiaotaiyang08/123/blob/master/决策树在SKlearn中的实现.html