机器学习:基于KNN算法诊断乳腺癌(末尾有福利)

作者: ls_本性
专题简介:本专题是关于机器学习与R语言书籍的读书笔记(主要使用的R语言,可能会以别的案例做关于python实现机器学习的文章)
本章是关于机器学习的第一章,会简单的介绍一下机器学习,然后介绍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)

结尾福利

最后谢谢大家能够看完本博客,由于本人也正在学习,可能会有诸多不足和错误,希望大家能够提出,本人也会积极改正。最后为了奖励我写完了本博客,大家也阅读到了最后,看看美女照片奖励一下自己吧!
在这里插入图片描述

好的,我可以为您讲解如何使用PCA、Isomap进行降维,以及如何使用KNN进行分类。 首先,PCA和Isomap都是常用的降维算法,它们可以将高维数据映射到低维空间中,以便更好地进行数据分析和可视化。PCA是一种线性降维算法,它通过找到数据中最大方差的方向进行降维。而Isomap是一种非线性降维算法,它可以在保留数据流形结构的基础上进行降维。 对于乳腺癌数据集,我们可以先使用PCA或Isomap进行降维,然后再使用KNN进行分类。具体步骤如下: 1. 加载数据集 我们可以使用sklearn库中的load_breast_cancer函数来加载乳腺癌数据集。 ```python from sklearn.datasets import load_breast_cancer data = load_breast_cancer() X, y = data.data, data.target ``` 其中,X是特征矩阵,y是标签向量。 2. 数据预处理 在进行数据降维之前,我们需要对数据进行预处理。一般来说,我们需要对数据进行标准化处理,使得每个特征的均值为0,标准差为1。 ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) ``` 3. 使用PCA或Isomap进行降维 接下来,我们可以使用PCA或Isomap进行降维。 使用PCA: ```python from sklearn.decomposition import PCA pca = PCA(n_components=2) X_pca = pca.fit_transform(X_scaled) ``` 使用Isomap: ```python from sklearn.manifold import Isomap isomap = Isomap(n_components=2) X_isomap = isomap.fit_transform(X_scaled) ``` 其中,n_components参数表示降维后的维度数。 4. 使用KNN进行分类 最后,我们可以使用KNN进行数据分类。 ```python from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.2, random_state=42) knn = KNeighborsClassifier() knn.fit(X_train, y_train) y_pred = knn.predict(X_test) ``` 这里我们以PCA降维后的数据为例。首先,我们将数据集分为训练集和测试集,然后使用KNN进行分类,最后计算预测准确率。 完整代码如下: ```python from sklearn.datasets import load_breast_cancer from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.manifold import Isomap from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split import numpy as np # 加载数据集 data = load_breast_cancer() X, y = data.data, data.target # 数据预处理 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 使用PCA进行降维 pca = PCA(n_components=2) X_pca = pca.fit_transform(X_scaled) # 使用Isomap进行降维 isomap = Isomap(n_components=2) X_isomap = isomap.fit_transform(X_scaled) # 使用KNN进行分类 X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.2, random_state=42) knn = KNeighborsClassifier() knn.fit(X_train, y_train) y_pred = knn.predict(X_test) accuracy = np.mean(y_pred == y_test) print("PCA + KNN accuracy: {:.2f}%".format(accuracy * 100)) X_train, X_test, y_train, y_test = train_test_split(X_isomap, y, test_size=0.2, random_state=42) knn = KNeighborsClassifier() knn.fit(X_train, y_train) y_pred = knn.predict(X_test) accuracy = np.mean(y_pred == y_test) print("Isomap + KNN accuracy: {:.2f}%".format(accuracy * 100)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值