R语言-kNN算法进行乳腺癌诊断

本文通过使用KNN算法对乳腺癌数据集进行诊断分类,首先对数据进行预处理,包括读取数据、查看数据结构、调整诊断标签,并对特征进行min-max标准化和z-score标准化。随后,利用不同标准化方式的数据训练模型,对比不同k值下的预测结果,以减少错误分类值的数量,提高模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完整代码如下:

wbdc<-read.csv("/Users/wenfeng/Desktop/R&ML/机器学习和R语言/机器学习实验6 KNN/wisc_bc_data.csv",stringsAsFactors = FALSE)
str(wbdc)
wbdc<-wbdc[-1]
table(wbdc$diagnosis)
wbdc$diagnosis<-factor(wbdc$diagnosis,levels = c("B","M"),labels = c("Benign","Malignant"))
round(prop.table(table(wbdc$diagnosis))*100,digits = 1)
summary(wbdc[c("radius_mean","area_mean","smoothness_mean")])

#标准化min-max
normalize<-function(x){
  return((x-min(x))/(max(x)-min(x)))
}
normalize(c(1,2,3,4,5))
wbdc_n<-as.data.frame(lapply(wbdc[2:31],normalize))
summary(wbdc_n$area_mean)
#数据准备
wbdc_train<-wbdc_n[1:469,]
wbdc_test<-wbdc_n[470:569,]
wbdc_train_label<-wbdc[1:469,1]
wbdc_test_label<-wbdc[470:569,1]
#训练模型
library(class)
wbdc_test_pred<-knn(train = wbdc_train,test = wbdc_test,cl=wbdc_train_label,k=21)
library(gmodels)
CrossTable(x=wbdc_test_label,y=wbdc_test_pred,prop.chisq = FALSE)

#z-score标准化
wbdc_z<-as.data.frame(scale(wbdc[-1]))
summary(wbdc_z$area_mean)
#数据准备
wbdc_train<-wbdc_z[1:469,]
wbdc_test<-wbdc_z[470:569,]
wbdc_train_label<-wbdc[1:469,1]
wbdc_test_label<-wbdc[470:569,1]
#训练模型
library(class)
wbdc_test_pred<-knn(train = wbdc_train,test = wbdc_test,cl=wbdc_train_label,k=21)
library(gmodels)
CrossTable(x=wbdc_test_label,y=wbdc_test_pred,prop.chisq = FALSE)

#改变k值
wbdc_test_pred<-knn(train = wbdc_train,test = wbdc_test,cl=wbdc_train_label,k=10)
CrossTable(x=wbdc_test_label,y=wbdc_test_pred,prop.chisq = FALSE)


wbdc_test_pred<-knn(train = wbdc_train,test = wbdc_test,cl=wbdc_train_label,k=5)
CrossTable(x=wbdc_test_label,y=wbdc_test_pred,prop.chisq = FALSE)

一、数据处理
wbdc<-read.csv("/Users/wenfeng/Desktop/R&ML/机器学习和R语言/机器学习实验6 KNN/wisc_bc_data.csv",stringsAsFactors = FALSE)
str(wbdc)
在这里插入图片描述
wbdc<-wbdc[-1]
table(wbdcdiagnosis)wbdcdiagnosis) wbdcdiagnosis)wbdcdiagnosis<-factor(wbdcdiagnosis,levels=c(&quot;B&quot;,&quot;M&quot;),labels=c(&quot;Benign&quot;,&quot;Malignant&quot;))round(prop.table(table(wbdcdiagnosis,levels = c(&quot;B&quot;,&quot;M&quot;),labels = c(&quot;Benign&quot;,&quot;Malignant&quot;)) round(prop.table(table(wbdcdiagnosis,levels=c("B","M"),labels=c("Benign","Malignant"))round(prop.table(table(wbdcdiagnosis))*100,digits = 1)
summary(wbdc[c(“radius_mean”,“area_mean”,“smoothness_mean”)])
在这里插入图片描述
#标准化min-max
normalize<-function(x){
return((x-min(x))/(max(x)-min(x)))
}
normalize(c(1,2,3,4,5))
wbdc_n<-as.data.frame(lapply(wbdc[2:31],normalize))
summary(wbdc_n$area_mean)
在这里插入图片描述

二、建立模型
#数据准备
wbdc_train<-wbdc_n[1:469,]
wbdc_test<-wbdc_n[470:569,]
wbdc_train_label<-wbdc[1:469,1]
wbdc_test_label<-wbdc[470:569,1]
#训练模型
library(class)
wbdc_test_pred<-knn(train = wbdc_train,test = wbdc_test,cl=wbdc_train_label,k=21)
library(gmodels)
CrossTable(x=wbdc_test_label,y=wbdc_test_pred,prop.chisq = FALSE)
在这里插入图片描述
由上图可知:由61个良性患者,knn算法也将其正确预测为良性;而将2个恶性错误地预测为良性。100个肿块,有两个被错误分类。我们可以继续采用其他方法,提高模型的性能并减少错误分类值的数量。

三、提高模型性能
1.z-score标准化
#z-score标准化
wbdc_z<-as.data.frame(scale(wbdc[-1]))
summary(wbdc_z$area_mean)
#数据准备
wbdc_train<-wbdc_z[1:469,]
wbdc_test<-wbdc_z[470:569,]
wbdc_train_label<-wbdc[1:469,1]
wbdc_test_label<-wbdc[470:569,1]
#训练模型
library(class)
wbdc_test_pred<-knn(train = wbdc_train,test = wbdc_test,cl=wbdc_train_label,k=21)
library(gmodels)
CrossTable(x=wbdc_test_label,y=wbdc_test_pred,prop.chisq = FALSE)
在这里插入图片描述
由上图可知,由5个恶性肿块被错误的划分为良性的,比min-max标准化后的建模效果差

2.改变k值(在z-score基础上)
wbdc_test_pred<-knn(train = wbdc_train,test = wbdc_test,cl=wbdc_train_label,k=10)
CrossTable(x=wbdc_test_label,y=wbdc_test_pred,prop.chisq = FALSE)
在这里插入图片描述
这种情况下,虽然假阴性的情况较k=21有所提高,但有1个被错误的判定为恶性

wbdc_test_pred<-knn(train = wbdc_train,test = wbdc_test,cl=wbdc_train_label,k=5)
CrossTable(x=wbdc_test_label,y=wbdc_test_pred,prop.chisq = FALSE)
在这里插入图片描述
这种情况下,虽然假阳性的情况与k=10一样,但是假阴性的情况有所好转。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值