人工智能开发实战辅助诊断应用解析

内容导读

  1. 项目分析
  2. 预备知识
  3. 项目实战

一、项目分析

1、提出问题

随着人们生活水平的提升和健康意识的增强,民众定期进行身体健康体检已成为常态,这种早期的疾病检测和筛查可以及早发现身体里已经出现的异常体征信息,做出正确诊断和有效处理措施,将疾病消灭于萌芽时期,为健康提供超前保障,避免出现患病后的痛苦和尽早纠正不良的生活习惯等。

随着医疗AI在医疗领域的攻城掠地,如今已经开启了新纪元的智慧医疗科技,借助“人工智能大脑”,AI辅助诊疗新时代正在到来。利用AI探索生命科技,是当前人工智能医学的一大热点。基于大数据、云计算、机器学习和深度学习的人工智能,正在弥补人类的能力短板,成为医生的得力助手。

传统的医疗诊断只能通过医生的肉眼去看X光、CT、超声、MR等的影像,才能给出患者诊断结论,过程不仅繁琐且重复性高。而现在通过AI辅助诊断技术的应用,能够很大程度地提高医疗机构、医生的工作效率,降低工作强度,降低漏诊率。那么,AI是如何辅助医生进行病情诊断的呢?

下面,我们就以另一类分类器SVM为利器,看它是如何利用女性身上的活检数据,检测号称女性头号杀手的乳腺癌的。

2、解决方法

支持向量机SVM特别适合样本相对少、样本特征数较多的应用场合。

从患者体内切取、钳取或穿刺等取出病变组织,进行病理学检查的得到活检数据不像其他数据容易获取,数据本身成本也比较高,另外还可能涉及到患者的隐私等,如果我们能借助机器学习自动识别癌细胞是良性还是恶性的,那无疑对医生还是医疗系统而言都会有很大的裨益,至少能显著缩短诊断时间,为病人争取更多宝贵的治疗时间,为医生有更多的时间花在治疗疾病上。

利用SVM辅助诊断乳腺癌的解决方案如下图所示。

二、预备知识

用支持向量机SVM来“智慧”识别癌细胞,这个工作无疑是令人兴奋的。

为在后续的工作中合理设计SVM模型,先了解相关的知识。

1、SVM的最优分界面

假设有两分类数据如图所示。

现在就要找出一个最优分界面H,将两类数据分开。显然能将两类数据分开的分界面有无数种,如图所示就是其中的几种情形。

分界面H1、H4靠近样本族群的边界,称为临界分界面。那么哪个分界面是最优的呢?

我们希望所得的最优分界面不仅能准确地将两类数据分离开来,同时希望到两边临界分界面的距离达到最大,这样尽管训练样本中可能存在个别噪声样本和离群样本,但由于最优分界面远离族群,仍能在一定范围内正确分类这些噪声或离群样本,具有较强的抗噪声能力和较小的泛化误差。

临界面上的样本如样本1、7、10被称为支持向量,H0则是最优分界面,因为它到两边临界分界面的距离最大,显然H0是由支持向量决定的,这也是SVM名称的由来。

2、SVM模型参数

在很多情况下,样本变量之间的关系是非线性的,在低维输入空间没法将两类样本通过分界面将它们分开,如图所示左半部分。

支持向量机为了更好地将左半部分两类样本分离开来,使用一种称为核技巧的处理方式将上述问题映射到一个更高维的空间,即通过核函数K(x,y),将输入空间样本变换到高维输出空间,这样原本不能线性可分的问题就突然变得线性可分了,如下图右半部分。

这就有点类似于我们换了一个新的视角看数据,看到了不一样的情形。

核函数有多种形式,通常情况下,需要在模型上一点点地去试错并评估应用效果,在很多场合,核函数的选择可以是任意的,尽管不同的核函数所表现的性能可能只有轻微的变化,但最常用是rbf核函数,它被证明对于许多类型的数据都具有较好的拟合度。

下表就列出SVM模型的常用参数,以便大家在实际应用中合理来选择。

3、样本数据解读

本案例所用的样本数据来自网站UCI Machine Learning Repository,由威斯康星大学研究者公开捐赠的。

该数据集本质上是乳房肿块活检图像的细胞核多项测量值。通过以下代码读取数据集并了解样本的基本特征。

datas=pd.read_csv(r'data\wisc_bc_data.csv',sep=',')

读取的样本数如下图所示:

共有样本569个,即569例乳腺细胞活检案例。每行数据32列,其中id列是编号,无实际意义,在后续数据处理中会被删除或屏蔽。

诊断列diagnosis取值[M|B],分别表示诊断为恶性或良性。

其它30个列是细胞核的10个不同特征的均值mean、标准差se、最差值worst构成。

通过命令datas.columns查看所有的列名,可知10个特征有:

上述10个特征值是用来描述乳腺细胞核的大小和形状,有经验的医生是可以通过这些特征数据或阅读细胞核影像数字来诊断一个病人是否患有乳腺癌,可SVM是如何通过机器学习来一步步揭示这个模式的呢?下面我们来进行实战演练。

三、项目实战

1、准备训练集

为了能让SVM算法用于乳腺癌预测,就要准备所用到的学习数据,为此,我们首先要加载数据,然后对其做适当的处理,最后形成模型所需的训练集和测试集。

相关的代码如下。

import numpy as np
import pandas as pd
import sklearn.model_selection as msdatas=pd.read_csv(r'data\wisc_bc_data.csv',sep=',')x=datas.iloc[:,2:32]y=datas.iloc[:,1:2]x_train,x_test,y_train,y_test=ms.train_test_split(x,y,test_size=0.2, random_state=42)y_train=y_train.values.ravel()y_test=y_test.values.ravel()

行3导入model_selection用于样本数据分割,行4读取csv数据文件到数据框架datas中,行5是将datas中所有行第3列到第32列的数据作为样本输入集x,行6是将datas中第1列到第2列的所有行数据作为样本输出集y,行7是将输入集x和输出集y进行分割,按比例8:2分别形成训练样本和测试样本。

行8-9分别对训练样本和测试样本的输出值降维,将其变为一维数组,以满足模型训练和测试的数据格式要求。

以测试样本为例,准备好的数据如下图所示。

从上图可以浏览整个训练样本特征值的分布情况和标签值,用这些训练样本来估计模型训练后的效果,也就是用这114条记录模拟新的病人,去了解模型诊断结果的好坏。

2、构建和训练模型

有了训练集和标签后,就可以构建一个SVM模型并对它进行训练,代码如下。

import sklearn.svm as svm
#导入支持向量机模块svm
modle=svm.SVC(C=1, kernel='rbf')
#利用高斯核函数rbf构建模型modle,惩罚参数C取值为1
modle.fit(x_train,y_train)
#利用训练样本对模型modle进行训练

模型训练完成后,为了解模型的训练效果,利用以下语句输出模型的训练得分(精确度)。

print(modle.score(x_train,y_train))

模型得分为:

看来模型的得分并不太理想。训练后的模型对于114条测试集而言性能又如何呢?请往下看!

3、评估模型预测效果

下面基于测试集(模拟114个新的病人)对模型的诊断效果进行测试,看它预测的结果与医生事先标注的结果是否一致,如不一致,差异在什么地方,从而判断该模型是否能较好地推广到未知样本(或辅助于临床应用)。

代码如下。

	import sklearn.metrics as sm#导入评估模块metricsy_pred=modle.predict(x_test)#利用模型modle对测试样本进行预测得到预测值y_predprint(sm.classification_report(y_test,y_pred))

将实际标签值y_test与预测值y_pred进行比对分析,将结果以报告形式输出,如图所示。

可以看到,在所有114个测试样本中,所有实际标注为良性(B)的病人都被成功识别出来,而实际标注为恶性(M)的病人只有86%被识别出来,剩余14%的恶性肿瘤为错分为良性,在这种情况下,这种错分可能会造成严重的代价,因为误诊的病人可能会为此丧失治疗的黄金时机,导致病情继续蔓延恶化。

因此,有必要对样本数据或模型进行调整,以便训练出性能更好的模型。

观察图中样本的输入特征值,各特征值大小及范围差异较大,例如细胞核半径radius_mean的取值在[6.981, 28.11]内,而光滑度smoothness_mean的取值在[0.05263,0.1634]之间,两者数据量级不一样,有必要进行标准化处理,以消除量纲影响。

代码如下。

from sklearn.preprocessing import MinMaxScaler
x=MinMaxScaler().fit_transform(x)

行1导入min-max标准化类MinMaxScaler,在行2中对所有样本的输入特征值进行归一化处理,然后用任务2中相同的模型进行训练,最后再次对训练后的模型进行测试评估,评估结果如图。

可以发现,仅仅使用一行代码对样本集x进行标准化后,模型对标签为M的样本召回率由原来的86%提高到95%,B和M两种样本的综合评价系数F1也分别提升2和4个百分点,模型性能有比较明显的提升。

在训练样本数据比较下的情况下,能取得97%的预测精度还是比较令人满意的。

4、模型优化

尽管用于诊断乳腺癌的SVM模型有着高达97%的预测精度,但这种性能水平用于癌症诊断还不是非常令人满意的,因为不论是错分为假阴性还是假阳性,后果可能会比较糟糕,应尽量避免产生错分情况。

在这里,有必要从以下几个方面不断尝试,试图找到更好的模型。

1、将样本输入特征集x进行Z-score转换

在之前模型训练中,通过对样本数据进行min-max归一化处理来提升了模型的性能,那么如果对样本数据进行标准化处理,是否还能提高模型效果呢?

利用以下代码对样本输入变量x进行Z-score转换。

from sklearn.preprocessing import StandardScaler
x=StandardScaler().fit_transform(x)

数据转换后,仍用相同参数模型进行训练和预测,测试结果如下:

可以看出,除了训练得分有一点提高外,模型的预测结果没有什么变化。

有点遗憾的是数据标准化后,并没有让模型在诊断方面表现更好。

2、改变模型参数C

前面谈到可以通过变更SVM模型的参数,来改变模型的性能。下面仅以改变惩罚因子C的值,看它是如何引起模型效果或拟合度变化的。

我们的目标是减少模型错分比率,尽可能多地提高模型召回率和精确度,为此,根据C参数的含义,应该增大C的值,加大对错分类的惩罚,以降低训练误差。代码如下。

modle=svm.SVC(C=1.5, kernel='rbf')

上述代码只是将原C=1更新为1.5,核函数和其它参数没有变。C参数变化前后模型的预测结果对比如图所示。

上图左测是C=1的预测交叉表,右侧是C=1.5的预测交叉表,对比可以看出,当C取一个合适的较大值1.5的时候,所有标签为B的样本悉数找回,错分情况有较小的改善,是可以在一定程度上提高模型性能的,但有点遗憾的是,这种改善在标签为M的样本上并没有表现出来。

大家可以尝试用不同的C值或其它核函数对模型进行测试,看是否能找到更完美的分类效果。

更多精彩内容请持继关注本站!

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

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

相关文章

css实现居中的方法

水平居中 1. 行内设置text-align 给父元素设置text-align为center,一般用于实现文字水平居中 2. 给当前元素设置margin:0 auto 原理:块级独占一行,表现为在水平方向上占满整个父容器,当水平方向padding,…

navicat无法连接远程mysql数据库1130报错的解决方法

出现报错:1130 - Host ipaddress is not allowed to connect to this MySQL serve navicat,当前ip不允许连接到这个MySQL服务 解决当前ip无法连接远程mysql的方法 1. 查看mysql端口,并在服务器安全组中放开相应入方向端口后重启服务器 sud…

音视频入门基础:AAC专题(7)——FFmpeg源码中计算AAC裸流每个packet的size值的实现

音视频入门基础:AAC专题系列文章: 音视频入门基础:AAC专题(1)——AAC官方文档下载 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件 音视频入门基础:AAC…

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL77

编写乘法器求解算法表达式 描述 编写一个4bit乘法器模块,并例化该乘法器求解c12*a5*b,其中输入信号a,b为4bit无符号数,c为输出。注意请不要直接使用*符号实现乘法功能。 模块的信号接口图如下: 要求使用Verilog HDL语言实现以上…

水下目标检测数据集 urpc2021

项目背景: 水下目标检测在海洋科学研究、水下考古、海洋资源勘探等多个领域具有重要的应用价值。由于水下环境的复杂性和多变性,传统的人工检测方法存在诸多限制,自动化检测技术的需求日益增加。URPC2021数据集旨在为水下目标检测提供高质量…

蔚来是如何算加电网络的「大账」的?

作者 | 张马也 编辑 | 德新 李斌很忙,连中秋假期也没休息,开着ES8在新疆喀什周边的县区考察。 这次考察的目的,是为了推进「加电县县通」计划的落地。蔚来在一个月前的加电日发布会,推出了这个大胆的计划,要实现全国县…

如何在webots中搭建一个履带机器人

前期准备 下载webotswebots基本知识 a. 官方文档:Webots documentation: Track b. B站教程:webots-超详细入门教程(2020)_哔哩哔哩_bilibili搭建流程 搭建履带机器人主要使用到了webots中的track节点,这个节点是专门用来定义履带的相关属性,模拟履带运动的 首先,创建一个…

C一语言—动态内存管理

目录 一、为什么要有动态内存管理 二、malloc和free (2.1)malloc (2.2)free 三、calloc和realloc (3.1)calloc (3.2)realloc 四、常见的动态内存的错误(举例均为错…

sqli-lab靶场学习(四)——Less11-14(post方法)

前言 第1-10关都是get方法,本关开始进入post方法。其实post也好get也好,本质都差不多,使用的技巧也基本相同。 Less11 第11关打开是一个输入用户名密码的界面 显然登陆对话框会使用post方式提交,这里我们尝试在Username一栏通过…

Scrapy爬虫实战——某瓣250

# 按照我个人的习惯,在一些需要较多的包作为基础支撑的项目里,习惯使用虚拟环境,因为这样能极大程度的减少出现依赖冲突的问题。依赖冲突就比如A、B、C三个库,A和B同时依赖于C,但是A需要的C库版本大于N,而B…

Python中lambda表达式的使用——完整通透版

文章目录 一、前言二、 基本语法三、举个简单的例子:四、常见应用场景1. 用于排序函数sort() 方法简介lambda 表达式的作用详细解释进一步扩展总结 2、与 map、filter、reduce 等函数结合1、 map() 函数示例:将列表中的每个数字平方 2、 filter() 函数示…

音视频直播应用场景探讨之RTMP推流还是GB28181接入?

技术背景 好多开发者跟我们沟通音视频解决方案的时候,不清楚什么时候用RTMP推送模块,什么时候用GB28181设备接入模块,也不清楚二者差异化。实际上,RTMP推流和GB28181接入模块,在很多方面存在差异,如应用领…

centos 安装VNC,实现远程连接

centos 安装VNC,实现远程连接 VNC(Virtual Network Computing)是一种远程控制软件,可以实现通过网络远程连接计算机的图形界面。 服务器安装VNC服务 yum install -y tigervnc-server*启动VNC服务,过程中需要输入连接密码 vncserver :1查看…

云栖大会Day1:云应用开发平台 CAP 来了

2024 云栖大会开幕,在大会第一天,阿里云正式发布全新产品——云应用开发平台 CAP。CAP 拥有丰富的场景化应用模板,可以极速体验,并且具备更低的成本优势以及灵活组装等特点,成为广大开发者与企业必备的一站式应用开发平…

Stable Diffusion绘画 | ControlNet应用-instant-ID控制器:快速生成人物多角度图片

使用 instant-ID 控制器,用户只需要提供一张正脸图片,就可以快速地给人物生成多角度图片的,从而很好的保持了人物的一致性。 对于要制作小说推文、创建人物故事情节的创作,是一个非常好用且高效的功能。 准备工作 使用该控制类型&…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第一篇-原理】

如果想直接制作,请看【第二篇】内容 这次做一个这样的东西,通过在2DRT上实时绘制,生成动态的体积纹理,也就是可以runtime的VDB 设想的文章流程: 对原理进行学习制作体积渲染制作实时绘制 第一篇(本篇)是对“…

vue3+element-plus icons图标选择组件封装

一、最终效果 二、参数配置 1、代码示例 <t-select-icon v-model"selectVlaue" />2、配置参数&#xff08;Attributes&#xff09;继承 el-input Attributes 参数说明类型默认值v-model绑定值string-prefixIcon输入框前缀iconstringSearchisShowSearch是否显…

机器翻译之创建Seq2Seq的编码器、解码器

1.创建编码器、解码器的基类 1.1创建编码器的基类 from torch import nn#构建编码器的基类 class Encoder(nn.Module): #继承父类nn.Moduledef __init__(self, **kwargs): #**kwargs&#xff1a;不定常的关键字参数super().__init__(**kwargs)def forward(self, X, *args…

Git入门学习(1)

Git 00.准备工作-gitee注册 今天Git的设置中需要用到gitee的注册信息&#xff0c;先自行完成注册工作&#xff0c;可以 参考笔记 或第二天视频&#xff08;10.Git远程仓库-概念和gitee使用准备&#xff09; 传送门: gitee&#xff08;码云&#xff09;:https://gitee.com/ 注…

详解:冒泡排序

1.是什么 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法。它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成…