zoukankan      html  css  js  c++  java
  • 【机器学习与R语言】8- 神经网络

    1.理解神经网络

    1)基本概念

    • 人工神经网络(ANN):对一组输入信号和一组输出信号之间的关系进行建模,模型来源于人类大脑对来自感觉输入刺激反应的理解。使用人工神经元或节点的网络来学习。
    • 图灵测试:如果一个人不能把机器行为和一种生物行为区分开来,那么将该机器划分为智能类。
    • ANN应用方法:分类/数值预测/无监督模式识别
    • ANN应用场景:输入和输出好理解,但其过程很复杂(即黑箱方法)

    生物神经元示意图
    人工神经元模型,x输入信号,y输出信号,w加权,f为激活函数(求和)
    n个输入神经元:
    image.png

    2)激活函数

    • 单位跳跃激活函数:输入信号总和大于0,神经元才击破阈值

    单位跳跃激活函数示意图

    • S形激活函数(最常用的激活函数):输出信号不是二元的,而是0-1之间的某个值(可微的,因此可对整个输入范围求导)

    S形激活函数示意图

    • 其他激活函数:差异就在于输出信号的范围不同,一般是(0-1),(-1,1),(-∞,+∞)中的一种。

    image.png
    对于很多激活函数,影响输出信号的输入值范围是相对较窄的,比如上面S形激活函数影响输出信号(0,1)的输入信号范围(-5,5),存在输入信号压缩(也称为压缩函数),所以神经网络输入一般要做标准化,使特征值落在0附近的小范围内,这样模型训练也更快些。

    3)网络拓扑

    神经网络的学习能力来自它的拓扑结构:相互连接的神经元模式和结构。关键特征:

    • 层的数目

    单层网络示意图
    多层网络示意图

    多个隐藏层又称为深度学习

    • 信息传播方向
      前馈网络:输入信号从上至下节点传送,直至输出层。应用广泛。
      反馈网络(递归网络):允许信号使用循环在两个方向上传播。更贴近生物神经网络工作原理,使复杂模式被学习。停留在理论层面。
      多层前馈网络(多层感知器,MLP):人工神经网络拓扑结构的事实标准。

    递归网络示意图

    • 每一层内的节点数
      输入节点的个数由输入数据特征的数量预先确定,输出节点的个数由需要进行建模的结果或结果中分类水平数预先确定。隐藏节点的个数留给使用者在训练模型之前确定(无可信规则)。
      较多数量的神经元训练更严格的模型,但易过拟合,且训练慢。最好是基于验证数据集,使用较少的节点产生适用的性能。

    4)训练算法

    通过调整连接权重训练神经网络模型的计算量非常大,因此一种后向传播误差的训练策略被发现。

    目前,后向传播算法的多层前馈网络在数据挖掘领域很常见:

    后向传播算法特点
    该算法通过两个过程的多次循环进行迭代。
    两个过程:

    • 前向阶段:输入层到输出层,沿途应用每个神经元的权重和激活函数,一旦到最后一层就产生一个输出信号。
    • 后向阶段:前向阶段产生的输出信号与训练集中的真是目标值比较,两者的误差向后传播来修正神经元之间的连接权重,并减少将来的误差。

    梯度下降法:利用每个神经元的激活函数的导数来确定每个输入权重方向上的梯度(因此一个可微的激活函数很重要,梯度因为权重的改变表明误差的急剧变化,后向传播算法通过学习率的量来改变权重来使得误差最大化减少)。

    2.神经网络应用示例

    使用人工神经网络对混凝土的强度进行建模

    1)收集数据

    包含1030个混凝土案例,8个描述混合物成分的特征(与抗压强度相关)。
    数据下载:

    链接: https://pan.baidu.com/s/1Js-Asm479XYBjuCEXVF7Ng 提取码: 45fv

    2)探索和准备数据

    输入数据的标准化。注意如果数据服从一个钟形曲线(如正态分布),使用base::scale()函数才是有意义的。如果是均匀分布或严重非正态,则标准化到0-1水平会更合适。

    ## Example: Modeling the Strength of Concrete  ----
    
    ## Step 2: Exploring and preparing the data ----
    # read in data and examine structure
    concrete <- read.csv("concrete.csv")
    str(concrete)
    
    # custom normalization function
    normalize <- function(x) { 
      return((x - min(x)) / (max(x) - min(x)))
    }
    
    # apply normalization to entire data frame
    concrete_norm <- as.data.frame(lapply(concrete, normalize))
    
    # confirm that the range is now between zero and one
    summary(concrete_norm$strength)
    
    # compared to the original minimum and maximum
    summary(concrete$strength)
    
    # create training and test data
    concrete_train <- concrete_norm[1:773, ] #75%
    concrete_test <- concrete_norm[774:1030, ] #25%
    

    训练模型前应用于数据的任何变换,之后需要应用反变换,以便将数据转换回原始的测量单位。

    3)训练数据

    可做神经网络的R包:neuralnet,nnet,RSNNS等。这里使用neuralnet包的同名函数来做,hidden参数即隐藏层默认为1。

    ## Step 3: Training a model on the data ----
    # train the neuralnet model
    library(neuralnet)
    
    # simple ANN with only a single hidden neuron
    set.seed(12345) # to guarantee repeatable results
    concrete_model <- neuralnet(formula = strength ~ cement + slag +
                                  ash + water + superplastic + 
                                  coarseagg + fineagg + age,
                                  data = concrete_train)
    
    # visualize the network topology
    plot(concrete_model)
    

    训练模型的网络拓扑结构可视化:

    Error是误差平方和SSE,Step是训练步数

    4)评估模型

    评估模型是compute函数(而非predict),评估中包含网络中每一层的神经元和预测值这2个结果。
    因为是数值预测而不是分类问题,所以不能用混淆矩阵来评估,可以用预测的强度和真实值的相关性来评估。

    ## Step 4: Evaluating model performance ----
    # obtain model results
    model_results <- compute(concrete_model, concrete_test[1:8])
    # obtain predicted strength values
    predicted_strength <- model_results$net.result
    # examine the correlation between predicted and actual values
    cor(predicted_strength, concrete_test$strength)
    

    预测值与真实值相关性

    5)提高性能

    考虑使用更复杂拓扑结构的网络学习,将隐藏节点个数增加到5来提高性能。

    ## Step 5: Improving model performance ----
    # a more complex neural network topology with 5 hidden neurons
    set.seed(12345) # to guarantee repeatable results
    concrete_model2 <- neuralnet(strength ~ cement + slag +
                                   ash + water + superplastic + 
                                   coarseagg + fineagg + age,
                                   data = concrete_train, hidden = 5)
    
    # plot the network
    plot(concrete_model2)
    
    # evaluate the results as we did before
    model_results2 <- compute(concrete_model2, concrete_test[1:8])
    predicted_strength2 <- model_results2$net.result
    cor(predicted_strength2, concrete_test$strength)
    

    Error减小,步数增加(耗时)
    预测值和真实值相关性增加


    机器学习与R语言系列推文汇总:
    【机器学习与R语言】1-机器学习简介
    【机器学习与R语言】2-K近邻(kNN)
    【机器学习与R语言】3-朴素贝叶斯(NB)
    【机器学习与R语言】4-决策树
    【机器学习与R语言】5-规则学习
    【机器学习与R语言】6-线性回归
    【机器学习与R语言】7-回归树和模型树
    【机器学习与R语言】8-神经网络
    【机器学习与R语言】9-支持向量机
    【机器学习与R语言】10-关联规则
    【机器学习与R语言】11-Kmeans聚类
    【机器学习与R语言】12-如何评估模型的性能?
    【机器学习与R语言】13-如何提高模型的性能?

  • 相关阅读:
    在dubbo的一端,看Netty处理数据包,揭网络传输原理
    解惑:什么叫模型?
    拜托!不要再问我是否了解多线程了好吗
    微软职位内部推荐-Senior SW Engineer for Application Ecosystem
    微软职位内部推荐-Senior Software Engineer
    微软职位内部推荐-Senior Software Engineer_Azure
    微软职位内部推荐-Software Engineer II
    微软职位内部推荐-Senior Software Engineer
    微软职位内部推荐-Software Engineer II
    微软职位内部推荐-Senior Software Engineer
  • 原文地址:https://www.cnblogs.com/jessepeng/p/13616676.html
Copyright © 2011-2022 走看看