Java 朴素贝叶斯分类器、SVM(5行代码)实现乳腺癌分类

Java实现乳腺癌诊断(分类)实验总结

朴素贝叶斯分类器、SVM(5行代码实现)

实验源码:https://gitee.com/LiuXingwu/sharing

1.问题描述

某研究获取了若干乳腺癌诊断数据,存放于breast cancer数据.txt 中。每个样本第一个数值为ID,随后10列为十个属性值,最后一列为分类(2代表良性,4代表恶性) 缺失属性用。根据实验算法的不同自行从数据集中选出训练样本和测试样本。

实验要求如下:

1)进行数据预处理,填充缺失值,说明预处理的方法。

2)分别使用支持向量机和朴素贝叶斯分类器进行分类,并比较两种方法在测试样本上的准确率。

3)实验 告中说明训练样本和测试样本如何选择。

4)为了使得数据适应所选择的分类器,要进行适当的数据预处理。

breast cancer数据.txt部分截图:

SVM程序流程:

下载最新版本为3.24 (目前):

4.2 实验数据

数据预处理:对给定的数据集中存在的缺失值,现将缺失值置为0,然后利用其对应属性的均值填充缺失值。对于朴素贝叶斯分类器分类,去除原始数据中的第一列(序 属性)。对于支持向量机分类,将样本类别属性提前到第一列(循环右移一列),同时将样本的结果集另存一个文件夹中。

4.3 实验过程与结果

封装的工具类:

从原始数据中读取数据:

SVM数据预处理:

朴素贝叶斯分类器:

数据变量:

程序执行:

实验结果:

4.4 结果分析

从实验结果来看,朴素贝叶斯分类器的正确率为97%,而SVM的准确率可以达到100%。总体上,两类的分类效果都比较理想。

对于朴素贝叶斯份分类器的结果出现一定的误差我觉得可能是密度函数方面的选取有关,实验中我采用的是求出各个属性的均值和方差然后将对应的正态分布转成标准正态分布的方式来求对应的密度值的,这点有可能会影响最后的结果。也可能是采用平均值填充缺失值造成一定的影响。

对于SVM的分类准确度,我个人是比较惊讶的。属于出乎意料之外,又在情理之中。所谓出乎意料,是因为即使是调用库函数,但我也没想过可以做到100%的精确度,可能是因为我在做完数据预处理后,将全部样本用于训练模型,同时也作为测试样本的原因吧。在情理之中是因为SVM本来就对二类分类的高效性,虽然样本数据近700个,但仍属于小规模样本,所以很好地契合了SVM分类的优势。

5. 总结与体会

从第5章开始学习朴素贝叶斯开始,做了相关的作业,做了两次实验(一次是朴素贝叶斯分类器的实现、一次是鸢尾花分类),在加上这次的乳腺癌诊断。对于朴素贝叶斯分类的算法流程已经相对熟悉了。个人觉得影响分类结果的两大因素为:缺失值的处理(涉及到相关参数的训练)和密度函数的选取(涉及到求取最后的分类概率)。因为各个属性的相互独立,在这个实验中基本是可以保证的。

对于SVM从一开始学习就只是简单了解的其实现的流程和大致适用的情形。对于具体的实现也是一直存有疑虑的。对于之前使用鸢尾花分类和这次的乳腺癌诊断都采用的是调用库函数,其中需要注意的就是按照函数的要求做好数据预处理而已。

结合之前的鸢尾花分类实验,我觉得朴素贝叶斯分类器实现数据分类确实相对简单,而且执行速度也很理想,但始终没法达到特别高了准确率(这次的97%确实出乎意料)。而SVM处理二类划分的效果比之前鸢尾花的三类划分确实好上不少,虽然具体实现较为复杂,但相对于朴素贝叶斯分类器而言SVM有准确率的保证。所以在有库函数的前提下,采用SVM来处理数据不失为更好的选择。

实验源码:https://gitee.com/LiuXingwu/sharing

img 文章知识点与官方知识档案匹配,可进一步学习相关知识OpenCV技能树首页概览11206 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年1月12日
下一篇 2021年1月12日

相关推荐