机器学习笔记(通俗易懂)---决策树算法介绍(6)---附完整代码

机器学习笔记—决策树算法介绍(6)—附完整代码

以下都是本人在学习机器学习过程中的一些心得和笔记,仅供参考。


  • 决策树是广泛用于分类和回归任务的模型。本质上,它从一层层的if/else问题中进行学习,并且得出结论!

如果你要区分四种动物:熊、鹰、企鹅和海豚,可以转换成一颗决策树来表示。

mglearn.plots.plot_animal_tree()

在这里插入图片描述

图为 区分几种动物的决策树

  • 在这张图中,树的每个节点代表一个问题或者一个包含答案的终结点(叶结点)。树的边将问题的答案与将问的下一个问题连接起来。

  • 用机器学习的语言来说就是,为了区分四类动物(熊、鹰、企鹅和海豚),我们利用三个特征(“有没有羽毛”,“会不会飞”,“有没有鳍”)来构建一个模型。


1.构造决策树

我们在下面的二维分类数据集上构造决策树,这个two_moons数据集由2个半月组成,每个类别都包含50个数据点。

  • 在机器学习中,用于分类的方法叫做测试
  • 数据通常不是像动物分类的例子那样具有二元特征(是/否)的形式,而是表示为连续特征
  • 用于连续数据的测试形式是:“特征i的值是否大于a?”
mglearn.plots.plot_tree_progressive()

在这里插入图片描述

图为 two_moos数据集


在这里插入图片描述

图为 深度为1的树的决策边界

  • 为了构造决策树,算法搜遍所有可能的测试,找出对目标变量来说信息量最大的那一个。

上图选出了第一个测试,将数据集在x[1]=0.0596处垂直划分可以得到最多信息,它在最大程度上将类别 0 中的点与类别 1 中的点进行区分。

右侧的决策树,通过测试 x[1] <=0.0596的真假来对数据集进行划分,在图中表示为一条黑线。

如果测试结果为真,那么将这个点分配给左结点,左结点里包含属于类别 0 的 2 个点和属于类别 1 的 32 个点。否则将这个点分配给右结点,右结点里包含属于类别 0 的 48 个点和属于类别 1 的 18 个点。


在这里插入图片描述

图为 深度为2的树的决策边界

尽管第一次划分已经对两个类别做了很好的区分,但底部区域仍包含属于类别 0 的点,顶部区域也仍包含属于类别 1 的点。我们可以在两个区域中重复寻找最佳测试的过程,从而构建出更准确的模型。

上图展示了信息量最大的下一次划分,这次划分是基于 x[0]做出的,分为左右两个区域。

这一递归过程生成一棵二元决策树,其中每个结点都包含一个测试。或者你可以将每个测试看成沿着一条轴对当前数据进行划分。这是一种将算法看作分层划分的观点。由于每个测试仅关注一个特征,所以划分后的区域边界始终与坐标轴平行。
对数据反复进行递归划分,直到划分后的每个区域(决策树的每个叶结点)只包含单一目标值(单一类别或单一回归值)。如果树中某个叶结点所包含数据点的目标值都相同,那么这个叶结点就是纯的(pure)。这个数据集的最终划分结果见下图。


在这里插入图片描述

图为 深度为9的树的决策边界

  • 想要对新数据点进行预测,首先要查看这个点位于特征空间划分的哪个区域,然后将该区域的多数目标值(如果是纯的叶结点,就是单一目标值)作为预测结果。从根结点开始对树进行遍历就可以找到这一区域,每一步向左还是向右取决于是否满足相应的测试。
  • 决策树也可以用于回归任务,使用的方法完全相同。预测的方法是,基于每个结点的测试对树进行遍历,最终找到新数据点所属的叶结点。这一数据点的输出即为此叶结点中所有训练点的平均目标值

2.控制决策树的复杂度

为什么要控制决策树的复杂度,就是防止过拟合。

  • 通常来说,构造决策树直到所有叶结点都是纯的叶结点,这会导致模型非常复杂,并且对训练数据高度过拟合。
  • 纯叶结点的存在说明这棵树在训练集上的精度是 100%。训练集中的每个数据点都位于分类正确的叶结点中。
  • 有的决策边界过于关注远离同类别其他点的单个异常点。

防止过拟合有两种常见的策略:

  • 预剪枝pre-pruning),及早停止树的生长
  • 后剪枝post-pruning)或剪枝pruning),先构造树,但随后删除或折叠信息量很少的结点

预剪枝的限制条件可能包括限制树的最大深度、限制叶结点的最大数目,或者规定一个结点中数据点的最小数目来防止继续划分。

scikit-learn 的决策树在 DecisionTreeRegressor 类和 DecisionTreeClassifier类中实现。D但是scikit-learn 只实现了预剪枝,没有实现后剪枝。


下面我们在乳腺癌数据集上更详细地看一下预剪枝的效果。运行代码如下:

In

from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
#加载数据
cancer = load_breast_cancer()
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值