利用rstudio做深度学习回归模型的案例
先说说我写本文的目的:
我之前买了一本《python深度学习》的书(见下图),这本书是基于keras和tensorflow做深度学习的,我的建议是,小白不要买这本书,避免看不懂。

这本书对深度学习的小白很不友好,如果你直接复制代码就想上手跑的话,代码是跑不通的,会报一堆的错误。也就是说,这本书不是给小白看的。给小白看至少代码复制粘贴就能跑,不是吗?

另外我还买了《R语言深度学习》这本书(见下面的购买截图),我发现《python深度学习》这本书(见上图)和《R语言深度学习》这本书(见下面)两者的重复率高达90%,作者或者出版社就是将python的代码换成R代码就编成两本书了(国外的出版社很聪明呀),这个作者够聪明的(LA-JI)的,这样都能写成两本书来卖?要不是我这两本书都买了,我也不会发现这个现象。反正这个作者和这个出版社给我的印象就是:太聪明了,大家碰见这个出版社和这个作者,要小心一点。小白看不懂

我发现《python深度学习》这本书和《R语言深度学习》这本书,关于回归模型的深度学习,也就是第3章关于预测波士顿房价的那些代码,你直接复制粘贴,很有可能报错,另外书里面讲得不明不白,看得云里雾里。所以我用网上找到的其他材料自学了一遍回归模型的深度学习过程,如果你需要这方面的知识,可以看本文我的讲解,保证代码能跑。
第1步,加载波士顿房屋价格的数据
命令如下所示,为什么要加载这个数据,因为已经有现成的数据了,你也可以自己编写一个广州的房价数据加载进去。
如果报下面的错误,代表你没有安装mlbench包:

用下面的命令安装mlbench包,就不会报上面的没有BostonHousing这个数据集的错误了:
install.packages("mlbench")
第2步、将BostonHousing这个数据集命名为data:
data <- BostonHousing
可以用data回车来查看波士顿房价的数据,一共14列,506行:

关于这14列的数据,网上有详细的介绍,我这里简单介绍一下14列数据的表示的意思(最后一列medv就是房屋的价格中位数,必须清楚第14列是房屋价格的意思,不然无法理解下面的代码):
CRIM——按城镇划分的人均犯罪率
ZN——划分为25000平方英尺以上地块的住宅用地比例。
INDUS——每个城镇非零售商业英亩数的比例。
CHAS-Charles River伪变量(如果域边界为河流,则为1;否则为0)
NOX-氮氧化物浓度(百万分之一)
RM——每个住宅的平均房间数
年龄-1940年之前建造的自住单元的比例
DIS-到波士顿五个就业中心的加权距离
RAD——辐射状公路可达性指数
TAX-每10000美元的全额财产税税率
PTRATIO-按城镇划分的师生比例
B-1000(Bk-0.63)^2其中Bk是按城镇划分的黑人比例
LSTAT——人口地位降低%
MEDV-自住房屋的中值,单位为1000美元
第3步、将data转化成matrix数据:
data <- as.matrix(data)
第4步、设置取样的数据
首先设置一个种子, 例如我设置了一个9999的种子,如果不设置种子的话,就无法重复。如果我设置了9999的种子,下次我想要重复的时候,就用9999来重新调取即可。你也可以设置成一个8888的种子:
set.seed(9999)
从data里面抽取样品ind(你也可以设置成abc,不一定要设置成ind),下面设置成从 1,2 中有放回( replace = T)抽取样品,概率分别为(0.8,0.2),也就是抽取506行数据的80%作为训练样品,506行数据的20%作为测试样品。
ind <- sample(2, nrow(data), replace = T, prob = c(.8, .2))
将1到13列数据的80%作为训练样品,命名为training:
training <- data[ind==1,1:13]
将1到13列数据的20%作为测试样品,命名为test:
test <- data[ind==2, 1:13]
将第14列数据的80%作为训练目标数据,命名为trainingtarget:
trainingtarget <- data[ind==1, 14]
将第14列数据的20%作为测试目标数据,命名为testtarget:
testtarget <- data[ind==2, 14]
在rstudio里面,将上面所述的6条代码依次敲入并回车即可:

第5步、数据标准化处理
m <- colMeans(training)
s <- apply(training, 2, sd)
training <- scale(training, center = m, scale = s)
test <- scale(test, center = m, scale = s)
第6步、建立模型
代码为:
model <- keras_model_sequential() %>%
layer_dense(units = 10, activation = 'relu', input_shape = c(13)) %>%
layer_dense(units = 1)
上面代码的意思是:利用 keras_model_sequential() 定义了模型model,并设置了 1 个隐藏层和 1 个输出层,其中的激活函数是 relu。

用summary函数来查看这个model:

第7步、模型编译
用下面的代码来编译,其中mse是损失函数,mse的意思是Mean Square Error,即预测值和目标值差异的平方;rmsprop是优化器,rmsprop是Root Mean Squared Propagation的意思;mae是监控度量,mae是Mean Absolute Error的意思:
model %>% compile(loss = 'mse',
optimizer = 'rmsprop',
metrics = 'mae'
)
第8步、模型拟合
代码如下:
mymodel <- model %>%
fit(training,
trainingtarget,
epochs = 200,
batch_size = 32,
validation_split = 0.2)
其中,上面代码的 epochs = 200,batch_size = 32,validation_split = 0.2这几个参数可以自行设置。
上面的代码回车后,就开始跑了:

运行结束会显示下面的图:

上图的 loss 是“损失函数“的意思,val_loss 是“验证集下的损失函数“的意思。(上面代码我设置的验证集划分比例为 0.2)。mae 是“平均绝对误差“的意思,而 val_mae 是“验证集下的平均绝对误差“。从上图可以看出,训练80轮之后,mae 与 loss 就基本上趋于稳定。
第9步、用evaluate函数来评估模型
代码为:
model %>% evaluate(test, testtarget)
这时候显示loss值为21.3,mae值为3.65,loss值也就是均方误差(Mean Square Error,MSE)值为21.3,而mae值也就是平均绝对误差(Mean Absolute Error,MAE)值为3.65:

也可以用下面的代码来计算均方误差:
mean((testtarget-pred)^2)
用下面的代码来算预测值:
pred <- predict(model,test)
第10步、预测值和真实值之间的比较
先要加载3个包:
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())
上面的代码最后是ggplot画出的预测值和真实值之间的比较:

第一种方法小结
library(keras) #加载keras包
# 用runif函数随机生成自变量x和应变量y:
x <- matrix(runif(100), nrow = 10, ncol = 10)
y <- runif(10)
# 生成模型
model <- keras_model_sequential() %>%
layer_dense(units = 5, activation = "relu", input_shape = c(10)) %>%
layer_dense(units = 1)
# 编译模型,用的损失函数是mse,优化器是optimizer_sqd:
model %>% compile(loss = "mean_squared_error", optimizer = optimizer_sgd(lr = 0.01))
# 训练模型
model %>% fit(x, y, epochs = 100, batch_size = 1)
# 保存模型
save_model_hdf5(model, "模型名字")
第2种方法介绍
下面按照《R语言深度学习》这本书上介绍的方法来说明。
将波士顿房价数据命名为dataset:
dataset <- dataset_boston_housing()
用dataset来查看,发现这个dataset里面有train$x, train$y, test$x, test$y共4个数据集,其中train$x是404行13列的数据,train$y是404行1列,test$x是102行13列,test$y是102行1列的数据。

将train$x, train$y, test$x, test$y这4个数据集分别命名为train_data, train_targets, test_data, test_targets:
c(c(train_data, train_targets), c(test_data, test_targets)) %<-% dataset
用str函数查看这4个数据集的情况:
str(train_data)
str证明,这些数据确实是我说的404行13列等格式:

用下面的命令对数据进行标准化处理:
mean <- apply(train_data, 2, mean)
std <- apply(train_data, 2, sd)
train_data <- scale(train_data, center = mean, scale = std)
test_data <- scale(test_data, center = mean, scale = std)

建立模型:
model <- keras_model_sequential() %>%
layer_dense(units = 64, activation = "relu",
input_shape = dim(train_data)[[2]]) %>%
layer_dense(units = 64, activation = "relu") %>%
layer_dense(units = 1)
编译模型:
model %>% compile(
optimizer = "rmsprop",
loss = "mse",
metrics = c("mae")
)
创建一个叫做build_model的函数:
build_model <- function() {
model <- keras_model_sequential() %>%
layer_dense(units = 64, activation = "relu",
input_shape = dim(train_data)[[2]]) %>%
layer_dense(units = 64, activation = "relu") %>%
layer_dense(units = 1)
model %>% compile(
optimizer = "rmsprop",
loss = "mse",
metrics = c("mae")
)
}
用k=4来跑代码:
k <- 4
indices <- sample(1:nrow(train_data))
folds <- cut(indices, breaks = k, labels = FALSE)
num_epochs <- 100
all_scores <- c()
for (i in 1:k) {
cat("processing fold #", i, "n")
val_indices <- which(folds == i, arr.ind = TRUE)
val_data <- train_data[val_indices,]
val_targets <- train_targets[val_indices]
partial_train_data <- train_data[-val_indices,]
partial_train_targets <- train_targets[-val_indices]
model <- build_model()
model %>% fit(partial_train_data, partial_train_targets,
epochs = num_epochs, batch_size = 1, verbose = 0)
results <- model %>% evaluate(val_data, val_targets, verbose = 0)
all_scores <- c(all_scores, results$mean_absolute_error)
}
如果执行上面的代码报错,报错信息是:Error in results$mean_absolute_error : $ operator is invalid for atomic vectors,可以用下面的代码来单独跑:
model %>% fit(train_data, train_targets,
epochs = 200, batch_size = 1, verbose = 0)
可以将这个拟合的模型命名为my,然后用my来看这个模型的情况:

全文完,谢谢观看。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~


值友5392515177
校验提示文案
卖女孩的火柴棍
一、数据导入
二、数据预处理(清洗规整、增删改查、数据类型转化)
三、探索分析(可视自动化)
四、特征衍生(组合变量批量自动化生成、特征筛选指标评估自动化)
五、分箱筛选(变量分箱最优自动化)
六、相关性构建(多类算法聚合:逻辑、回归、分类&机器学习、深度学习、强化学习
七、检验评测(第六项计算各自的混淆矩阵指标,自动化计算结果)
八、分数转换
九、超参调优
so针对第二至七项,就python及其第三方库(自动化)实操详解的电子书及其代码而言,特跪求大佬推荐。。。非AI或者chatgpt+XX系列,书籍需求具体如下:
1、小白速成上手、简单易懂
because:文科转型
2、行业内公认靠谱,电子书中文版(暂不考虑:单个某库的说明书)
because:内容忒多繁杂,且无常用算法库的聚合呈现
3、需要2023年出版
because:即使按书实操,旧版书均因为其所涉之第三方库的灭失、相同操作而新旧版本不适配、新旧版本变更操作等原因而导致无法实现同等功能)
校验提示文案
值友7242847161
校验提示文案
sahara11
校验提示文案
弗老大
校验提示文案
弗老大
校验提示文案
五十包郵解君愁
校验提示文案
五十包郵解君愁
校验提示文案
sahara11
校验提示文案
弗老大
校验提示文案
值友7242847161
校验提示文案
弗老大
校验提示文案
卖女孩的火柴棍
一、数据导入
二、数据预处理(清洗规整、增删改查、数据类型转化)
三、探索分析(可视自动化)
四、特征衍生(组合变量批量自动化生成、特征筛选指标评估自动化)
五、分箱筛选(变量分箱最优自动化)
六、相关性构建(多类算法聚合:逻辑、回归、分类&机器学习、深度学习、强化学习
七、检验评测(第六项计算各自的混淆矩阵指标,自动化计算结果)
八、分数转换
九、超参调优
so针对第二至七项,就python及其第三方库(自动化)实操详解的电子书及其代码而言,特跪求大佬推荐。。。非AI或者chatgpt+XX系列,书籍需求具体如下:
1、小白速成上手、简单易懂
because:文科转型
2、行业内公认靠谱,电子书中文版(暂不考虑:单个某库的说明书)
because:内容忒多繁杂,且无常用算法库的聚合呈现
3、需要2023年出版
because:即使按书实操,旧版书均因为其所涉之第三方库的灭失、相同操作而新旧版本不适配、新旧版本变更操作等原因而导致无法实现同等功能)
校验提示文案
值友5392515177
校验提示文案