IT评测·应用市场-qidao123.com
标题:
基于 R 语言的深度学习——简单回归案例
[打印本页]
作者:
郭卫东
时间:
2024-9-6 14:13
标题:
基于 R 语言的深度学习——简单回归案例
近年来深度学习在人工智能领域飞速发展,各行业的学者、研究职员纷纷涌入研究高潮。本文将从 R 语言角度来先容深度学习并解决以下几个问题:
什么是深度学习?
相干深度学习包有哪些?
怎样设置工作环境?
怎样使用神经网络建立模子?
本文主要解决:
怎样使用神经网络建立模子?
,其他推文可见:基于 R 语言的深度学习——设置环境;基于 R 语言的深度学习——简介及资料分享。
简单神经网络建模
本节将从一个简单的回归例子[1]来先容怎样在 R 中使用 keras 包进行深度学习。
该案例是在 CPU 下进行的。如果你的装备有 GPU,并想用 GPU 训练模子。你不必要修改以下的代码,只需前期安装 GPU 版本的 TensorFlow,默认情况下,运算会优先使用 GPU。
知识点包括:
数据导入与数据处置处罚。
构建神经网络。
训练神经网络。
评估模子的准确性。
生存并规复创建的模子。
加载包
library(keras)
library(mlbench) #使用内部数据
library(dplyr)
library(magrittr)
复制代码
加载数据
使用 1970 年波士顿 506 个生齿普查区的住房数据作为例子。该数据集一共有 14 列,506 行。其中,因变量为 medv(自有住房的中位数报价, 单位 1000 美元),自变量为其他 13 个变量,包括:CRIM (城镇人均犯罪率)、ZN(占地面积凌驾 25000 平方英尺的住宅用地比例)、INDUS (每个城镇非零售业务的比例)等。
data("BostonHousing")
data <- BostonHousing
data %<>% mutate_if(is.factor, as.numeric)
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% 数据作为测试样本。
# 构建矩阵
data <- as.matrix(data)
dimnames(data) <- NULL
# 数据集划分
set.seed(1234)
ind <- sample(2, nrow(data), replace = T, prob = c(.7, .3)) #从 1,2 中有放回抽取一个数,概率分别为(0.7,0.3)。
training <- data[ind==1,1:13]
test <- data[ind==2, 1:13]
trainingtarget <- data[ind==1, 14]
testtarget <- data[ind==2, 14]
复制代码
别的,由于各个特征的数据范围不同,直接输入到神经网络中,会让网络学习变得困难。以是在进行网络训练之前,先将该数据集进行特征尺度化:输入数据中的每个特征,将其减去特征均匀值并除以尺度差,使得特征值以 0 为中央,且具有单位尺度差。在 R 中可以使用 scale() 函数实现该效果。
数据集 BostonHousing 也可以直接通过 keras 包中的 dataset_boston_housing() 进行加载,并且已经提前划分好了训练集和测试集。本文使用的是 mlbench 包中数据集进行加载,主要是呈现划分数据集的过程。
# 数据标准化
m <- colMeans(training)
s <- apply(training, 2, sd)
training <- scale(training, center = m, scale = s)
test <- scale(test, center = m, scale = s)
复制代码
构建模子
由于可用样本量很少,这里构建一个非常小的网络。使用 keras_model_sequential() 界说模子,并设置了 1 个隐藏层和 1 个输出层。激活函数为 relu。
model <- keras_model_sequential() %>%
layer_dense(units = 10, activation = 'relu', input_shape = c(13)) %>%
layer_dense(units = 1)
复制代码
通过 summary() 查察模子个层外形和参数,可以看到,统共包罗 151 个参数。
summary(model)
## Model: "sequential"
## ________________________________________________________________________________
## Layer (type) Output Shape Param #
## ================================================================================
## dense_1 (Dense) (None, 10) 140
##
## dense (Dense) (None, 1) 11
##
## ================================================================================
## Total params: 151
## Trainable params: 151
## Non-trainable params: 0
## ________________________________________________________________________________
复制代码
编译模子
编译主要必要设定三个部分:
损失函数:训练期间必要最小化的目的函数;
优化器:对数据和损失函数进行自我更新;
监控度量:训练和测试期间的评价尺度。
该例子是一个典范的回归问题,我们使用的损失函数是均方偏差(Mean Square Error,MSE),即预测和目的之间差异的平方。使用均方根传播方法(Root Mean Squared Propagation,RMSProp)作为该模子的优化器。使用均匀绝对偏差(Mean Absolute Error,MAE)来监控网络。
model %>% compile(loss = 'mse', #损失函数
optimizer = 'rmsprop', #优化器
metrics = 'mae'#监控度量
)
复制代码
优化器有很多种,详细先容可参考:理论[2]、实践[3];损失函数和评价度量的选择,可以参考这篇博客[4]。
拟合模子
拟合模子时,RStudio 的 Viewer 会出现:随着迭代变化的损失函数值。如下所示:
mymodel <- model %>%
fit(training,
trainingtarget,
epochs = 200,
batch_size = 32,
validation_split = 0.2)
复制代码
图中的 loss 是指损失函数,val_loss 是指验证集下的损失函数(代码中设置的验证集划分比例为 0.2)。mae 表示均匀绝对偏差,而 val_mae 表示验证集下的均匀绝对偏差。图中可以看到,随着训练轮数的增长,mae 与 loss 在不断减小并趋于稳定。
评估模子
使用 evaluate() 评估模子,给出预测效果。计算真实值和预测值的均方偏差。
model %>% evaluate(test, testtarget)
## loss mae
## 42.571 4.185
pred <- predict(model,test) #预测结果
mean((testtarget-pred)^2) #计算均方误差
## [1] 42.57
复制代码
通过 ggplot2[5] 包将预测效果和真实效果可视化。
library(ggplot2)
library(viridis)
library(ggsci)
ev_data = data.frame("Item" = seq(1,length(pred)),
"Value" = c(testtarget,pred),
"Class" = rep(c("True","Pred"),each = length(pred)))
ggplot(ev_data) +
geom_line(aes(Item,Value,col = Class,lty = Class)) +
scale_color_aaas() +
theme_bw() +
theme(panel.grid = element_blank())
复制代码
总体来看,预测效果还算不错,但是也有一些预测效果和真实值相差甚远。主要缘故原由是,我们没有调解参数来使模子到达最优的效果。读者可以使用 K 折验证的方法来探求最有的参数,例如:训练轮数,神经网络层数,各层神经元数等。具体案例可以见 《Deep Learning with R》的第 3.6.4 节[6]。
存储 / 加载模子
为了生存 Keras 模子以供将来使用,使用 save_model_tf() 函数生存模子。
save_model_tf(object = model, filepath = "BostonHousing_model") #保存模型
复制代码
使用 load_model_tf() 函数加载模子,并对新数据集(下面使用测试集)进行预测。
reloaded_model <- load_model_tf("BostonHousing_model") #加载模型
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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4