C++实现ID3决策树(UCI DNA数据集)

本文介绍了作者在使用UCI的DNA数据集进行机器学习实验时,如何用C++和Java实现决策树算法。文章详细阐述了数据预处理、熵和信息增益的计算、决策树的构建以及递归过程,并分享了在实现过程中遇到的bug和解决方法。最后,作者提到虽然代码实现过程中遇到了一些挑战,但还是成功实现了决策树的可视化并给出了代码链接。

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

本学期机器学习课程的第一个lab,数据集是用老师给的UCI的DNA数据集。由于本人惯用语言是C++和Java,所以python写机器学习项目有多香不太能体会。。
算法通俗易懂,写写全是bug。
一、DNA数据集
数据集:https://download.csdn.net/download/pvfeldt/16142737?spm=1001.2014.3001.5501
首先我们拿到数据集。有用的信息是这些。
在这里插入图片描述在这里插入图片描述
数据集最终的目的是通过前60个AGTC的排列,实现三个分类:分别是ie,ei和n。(看懂英文就行了,没生物背景没关系,我也不会,但这不影响我们分类)
在这里插入图片描述
数据集的组成是训练集有2000行,测试集有1186行。 每行有362列,其中第362列是一列‘;’号;第361列是分类的列(元素为1,2,3,1对应ei,2对应ie,3对应n);前360列是0/1数据,每两个数据之间用空格隔开,每三个数据代表一个字母(100代表A,010代表C,001代表G,000代表T)。
数据怎么处理成60+1列就不细讲了。
二、根节点的选取
说起来我一开始也在想着这个数据怎么才能决策树,后来跟朋友交流一下发现是这里的60列的每一列都是一个特性,好吧。
以下的公式都没有加乘号,加了会让这篇blog格式错乱。自行体会。
1.计算熵
我们总共要分三类,所以要分别计算出这三个类占了多少行。
设第1类占比为p1,第2类占比为p2,第3类占比p3。
熵的计算:Entropy(S)=-p1log2(p1)-p2log2(p2)-p3log2(p3)
2.计算信息增益
我们分别计算出来每列在A的条件下,A和第1类同时成立、A和第2类同时成立,A和第3类同时成立的占比;每列在T的条件下,T和第1类同时成立、T和第2类同时成立,T和第3类同时成立的占比;每列在G的条件下,G和第1类同时成立、G和第2类同时成立,G和第3类同时成立的占比;每列在C的条件下,C和第1类同时成立、C和第2类同时成立,C和第3类同时成立的占比。计算至此,不知道有没有人和我一样有种在算概率论里贝叶斯公式、全概率、条件概率的感觉。
然后各部分的熵和总的熵求法一样。
每列的信息增益:Gain(S,Feature)=Entropy(S)-SA/SEntropy(SA)-SG/SEntropy(SG)-ST/SEntropy(ST)-SC/SEntropy(SC)
此处Feature指AGTC。
3.计算信息增益最大的那一列作为决策树的根节点
三、决策树的递归
1.挑选子树数据集
根节点下分别有AGTC四个分支,分别将四个分支底下的数据集精简,如A分支下的为第root列(上一步求得的根节点index)为A的所有行等。
2.递归条件
(1)行为0或1,没得分了,返回
(2)行>1,分类都为同一个时,也是没得分了,返回
(3)行>1,但分类不都为同一个时,继续递归到(1)、(2)任一一个满足返回上一级的递归
四、树结构可视化(OpenCV)
1.可视化具体细节讲解
https://blog.csdn.net/pvfeldt/article/details/115339430?spm=1001.2014.3001.5501
2.实现出来的树结构图
别问,问就是丑哭我自己,向Python和Matlab势力低头。
请添加图片描述
五、完整代码
1.关于我自己遇到的奇怪bug总结
(1)熵和信息增益的计算
能想象bug出在初等数学上吗。
比如log2(x)的x=0了,报错了。
又比如在算信息增益的时候符合某列某特征的数量为0,所以分母为0了,nan导致节点index错误。甚至会使最终出来的树层数比理论大,多了很多奇怪的节点。
(2)递归的边界条件
之前对于“分到没法分”有种误解,以为只有两种情况:行为1,或者是行>1所有分类一样。但后来发现在某个节点死循环到溢出。。就发现有种情况也是“分到没法分”,这个时候行>1,但各个分类不一样,按照原来的递归就永远都是那么若干条。
我之前debug没发现本质问题是这个,因为卡断点看行为0这个判断根本没有走过,就比如符合A的行数已经没有了,就在进递归之前把它return了。然后这样操作就发现有些很底层的叶子节点没了。想了想是因为这样return了,本来同一层的G、T、C或许还有行,但是被我一起返回到了上一层,导致会有叶子节点没了。
2.代码
在实现算法的过程中,奇怪的bug一直在增加,sigh。
Github:https://github.com/pvfeldt/decision-tree-UCI-DNA
3.准确率
在这里插入图片描述

Over.

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值