当前课程知识点:R语言数据分析 > 下部:博术 > 第12章 既是世间法、自当有分别 > 12.3 近邻法(II)
大家好
欢迎来到《R语言数据分析》课程
在前面讲完近邻法的基本原理之后
咱们今天看一看
在R里面是如何实现近邻法的
当然R里面对近邻法有很多包来实现它
咱们这边选用的是kknn这么一个包
它实现了我们前面讲的加权近邻法
具体来讲
它是调用这个kknn这个函数
进行模型的训练
这个函数里面要进行模型训练的话
至少得包含这么三个参数
第一个参数就是这么个公式
指定y和X
第二个参数是什么
就是我们的训练集
通过我们前面的这个算法原理可以知道
它至少是包含什么
包含一个训练集还有一个测试集
我们这一课首先想看看这个kknn
这个加权的近邻法
对于我们这个成绩表cjb这个数据
对于文理分科这个问题
它的拟合效果怎么样
这个时候我先把什么 先把这个测试集
也设为什么
也设为我这个相同的那个训练集
好 我们看看它的拟合效果
这个时候拟合出一个什么
拟合出一个imodel
在R里面所谓训练出来模型
它其实很多模型训练出来之后
本质上还是什么还是一个列表
具体训练结果是什么
所拟合的结果就是这个imodel的这个列表里面
fit这个组成部分
我们将这个组成部分存储下来
假如我们想衡量它的具体的
模型训练的指标的话
或者说拟合的效果的话怎么办
我们可以计算一下它的这个分类的错误率
分类错误率可以自己通过这个table
(得到的)这个混淆矩阵来构建
也可以调用这个Metrics这个包
里面专门有个ce()这个函数
它接受两个参数
一个是什么
一个是我们这个实际的这个数据
一个是预测的数据
经过比较这两个数据
我们发现它的拟合的
拟合的效果怎么样 还可以
它分类错误率只有11%
就是十有八九他能预测对
大概这么一个性能
但是这个时候我们不能高兴太早
为什么
因为这只是什么
这只是训练集上面的拟合的效果
现在还不能代表他的泛化的误差
我们来看看
当我们有一份训练集
同时有另外一份测试集的时候
它的测试效果怎么样
我们通过这个测试的误差
来近似表达我们的泛化的性能
这时候我们就在做一个测试集的一个
相应的模型性能的一个(测试)
模型训练的过程
这个时候我们同时还要调用什么
还要调这个kknn对吧
因为作为一个惰性学习法
它训练和测试过程同时进行的
也就是说有了一个新的测试样本之后
我再临时看一下我对那个训练集而言
在训练集里面找一个小伙伴
然后看看他头上最多的标签是什么
所以它是一个惰性的过程
这里面和前面这个代码其实唯一的区别是什么
就这个test
我这里边改成什么了
改成了我的测试集
我们再看看测试集
它这个fit的效果
它的预测的效果是什么
它的分类错误率就高达0.25了
将近有25%的类别是分错的
就文理分科这一块
和实际的情况相比确实有一些错误
但也有十之七八的可能性
他能预测对
这是我们没有经过参数调优
它目前达到一个性能指标
当然我们可以通过相应的实验
我们来怎么样
我来找究竟哪个K是最好的
哪个核是最好的
我们来看看能不能把
这个模型性能指标提高一些
当然我们可以自己写一个循环
来枚举不同的K和不同的核
然后来训练它
看看哪个K和哪个核组合的效果最好
当然这里面也有一个
这个包里面有一个专门有这么一个
选优的一个函数
同样我们也是什么
也是这么一个公式
然后相应的数据交给他
然后我设定什么
kmax也表示从1到100
这个K值我枚举一下
然后同时我再设定一下
我究竟想从哪些核里面进行比较
我们目前列了这么几个核
好 我们看一下训练的结果
这个训练结果
我们在这个控制台里面敲完之后一回车
发现这个时候最小的分类错误率多少
21%
这个时候是针对什么
是针对测试集来讲
相应的核是什么
是高斯核
最好的K是多少
最好的K是25
这就是直接将我们什么
将我们的参数进行了调优了
这个时候我们就找到了我们
最好的核和最好的什么
最好的K值
当然这个最好的核和最好的K值
并不是说我现在还需要什么
还需要人工的来通过ctrl c加ctrl v复制粘贴
不需要这样怎么办
我们这个训练的结果是什么
它其实本身也是一个列表
它列表里面专门就有一个这个best parameters
就是最好的参数
这个组成部分依旧是一个什么
依旧是一个列表
它又包含两部分
一个是K一个什么
一个是这个核对吧
所以我们通过这个美元符号
$符号将它取出来就可以
这个最好的K是25
最好的核是高斯核
当然除了这个最好的K和最好的核之外
我们还想知道其它的K值和
不同的核他的组合结果是什么样的
我们可以绘制一个图
通过ggplot2绘这个图得到相应的结果
直观展示一下
我们先看看这个具体的过程
我们可以先什么
先把这个训练的结果
这个误分率先取出来
我们View一下
发现它是什么
它是一个数据框
最小错误率
我直接用这个min这个函数就可以得到
假如我们想通过ggplot2
将这个不同的K 不同的核
进行组合进行显示的话
我们还是需要做一个数据长宽变换
先把这个K先得一列
是K
然后新增加什么
我们进行长宽变换的话
设定一列是什么
核kernel
然后对不同的核怎么样
它相应的分类错误率进行记录
这个时候相当于什么
把现有的一行变成多少
123456
把它现有的行变成六行
做一个数据的长
由宽数据变成长的数据
变换完之后
我们再进一步交给ggplot2进行绘图
咱们看看代码的实现
前面这一部分其实都是什么呢
这一部分都是我们刚才讲到这个
数据变换的过程
数据一个长宽变化的过程
先将这个数据转化成什么
data.frame
然后先增加这个K这一列
再之后
我将这个数据由宽数据变成长数据
只是这个K这一列不参与这个什么
宽数据变长数据这么一个变换过程
进行长宽变换之后
我就交给什么ggplot2
这么一个函数
将X轴映射为K的值就是1到100
我们刚才设了 kmax = 100
1到100
然后Y就是相应的什么
我这个分类的错误率
colour我不同的颜色用不断核来进行映射
这一部分其实相当于什么
相当于进行了分组
不同的核就分成了不同的 绘制成不同的曲线了
好 具体的映射的过程
我把它映射成这个line
就是映射着一条条曲线
同时叠加上 point
映射成相应的那个点
除了对每一个K 每一个核进行绘制相应的
折线以及相应的点之外
还做什么
我们增加了两条线
一条什么一条垂直线
这个垂直线在这个最好的K这一块画一条竖线
然后再什么
在最小的分类错误率里面画一条水平线
这是我们整个这个代码
一个最基本的一个简单的解释
咱们看一看具体的效果
具体最后绘制的图形
X轴就是从1到100的什么这个不同的核
然后Y轴就是分类的什么错误率
分类错误率
然后这里面不同的什么不同的颜色
就是代表了什么不同的核在不同的K上面
它分别的一个分类的错误率
好 我们看得出来
这两条线相交的地方是什么
K值取的是25
相应的核是什么核
是应该是一个高斯核
这就是我们那个通过ggplot2
将所有的不同的核不同的K的组合
它真正的分类错误率的一个变化情况
我们进行了直观地展示
在进行这个模型的这个K值
以及核的选优之后
我们可以进行进一步的什么
K折交叉检验
通过多次的训练测试
看看模型最终它的性能指标
能稳定到哪个水平之上
咱们看看R里面如何实现这个
K折交叉检验的
当然同样还是我们还是采用这个包
kknn对吧
我们先什么
先记录一下这个模型
进行K折交叉检验之前
记录下当前的系统时间
就调用这个Sys.time
并且我输出一下
在控制栏里面输出一下目前的时间是多少
进行K折交叉检验的时候就是要循环K次对吧
因为k交叉检验
每一次当前这一折作为测试集
其余的K-1折作为训练集
好 我先将当前这一折取出来
当前这一次取出来就是
kfolds当前这一折i等于1的时候
就是第一折i等于2的第二折
然后下标取完之后 训练集是什么
注意了 训练集是减掉当前这一折
因为是其余的K-1折
所以这个是减掉当前这一折
而测试集就当前这一折
然后进行模型的构建
我们先看训练集上的表现
训练集上的拟合的性能表现
这和我们前面讲的那个代码是一样的
还是调用kknn()这个函数
这个时候训练集和测试集都是什么
都是设置为什么
都是设置为我这个训练集
好 训练完之后
我调用这个imetrics
就是我们前面讲到的这个模型的
所有模型的性能指标的一个什么
一个存储
就是一个记录
当前是kknn这个方法
是训练集上面的一个表现
它预测的结果以及它什么
它实际的一个结果
这就是将我们目前kknn
它经过这个当前这一折的时候
把这个性能指标写到
global_perfomence这个变量里面去了
接下来我们再做一个测试
这个时候其实kknn还是一样的调用
然后唯一不同的就是这个test
这个测试集不一样了
当然这个时候我们相应的K用的最好的k
相应的核也用的最好的核对吧
同样是调用我们前面所定义的imetrics
这么一个函数
把当前的性能指标写入到全局变量里面去
也是kknn这个方法
但是目前使用的什么
目前是test
测试集的结果
最后我们记录一下
这个训练模型所结束的时候系统时间
把结束的时候的时间在控制台进行显示
最后我们计算一下
通过difftime
计算一下我们这个模型
开始和结束的时候一个时间差
也就是整个这个模型训练
经过K折交叉检验
究竟花了多长时间
我们看一下当前这个global_perfomence
它的一个具体的那个数值
它其实分成这个方法 类别
正确率 错误率这么四列
因为我们十折交叉检验
然后每一折的话
既计算这个训练集 也计算这个测试集
所以当前得到结果总共应该是有多少
应该是20行
每一折它相应的在训练集上的正确率和错误率
我们都进行记录了
这个值我们在后面
在不同的模型进行对比的时候需要用到
这就是我们在R语言里面
如何实现近邻法一些最基本的一个实现的过程
咱们总结一下
所谓的近邻法究竟是一个什么样的关系
我们说到
前面课程里面讲到了
所谓机器学习最核心的都是什么
都是寻找关系结构
那我们看完了近邻法的一个最基本的原理
也看完了近邻法的一个实现
应该有一个直观的认识了
那我们总结一下
既然我们机器所学到的规律
都是关系 都是结构
那近邻法究竟代表一种什么样的关系
它表现形式是什么
同学们思考一下这个问题
其实我们可以通过下面这个图一个直观的展示
假如我们这个K近邻法里面
这个K值我取为1的时候
也就是所谓的最近邻
它其实可以看成一个什么
看这个空间划分的过程
空间划分的过程
就不同的点有不同的什么势力范围
当我这个一个新的点
落入我某一个点的势力范围的话
那毫无疑问它就属于什么
它就跟这个点的标签是一致的
这就所谓的最近邻
我们其实可以理解成什么
一个空间的划分
当然K取其他值得时候
其实也可以视为一个空间划分的过程
这就和我们前面讲到了机器学习
其实无非是什么
变量之间的关系和
数据空间的结构所呼应起来了
这面就是对近邻法来讲
就这么一种数据空间一个切分的结构
本次课到此结束
谢谢大家
-第1章 气象万千、数以等观
--第1章 作业
-第2章 所谓学习、归类而已
--第2章 作业
-第3章 格言联璧话学习
--第3章 作业
-第4章 源于数学、归于工程
--第4章 作业
-讨论题
-第5章 工欲善其事、必先利其器
--第5章 作业
-第6章 基础编程——用别人的包和函数讲述自己的故事
--6.1 编程环境
--6.4 控制流
--第6章 作业
-第7章 数据对象——面向数据对象学习R语言
--第7章 作业
-第8章 人人都爱tidyverse
--第8章 作业
-第9章 最美不过数据框
--第9章 作业
-第10章 观数以形
--第10章 作业
-第11章 相随相伴、谓之关联
--11.1 导引
--第11章 作业
-第12章 既是世间法、自当有分别
--12.1 导引
--第12章 作业
-第13章 方以类聚、物以群分
--13.1 导引
--第13章 作业
-第14章 庐山烟雨浙江潮
--第14章 作业