数学英语计算机决策树,读书笔记(2) | 决策树算法及应用

本文详细介绍了决策树的基本概念、数学原理以及构建过程,包括信息增益、熵等核心概念。通过递归构建决策树,展示了如何利用Python实现决策树算法。此外,还通过隐形眼镜选择的例子展示了决策树的应用,并探讨了过度匹配问题和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1

决策树

决策树∈分类算法∈监督学习∈机器学习

1.1数学原理

决策树是一种简单高效并且具有强解释性的模型,广泛应用于数据分析领域。其本质是一颗由多个判断节点组成的树,可以是二叉树或非二叉树。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。

使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

上篇推文中KNN算法可以完成很多分类任务,但是它最大的缺点就是无法给出数据的内在含义,决策树的主要优势就在于数据形式非常容易理解。

6aa5434e86812d638bc137bc2f5740ac.png

1.2决策树的构造

(1)信息增益和划分数据集

划分数据集的大原则是:将无序的数据变得更加有序。划分数据集可以根据数据的多个属性来划分,那根据哪个属性来划分是最好的?由此我们引入信息增益的概念,即在划分数据集前后信息发生的变化,对每个属性划分数据集的结果计算一次信息增益,然后判断按照哪个属性划分数据集是最好的划分方式。而计算信息增益就要用到香农熵或者简称为熵。

熵定义为信息的期望值,公式为:

2715eb372aa6b71cae439ca6b8d747b0.png

其中n是分类的数目,p(xi)是选择该分类的概率,-log2p(xi)是该分类的信息,计算所有类别所有可能值包含的信息期望值便得到熵。

(2)递归构建决策树

构造决策树其工作原理如下:得到原始数据集,然后采用递归思想多次基于最好的属性值来划分数据集,得到决策树。由于每次划分数据集时属性值可能多于两个,因此可能存在大于两个分支的数据集划分。递归结束的条件是①程序遍历完所有划分数据集的属性;或者②每个分支下的所有实例都具有相同的分类。

2

决策树算法实现

2.1导入数据集

算法实现:

2ad4fab7856645dc9c2a8d5f93fddccc.png

运行结果:

c4d4621059855ee61f77f183195f654b.png

2.2计算香农熵

算法实现:

c2fdab6a45bbd59896b0831a7ee0126b.png

运行结果:

408456ab980c7d01b92a0998eee5b779.png

函数说明(一)

e60d7c83ddef723acff2278294cea81e.png

【1】log函数,需要引入math模块中的log函数。语法为log(x,base),其中:

①x表示数值表达式;

②base表示底数,默认为 e。

算法示例:

54e4fd3bf042f184a372307332c27e5e.png

运行结果:

3433ffc672d60e3a10157cc8bedb069e.png

【2】math模块的其他常用方法包括

6c8394f3ce5bfcb9ba3350c9e1e1bd5b.png

【3】len(s)——用于返回对象s(字符、列表、元组等)长度或项目个数。

算法示例:

af892281a2d48ab92fc57d54e445641e.png

运行结果:

3f67d0d5d220fc15d71493380e90dbc0.png

2.3划分数据集

算法实现:

a9d3bff415833ba27714a9b71b46c6bd.png

运行结果:

54235db352a6d6937664bac58532c111.png

函数说明(二)

e60d7c83ddef723acff2278294cea81e.png

【1】访问列表

list[i]——访问列表正数第i+1个值

list[-i]——访问列表倒数第i个值

list[i:j]——访问列表正数第i+1到第j+1个值

算法示例:

519c36bbefcf28413a2c4225d09b6f20.png

运行结果:

37f116febbc52f3122629ea4c1ebc7e3.png

除此之外,如果列表中的元素也是列表的话,可以通过list[i][j]求出list第i+1个列表中第j+1个元素。

算法示例:

d9b93ff6e86ea105c96889e8345527f1.png

运行结果:

1f2eec2257f66a571a80aec33e07cbf4.png

【2】更新列表

append(x)——添加x这个列表

extend(x)——添加列表x中的值

算法示例:

273de013444b6f49479fd5d9df90859c.png

运行结果:

540d38645ac4894841216973ab6c884c.png

【3】删除列表元素

del list[i]——删除第i+1个元素

a1583bf9d5e4940d7e6e878407512649.png

运行结果:

47477a3ac2e9d9b948c202bd17653c88.png

2.4 选择最佳数据集划分方式

算法实现:

cecab333444890efbd1714c2c996a082.png

函数说明(三)

e60d7c83ddef723acff2278294cea81e.png

【1】set(x)——将对象x转换为集合类型

算法示例:

cd90ce68baa8bc7962b69cdec66642cf.png

运行结果:

390f6b25b5de682fa0e038f31396a783.png

【2】float(x)——将对象x转换为float类型

算法示例:

f12e9258b78292d332759f8a1c3ca757.png

运行结果:

2d0852af05e0c23b70096a5cc966b86a.png

2.5构造决策树

算法实现:

634a17b94e965cafedcb06c9aa41abc7.png

函数说明(四)

e60d7c83ddef723acff2278294cea81e.png

【1】operator模块

因为这里需要用到itemgetter,所以需要导入operator模块。operator.itemgetter(item)——返回一个可调用的对象,如果指定了多个item,返回查找值的元组。

算法示例:

f84ddc6b92f4983a5cf4b76c8e3901ad.png

运行结果:

e005ea0275ecd6768416ac74bee32936.png

【2】count()——统计字符串里某个字符出现的次数。

语法为:str.count(sub, start= 0,end=len(string))。其中:

①sub表示待搜索的子字符串;

②start 表示字符串开始搜索的位置。默认为第一个字符(索引值为0);

③end表示字符串中结束搜索的位置。字符中第一个字符的索引为 0。默认为字符串的最后一个位置。

算法示例:

71e6af8dc3fd28f88cd92a369a3738ce.png

运行结果:

efcb8d5ebedbcc2853168cb54b185315.png

2.6 输入新数据测试决策树算法

算法实现:

7053c0a9eb8b53f1d357605f98a6aaba.png

运行结果:

ab23c3af3f3d4c3b1186ed0319a377c1.png

函数说明(五)

e60d7c83ddef723acff2278294cea81e.png

【1】 keys()——以列表方式返回一个字典所有的键。

算法示例:

e6ebe5387e95b0c014f8c8be9b495271.png

运行结果:

629e484ba720fa77c431f78bc2821fa2.png

【2】index(str)—返回子字符串str的开始索引值。基本语法为str.index(str, beg=0, end=len(string)),其中:

①str表示检索的字符串;

②beg表示开始索引,默认为0;

③end表示结束索引,默认为字符串的长度。

算法示例:

9c2b7c86a4cce8ca7de50840761ae44e.png

运行结果:

60f48153fefa82095c6d5902de0bf0c9.png

【3】type(x)——返回对象x的数据类型

算法示例:

cbcc2f97a9818672a9096c1ec46d9e5a.png

运行结果:

c801e391afc00354ebb93dd9cc05f64d.png

3

决策树应用

下面我们通过一个隐形眼镜选择的例子来应用前面构造的决策树,从而预测患者需要佩戴的隐形眼镜类型。使用小数据集,我们就可以利用构造的决策树学到很多知识,如眼科医生是如何判断患者需要佩戴的镜片类型;一旦理解了决策树的工作原理,我们甚至可以帮助人们去判断需要佩戴的镜片类型。

3.1 数据分析

隐形眼镜数据集是非常著名的数据集,它包含很多患者眼部状况的观察条件以及医生推荐的隐形眼镜类型。隐形眼镜类型包括“硬材质(hard)”、“软材质(soft)”以及“不适合佩戴隐形眼镜(no lenses)”。我们的数据集存在“lenses.txt”这个文本文件中,如下图:

bd9ec6b81814402b858b9c4b253758bd.png

可以看到我们的数据分为五列,前四列为数据属性列,描述患者眼部状况,每个属性有不同的分支条件;最后一列是适合佩戴的眼镜类型。前四列对应的数据属性和分支条件见下表:

6dc77621dcbfaa0a7e8f51a20ac42ccd.png

3.2 代码实现

算法实现:

278ff618985a123d37bd6329cec44b96.png

运行结果:

f123839373dae52b82e133afd0c12a6a.png

函数说明(六)

e60d7c83ddef723acff2278294cea81e.png

【1】open()——用于打开一个文件

函数语法:open(name[, mode[, buffering]])。其中:

①name:表示用字符串表示的文件名;

②mode:表示打开文件的模式:只读(r),写入(w),追加(a)等。所有的可取值见如下列表,默认文件访问模式为只读(r);

③buffering:如果 buffering 的值被设为 0,就不会有寄存;如果 buffering 的值取 1,访问文件时会寄存行;如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小;如果取负值,寄存区的缓冲大小则为系统默认。

eb94228b2f08055b9af858bd91ad41ac.png

【2】strip()——用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。

注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。

基本语法:str.strip([chars])

算法示例:

146d9b8cc5d082146a13cb022f78a654.png

运行结果:

d81f18fe475917f1cca782f151d9b49e.png

【3】split()——通过指定分隔符对字符串进行切片

基本语法:str.split(str="", num=string.count(str))。其中:

①str为分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等;

②num为分割次数。

算法示例:

9ae28333365a903f9f614a6237a15f70.png

运行结果:

d4b43ca49dcf0074234e3baed981edd4.png

3.3 总结

决策树非常好地匹配了实验数据,然而这些匹配选项可能太多了,我们将这种问题称之为过度匹配。为了解决过度匹配问题,我们可以裁剪决策树,去掉一些不必要的叶子节点,即如果叶子节点只能增加少许信息,则可以删除该节点,并将它归入到其他叶子节点中。我们后续介绍的另一个决策树构造算法 CART将进一步讨论这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值