#---------------------------------------- # 功能描述:演示kNN建模过程 # 数据集:威斯康星乳腺癌诊断 # #---------------------------------------- #第一步:收集数据 # import the CSV file wbcd <- read.csv("/Users/chenyangang/R语言/data/wisc_bc_data.csv", stringsAsFactors = FALSE) #熟悉数据 str(wbcd) #radius 半径 #texture 质地 #perimeter 周长 #area 面积 #smoothness 光滑度 #compactness 致密度 #concavity 凹度 #points 凹点 #symmetry 对称性 #dimension 分型维数 #第二步:探索和准备数据 # 删除 id 变量 wbcd <- wbcd[-1] # 目标数据的分类 table(wbcd$diagnosis) # 分类器要求目标属性为因子类型,所以需要进行转化 wbcd$diagnosis <- factor(wbcd$diagnosis, levels = c("B", "M"), labels = c("Benign", "Malignant")) # 目标变量的占比 round(prop.table(table(wbcd$diagnosis)) * 100, digits = 1) # 五数分析:分析半径、面积、光滑度,目的:看变量间的差异,是否需要进行数据的标准化 summary(wbcd[c("radius_mean", "area_mean", "smoothness_mean")]) # 2.1 最小-最大数据标注化,用于数值型变量 normalize <- function(x) { return ((x - min(x)) / (max(x) - min(x))) } # 测试标准化函数 normalize(c(1, 2, 3, 4, 5)) normalize(c(10, 20, 30, 40, 50)) # 标准化数据 wbcd_n <- as.data.frame(lapply(wbcd[2:31], normalize)) #2.2 创建训练集和测试数据 wbcd_train <- wbcd_n[1:469, ] wbcd_test <- wbcd_n[470:569, ] # 分别为训练集和测试集提取目标变量 wbcd_train_labels <- wbcd[1:469, 1] wbcd_test_labels <- wbcd[470:569, 1] #第三步:基于数据训练模型 #-------------------------------------------- # 创建分类器: # p <- knn(train, test, class, k) # train: 训练集,数值型 # test: 测试集 # class:分类的因子向量 # k : 一个整数 # 该函数返回一个因子向量,该向量含有测试数据框中每一行的预测分类 #--------------------------------------------- # 加载class包 library(class) #建模 wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21) ## 第四步: 评估模型性能 # 加载 "gmodels" 包 library(gmodels) # 交叉表分析 CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE) #有两个被错误分类 ## 第五步:提供模型的性能 # 5.1 使用scale() 函数进行 z-score 标准化数据 wbcd_z <- as.data.frame(scale(wbcd[-1])) # 查看标准化后的结果 summary(wbcd_z$area_mean) # 创建数据集和测试集 wbcd_train <- wbcd_z[1:469, ] wbcd_test <- wbcd_z[470:569, ] # 重新进行分类 wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21) # 交叉表分析 CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE) #重新分类后,并没有带来提升,出现了下降,方法可供参考,利用数据的标准化 # 可以对不用的k值进行尝试 wbcd_train <- wbcd_n[1:469, ] wbcd_test <- wbcd_n[470:569, ] wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=1) CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE) wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=5) CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE) wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=11) CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE) wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=15) CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE) wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=21) CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE) wbcd_test_pred <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_labels, k=27) CrossTable(x = wbcd_test_labels, y = wbcd_test_pred, prop.chisq=FALSE)