【机器学习与R语言】8- 神经网络

2020-09-04  本文已影响0人  生物信息与育种

1.理解神经网络

1)基本概念

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

n个输入神经元:


image.png

2)激活函数

单位跳跃激活函数示意图 S形激活函数示意图 image.png

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

3)网络拓扑

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

单层网络示意图
多层网络示意图 多个隐藏层又称为深度学习 递归网络示意图

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减小,步数增加(耗时)
预测值和真实值相关性增加
上一篇 下一篇

猜你喜欢

热点阅读