当前课程知识点:R语言数据分析 > 下部:博术 > 第12章 既是世间法、自当有分别 > 12.10 人工神经网络(II)
大家好
欢迎来到《R语言数据分析》课程
在前面的课程里面
我们和大家简单交流了一下
神经网络的基本原理
今天我们看一看R里面如何实现它
说到人工神经网络
其实在R里面它有很多实现的包
包括我们现在最火的深度学习
深度神经网络
其实在它不同的框架在R里面都有实现
都有相应的接口
针对咱们这个问题情境呢
我们用一个相对比较简单的神经网络结构
所采用的包也是一个比较经典的
nnet的这个包
这个包它其实实现的是什么呢
是一个单隐藏层
只包含一个隐藏层的这么一种神经网络
当然我们说单个隐藏层
这并不表示这个神经网络就不怎么好
其实也已经有理论上证明
只有一个隐藏层的话
其实也可以拟合任意的函数
这个在具体实现的过程中
我们这需要简单说明一下
因为我们在前面讲算法的时候
都是讲那个经典的一个实现的过程
然后具体某些包来进行实现的话
它可能有一些
有一些差别
比如说我们这个nnet的话
它在优化这个方面
其实和我们前面讲的也稍微有一些差别
我们看看这个nnet的这个包
它其实真正要用到的
其实训练的函数 要学习模型的话
其实用的就是 nnet和它那个同名的一个函数
里面有很多的参数 这儿只列了其中一部分
比如说这个size
size是什么呢
我们刚才讲了它nnet只是什么
训练一个比较简单的神经网络
它是包含一个隐藏层
这个size就是表示
这个隐藏层里面结点的个数
再比如Wts
毫无疑问
这Wts其实表示什么
表示这个权值weights
就是说
初始的权值你可以自己设定
但我们前面在讲算法的时候
也提到了
其实初始权值一般都怎么样
随机生成的
千里之行 始于随机
假如是我们不设定的话
其实绝大部分情况之下我们都不设定
它就是什么
随机生成
当然随机生成的时候
它也有一个什么也有一个区间
这个区间是什么呢
一般来讲就是-0.5到0.5左右
就是相对还是比较小的一个区间里面
另外还有个参数
也是经常需要设置的这个decay
这个参数的话
它其实是用来什么
用来控制我这个
所训练的神经网络它的泛化能力的
再下一个参数是什么
maxit
它其实什么
它其实就是我这个什么迭代的次数
最多不超过多少
我们之前讲了
这个整个的神经网络
它在训练的过程中
它不断迭代不断迭代
直到找到什么比较好的那一个W对吧
它有两个终止条件
一种是什么
两次之间它的误差(变化)已经足够小了
就不需要再迭代了
另外一种什么呢
就是迭代次数太多了
我就走得太累了
我不想再迭代了
这里面就设置一个什么
最大迭代次数
下面这个参数
大部分情况之下也是不需要设置的
但是有某些情况之下可能是需要用到
比如说它指的什么呢
就我这里面那个权值的个数
就也说白了也是什么
就是我这个连接的连线有多少条
最多不能超过多少
就一旦我们的输入这个节点数太多
隐层节点数太多
我的输入太多
那毫无疑问
这个一旦超过这个的话
那其实我们的训练网络的时候它可能会报错
这个时候就得重新设置一下
这是我们的nnet这个函数里面
最基本的常用的一些参数的一个情况
咱们看看具体针对我们这个问题情境
通过nnet如何来训练我们相应的模型
调用这个nnet()的这个函数
当然它和我们通常的大部分的什么
大部分的模型训练过程都是一样的
是吧
先一个公式对吧
这个formula
就是这是因变量
然后后面是自变量
波浪号前面是因变量
波浪号后面自变量
然后将我们的相应的训练数据设定好
另外就是这个size
这个是必不可少的
几乎其他的所有参数都有默认值
但是这个size是没有的
size它是你必须指定
指定究竟包含几个隐藏节点
一旦训练好这个模型之后
我们可以看看这个模型究竟是什么
它包含哪些具体的组成部分
imodel它其实还是什么
本质上还是一个列表
假如我们调用这个函数叫typeof()
typeof(imodel)的话
这个时候我们会发现什么
它其实
它返回结果就是什么 就是一个list
也就是说它本质上就是一个列表
我们可以看到它有一些具体组成部分
比如说其中的这个什么
第一个组成部分
imodel$n 表示什么
10 7 1
毫无疑问这是每一个层的节点个数
输入层 隐藏层 输出层
然后这个imodel的这个训练好的模型
它有一个什么
wts表示什么
我训练好之后
因为我们前面讲了所谓的神经网络的训练
一旦你的结构设定好了
这个超参数相应的超参数
比如这个size都已经设定好了
那你最后训练出来的时候
其实就是这个相应的一些参数
也就是什么
也就是我这个连接的权值
是不是
也就是连接的权值
当然还有一个什么
比如说这里面imodel的一个什么
fitted.values
表示什么意思呢
就表示我具体的我的训练集
我每一个它相应的什么
拟合得到结果
一旦我们这个模型训练完之后
就可以用来做什么
来看看我们模型的性能指标
通过这个统一的接口函数predict()
看看这个模型针对什么
针对我一个新的数据
假如我是要看这个训练集的拟合效果的话
怎么样
我把这个newdata还是设成什么
还是设置成这个训练集
type="class"
这时候我们可以通过
这个Metrics里面这个ce()这个函数
可以看一下它目前的结果是多少
分类错误率0.19
假如是对这个测试集来讲
测试集 针对这个测试集的话
它的结果其实更好一点 是多少
分类错误率只有0.17
只有0.17
当然这里面我们是什么
是没有经过太多的参数设置的
我们刚刚讲了这里面
必不可少的参数至少是个size
另外设置比较多的
还有一个什么decay
这个用来用于控制这个模型的泛化能力的
那这两个参数设置的时候
刚才这个size等于7的话还是相对有点随意
decay的话它默认是为零
其实这两个参数都可以设置
那怎么设呢
我们一般来讲我们可以通过什么
通过这个自己写一个嵌套的循环是可以的
双重循环
不同的这个size不同的decay当然可以
当然更好的方法就是采用这个caret的这个包
通过caret的包我们来做什么
通过这个进行这个格子点搜索
它本质上其实还是嵌套的循环
我们还是调用
这个expand.grid()这么一个函数
当然我们经常说这个
caret里面的什么格子点搜索
并不表示这个函数是什么
并不表示这个函数是caret包里面的
这个函数
其实我们在你不加载这个包
就在我们基础包里面本身已经包含了 base::expand.grid
它最后生成的结果是什么
expand.grid
它其实最后生成的是一个data.frame
就是这个size
不同的size 不同的decay
它怎么样
它不同的组合
size等于1
然后decay等于0.03
size等于1 decay等于0.1
类似这样的 这么一个组合的过程
然后我们利用这个caret的包里面
我们来什么来进行一个什么优选
就将什么将我这个格子点我都交给他
刚才我生成的这个格子点对吧
就不同的那个参数的组合
交过来进行什么
相当于写了一个双重循环
一个双重循环进行什么
模型(参数)的寻优
这时我们发现
怎么样
最佳的这个参数这个size等于多少
size等于3
然后 decay等于0.6
当然我们可以通过这个plot
我们来直接将这个训练啊
这个优选的过程我们看一下
就是参数优选的过程看一下
这个时候我们看一下横轴的话是多少
这里面其实就是什么就是我这个size
就是我这里面隐藏层节点的个数
然后这个纵轴的话是什么
是我这个准确率
大家注意了
纵轴的准确率
然后不同的什么
不同的线条
不同的颜色代表什么
不同的decay
毫无疑问
我们都希望我们的线条这么一个形状
对吧
都希望这么条形状
然后在最高点的时候什么就是我想要的什么
相应的size
相应的decay
对不对
那这时我们可以看得出来
确实这个时候size等于3
然后decay等于多少
decay等于0.6的时候
它效果最好的也达到一个最高点
达到一个最高点
一旦我们将这个调优之后的(超)参数
我们设定好之后
我们来看一看
这个时候相应的
所训练的模型
它的性能指标怎么样
刚才我们随意设置这个size等于7的时候
它是0.19
对训练集来讲
现在稍微有所改进了
变成了0.18
然后在这个测试集上面
在训练集上面有所改进
然后测试集上应该说改进更大一点
刚才是0.17
现在变成多少 0.15了
这就是一个比较好的一个提升
这也就是我们看到的
通过这个格子点搜索的方法
进行相应的参数的一个调优的过程
我们在训练模型之后
我们再看看这个神经网络究竟长什么样子
我们来绘制一下我们这个神经网络
这个时候我们要加载一个新的包
叫NeuralNetTools
当然还是用刚才我们这个nnet
它来进行模型训练
相应的参数就是
将刚才我们什么
将刚才已经优选好的参数交给它
包括decay 包括size
一旦训练好这个
再次训练好一个nnet的这个模型之后怎么样
我可以通过这个plotnet
将这个模型绘制出来
将这张网络绘制出来
咱们看一下这个网络的具体
长什么样子
毫无疑问
这里面都是什么
以I开头都是什么都是input
也就是说这个输入的节点
然后这个中间的都是什么
都是这个H都是什么
都是我这个所谓的隐藏层节点
这个hidden
这个O就是output就是输出层的节点
我们这个时候可以看得出来它其实什么
其实这个网络结构就比较清晰了
这里面权值的大小也映射成什么
这个线条的粗细了
这就是我们网络的一个绘制的过程
接下来我们可以看一看
究竟我们整个这个
nnet
这么一个相对比较简单的神经网络
针对我们这个文理分科这份数据
它的模型性能指标
究竟在稳定在哪一个水平之上
也是通过我们什么这个k折交叉检验
来进行那个模型的评估
当然 这个整个的过程
和我们前面过程也是一样的
分成训练集测试集
然后怎么样进行模型的训练
然后在训练集上我进行预测
看看拟合的效果
并且交给什么
通过这个imetrics函数叠加到这个
我这个global_performance里面去
同样对测试集也是一样
当然这里面我们稍微提一下
就是我们前面讲编代码的时候
在讲函数的时候就提过一个什么
叫事不过三法则
其实我们这个k折交叉检验
已经反反复复使用了
那这个时候其实我们有必要考虑一下
将它包成一个函数
我们为了演示的
为了看得更加清晰
所以每次我们都显示出来了
在具体如何包成函数
我们在这个托管的GitHub代码里面
已经实现了
大家可以参考一下
咱们先看看目前我们这个nnet
K折交叉检验的一个结果
它的这个应该讲这个测试集的训练的
性能指标应该还是相当不错的
很多都是什么都是这个在20%以下的
就是应该都迈进了
准确率迈进了80%以上
所以讲这个神经网络的整个性能指标
对咱们这个数据来讲还是不错的
以上就是我们关于这个R语言里面
如何实现我们一个相对比较简单一个神经网络
本次课到此结束
谢谢大家
-第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章 作业