zoukankan      html  css  js  c++  java
  • 机器学习与R语言:kNN

    #----------------------------------------
    # 功能描述:演示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)
    
     
    
     
    

      

  • 相关阅读:
    本地启动项目后cookie跨域获取不到的处理方式
    相对URL:协议名跨域的一种处理方式
    window.open方法被浏览器拦截的处理方式
    高维前缀和
    比较函数大小
    链式前向星
    并查集
    Kruskal算法
    读书笔记 UltraGrid(4)
    读书笔记 UltraGrid(12)
  • 原文地址:https://www.cnblogs.com/tychyg/p/5345212.html
Copyright © 2011-2022 走看看