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

本学期机器学习课程的第一个lab,数据集是用老师给的UCI的DNA数据集。由于本人惯用语言是C++和Java,所以python写机器学习项目有多香不太能体会。。
算法通俗易懂,写写全是bug。
(目前只贴讲解,代码晚点贴)
一、DNA数据集
数据集:https://download.csdn.net/download/pvfeldt/16142737?spm=1001.2014.3001.5501
首先我们拿到数据集。有用的信息是这些。
C++实现ID3决策树(UCI DNA数据集)_第1张图片C++实现ID3决策树(UCI DNA数据集)_第2张图片
数据集最终的目的是通过前60个AGTC的排列,实现三个分类:分别是ie,ei和n。(看懂英文就行了,没生物背景没关系,我也不会,但这不影响我们分类)
C++实现ID3决策树(UCI DNA数据集)_第3张图片
数据集的组成是训练集有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势力低头。
C++实现ID3决策树(UCI DNA数据集)_第4张图片
五、完整代码
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.代码
等这个lab due了再更新。
在实现算法的过程中,奇怪的bug一直在增加,sigh。
3.准确率
在这里插入图片描述

Over.

你可能感兴趣的:(机器学习那些奇怪的bug,机器学习,决策树)