本文使用威斯康星州临床科学中心的关于乳腺癌肿瘤的数据集。
一 读入数据
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近邻以距离为依据,因此数据中不能含有缺失值;
距离计算:上面算法默认欧式距离,如果有时间,可以看看不同距离计算方法的效果。