用kNN算法诊断乳腺癌--基于R语言

简介: 用kNN算法诊断乳腺癌--基于R语言

1 目的

  利用机器学习根据样本特征自动识别癌细胞,提高检测过程的效率,并尝试改进算法提高模型性能。

2 数据来源

  该演示数据来源于: 机器学习和智能系统中心

3 案例演示

3.1 数据读取及预处理

1. 读取数据并查看数据类型

  运行代码:

1.  data<-read.csv("G:\\wisc_bc_data.csv",stringsAsFactors = FALSE)  #读取数据
2.  str(data)                                                        #查看数据类型

   部分结果展示:

'data.frame': 569 obs. of  32 variables:
 $ id               : int  87139402 8910251 905520 868871 9012568 906539 925291 87880 862989 89827 ...
 $ diagnosis        : chr  "B" "B" "B" "B" ...
 $ radius_mean      : num  12.3 10.6 11 11.3 15.2 ...
 $ texture_mean     : num  12.4 18.9 16.8 13.4 13.2 ...
 $ perimeter_mean   : num  78.8 69.3 70.9 73 97.7 ...
 $ area_mean        : num  464 346 373 385 712 ...
 $ smoothness_mean  : num  0.1028 0.0969 0.1077 0.1164 0.0796 ...
 $ compactness_mean : num  0.0698 0.1147 0.078 0.1136 0.0693 ...
 $ concavity_mean   : num  0.0399 0.0639 0.0305 0.0464 0.0339 ...
 $ points_mean      : num  0.037 0.0264 0.0248 0.048 0.0266 ...
 $ symmetry_mean    : num  0.196 0.192 0.171 0.177 0.172 ...
 $ dimension_mean   : num  0.0595 0.0649 0.0634 0.0607 0.0554 ...
 $ radius_se        : num  0.236 0.451 0.197 0.338 0.178 ...
 $ texture_se       : num  0.666 1.197 1.387 1.343 0.412 ...
 $ perimeter_se     : num  1.67 3.43 1.34 1.85 1.34 ...
 $ area_se          : num  17.4 27.1 13.5 26.3 17.7 ...
 $ smoothness_se    : num  0.00805 0.00747 0.00516 0.01127 0.00501 ...
 $ compactness_se   : num  0.0118 0.03581 0.00936 0.03498 0.01485 ...
 $ concavity_se     : num  0.0168 0.0335 0.0106 0.0219 0.0155 ...
 $ points_se        : num  0.01241 0.01365 0.00748 0.01965 0.00915 ...
 $ symmetry_se      : num  0.0192 0.035 0.0172 0.0158 0.0165 ...
 $ dimension_se     : num  0.00225 0.00332 0.0022 0.00344 0.00177 ...
 $ radius_worst     : num  13.5 11.9 12.4 11.9 16.2 ...
 $ texture_worst    : num  15.6 22.9 26.4 15.8 15.7 ...
 $ perimeter_worst  : num  87 78.3 79.9 76.5 104.5 ...
 $ area_worst       : num  549 425 471 434 819 ...
 $ smoothness_worst : num  0.139 0.121 0.137 0.137 0.113 ...
 $ compactness_worst: num  0.127 0.252 0.148 0.182 0.174 ...
 $ concavity_worst  : num  0.1242 0.1916 0.1067 0.0867 0.1362 ...
 $ points_worst     : num  0.0939 0.0793 0.0743 0.0861 0.0818 ...
 $ symmetry_worst   : num  0.283 0.294 0.3 0.21 0.249 ...
 $ dimension_worst  : num  0.0677 0.0759 0.0788 0.0678 0.0677 ...

  通过运行结果我们可以较为明晰地观察到各列数据数据类型,为数据处理需要,利用stringsAsFactors= FALSE防止字符串string的列被辨认成factor。

2 .查看数据基本特征

  1)良性、恶性肿块数字特征

  运行代码:

1.  data1<-data[-1]                                   #剔除id特征数据  
2.  table(data1$diagnosis)                            #输出良性、恶性肿块数量特征

  结果展示:

B   M 
357 212

  由运行结果我们可以观察到,案例中良性、恶性肿块数量分别为357,212。

  2)良性、恶性肿块数量占比

1.  summary(data1[c("radius_mean","area_mean","smoothness_mean")])     #输出部分案例特征信息

  结果展示:

radius_mean       area_mean      smoothness_mean  
 Min.   : 6.981   Min.   : 143.5   Min.   :0.05263  
 1st Qu.:11.700   1st Qu.: 420.3   1st Qu.:0.08637  
 Median :13.370   Median : 551.1   Median :0.09587  
 Mean   :14.127   Mean   : 654.9   Mean   :0.09636  
 3rd Qu.:15.780   3rd Qu.: 782.7   3rd Qu.:0.10530  
 Max.   :28.110   Max.   :2501.0   Max.   :0.16340

  通过运行结果显示。我们可以发现案例样本半径、面积、光滑度的样本特征分布情况,其中样本面积范围为143.5-2501.0;样本光滑度范围为0.05-0.16。

3.2 工具函数编写

1.标准化函数编写

  运行代码:

1.  normalize<-function(x){  
2.    return((x-min(x))/(max(x)-min(x)))  
3.  }                                                  #创建极大极小标准化函数  
4.  normalize(c(1,2,3,4,5))                            #测试函数效果

2.工具函数性能测试

  运行代码:

> normalize(c(1,2,3,4,5))            #测试函数效果

   结果展示:

[1] 0.00 0.25 0.50 0.75 1.00

  通过函数测试效果,可以看出,标准化函数编写成功。

3.3 原始数据标准化

  运行代码:

1.  data2<-as.data.frame(lapply(data1[2:31],normalize))    #标准化数据,并转化为数据框格式  
2.  summary(data2$area_mean)                               #输出area_mean特征

  结果展示:

Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 0.0000  0.1174  0.1729  0.2169  0.2711  1.0000

4 模型建立及优化

4.1 训练集测试集划分

  由于样本数据本身为随机化数据,故以前469个样本作为训练集,后100个样本作为测试集,并将这些类的标签分别存储在相应因子向量中。

  运行代码:

1.  data2_train<-data2[1:469,]                      #创建训练集  
2.  data2_test<-data2[470:569,]                     #创建测试集  
3.  data2_train_lables<-data1[1:469,1]              #存储因子向量型训练集类标签  
4.  data2_test_lables<-data1[470:569,1]             #存储因子向量型测试集类标签

4.2 基于数据训练模型

  运行代码:

1.  library("class")                    #加载包
2.  data2_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=21)                                         #将k值设置为21
3.  library("gmodels")                  #加载包
4.  CrossTable(x=data2_test_lables,y=data2_test_pred,prop.chisq = F)

  结果展示:

data2_test_pred
data2_test_lables Benigen Malignant Row Total
Benigen 61 0 61
1.000 0 0.610
0.968 0.000
0.610 0.000
Malignant 2 37 39
0.051 0.949 0.390
0.032 1.000
0.020 0.370
Column Total 63 37 100
0.630 0.370

  由运行结果显示:模型判断准确率达(37+61)/100=98%,其中共存在37个真阳性、2个假阴性案例。

4.3 改进模型,提高模型性能

1. 利用Z-分数标准化数据

  运行代码:

1.  data4<-as.data.frame(scale(data1[-1]))    
2.  summary(data4$area_mean)  
3.  data4_train<-data4[1:469,]  
4.  data4_test<-data4[470:569,]  
5.  data4_train_lables<-data1[1:469,1]  
6.  data4_test_lables<-data1[470:569,1]  
7.  data4_test_pred<-knn(train = data4_train,test = data4_test,cl<-data4_train_lables,k=21) 
8.  CrossTable(x=data4_test_lables,y=data4_test_pred,prop.chisq = F)

  结果展示:

data4_test_pred
data4_test_lables Benigen Malignant Row Total
Benigen 61 0 61
1.000 0 0.610
0.968 0.000
0.610 0.000
Malignant 5 34 39
0.128 0.872 0.390
0.076 1.000
0.050 0.340
Column Total 66 34 100
0.660 0.340

  由运行结果显示:模型判断准确率达(61+34)/100=95%,其中共存在34个真阳性、5个假阴性案例,相比于极大极小标准化法,模型效能相对较低。

2.测试其他k值

  运行代码:

1.  data5_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=1)  
2.  CrossTable(x=data2_test_lables,y=data5_test_pred,prop.chisq = F) #测试性能  
3.  data6_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=5)  
4.  CrossTable(x=data2_test_lables,y=data6_test_pred,prop.chisq = F) #测试性能  
5.  data7_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=11)  
6.  CrossTable(x=data2_test_lables,y=data7_test_pred,prop.chisq = F) #测试性能   
7.  data8_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=15)  
8.  CrossTable(x=data2_test_lables,y=data8_test_pred,prop.chisq = F) #测试性能 
9.  data9_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=21)  
10. CrossTable(x=data2_test_lables,y=data9_test_pred,prop.chisq = F) #测试性能  
11. data10_test_pred<-knn(train = data2_train,test = data2_test,cl<-data2_train_lables,k=27)  
12. CrossTable(x=data2_test_lables,y=data10_test_pred,prop.chisq = F) #测试性能

  结果展示:

K值 假阴性 假阳性 错误分类的百分比(%)
1 1 3 4
5 2 0 2
11 3 0 3
15 3 0 3
21 2 0 2
27 4 0 4

  由运行结果显示,K分别取1、5、11、15、21、27,当k,取21时,模型测试得出的准确率最高,达到了98%。


相关文章
|
21天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
28天前
|
机器学习/深度学习 算法 关系型数据库
基于PSO-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目展示了利用粒子群优化(PSO)算法优化支持向量机(SVM)参数的过程,提高了分类准确性和泛化能力。包括无水印的算法运行效果预览、Matlab2022a环境下的实现、核心代码及详细注释、操作视频,以及对PSO和SVM理论的概述。PSO-SVM结合了PSO的全局搜索能力和SVM的分类优势,特别适用于复杂数据集的分类任务,如乳腺癌诊断等。
|
2月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
2月前
|
机器学习/深度学习 算法 API
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
机器学习入门(五):KNN概述 | K 近邻算法 API,K值选择问题
|
3月前
|
算法 Python
KNN
【9月更文挑战第11天】
56 13
|
3月前
|
算法 大数据
K-最近邻(KNN)
K-最近邻(KNN)
|
3月前
|
机器学习/深度学习 算法 数据挖掘
R语言中的支持向量机(SVM)与K最近邻(KNN)算法实现与应用
【9月更文挑战第2天】无论是支持向量机还是K最近邻算法,都是机器学习中非常重要的分类算法。它们在R语言中的实现相对简单,但各有其优缺点和适用场景。在实际应用中,应根据数据的特性、任务的需求以及计算资源的限制来选择合适的算法。通过不断地实践和探索,我们可以更好地掌握这些算法并应用到实际的数据分析和机器学习任务中。
|
15天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
8天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。
|
17天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。