基于随机森林的乳腺癌诊断

news2025/4/17 18:53:34

        在当今的现实生活中存在着很多种微信息量的数据,如何采集这些数据中的信息并进行利用,成了数据分析领域里一个新的研究热点。随机森林以它自身固有的特点和优良的分类效果在众多的机器学习算法中脱颖而出。
        随机森林算法由Leo Breiman和 Adele Cutler提出,该算法结合了Breimans的“Boot-strap aggregating”思想和Ho的“"random subspace”方法。其实质是一个包含多个决策树的分类器,这些决策树的形成采用了随机的方法,因此也叫做随机决策树,随机森林中的树之间是没有关联的。当测试数据进人随机森林时,其实就是让每一棵决策树进行分类,最后取所有决策树中分类结果最多的那类为最终的结果。因此随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
        本博客将详细介绍随机森林的思想与算法原理,并结合实例讲解随机森林算法的MATLAB实现。

1 案例背景

1.1随机森林概述

 

1.2问题描述

        威斯康辛大学医学院经过多年的收集和整理,建立了一个乳腺肿瘤病灶组织的细胞核显微图像数据库。数据库中包含了细胞核图像的10个量化特征(细胞核半径,质地,周长、面积、光滑性、紧密度、凹陷度、凹陷点数、对称度、断裂度),这些特征与肿瘤的性质有密切的关系。因此,需要建立一个确定的模型来描述数据库中各个量化特征与肿瘤性质的关系,从而可以根据细胞核显微图像的量化特征诊断乳腺肿瘤是良性还是恶性的。

2 模型建立

2.1 设计思路

        将乳腺肿瘤病灶组织的细胞核显微图像的10个量化特征作为模型的输人﹐良性乳腺肿瘤和恶性乳腺肿瘤作为模型的输出。用训练集数据进行随机森林分类器的创建,然后对测试集数据进行仿真测试,最后对测试结果进行分析。

2.2设计步骤

        根据上述设计思路,设计步骤主要包括以下几个部分,如图30-2所示。

        1.数据采集

        数据来源于威斯康辛大学医学院的乳腺癌数据集,共包括569个病例,其中,良性357例,恶性212例。本书随机选取500组数据作为训练集,剩余69组作为测试集。
        每个病例的一组数据包括采样组织中各细胞核的这10个特征量的平均值、标准差和最坏值(各特征的3个最大数据的平均值)共30个数据。数据文件中每组数据共分32个字段:第1个字段为病例编号;第2个字段为确诊结果,B为良性,M为恶性;第3~12个字段是该病例肿瘤病灶组织的各细胞核显微图像的10个量化特征的平均值;第13~22个字段是相应的标准差;第23~32个字段是相应的最坏值。
        2.随机森林分类器创建
        数据采集完成后,利用随机森林工具箱函数classRF_train(),即可基于训练集数据创建个随机森林分类器,该函数的具体用法将在下一节中详细介绍。
        3、仿真测试
        随机森林分类器创建好后,利用随机森林工具箱函数classRF_predict(),即可对测试集数据进行仿真预测,该函数的具体用法将在下一节中详细介绍。
        4.结果分析
        通过对随机森林分类器的仿真结果进行分析,可以得到误诊率(包括良性被误诊为恶性、恶性被误诊为良性),从而可以对该方法的可行性进行评价。同时,也可以与其他方法进行比较,探讨该方法的有效性。

3 随机森林工具箱

        MATLAB自带的工具箱中没有随机森林工具箱,此处采用Abhishek Jaiantilal开发的randomforest-matlab开源工具箱(下载地址: https://code.google.com/p/randomforest-matlab/)。下面将详细介绍该工具箱中的一些重要函数的调用格式及使用注意事项。

3.1 随机森林分类

        函数classRF_train()用于创建一个随机森林分类器,其调用格式为:

model = classRF_train(X,Y,ntree,mtry, extra options)
        其中,X为训练集的输人样本矩阵,其每一列表示一个变量(属性),其每一行表示一个样本;Y为训练集的输出样本向量,其每一行表示X中对应的样本所属的类别;ntree为随机森林中决策树的个数(默认值为500);mtry为分裂属性集中的属性个数(默认值m=LVMj,M为总的属性个数,符号L·表示向下取整);extra_options为可选的参数; model为创建好的随机森林分类器。

3.2随机森林分类器仿真预测函数

        函数classRF_predict()用于利用创建好的随机森林分类器进行仿真预测,其调用格式为:

[Y_hat votes] =classRF_predict(x, model,extra_options)
        其中,X为待预测样本的输入矩阵,其每一列表示一个变量(属性),其每一行表示一个样本;model为创建好的随机森林分类器;extra_options为可选的参数;Y_hat为待预测样本对应的所属类别;votes为未格式化的待预测样本输出类别权重,即将待预测样本预测为各个类别的决策树个数。

4 完整matlab代码

        主函数如下:

%% 基于随机森林思想的组合分类器设计

%% 清空环境变量
clear all
clc
warning off

%% 导入数据
load data.mat
% 随机产生训练集/测试集
a = randperm(569);
Train = data(a(1:500),:);
Test = data(a(501:end),:);
% 训练数据
P_train = Train(:,3:end);
T_train = Train(:,2);
% 测试数据
P_test = Test(:,3:end);
T_test = Test(:,2);

%% 创建随机森林分类器
model = classRF_train(P_train,T_train);

%% 仿真测试
[T_sim,votes] = classRF_predict(P_test,model);

%% 结果分析
count_B = length(find(T_train == 1));
count_M = length(find(T_train == 2));
total_B = length(find(data(:,2) == 1));
total_M = length(find(data(:,2) == 2));
number_B = length(find(T_test == 1));
number_M = length(find(T_test == 2));
number_B_sim = length(find(T_sim == 1 & T_test == 1));
number_M_sim = length(find(T_sim == 2 & T_test == 2));
disp(['病例总数:' num2str(569)...
      '  良性:' num2str(total_B)...
      '  恶性:' num2str(total_M)]);
disp(['训练集病例总数:' num2str(500)...
      '  良性:' num2str(count_B)...
      '  恶性:' num2str(count_M)]);
disp(['测试集病例总数:' num2str(69)...
      '  良性:' num2str(number_B)...
      '  恶性:' num2str(number_M)]);
disp(['良性乳腺肿瘤确诊:' num2str(number_B_sim)...
      '  误诊:' num2str(number_B - number_B_sim)...
      '  确诊率p1=' num2str(number_B_sim/number_B*100) '%']);
disp(['恶性乳腺肿瘤确诊:' num2str(number_M_sim)...
      '  误诊:' num2str(number_M - number_M_sim)...
      '  确诊率p2=' num2str(number_M_sim/number_M*100) '%']);
  
%% 绘图
figure

index = find(T_sim ~= T_test);
plot(votes(index,1),votes(index,2),'r*')
hold on

index = find(T_sim == T_test);
plot(votes(index,1),votes(index,2),'bo')
hold on

legend('错误分类样本','正确分类样本')

plot(0:500,500:-1:0,'r-.')
hold on

plot(0:500,0:500,'r-.')
hold on

line([100 400 400 100 100],[100 100 400 400 100])

xlabel('输出为类别1的决策树棵数')
ylabel('输出为类别2的决策树棵数')
title('随机森林分类器性能分析')


%% 随机森林中决策树棵数对性能的影响
Accuracy = zeros(1,20);
for i = 50:50:1000
    i
    %每种情况,运行100次,取平均值
    accuracy = zeros(1,100);
    for k = 1:100
        % 创建随机森林
        model = classRF_train(P_train,T_train,i);
        % 仿真测试
        T_sim = classRF_predict(P_test,model);
        accuracy(k) = length(find(T_sim == T_test)) / length(T_test);
    end
     Accuracy(i/50) = mean(accuracy);
end
% 绘图
figure
plot(50:50:1000,Accuracy)
xlabel('随机森林中决策树棵数')
ylabel('分类正确率')
title('随机森林中决策树棵数对性能的影响')

        运行结果:

病例总数:569良性:357恶性:212
训练集病例总数:500良性:312恶性:188测试集病例总数:69良性:45恶性:24
良性乳腺肿瘤确诊:45误诊:0确诊率p1 =100 %
恶性乳腺肿瘤确诊:23 误诊:1确诊率p2 = 95.8333%

        从结果中可以看出,在测试集的69个样本中,共有1个样本被预测错误,1个恶性乳腺肿瘤样本被错分为良性乳腺肿瘤),平均确诊率为98.55%(68/69)。这表明随机森林用于分类及模式识别问题中具有较好的性能。

5.总结

        随机森林以其良好的泛化性能,已被广泛应用到许多领域中 同时,不少 家对随机森林做了不少改进和完善,取得了丰硕的研究成果。也有一些学者尝试将随机森林思想与其他分 类器相结合,也取得了不错的进展 ,感 兴趣的读者,也可以做一些尝试和深入研究.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/918454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JMeter使用方法

一、基础简介 界面 打开方式 双击 jmeter.bat双击 ApacheJMeter.jsr命令行输入 java -jar ApacheJMeter.jar 目录 BIN 目录:存放可执行文件和配置文件 docs目录:api文档,用于开发扩展组件 printable-docs目录:用户帮助手册 li…

海思Hi3861L开发一-环境搭建

一、简介 之前的文章中有详细介绍了HarmonyOS的Hi3861开发,但是该开发是基于HarmonyOS来的。实际在项目开发中,可能不会用到HarmonyOS,用的还是原生的Hi3861。那这次就重新学习Hi3861L。 二、环境搭建 环境:Ubuntu18.04.5 关于Ubuntu的环境搭建,还是参考之前的文章,附上…

musl libc ldso 动态加载研究笔记:动态库的加载次序与初始化次序

前言 musl ldso 是按照什么次序加载动态链接的应用程序的共享库的?如果共享库之间有依赖, musl ldso 如何处理先初始化哪个 共享库? musl ldso 的代码可以在 musl 官方代码: ldso\dlstart.c 与 ldso\dynlink.c,其中动…

table,设置 数据相同时, 合并列

<el-table :data"tableData" :span-method"objectSpanMethod" border style"width: 100%" show-summary><el-table-column type"index" label"序号" width"100" /><el-table-column prop"dat…

c++(8.23)类,this指针,构造函数,析构函数,拷贝构造函数

设计一个Per类&#xff0c;类中包含私有成员&#xff1a;姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员&#xff1a;成绩、Per类对象 p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream>u…

idea的断点调试

1、行断点 首先在代码的最左侧点击会显示红色的圆圈 第二步在main方法中右键选中debug run进行运行 会出现下面图片的情况 出现上图之后&#xff0c;点击console 下一步 这个时候就可以看到调试的结果了 6、方法调用栈&#xff1a;这里显示了该线程调试所经过的所有方法&…

SQL注入之堆叠查询

文章目录 堆叠查询是什么&#xff1f;堆叠查询修改所有用户密码堆叠查询删除数据库恢复数据库 堆叠查询是什么&#xff1f; 在SQL中&#xff0c;分号;是用来表示一条sql语句的结束。试想一下我们在; 结束一个sql语句后继续构造下一条语句&#xff0c;会不会一起执行&#xff1f…

漏洞挖掘和安全审计的技巧与策略

文章目录 漏洞挖掘&#xff1a;发现隐藏的弱点1. 源代码审计&#xff1a;2. 黑盒测试&#xff1a;3. 静态分析工具&#xff1a; 安全审计&#xff1a;系统的全面评估1. 渗透测试&#xff1a;2. 代码审计&#xff1a;3. 安全策略审查&#xff1a; 代码示例&#xff1a;SQL注入漏…

VB.NET调用VB6 Activex EXE实现PowerBasic和FreeBasic的标准DLL调用

VB6写的ActiveX EXE公共对象是外置进程&#xff0c;因此&#xff0c;尽管它是x86 32位的进程&#xff0c;但可以集成到 VB.NET的x64和x32程序中使用。 VS2022的VB.NET程序&#xff0c;调用ActiveX DLL对象我在上篇笔记中写了 VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeB…

【网络】DNS | ICMP | NAT | 代理服务器

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 前面几篇文章虽然讲介绍了整个网络通信的协议栈&#xff0c;我们也知道了完整的网络通信过程&#xff…

线性回归的正则化改进(岭回归、Lasso、弹性网络),最小二乘法和最大似然估计之间关系,正则化

目录 最小二乘法 极大似然估计的思想 概率&#xff1a;已知分布参数-对分布参数进行估计 概率描述的是结果;似然描述的是假设/模型​编辑 似然&#xff1a;已知观测结果-对分布参数进行估计​编辑 对数函数消灭连乘-连乘导致算法参数消失 极大似然估计公式&#xff1a;将乘…

Android BatteryManager的使用及BatteryService源码分析

当需要监控系统电量时&#xff0c;用 BatteryManager 来实现。 参考官网 监控电池电量和充电状态 获取电池信息 通过监听 Intent.ACTION_BATTERY_CHANGED 广播实现&#xff0c;在广播接收器中获取电池信息。 这是个粘性广播&#xff0c;即使过了广播发出的时间点后再注册广…

基于数据采集网关的工业锅炉远程监控运维系统

随着社会经济的不断发展&#xff0c;工业生产规模不断扩大&#xff0c;生产工艺也在不断创新&#xff0c;工业锅炉已经实现自动化控制&#xff0c;但管理模式仍存在缺陷&#xff0c;目前锅炉主要以人工巡检为主&#xff0c;这种方式费时费力且无法及时发现生产中的隐患&#xf…

javaScript:带你深入了解基本数据类型和引用类型

目录 一.前言 二.Ecmascript 规定的变量有两种 补充 1.基本数据类型&#xff08;重点掌握&#xff09; 基本数据类型的特点 2.引用数据类型 &#xff08;重点掌握&#xff09; 引用数据类型的特点 三.什么是栈&#xff1f;堆&#xff1f; 下面代码帮助了解 解释 官…

线性数据结构:数组与链表的探索与应用

文章目录 1. 数组&#xff1a;连续存储的有序元素集合1.1 创建和访问数组1.2 数组的搜索与排序 2. 链表&#xff1a;非连续存储的动态数据结构2.1 单链表与双链表2.2 链表的操作与应用 3. 数组与链表的比较与应用3.1 数组与链表的比较3.2 数组与链表的应用 4. 总结与展望 &…

Docker基本部署和相关操作

1.安装docker服务&#xff0c;配置镜像加速器 1、yum安装并且添加源信息 yum install yum-utils device-mapper-persistent-data lvm2 -y yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo2、修改一些配置信息 sed…

跨境电商系统开发:解锁海外财富,轻松实现财富自由

了解跨境电商系统开发的重要性 随着全球化和科技发展的进程&#xff0c;跨境电商已经成为一种崭新且热门的商业模式。跨境电商系统开发为企业提供了进军海外市场的机会&#xff0c;解锁了海外财富&#xff0c;帮助实现财富自由。 跨境电商系统的基本架构 跨境电商系统的基本架…

反腐力度空前,医药行业全面合规势在必行!

“公立医院改革、临床试验自查、医疗反腐、分级诊疗、药品集中采购、一致性评价、最严限抗、两票制等一系列政策卷起了医疗界阵阵反腐风暴。据报道&#xff0c;全国已有至少155家医院的院长和书记接受了调查。。。” 医药行业是与人们的生命和健康息息相关的重要领域&#xff…

一云多芯,智能化转型的下一个工程化挑战

进入2023年&#xff0c;产业数字化和智能化转型升级进入了大规模工程化落地阶段。根据中国信通院《中国数字经济发展研究报告&#xff08;2023&#xff09;》&#xff0c;数字经济已经占我国GDP比重达到41.5%&#xff0c;相当于第二产业占国民经济的比重。随着产业数字化和智能…

java Collection/Map选型

1.Collection接口 Collection接口实现了Iterator接口&#xff0c;所以Collection接口的实现类都可以用迭代器进行迭代。 Collection接口主要有两大重要的子接口List(列表)、Set(集合)。 List的主要特点是&#xff1a;有序、值可重复、支持索引访问。 Set的主要特点是&#xf…