Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >机器学习-决策树算法(ID3、C4.5和CART)

机器学习-决策树算法(ID3、C4.5和CART)

作者头像
唔仄lo咚锵
发布于 2023-05-23 02:42:24
发布于 2023-05-23 02:42:24
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

简介


决策树(Decision Tree)是⼀种树形结构,每个节点表示⼀个属性上的判断,每个分⽀代表⼀个判断结果的输出,最后每个叶节点代表⼀种分类结果,本质是⼀颗由多个判断节点组成的树。

类似if-else结构,通过若干判断(决策)来确定分类结果,比如打网球数据集中,包括天气、温度、湿度、风力四个特征,标签是play,表示是否适合打网球,属于二分类问题。

那我们便可以通过如下决策树进行预测是否适合打网球,先判断天气,再判断温度······,树中中间结点表示决策条件,叶子节点表示决策结果。

但是一个显然的问题是,我们应该如何确定判断条件的先后?比如上图中是先判断天气,若天气晴天再判断温度,再判断风力等,如果交换判断条件,将会直接影响分类结果。也就是我们需要定义划分依据,确定当前使用哪个特征值来作为划分依据,有了划分依据便可以构建决策树。划分依据包括ID3算法、C4.5算法和CART算法。

划分依据

ID3算法


ID3算法全称Iterative Dichotomiser 3,使用信息增益来作为划分依据,信息增益(information gain)就是划分数据集前后熵(information entropy)的差值。

物理学中,熵用来度量混乱程度。也就是说,熵越大则越乱,熵越小则越有序。我们希望决策条件划分出来的结果尽可能的属于同一类,即结点的“纯度”越来越高。

假设样本集合

D

共有

N

类,

pk

表示样本集合

D

中第

k

类样本所占比例,

D

的信息熵

H(D)

的定义如下:

H(D)=Nk=1pklog2pk

由于比例

pk

取值(0,1),而log函数在(0,1)间为负,添加负号,使熵的值为正。

H(D)

的值越小,则

D

的纯度越高。 比如对于outlook特征值,14天中有5天Sunny、5天Rain、4天Overcast,则

H(outlook)=(514log2514+514log2514+414log2414)=1.58

特征

A

对数据集

D

的信息增益

G(D,A)

,定义为集合

D

的信息熵

H(D)

与特征

A

给定条件下

D

的信息条件熵

H(D|A)

之差,即:

Gain(D,A)=H(D)H(D|A)=H(D)Vv=1|Dv||D|H(Dv)

其中特征

A

V

个取值,即用

A

对数据集

D

来划分会产生

V

个分支,用

Dv

表示第

v

个分支中数据集

D

在特征

A

上取到第

v

个值的样本。信息增益表示得知特征X的信息⽽使得类Y的信息熵减少的程度。

比如特征

outlook

取值

sunny

时,5天

sunny

中有2天正例(yes,适合打网球),3天负例,则

H(outlooksunny)=(25log225+35log235)=0.97

同理有:

H(outlookrain)=(35log235+25log225)=0.97
H(outlookovercast)=(44log244+00log200)=0

则特征

outloook

的信息增益

G(D,outllok)=1.58(514×0.97+514×0.97+414×0)=0.24

同样的,计算其他特征的信息增益:

Gain(D,temp)=0.02
Gain(D,humidity)=0.15
Gain(D,wind)=0.05
Gain(D,outllok)

最大,所以选择

outlook

作为决策条件,根据其3个取值,将数据集

D

划分为3个数据集

D1

D2

D3

,然后分别在新数据集中,计算剩余特征的信息增益,选信息增益最大的作为下一个决策条件,以此类推。当数据集全部属于一个类时,则作为叶节点,不再往下划分。 最终得到决策树如下:

但是ID3有存在缺点,总是偏向于取值更多的特征值。比如若将

day

作为特征值,则

H(day)=(114log2114×14)=3.8
H(dayD1)=H(dayD2)=...=H(dayD14)=(11log211+01log201)=0
Gain(D,day)=3.8

day

的信息增益最大,因为取值多的特征值对应条件熵趋于0,导致信息增益很大,有些情况下,这些特征值并不会提供太大价值。

C4.5算法


C4.5算法使用信息增益率作为划分依据,避免了ID3的缺点。增益率定义为:

Gain_ratio(D,A)=Gain(D,A)IV(A)

也就是将信息增益

Gain

除以一个固定值(intrinsic value)

IV

,如果特征值的取值数目越多,则

IV

越大。

IV(A)=Vv=1|Dv||D|log2|Dv||D|

比如:

IV(day)=(114log2114×14)=3.8
IV(outlook)=(514log2514+514log2514+414log2414)=1.58

C4.5算法不是直接选择增益率最大的特征,而是在信息增益超过平均增益的特征中,再筛选增益高的特征。

CART算法


CART(classification and regression tree)算法使用基尼指数(Gini Index)作为划分依据。

不再使用熵来定义数据集的纯度,而是使用基尼值来度量数据集纯度:

仍以打网球数据集

为例,14天中有5天不适合打网球,9天适合打网球,则数据集纯度:

基尼值反映随机抽取两个样本,其类别不一致的概率。即基尼值越小,数据集纯度越高。定义基尼指数:

若根据outlook来划分,14天中有5天Sunny(2正3负)、5天Rain(3正2负)、4天Overcast(4正0负),则:

同理,算其他特征的基尼指数:

也就是说,选择基尼指数最小的

特征作为决策条件,然后划分新数据集,往下迭代。

CART全称为分类和回归树,还可以实现回归任务,将基尼指数换成误差平方和,最后预测值与真实值满足一定误差内便可接受。因为一个特征的纯度越高,则方差越小,表示分布集中,即每次选择误差平方和最小的特征作为决策条件即可,照葫芦画瓢,不再赘述。

上述3种算法都是单变量决策,也就是判断条件只有一个(A)。实际上还有多变量决策树,也就是判断条件是多个(A&B),不再选择一个特征,而是一组特征。相应的决策树会更复杂,开销越更大,比如OC1算法,这里不多介绍。

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

处理连续值


打网球数据集中全是离散值,那对于连续值又该如何处理?

比如下表数据集,A和B是两个连续值特征,Y是标签。

A

B

Y

1

2

yes

3

6

no

4.6

8

no

6

4

yes

假定特征

在数据集

上有

个不同取值,排序后记为

,将每相邻2个取值的均值作为一个分割点

比如对于特征值A来说,排序后得到{1,3,4.6,6},分割点

比如对于特征值B来说,排序后得到{2,4,6,8},分割点

。 也就是将连续值离散化,得到上述3个离散值,根据是否小于该值来划分,只有C4.5算法和CART算法可以使用连续值,再选择基尼指数最小的分割点来分割该特征,然后再选择基尼指数小的特征作为划分依据。

比如对应分割点

,特征A分为2个子集

,记为

,计算基尼指数:

类似的,计算其他分割点:

故说特征A可以选分割点2或5.4,

对于特征B:

故特征B应选分割点5,

然后决策选择特征A还是特征B作为划分依据:

故选择特征B作为划分依据。

剪枝


剪枝主要是为了解决过拟合的问题,包括预剪枝和后剪枝两种。

  • 预剪枝

预剪枝是在划分决策树之前进行剪枝,列举几种方法。

(1)指定结点所包含的最⼩样本数⽬。当结点总样本数⼩于该值时则不再分。 (2)指定树的深度。当树的最⼤深度大于该值时则往下不再划分。 (3)指定叶子节点个数。当叶子节点树大于该值则不再划分。 (4)指定叶子节点所含最小样本数。当叶子节点所含样本小于该值时,则会和兄弟叶子节点一起被剪枝。

往往使用预剪枝更多。

  • 后剪枝

后剪枝是在已⽣成的决策树上进⾏剪枝。

得到决策树后,便可以验证精度,然后依次将某些中间结点剪枝掉,再计算精度,若精度提高了则剪枝该结点,反之不剪枝。

应用示例


使用sklearn中封装的DecisionTreeClassifier()函数构建决策树,包括主要参数:

  • criterion 划分依据,可取gini(默认)或"entropy",即CART算法或ID3算法。
  • min_samples_split 结点所包含的最⼩样本数⽬,默认2,即预剪枝方法(1)。
  • max_depth 决策树最⼤深度,即预剪枝方法(2)。
  • max_leaf_nodes 最大叶子节点数,即预剪枝方法(3)。
  • min_samples_leaf 叶⼦节点最少样本数,默认1,即预剪枝方法(4)。
  • random_state 随机数种⼦。

例1. ID3算法 在Kaggle中下载打网球数据集,最后使用在线Graphviz可视化决策树。

代码语言:javascript
代码运行次数:0
复制
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz

# 读数据
data = pd.read_csv('D:\\play_tennis.csv')
x = data[['outlook', 'temp', 'humidity', 'wind']]
y = data['play']
# 数据处理
transfer = DictVectorizer(sparse=False)
x = transfer.fit_transform(x.to_dict(orient="records"))  # 转为onehot
# 创建模型
estimator = DecisionTreeClassifier(criterion="entropy",max_depth=3)  # 使用ID3,最大深度3
estimator.fit(x, y)  # 训练
# 数据太少了,就没有测试和评估
# 可视化,保存为.dot文件
export_graphviz(estimator, out_file="D:\\tennis.dot",
                feature_names=['Outlook_overcast', 'Outlook_rain', 'Outlook_sunny', 'Temperature_cool',
                               'Temperature_hot', 'Temperature_mild', 'Humidity_high', 'Humidity_normal', 'Windy_waek',
                               'Windy_strong'])

例2. CART算法-分类 使用自带鸢尾花数据集,4特征3分类。

代码语言:javascript
代码运行次数:0
复制
from sklearn.datasets import load_iris
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz

iris = load_iris()  # 读数据集
x = iris.data
y = iris.target
# 划分训练集测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=20221020)
# 创建模型
estimator = DecisionTreeClassifier(max_depth=4, min_samples_split=3)  # 最大深度4,最小样本数3
estimator.fit(x_train, y_train)  # 训练
y_pred = estimator.predict(x_test)  # 测试
print(classification_report(y_test, y_pred))  # 评估
# 可视化
export_graphviz(estimator, out_file="D:\\iris.dot",
                feature_names=["sepal length", "sepal width", "petal length", "petal width"])

例3. CART算法-回归

代码语言:javascript
代码运行次数:0
复制
import numpy as np
from matplotlib import pyplot as plt
from sklearn.tree import DecisionTreeRegressor,export_graphviz

np.random.seed(20221021)
X = np.linspace(0, 5, 100)  # 生成数据
y = X ** 2 + 5 + np.random.randn(100)
x = X.reshape(-1, 1)
# 创建模型
estimator = DecisionTreeRegressor(max_depth=5, max_leaf_nodes=10)  # 最大深度5,最多叶子10
estimator.fit(x, y)  # 训练
y_pred = estimator.predict(x)  # 测试
# 可视化
export_graphviz(estimator, out_file="D:\\乌七八糟\\refression.dot", feature_names=["x"])
plt.scatter(X, y, color='lightblue')
plt.plot(x, y_pred, color='red')
plt.show()

回归效果其实并不好,不是过拟合就是阶梯状。

原创不易,请勿转载本不富裕的访问量雪上加霜 ) 博主首页:https://wzlodq.blog.csdn.net/ 来都来了,不评论两句吗👀 如果文章对你有帮助,记得一键三连❤

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
决策树(ID3,C4.5,CART)原理以及实现
决策树是一种基本的分类和回归方法.决策树顾名思义,模型可以表示为树型结构,可以认为是if-then的集合,也可以认为是定义在特征空间与类空间上的条件概率分布.
用户1631856
2018/12/17
8790
决策树算法:ID3,C4.5,CART
其实用一下图片能更好的理解LR模型和决策树模型算法的根本区别,我们可以思考一下一个决策问题:是否去相亲,一个女孩的母亲要给这个女海介绍对象。
大数据技术与机器学习
2019/11/20
1.3K0
决策树算法:ID3,C4.5,CART
三种决策树算法(ID3, CART, C4.5)及Python实现
决策树是属于机器学习监督学习分类算法中比较简单的一种,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。
YingJoy_
2018/03/11
21.4K2
三种决策树算法(ID3, CART, C4.5)及Python实现
最常见核心的决策树算法—ID3、C4.5、CART(非常详细)
决策树是一个非常常见并且优秀的机器学习算法,它易于理解、可解释性强,其可作为分类算法,也可用于回归模型。本文将分三篇介绍决策树,第一篇介绍基本树(包括 ID3、C4.5、CART),第二篇介绍 Random Forest、Adaboost、GBDT,第三篇介绍 Xgboost 和 LightGBM。
Datawhale
2019/11/05
5.8K0
最常见核心的决策树算法—ID3、C4.5、CART(非常详细)
独家 | 手把手教你推导决策树算法
决策树是最重要的机器学习算法之一,其可被用于分类和回归问题。本文中,我们将介绍分类部分。
数据派THU
2020/06/12
6690
西瓜书4-决策树
从西瓜书和统计学习方法中学习了决策树的相关知识,同时在网上查找了树的知识点,最重要的是二叉树和树3种的遍历方式
皮大大
2021/03/02
1.1K0
决策树之ID3、C4.5、C5.0等五大算法及python实现
版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/47617801
悟乙己
2019/05/28
2.6K0
决策树算法之----C4.5
1. C4.5算法简介 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法。它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类。C4.5的目标是通过学习,找到一个从属性值到类别的映射关系,并且这个映射能用于对新的类别未知的实体进行分类。 C4.5由J.Ross Quinlan在ID3的基础上提出的。ID3算法用来构造决策树。决策树是一种类似流程图的树结构,其中每个内部节点(非树叶节点)表示在一个属性上的测试,每个分枝代
智能算法
2018/04/03
1.5K0
决策树算法之----C4.5
决策树学习笔记(二):剪枝,ID3,C4.5
推荐导读:本篇为树模型系列第二篇,旨在从最简单的决策树开始学习,循序渐进,最后理解并掌握复杂模型GBDT,Xgboost,为要想要深入了解机器学习算法和参加数据挖掘竞赛的朋友提供帮助。
1480
2019/07/15
1.1K0
决策树学习笔记(二):剪枝,ID3,C4.5
【机器学习】算法原理详细推导与实现(七):决策树算法
在之前的文章中,对于介绍的分类算法有逻辑回归算法和朴素贝叶斯算法,这类算法都是二分类的分类器,但是往往只实际问题中
机器学习和大数据挖掘
2020/08/24
4000
【机器学习】算法原理详细推导与实现(七):决策树算法
决策树(Decision Tree)C4.5算法
C4.5,是机器学习算法中的另一个分类决策树算法,它是决策树(决策树也就是做决策的节点间的组织方式像一棵树,其实是一个倒树)核心算法,也是上节所介绍的ID3的改进算法,所以基本上了解了一半决策树构造方法就能构造它。
统计学家
2019/04/08
1.7K0
决策树(Decision Tree)C4.5算法
【一分钟知识】决策树-ID3,C4.5,CART
决策树是一种自上而下,对样本数据进行树形分类的过程,由节点和有向边组成。节点分为内部节点和叶子节点,其中每个内部节点表示一个特征或属性,叶子节点表示类别。决策树常用于分类问题于回归问题,完全生长的决策树模型具有简单直观、解释性强的特点。
zenRRan
2019/08/15
1.2K0
【一分钟知识】决策树-ID3,C4.5,CART
机器学习算法之决策树
"语言艺术是以善意为基础。变相的讽刺,拐弯抹角的谩骂,体现的不是机灵,而是素质问题,毕竟谁都不是傻瓜。
小闫同学啊
2020/02/26
6440
决策树
输入: 训练集:D= \{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\} ;属性集:A= \{a_1,a_2,..,a_d\} 。
花鸣溪
2019/11/28
9130
决策树
常用决策树算法
再使用某一特征A对数据及逆行分类后,其不确定度会减少(已经进行过一定程度的分类),此时的信息熵也会减小。假设特征A 将数据分为
Steve Wang
2023/10/12
2630
决策树及ID3算法学习
决策树是一种用树形结构来辅助行为研究、决策分析以及机器学习的方式,是机器学习中的一种基本的分类方法。
Techeek
2018/03/19
3.3K13
决策树及ID3算法学习
决策树之剪枝原理与CART算法
继续关于决策树的内容,本篇文章主要学习了决策树的剪枝理论和基于二叉树的CART算法。主要内容:
用户1147447
2019/05/26
3K0
好记忆的机器学习面试--决策树
其实用一下图片能更好的理解LR模型和决策树模型算法的根本区别,我们可以思考一下一个决策问题:是否去相亲,一个女孩的母亲要给这个女海介绍对象。
mantch
2019/07/30
4680
好记忆的机器学习面试--决策树
决策树:最清晰明了的分类模型
决策树属于监督学习算法的一种,根据原始输入数据中的特征,构建一个树状模型来进行分类。比如探究早晨是否出去打网球的例子,输入数据如下
生信修炼手册
2021/03/10
6720
决策树:最清晰明了的分类模型
机器学习_分类_决策树
叶子节点:存放决策结果 非叶子节点:特征属性,及其对应输出,按照输出选择分支 决策过程:从根节点出发,根据数据的各个属性,计算结果,选择对应的输出分支,直到到达叶子节点,得到结果
AomanHao
2022/01/13
9520
相关推荐
决策树(ID3,C4.5,CART)原理以及实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验