决策树(R语言)

决策树是有监督学习算法中的一种。基于属性做一系列的决策,每次决策要么进入下一级决策,要么生成最终结果。决策树可以作为集成算法中的基分类器,并且有最为广泛的应用。

决策树算法

要想理解决策树的工作原理,首先需要了解决策树的层次结构。决策树由结点与有向边组成,其中,结点分为如下三种:

  • 根结点:无入边,但有零条或多条出边
  • 内部结点:有一条入边和多条出边
  • 叶节点:有一条入边,无出边

每个叶节点都有一个类标号,根节点和内部结点包含属性测试条件,每个根节点和内部结点都对应一次条件判断,用来分开有不同特性的记录。对一条记录进行判断时,从根结点开始,根据判断进入相应分支,只到叶节点,叶节点的类别即为分类结果。比如,根据历史贷款记录预测贷款申请者是否会逾期,是否有房和婚姻状况作为属性,是否逾期作为类标号。历史数据如下:

序号

有房

婚姻状况

是否逾期

1

单身

2

已婚

3

单身

4

已婚

5

离异

6

已婚

7

离异

8

单身

9

已婚

根据历史贷款记录,可构造如下决策树:

当决策树构造好后,对未标记的记录进行分类就非常容易了。如使用以及构造好的决策树,对如下序号8这个人进行预测,可以知道,最终停在了未逾期这个节点。

序号

有房

婚姻状况

是否逾期

8

离异

Hunt算法是常用的用来建立决策树的算法,采用贪心策略,在选择划分数据属性时,采取一系列局部最优决策来构造决策树。他是C4.5,CART等决策树算法的基础。

Hunt算法流程

step1

Dt=与结点t相关联的训练记录集;

Y=类标号向量;

step2

if Dt中所有记录都属于同一个类Yt,则t为叶结点,并用Yt标注。

else if Dt中包含多个类记录,选一个属性测试条件,将记录分为更小的子集。对于测试条件的每个输出,创建一个子结点,并根据测试结果将Dt中记录分布到相应结点,对每个结点,递归调用此算法

R语言实现

通过R语言中的rpart包,对iris数据集进行分类。rpart包的处理方式:首先对所有自变量和所有分割点进行评估,最佳的选择是使分割后组内的数据更为“一致”(pure)。这里的“一致”是指组内数据的因变量取值变异较小。rpart包对这种“一致”性的默认度量是Gini值。确定停止划分的参数有很多(参见rpart.control),确定这些参数是非常重要而微妙的,因为划分越细,模型越复杂,越容易出现过度拟合的情况,而划分过粗,又会出现拟合不足。处理这个问题通常是使用“剪枝”(prune)方法。即先建立一个划分较细较为复杂的树模型,再根据交叉检验(Cross-Validation)的方法来估计不同“剪枝”条件下,各模型的误差,选择误差最小的树模型。(来源:百度)maptree包可以画出生成的决策树图,便于直观的对模型进行解释。

  • 导入包,用rpart函数训练决策树,并输出决策树结果,画出结构图。
formular<-Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width
fit<-rpart(formular, method = 'class', data = iris)
print(fit)
draw.tree(fit)

由图中结果,可以观察生成决策树的具体结构图,一般来说,处于越高层级的测试条件,有越高的重要性。因此,在进行特征选择时,可根据决策树的结果协助判断,这个特点也增加了决策树的可解释性。

  • 观察误差。建立决策树模型要考虑分组后变异小(CP),还要防止过拟合造成的大误差(Xerror),使两个参数都小则效果越好。如果树过于复杂,要剪枝。

#观察误差

printcp(fit)
#调用CP(complexity parameter)与xerror的相关图
plotcp(fit)
  • 剪枝。一种方法是找xerror最小点对应的CP值,由此CP值决定树的大小,另一种方法是用1SE法,找xerror+SE的最小点对应的CP值。

#用prune命令对树进行修剪

pfit<-prune(fit, cp = fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])

本例比较简单,因此剪枝后模型没有改变,当遇到复杂模型时,读者可根据相应情况观察前后结果变化。

特点

1,不需要先验假设,不需要属性和类服从一定的分布。

2,非线性分类边界。

3,对噪声有较好的鲁棒性。

4,有较好的解释性。

原文发布于微信公众号 - 机器学习养成记(chenchenwings)

原文发表时间:2018-02-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Gaussic

使用TensorFlow训练循环神经网络语言模型

读了将近一个下午的TensorFlow Recurrent Neural Network教程,翻看其在PTB上的实现,感觉晦涩难懂,因此参考了部分代码,自己写了...

29130
来自专栏决胜机器学习

从机器学习学python(四) ——numpy矩阵广播及一些技巧

从机器学习学python(四)——numpy矩阵广播及一些技巧 (原创内容,转载请注明来源,谢谢) 在学ng的深度学习微专业时,其中有几节课讲到numpy的一...

46440
来自专栏闪电gogogo的专栏

OMP算法代码学习

正交匹配追踪(OMP)算法的MATLAB函数代码并给出单次测试例程代码 测量数M与重构成功概率关系曲线绘制例程代码 信号稀疏度K与重构成功概率关系曲线绘制例程代...

35660
来自专栏AI研习社

如何使用注意力模型生成图像描述?

我们的目标是用一句话来描述图片, 比如「一个冲浪者正在冲浪」。 本教程中用到了基于注意力的模型,它使我们很直观地看到当文字生成时模型会关注哪些部分。

23220
来自专栏智能算法

决策树算法之----C4.5

1. C4.5算法简介 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法。它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性...

482120
来自专栏企鹅号快讯

使用RNN预测股票价格系列一

正文共11490个字,16张图,预计阅读时间:29分钟。 01 概述 我们将解释如何建立一个有LSTM单元的RNN模型来预测S&P500指数的价格。 数据集可以...

27890
来自专栏人工智能LeadAI

实现与优化深度神经网络

全连接神经网络 辅助阅读:TensorFlow中文社区教程 - 英文官方教程(http://www.tensorfly.cn/tfdoc/tutorials/m...

367110
来自专栏深度学习之tensorflow实战篇

Sklearn-train_test_split随机划分训练集和测试集

sklearn.model_selection.train_test_split随机划分训练集和测试集 官网文档: 一般形式: train_test...

44060
来自专栏本立2道生

滤波器——BoxBlur均值滤波及其快速实现

在数字图像处理的语境里,图像一般是二维或三维的矩阵,卷积核(kernel)和滤波器(filter)通常指代同一事物,即对图像进行卷积或相关操作时使用的小矩阵,尺...

17210
来自专栏悦思悦读

决策树告诉你Hello Kitty到底是人是猫

Hello Kitty,一只以无嘴造型40年来风靡全球的萌萌猫,在其40岁生日时,居然被其形象拥有者宣称:HelloKitty不是猫! 2014年八月,研究 H...

40570

扫码关注云+社区

领取腾讯云代金券