决策树算法_【手撕】决策树算法

news/2025/2/23 5:37:17

决策树算法就是寻找最优的划分选择x,然后根据x将数据划分开来,不断迭代,即可产生一颗完整的决策树。

一、划分选择

1.信息熵

信息熵,是一个描述样本“纯度”的量。信息熵越小,数据越纯。(熵这个概念通常的理解就是:熵越大,越混乱;熵越小,越单一)。

设样本为D,第k类所占比例

,那么样本D的信息熵定义为:

举个例子来说,若D中只有1类,则Ent(D)=0,已经到达最小了,即最纯的样本。若D中有2类,分别占1/2,那么Ent(D)为:

显然类别变多(数据变得不单纯),信息熵会变大。

2.信息增益——ID3算法采用的划分依据

对于数据中的所有特征属性A,某个属性为a,a的可能取值有V个,分别是

,例如对西瓜而言,若a表示“色泽”属性,a1表示“青绿”,a2表示“乌黑”,a3表示“浅白”,则V=3 。

表示在属性a上所有区值为
的所有数据。如果用上面所说的“色泽”来划分数据,则D1表示所有色泽为“青绿”的样本,显然如果一个
所对应的数据很多,它的影响力就很大,由此得到属性
的信息增益公式可以表达为:

的信息增益越大,那么使用
来划分数据集对“纯度”的提升越大。ID3采用信息增益来划分数据,目的是提升数据集信息纯度,当纯度最大时就可以全都划到一个类里面了。

即ID3算法用于划分的属性

为:

3.增益率——C4.5决策树使用的划分依据

信息增益存在的问题:对取值多的属性有偏好。

假设属性a的表示编号,若有10个样本,则属性a的取值就有10种可能,,若按a的取值划分

,则每一个子样本的信息熵为0,所以计算信息增益会很大,所以就会采用编号这个属性划分数据集,但这样做显然没有道理。

增益率的定义为:

IV(a)和信息熵的公式特别像,可以直观理解为是数据集划分后的信息熵,属性越多、划分的越多,则熵越大,则增益率就会变小,就平衡了只有信息增益而存在的问题。

但C4.5也不是单纯的使用信息增益,而是分为了2步:

step1:找信息增益高于平均值的属性。

step2:从上述挑选出的属性中找到增益率最高的属性来划分。

4.基尼指数——CART决策树使用的划分依据

即使用基尼值而不是信息熵来作判断,基尼值的定义为:

假设数据集D有12个数据,

Case1:分2类,每类6个

Gini(D)=0.5x0.5+0.5x0.5=0.5

Case1:分3类,每类4个

Gini(D)=0.33x0.66+0.33x0.66+0.33x0.66=1-3x0.33x0.33=0.66

基尼指数越小,数据越单纯。

基尼指数的定义为:

选择具有最小基尼指数的属性划分即可。

二、决策树的其它问题

1.剪枝问题——预防过拟合

预剪枝:在划分前,先将划分后和不划分的两种情况在验证集上做对比,再决定是否划分。

后剪枝:先生成决策树,从后往前考察划分后的准确率,再决定是否减掉。

2.连续值处理——离散化

C4.5采用二分法,即设连续值得取值包括x1,x2,,,xn,那先求出每两个点之间的中点,然后对每个中点求信息增益,最大的那一个中点当做划分依据,可以化为两半。

3.缺失值处理

如何找划分属性:采用没有缺失值的样本子集来评估划分依据。

如何对缺失样本划分:对于在属性上缺失的样本,同时划到所有子节点中,并改变该样本权重。

666adb09256e9176c4b981249f22afd9.png

欢迎关注我的公众号:慢慢学算法


http://www.niftyadmin.cn/n/927187.html

相关文章

python datetime 加一个月_python时间模块,如何让时间一次改变一个月?

展开全部 Python语言: Python中按月增加datetime 1653#codingutf-8 #from: import datetime # input datetime1, and an month offset # return the result datetime def datetime_offset_by_month(datetime1, n 1): # create a shortcut object for one day one_day datetim…

python做一个登录注册界面_python做一个登录注册界面的方法

python做一个登录注册界面的方法 发布时间:2020-08-21 10:37:05 来源:亿速云 阅读:111 作者:小新 这篇文章主要介绍python做一个登录注册界面的方法,文中介绍的非常详细,具有一定的参考价值,感兴…

python的random函数_python随机模块random的22种函数(小结)

前言 随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。平时数据分析各种分布的数据构造也会用到。 random模块,用于生成伪随机数,之所以称之…

python语言关键字finally_Python中try/except/finally关键字的使用,python,tryexceptfinally

和JAVA语言一样,Python也用try关键字来处理异常。 为什么处理异常非常重要呢? 主要原因 :很多操作只要‘尝试’了才知道会不会成功。比如, 用python打开一个txt文件,并把txt文件中的字符串转换成整型数 。 try的搭配通…

python 提取一个单词的所有字母_如何用python提取单词(正则表达式or分割)

“What brings u here today!”(今天什么风把你吹过来了!),相信大家也是遇到和我一样的难题了吧,想把字母提取出来很简单,但是想把整个单词(还不是相同的单词)给提取出来就有点困难了…

java使用xml存储数据_「爬虫四步走」手把手教你使用Python抓取并存储网页数据

爬虫是Python的一个重要的应用,使用Python爬虫我们可以轻松的从互联网中抓取我们想要的数据,本文将基于爬取B站视频热搜榜单数据并存储为例,详细介绍Python爬虫的基本流程。如果你还在入门爬虫阶段或者不清楚爬虫的具体工作流程,那…

骁龙芯片性能排行2020_急速快讯!手机芯片性能排行榜

阅读本文前,请您先点击上面的“ 蓝色字体”,再点击“关注”,这样您就可以继续免费收到文章了。每天都有分享,完全是免费订阅,请放心关注。 …

vba 定义类_excel编程系列基础:认识VBA的编辑器VBE

编按:哈喽,大家好!VBA实战入门教程第5篇,我们将从九九乘法表开始和结束今天的教程。之中,我们会认识VBE,也就是VBA代码的编辑器。VBE的基本概念、打开方式,以及它的布局和主要功能,它…