基于 mlr 包的 K 最近邻算法介绍与实践(上)

简介: 这里是林小编的新模块 ~ 一直想系统学习一下 R 语言关于机器学习的应用,主要从算法和 R 包的角度出发,并把自己的学习笔记分享出来,希望大家可以批评指正,一起交流,主要参考书是 《Machine Learning with R, tidyverse, and mlr[1]》,本书涉及两个非常重要的 R 包为 mlr 和 tidyverse,感兴趣的读者可以先行安装其中,mlr 包含了数量惊人的机器学习算法,并极大地简化了我们所有的机器学习任务。tidyverse 是一个 “专为数据科学设计的 R 包集合”,创建的目的是让 R 中的数据科学任务更简单、更人性化、更可复制。本期将先从常用的 k

前言


这里是林小编的新模块 ~ 一直想系统学习一下 R 语言关于机器学习的应用,主要从算法和 R 包的角度出发,并把自己的学习笔记分享出来,希望大家可以批评指正,一起交流,主要参考书是 《Machine Learning with R, tidyverse, and mlr[1]》,本书涉及两个非常重要的 R 包为 mlrtidyverse,感兴趣的读者可以先行安装:

install.packages("mlr", dependencies = TRUE)
install.packages("tidyverse")

其中,mlr 包含了数量惊人的机器学习算法,并极大地简化了我们所有的机器学习任务。tidyverse 是一个 “专为数据科学设计的 R 包集合”,创建的目的是让 R 中的数据科学任务更简单、更人性化、更可复制。

本期将先从常用的 k 近邻算法 出发!


1. k 近邻算法简介

k 近邻 (k-Nearest Neighbor,KNN)[2]算法,是一个理论上比较成熟的分类算法,也是最简单的 机器学习算法 之一。该方法的思路是:在特征空间中,如果一个样本附近的 k 个最近 (即特征空间中最邻近) 样本的大多数属于某一个类别,则该样本也属于这个类别。

即给定一个训练数据集,对新输入的样本,在训练数据集中找到与该样本最邻近的 k 个实例, 这 k 个实例中的多数属于哪个类,则新输入的样本也属于哪个类。


2. KNN 算法基本要素

KNN 算法中,所选择的邻近实例都是已经正确分类的对象,该算法只依赖于最邻近的一个或者几个实例的类别来决定待分样本所属的类别,分类器不需要使用训练集进行训练,训练时间复杂度为 0,即若训练集中文档总数为 n,那么 KNN 的分类时间复杂度为 O(n)。k 值的选择、距离度量和分类决策规则是该算法的三个基本要素:


2.1 k 值的选择

易知,k 值的选择会对算法的结果产生重大影响。k 值较小意味着只有与待分样本较近的训练实例才会对预测结果起作用,但容易发生过拟合;若 k 值较大,这时与待分样本距离较远的训练实例也会对预测起作用,可能使预测发生错误。在实际应用中,k 值一般选择一个较小的数值 (通常小于 20),实际中常采用 交叉验证 的方法来选择最优的 k 值。


2.2 距离度量

距离度量方法有 Euclidean(欧氏距离)、Minkowski(闵可夫斯基距离)和 Mahalanobis(马氏距离)等,而由分析学可知  上范数之间是等价的,故不必过度纠结选谁。在度量之前,应该将每个属性的值规范化,这样有助于防止具有较大初始值域的属性比具有较小初始值域的属性的权重过大。


2.3 分类决策规则

该算法中的分类决策规则往往是多数表决,即由输入实例的 k 个最邻近的训练实例中的多数类决定待分样本的类别。


3. 应用举例

本文将先介绍 mlr 包中 KNN 算法的使用方法,以 mclust 包中的 diabetes 数据集为例。


3.1 加载数据

library(mclust)
library(tibble)#属于 tidyverse,以合理的方式组织和显示数据
data(diabetes, package = "mclust")#加载数据
diabetesTib <- as_tibble(diabetes)#转换为 tibble 形式
diabetesTib
# A tibble: 145 x 4
   class  glucose insulin  sspg
   <fct>    <dbl>   <dbl> <dbl>
 1 Normal      80     356   124
 2 Normal      97     289   117
 3 Normal     105     319   143
 4 Normal      90     356   199
 5 Normal      90     323   240
 6 Normal      86     381   157
 7 Normal     100     350   221
 8 Normal      85     301   186
 9 Normal      97     379   142
10 Normal      97     296   131
# ... with 135 more rows

该数据集有 145 个实例和 4 个变量。class 因子显示,76 例为非糖尿病(Normal),36 例为化学糖尿病(Chemical),33 例为明显糖尿病(Overt)。另外三个变量是连续测量血糖水平的显性和胰岛素后的葡萄糖耐量测试(分别为glucoseinsulin) 以及稳态血糖水平(sspg)。

tibble 包引入了一种新的数据结构,关于该包和此新的数据结构的更多内容读者可参见参考书的第 2 章或该包的官方帮助说明[3]


3.2 作图分析

为了理解这些变量之间的关系,使用 R 中常用的 ggplot2 包绘制图。

library(ggplot2)
ggplot(diabetesTib, aes(glucose, insulin, col = class)) +
  geom_point() +
  theme_bw()#变量为 glucose 和 insulin
ggplot(diabetesTib, aes(sspg, insulin, col = class)) +
  geom_point() +
  theme_bw()#变量为 sspg 和 insulin
ggplot(diabetesTib, aes(sspg, glucose, col = class)) +
  geom_point() +
  theme_bw()#变量为 sspg 和 glucose

JDW3F9VNWQSI9C}LJG9}U1P.png


image.gifFig 1. 变量为 glucose 和 insuli


VIPE$EYG2UM~JERC7}[N~PG.png


Fig 2. 变量为 sspg 和 insulin

YG3GT%T~7@B$V%I$045K@4G.png


Fig 3. 变量为 sspg 和 glucose


从图中可以看出,在这三个类别之间,连续变量存在差异,接下来将构建一个 KNN 分类器,并用来预测未来患者的糖尿病状况。


3.3 使用 mlr 训练 KNN 模型

用这个包构建机器学习模型有三个主要阶段:

  • 定义任务。任务包括数据以及想要对数据做什么。在本例中,数据是  diabetesTib,我们想用变量 class 作为目标变量对数据进行分类。
  • 定义 learnerlearner 只是计划使用的算法的名称,以及该算法接受的任何其他参数。
  • 训练模型。这个阶段就是把任务交给  learnerlearner 生成一个模型,你可以用它来预测未来。


3.3.1 定义任务

定义任务所需的部分有:

  • 包含预测变量的数据 (我们希望这些变量包含进行预测/解决问题所需的信息)。
  • 想要预测的目标变量 (target variable)。

即:

Fig 4. 在 mlr 中定义任务

因为要构建一个分类模型,故使用 makeClassifTask() 函数来定义一个分类任务,当构建回归和聚类模型时,将分别使用 makeRegrTask()makeClusterTask()

library(mlr)
#定义分类任务
diabetesTask <- makeClassifTask(data = diabetesTib, target = "class")


3.3.2 定义 learner

定义 learner 所需的部分有:

  • 使用的算法类别: "classif." 分类;"regr." 回归;"cluster." 聚类;"surv." 和 "multilabel." 用于预测生存和多标签分类。
  • 使用的算法。
  • 用来控制算法的其他选项。

即:

QAB[H)%4QPTD9NXNC_84UWN.png

Fig 5. 在 mlr 中定义 learner

使用 makeLearner() 函数来定义 learnermakeLearner() 函数的第一个参数是用来训练模型的算法,在本例中,是使用 KNN 算法,因此指定参数为 "classif.knn"。第二个参数 par.vals 表示参数值,用来指定希望算法使用的 k 个最近邻的数量。

#定义 learner
knn <- makeLearner("classif.knn", par.vals = list("k" = 2))# k 先设定为 2,后续会讨论如何选择 k


3.3.3 训练模型

训练模型所需的部分是我们之前定义的任务和 learner,定义任务、learner 并将其结合起来就是训练模型的整个过程。

即:

BSKU23P42PHUXA[`O]WMZ2C.png

Fig 6. 在 mlr 中训练模型

这个过程通过 train() 函数实现,它将 learner 作为第一个参数,而任务作为第二个参数。

#训练模型
knnModel <- train(knn, diabetesTask)


3.4 预测和评估模型

现在我们有了模型,再将数据传回模型,看看它是如何执行的。predict() 函数接受未标记的数据,并将其传递给模型以获得它们的预测类,该函数第一个参数是模型,传递给它的数据由第二个参数 newdata 给出。

knnPred <- predict(knnModel, newdata = diabetesTib)

可再将这些预测作为 performance() 函数的第一个参数传递。该函数将模型预测的类与真实的类进行比较,并返回预测值与真实值之间匹配程度的性能指标。

J81DSS(FPK2LF53SZEZ$C$8.png

image.gifFig 7. mlr 中 predict()和 performance()函数的过程

performance(knnPred, measures = list(mmce, acc))
     mmce       acc 
0.0137931 0.9862069


这里指定的性能指标为 mmce (mean misclassifcation error) 和 acc (accuracy)。mmce 是被分类为其他类别而不是真实类别的实例所占的比例,acc 与此相反,是模型正确分类的实例比例。


由此可见,模型对 98.62% 的实例都进行了正确的分类。

这是否意味着我们的模型将在新的、未见过的病人身上表现良好?事实上我们并不知道。使用最初用来训练模型的数据进行预测来评估模型性能,几乎不能说明在对完全看不见的数据进行预测时模型将如何运行。因此,用这种方式评估模型性能是不合理的。

目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
199 30
|
1月前
|
存储 算法
深入解析PID控制算法:从理论到实践的完整指南
前言 大家好,今天我们介绍一下经典控制理论中的PID控制算法,并着重讲解该算法的编码实现,为实现后续的倒立摆样例内容做准备。 众所周知,掌握了 PID ,就相当于进入了控制工程的大门,也能为更高阶的控制理论学习打下基础。 在很多的自动化控制领域。都会遇到PID控制算法,这种算法具有很好的控制模式,可以让系统具有很好的鲁棒性。 基本介绍 PID 深入理解 (1)闭环控制系统:讲解 PID 之前,我们先解释什么是闭环控制系统。简单说就是一个有输入有输出的系统,输入能影响输出。一般情况下,人们也称输出为反馈,因此也叫闭环反馈控制系统。比如恒温水池,输入就是加热功率,输出就是水温度;比如冷库,
345 15
|
2月前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
7天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
8天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真