R-机器学习| KNN算法

8 篇文章 2 订阅
8 篇文章 2 订阅

本文使用威斯康星州临床科学中心的关于乳腺癌肿瘤的数据集。

一 读入数据

cancer <- read.csv('breast_cancer.csv',stringsAsFactors = F)

用str(cancer)观察一下数据

第一例是id,第二列为diagnosis诊断类型(良性/恶性),第3-32个特征其实只包含了十个属性,但是以mean均值,standard error标准差,“worst” or largest最差的值分别出现了三次,所以总共有30个特征。

二 数据清洗

#去掉没有用的id列和最后一列空值,剩下31个特征
cancer_data <- cancer[,c(-1)]
#把diagnosis特征加上标签,写英文全称方便识别
cancer_data$diagnosis <- factor(cancer_data$diagnosis,levels = c("B","M"),labels = c("benign","malignant"))
#看下乳腺癌良性和恶性的分布概率
round(prop.table(summary(cancer_data$diagnosis)),2)

把diagnosis变成了factor因子类型,并且把B和M的简写改成了全称,用prop.table看一下良性和恶性的概率分布,round指结果保留两个小数点。

因为30个特征数值之间差异较大,可以通过标准化normalization减少数值之间的差异。

summary(cancer_data[,c(2,3,4)])
#0-1标准化
normalization_01 <- function(x){
  return((x-min(x))/(max(x)-min(x)))
}
cancer_data[2:31] <-as.data.frame(lapply(cancer_data[2:31], normalization_01))

数据清洗好之后,通过划分测试集和训练集来建模预测

三 KNN算法实现

#随机取样分为训练集和测试集,按8:2比例分
set.seed(1234)
index <- sample(1:nrow(cancer_data),size = nrow(cancer_data)*0.8,replace = F)
cancer_train <- cancer_data[index,]
cancer_test <- cancer_data[-index,]

用到的是KNN算法,class包里面的函数knn(),在R中可以通过help(“knn”)来查看函数的具体用法

class包中的knn

首先将k值设为训练集样本数量的平方根

#用KNN算法建模预测
library(class)
knn_model_predict <- knn(train=cancer_train[,-1],test=cancer_test[,-1],cl=cancer_train$diagnosis,k=21)
#
table(knn_model_predict,cancer_test[,1])

#交叉验证
CrossTable(x=cancer_test[,1],y=knn_model_predict,prop.chisq = F)

可以看到模型的准确率为97%,接下来我们测试一下不同k值对模型准确率的影响

四 总结

需要注意的点:
数据标准化:knn()函数在调用前需标准化数据,其他2个函数默认调用时进行标准化;
缺失值:k近邻以距离为依据,因此数据中不能含有缺失值;
距离计算:上面算法默认欧式距离,如果有时间,可以看看不同距离计算方法的效果。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值