决策树
罗斯.昆兰 - 是数据挖掘和决策论的计算机科学研究员。他发明了ID3算法和C4.5算法。
1 决策树算法—ID3
1.1 决策树的背景
决策树是一种常见的机器学习方法。决策树由根节点、内部节点、叶子节点和边组成。叶子节点对应每个决策结果,内部节点和根结点对应一个属性的测试。
1.2 ID3算法数学推导(离散变量)
在生成决策树的过程,会用到信息熵和信息增益:
信息熵(information entropy)是度量样本集合的纯度。假定当前样本集合 D 中第k类样本所占的比例为pk,则 D 的信息熵定义为:
Ent(D)=−|y|∑k=1pklog2pk
一般认为,熵值越大纯度越小,混乱程度越大。
注意:计算信息熵时,若p=0,则plog2p=0.
根据熵的定义计算每个分支的信息熵:
假设离散属性a有V个可能的取值{a1,a2,...,aV},若使用a来对样本集D进行划分,则会产生V个分支结点,其中第v个分支结点包含了D中所有在属性a上取值为av的样本,记为Dv.考虑到分支结点包含的样本数目不同,给予每个分支结点一个权重|Dv||D|,即样本数越多的分支结点的影响越大。下面是用属性a对数据集D进行划分所获得的信息增益(information gain)为:
Gain(D,a)=Ent(D)−V∑v=1|Dv||D|Ent(Dv)
一般,信息增益越大,则意味着使用属性a来划分所获得的纯度提升越大。
表一
ID |
年龄 |
有工作 |
有自己的房子 |
信贷情况 |
类别 |
1 |
青年 |
否 |
否 |
一般 |
否 |
2 |
青年 |
否 |
否 |
好 |
否 |
3 |
青年 |
是 |
否 |
好 |
是 |
4 |
青年 |
是 |
是 |
一般 |
是 |
5 |
青年 |
否 |
否 |
一般 |
否 |
6 |
中年 |
否 |
否 |
一般 |
否 |
7 |
中年 |
否 |
否 |
好 |
否 |
8 |
中年 |
是 |
是 |
好 |
是 |
9 |
中年 |
否 |
是 |
非常好 |
是 |
10 |
中年 |
否 |
是 |
非常好 |
是 |
11 |
老年 |
否 |
是 |
非常好 |
是 |
12 |
老年 |
否 |
是 |
好 |
是 |
13 |
老年 |
是 |
否 |
好 |
是 |
14 |
老年 |
是 |
否 |
非常好 |
是 |
15 |
老年 |
否 |
否 |
一般 |
否 |
属性集{年龄,有工作,有自己的房子,信贷情况}
标签集{9是,6否}
Ent(D)=−(915log2915+615log2615)=0.97
Ent(青年)=−(25log225+35log235)=0.97Ent(中年)=−(35log235+25log225)=0.97Ent(老年)=−(45log245+15log215)=0.72w青年=515w中年=515w老年=515Gain(D,年龄)=Ent(D)−13(0.97+0.97+0.72)=0.083
Ent(是)=−(05log205+55log255)=0Ent(否)=−(610log2610+410log2410)=0.97w是=515=13w否=1015=23Gain(D,有工作)=0.97−0.97×23=0.97×13=0.324
Ent(是)=−(06log206+66log266)=0Ent(否)=−(39log239+69log269)=0.917w是=615=25w否=915=35Gain(D,有自己的房子)=0.97−0.917×35=0.420
Ent(一般)=−(15log215+45log245)=0.72Ent(好)=−(46log246+26log226)=0.917Ent(非常好)=−(44log244+04log204)=0w一般=515w好=615w非常好=415Gain(D,信贷情况)=Ent(D)−(13×0.72+25×0.917)=0.97−0.6068=0.363
从上面计算可以看出,“有自己的房子”的属性划分数据集后的信息增益最大,所以选择“有自己的房子”作为根结点。
表二
(a)“没有房子”的列表
ID |
年龄 |
有工作 |
信贷情况 |
类别 |
1 |
青年 |
否 |
一般 |
否 |
2 |
青年 |
否 |
好 |
否 |
3 |
青年 |
是 |
好 |
是 |
5 |
青年 |
否 |
一般 |
否 |
6 |
中年 |
否 |
一般 |
否 |
7 |
中年 |
否 |
好 |
否 |
13 |
老年 |
是 |
好 |
是 |
14 |
老年 |
是 |
非常好 |
是 |
15 |
老年 |
否 |
一般 |
否 |
(b)“有房子”的列表
ID |
年龄 |
有工作 |
信贷情况 |
类别 |
4 |
青年 |
是 |
一般 |
是 |
8 |
中年 |
是 |
好 |
是 |
9 |
中年 |
否 |
非常好 |
是 |
10 |
中年 |
否 |
非常好 |
是 |
11 |
老年 |
否 |
非常好 |
是 |
12 |
老年 |
否 |
好 |
是 |
类别标记{6否,3是}
Ent(没房子)=−(39×log239+69×log269)=0.917
计算表二中每个属性的信息增益:
Ent(青年)=−(14×log214+34×log234)=0.8113Ent(中年)=−(02×log202+22×log222)=0Ent(老年)=−(23×log223+13×log213)=0.9183w青年=49w中年=29w老年=39Gain(没房子,年龄)=0.917−(49×0.8113+29×0+39×0.9183)=0.2503
Ent(是)=−(33×log233+03×log203)=0Ent(否)=−(06×log206+66×log266)=0w是=39w否=69Gain(没房子,年龄)=0.917−(39×0+69×0)=0.917
Ent(一般)=−(04log204+44log244)=0Ent(好)=−(24log224+24log224)=1Ent(非常好)=−(11log211+01log201)=0w一般=49w好=49w非常好=19Gain(D,信贷情况)=Ent(D)−(49×0+49×1+19×0)=0.4726
从上面计算可以看出,“有工作”的属性划分“没有房子”数据集后的信息增益最大,所以选择“有工作”作为没有自己房子的下一个结点。
下表是“有房子”的列表:
表三
ID |
年龄 |
有工作 |
信贷情况 |
类别 |
3 |
青年 |
是 |
好 |
是 |
13 |
老年 |
是 |
好 |
是 |
14 |
老年 |
是 |
非常好 |
是 |
表四
ID |
年龄 |
信贷情况 |
类别 |
1 |
青年 |
一般 |
否 |
2 |
青年 |
好 |
否 |
5 |
青年 |
一般 |
否 |
6 |
中年 |
一般 |
否 |
7 |
中年 |
好 |
否 |
15 |
老年 |
一般 |
否 |
参考文献:
周志华. 机器学习[M].北京:清华出版社,2016:73-93.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端