基于 R 语言的深度学习——简单回归案例

打印 上一主题 下一主题

主题 1024|帖子 1024|积分 3072

近年来深度学习在人工智能领域飞速发展,各行业的学者、研究职员纷纷涌入研究高潮。本文将从 R 语言角度来先容深度学习并解决以下几个问题:


  • 什么是深度学习?
  • 相干深度学习包有哪些?
  • 怎样设置工作环境?
  • 怎样使用神经网络建立模子?
本文主要解决:怎样使用神经网络建立模子?,其他推文可见:基于 R 语言的深度学习——设置环境;基于 R 语言的深度学习——简介及资料分享。
简单神经网络建模

本节将从一个简单的回归例子[1]来先容怎样在 R 中使用 keras 包进行深度学习。
   该案例是在 CPU 下进行的。如果你的装备有 GPU,并想用 GPU 训练模子。你不必要修改以下的代码,只需前期安装 GPU 版本的 TensorFlow,默认情况下,运算会优先使用 GPU。
  知识点包括:

  • 数据导入与数据处置处罚。
  • 构建神经网络。
  • 训练神经网络。
  • 评估模子的准确性。
  • 生存并规复创建的模子。
加载包

  1. library(keras)
  2. library(mlbench) #使用内部数据
  3. library(dplyr)
  4. library(magrittr)
复制代码
加载数据

使用 1970 年波士顿 506 个生齿普查区的住房数据作为例子。该数据集一共有 14 列,506 行。其中,因变量为 medv(自有住房的中位数报价, 单位 1000 美元),自变量为其他 13 个变量,包括:CRIM (城镇人均犯罪率)、ZN(占地面积凌驾 25000 平方英尺的住宅用地比例)、INDUS (每个城镇非零售业务的比例)等。
  1. data("BostonHousing")
  2. data <- BostonHousing
  3. data %<>% mutate_if(is.factor, as.numeric)
  4. knitr::kable(head(data[,1:12])) #由于呈现不了所有列,这里只展示 12 列的前 6 行数据。
复制代码
crimzninduschasnoxrmagedisradtaxptratiob0.0063182.3110.5386.57565.24.090129615.3396.90.027307.0710.4696.42178.94.967224217.8396.90.027307.0710.4697.18561.14.967224217.8392.80.032402.1810.4586.99845.86.062322218.7394.60.069002.1810.4587.14754.26.062322218.7396.90.029902.1810.4586.43058.76.062322218.7394.1 数据处置处罚

首先,对 506 条数据进行划分。随机选择其中的 70% 数据作为训练样本,别的 30% 数据作为测试样本。
  1. # 构建矩阵
  2. data <- as.matrix(data)
  3. dimnames(data) <- NULL
  4. # 数据集划分
  5. set.seed(1234)
  6. ind <- sample(2, nrow(data), replace = T, prob = c(.7, .3)) #从 1,2 中有放回抽取一个数,概率分别为(0.7,0.3)。
  7. training <- data[ind==1,1:13]
  8. test <- data[ind==2, 1:13]
  9. trainingtarget <- data[ind==1, 14]
  10. testtarget <- data[ind==2, 14]
复制代码
别的,由于各个特征的数据范围不同,直接输入到神经网络中,会让网络学习变得困难。以是在进行网络训练之前,先将该数据集进行特征尺度化:输入数据中的每个特征,将其减去特征均匀值并除以尺度差,使得特征值以 0 为中央,且具有单位尺度差。在 R 中可以使用 scale() 函数实现该效果。
   数据集 BostonHousing 也可以直接通过 keras 包中的 dataset_boston_housing() 进行加载,并且已经提前划分好了训练集和测试集。本文使用的是 mlbench 包中数据集进行加载,主要是呈现划分数据集的过程。
  1. # 数据标准化
  2. m <- colMeans(training)
  3. s <- apply(training, 2, sd)
  4. training <- scale(training, center = m, scale = s)
  5. test <- scale(test, center = m, scale = s)
复制代码
构建模子

由于可用样本量很少,这里构建一个非常小的网络。使用 keras_model_sequential() 界说模子,并设置了 1 个隐藏层和 1 个输出层。激活函数为 relu。
  1. model <- keras_model_sequential() %>% 
  2.          layer_dense(units = 10, activation = 'relu', input_shape = c(13)) %>%
  3.          layer_dense(units = 1)
复制代码
通过 summary() 查察模子个层外形和参数,可以看到,统共包罗 151 个参数。
  1. summary(model)
  2. ## Model: "sequential"
  3. ## ________________________________________________________________________________
  4. ##  Layer (type)                       Output Shape                    Param #     
  5. ## ================================================================================
  6. ##  dense_1 (Dense)                    (None, 10)                      140         
  7. ##                                                                                 
  8. ##  dense (Dense)                      (None, 1)                       11          
  9. ##                                                                                 
  10. ## ================================================================================
  11. ## Total params: 151
  12. ## Trainable params: 151
  13. ## Non-trainable params: 0
  14. ## ________________________________________________________________________________
复制代码
编译模子

编译主要必要设定三个部分:

  • 损失函数:训练期间必要最小化的目的函数;
  • 优化器:对数据和损失函数进行自我更新;
  • 监控度量:训练和测试期间的评价尺度。
该例子是一个典范的回归问题,我们使用的损失函数是均方偏差(Mean Square Error,MSE),即预测和目的之间差异的平方。使用均方根传播方法(Root Mean Squared Propagation,RMSProp)作为该模子的优化器。使用均匀绝对偏差(Mean Absolute Error,MAE)来监控网络。
  1. model %>% compile(loss = 'mse', #损失函数
  2.                   optimizer = 'rmsprop', #优化器
  3.                   metrics = 'mae'#监控度量
  4.                   )
复制代码
  优化器有很多种,详细先容可参考:理论[2]、实践[3];损失函数和评价度量的选择,可以参考这篇博客[4]。
  拟合模子

拟合模子时,RStudio 的 Viewer 会出现:随着迭代变化的损失函数值。如下所示:
  1. mymodel <- model %>%
  2.          fit(training,
  3.              trainingtarget,
  4.              epochs = 200,
  5.              batch_size = 32,
  6.              validation_split = 0.2)
复制代码



图中的 loss 是指损失函数,val_loss 是指验证集下的损失函数(代码中设置的验证集划分比例为 0.2)。mae 表示均匀绝对偏差,而 val_mae 表示验证集下的均匀绝对偏差。图中可以看到,随着训练轮数的增长,mae 与 loss 在不断减小并趋于稳定。
评估模子

使用 evaluate() 评估模子,给出预测效果。计算真实值和预测值的均方偏差。
  1. model %>% evaluate(test, testtarget)
  2. ##   loss    mae 
  3. ## 42.571  4.185
  4. pred <- predict(model,test) #预测结果
  5. mean((testtarget-pred)^2) #计算均方误差
  6. ## [1] 42.57
复制代码
通过 ggplot2[5] 包将预测效果和真实效果可视化。
  1. library(ggplot2)
  2. library(viridis)
  3. library(ggsci)
  4. ev_data = data.frame("Item" = seq(1,length(pred)),
  5.                      "Value" = c(testtarget,pred),
  6.                      "Class" = rep(c("True","Pred"),each = length(pred)))
  7. ggplot(ev_data) +
  8.   geom_line(aes(Item,Value,col = Class,lty = Class)) +
  9.   scale_color_aaas() +
  10.   theme_bw() + 
  11.   theme(panel.grid = element_blank())
复制代码


总体来看,预测效果还算不错,但是也有一些预测效果和真实值相差甚远。主要缘故原由是,我们没有调解参数来使模子到达最优的效果。读者可以使用 K 折验证的方法来探求最有的参数,例如:训练轮数,神经网络层数,各层神经元数等。具体案例可以见 《Deep Learning with R》的第 3.6.4 节[6]。
存储 / 加载模子

为了生存 Keras 模子以供将来使用,使用 save_model_tf() 函数生存模子。
  1. save_model_tf(object = model, filepath = "BostonHousing_model") #保存模型
复制代码
使用 load_model_tf() 函数加载模子,并对新数据集(下面使用测试集)进行预测。
  1. reloaded_model <- load_model_tf("BostonHousing_model") #加载模型
  2. predict(reloaded_model, test) #对新数据集进行预测
复制代码
相干拓展

以上例子先容了怎样使用神经网络来处置处罚简单问题(数据量较小的回归问题),但在实际过程中可能面对种种困难,包括:怎样对数据进行预处置处罚,怎样进行特征筛选,怎样解决过拟合问题,怎样调解参数等。
由于笔者时间和能力有限,这篇推文不能一一给出系统的解决方案。相干资源可见:基于 R 语言的深度学习——简介及资料分享,以供读者翻阅。
   该系列还会继承写下去,欢迎来我的公众号《庄闪闪的 R 语言手册》关注新内容。
  参考资料

[1]
回归例子: https://github.com/fmmattioni/deep-learning-with-r-notebooks/blob/master/notebooks/3.6-predicting-house-prices.Rmd
[2]
理论: http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf
[3]
实践: https://keras.io/api/optimizers/
[4]
博客: https://machinelearningmastery.com/how-to-choose-loss-functions-when-training-deep-learning-neural-networks/
[5]
ggplot2: https://ggplot2.tidyverse.org/
[6]
3.6.4 节: https://github.com/fmmattioni/deep-learning-with-r-notebooks/blob/master/notebooks/3.6-predicting-house-prices.Rmd

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表