作者: ls_本性
专题简介:本专题是关于机器学习与R语言书籍的读书笔记(主要使用的R语言,可能会以别的案例做关于python实现机器学习的文章)
本章是关于机器学习的第一章,会简单的介绍一下机器学习,然后介绍KNN算法,最后以乳腺癌数据集做实战训练
😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍
本文末尾有惊喜哦!
机器学习:基于KNN算法诊断乳腺癌
机器学习简介
无论是人还是机器,基础的学习过程都是类似的,一般分为以下四个部分:
- 数据存储:利用观测值、记忆存储,以及回忆来提供进一步推理的事实依据。
- 抽象化:涉及把数据转换成更宽泛的表示(broader representation)和概念.(concept)。
- 一般化:应用抽象的数据来创建知识和推理,从而使得行动具有新的背景。
- 评估:提供反馈机制来衡量学习的知识的用处以便给出潜在的改进之处。
下图展示了学习过程的步骤:
KNN算法基本原理
KNN算法是一种有监督的分类算法,又称作k近邻算法。KNN算法源于这样一个事实:它使用关于一个案例的k个近邻的信息来分类无标记的例子。字母k是一个可变选项,表示任意数目的近邻都可以使用。在选定k之后,该算法需要一个已经分成几个类别的案例组成的训练数据集,类别由名义变量来标记。然后,对于测试数据集中的每一个无标记的记录,KNN确定训练数据集中与该记录相似度“最近”的k 条记录,将无标记的测试例子分配到k 个近邻中占比最大的那个类中。
KNN算法的优缺点
案例分析
案例简介
应用KNN算法判断一个人是否患有乳腺癌
相关数据说明
我们将使用来自UCI机器学习数据仓库的威斯康星乳腺癌诊断数据集 ( Wisconsin Breast Cancer Diagnostic dataset),
该数据可以从网站http: //archive.ics.uci. edu/ml获得。乳腺癌数据包括569例细胞活检案例,
每个案例有32个特征。一个特征是识别号码,一个特征是癌症诊断结果,
其他30个特征是数值型的实验室测量结果。癌症诊断结果用编码“M”表示恶性,用编码“B”表示良性。
数据导入
数据链接: kaggle Breast Cancer Wisconsin
这里从kaggle里面下载数据(kaggle的注册需要科学上网)
wbcd <- read.csv("C:/Users/blank/Downloads/data.csv")
#第一列数据的数据为病人的ID是病人的标识符无用应该剔除,否则会造成模型过拟合
wbcd <- wbcd[,-1]
由于因子类型的数据底层是又数字映射而来,故在R语言中分类模型的目标变量大多数应该转换成因为型
wbcd$diagnosis <- factor(wbcd$diagnosis,levels = c("B","M"),labels = c("Benign","Malignant"))
数据处理
下面我们来看一看其他30个特征的大概情况
summary(wbcd)
通过summary()函数命名我们可以看到变量的基本数字特征,从上图我们发现不同变量之间数值的取值范围差别巨大,为了防止量纲导致问题,我们需要对数据进行规范化处理。
方法一: min-max标准化处理
wbcd_n <- as.data.frame(lapply(wbcd[2:31],normalize))
#lapply函数需要输入一个列表,一个函数返回一个列表,
#这里将数据框的每一个特征变量当场一个列表,最后输出30个列表,
#最后用as.data.frame转化成数据框
方法二: z分数标准化
wbcd_z <- as.data.frame(scale(wbcd[2:31])
#scale是R语言自带的z标准化函数,其输出是一个矩阵或者数组
俩种标准化方式需要注意的点:min-max标准化,需要保证未来的样本的数值不能出现训练原本的数值范围外;z分数标准化,要保证未来样本同训练样本同分布且具有相似的均值和标准差
数据的准备(创建训练数据集和测试数据集)
wbcd_train <- wbcd_n[1:469,] #取前469行当训练数据集
wbcd_test <- wbcd_n[470:569,] #取后100行当测试数据集
wbcd_train_labels<- wbcd[1:469,1] #训练数据集的结果
wbcd_test_labels <- wbcd[470:569,1] #测试数据集的结果
注意:wbcd记录已经随机排序,所以我们可以简单地提取100个连续的记录来创建一个测试数据集。
如果数据是按时间顺序或者以具有相似值的组的顺序排列的,那么这将是不恰当的。
在这些情况下,需要用到随机抽样方法。
基于数据集训练模型
#在R语言class包中自带knn函数
install.packages("class")
library(class)
wbcd_test_pred <- knn(train = wbcd_train,test = wbcd_test,cl=wbcd_train_labels,k=21)
关于k值的选取问题:一般来说k过小会受到异常值的影响比较大,会欠 拟合;k过大可能会导致过拟合。一般来说k值的选取可以是训练数据个数的开平方,这里469^0.5=21;除此之外还可以根据自己经验修改k值,或者选取一个较大k值,然后采取权重投票方法
性能评估
将wbcd_test_pred与wbcd_test_labels进行比较
#这里采用gmodel包中的CrossTable()函数
install.packages("gmodels")
library(gmodels)
CrossTable(wbcd_test_labels,wbcd_test_pred,prop.chisq = F)
从上图结果来看,有4个阳性被预测成了阴性,其实是会造成较大影响的,整体的正确率为95%
代码
wbcd <- read.csv("C:/Users/blank/Downloads/data.csv")
wbcd <- wbcd[,1:32]
wbcd <- wbcd[,-1]
wbcd$diagnosis <- factor(wbcd$diagnosis,levels = c("B","M"),labels = c("Benign","Malignant"))
summary(wbcd)
normalize <- function(x){
return (x-min(x))/(max(x)-min(x))
}
wbcd_n <- as.data.frame(lapply(wbcd[2:31],normalize))
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]
install.packages("class")
library(class)
wbcd_test_pred <- knn(train = wbcd_train,test = wbcd_test,cl=wbcd_train_labels,k=21)
install.packages("gmodels")
library(gmodels)
CrossTable(wbcd_test_labels,wbcd_test_pred,prop.chisq = F)
结尾福利
最后谢谢大家能够看完本博客,由于本人也正在学习,可能会有诸多不足和错误,希望大家能够提出,本人也会积极改正。最后为了奖励我写完了本博客,大家也阅读到了最后,看看美女照片奖励一下自己吧!