机器学习与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)

 

 

  

原文地址:https://www.cnblogs.com/tychyg/p/5345212.html