深度学习--人工神经网络算法
Posted 数据挖掘与应用
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习--人工神经网络算法相关的知识,希望对你有一定的参考价值。
总结过去3天的2018年世界人工智能大会,业界大佬们释放出的主要信息,未来是人工智能的时代,人工智能靠的是复杂的深度学习(Deep Learning)等等。着眼当下,用于深度学习的主流算法即是人工神经网络(Artificial Neural Network,ANN)算法。
由于本篇主要是实战,理论知识此时略过。。。数据来源从UCI机器学习数据仓库http://archive.ics.uci.edu/ml/datasets/Concrete+Compressive+Strength下载数据集。这是用人工神经网络对土木工程领域中的建筑材料--混凝土的强度进行建模,从而给定一份输入材料的成分清单,能够可靠地预测出混凝土强度以带来更安全的建设,避免豆腐渣工程。
根据网站提供的数据,该数据集共包含1030个样本,8个特征。这些特征被认为与最终的抗压强度有关。
特征指标含义:
cenent:水泥
slag:矿渣
ash:灰
water:水
superplastic:超塑化剂
coarseagg:粗集料
fineagg:细集料
age:老化时间
strength:抗压强度
下面开始加载探索数据并进行建模预测。
> library(readxl)
> concrete <- read_xls(file=file.choose())
Error in read_xls(file = file.choose()) :
unused argument (file = file.choose())
> concrete <- read_xls(path = "C:\\Users\\jinsong.yang\\Desktop\\Concrete_Data.xls",sheet = 1)
> dim(concrete)
[1] 1030 9
> names(concrete)
[1] "Cement (component 1)(kg in a m^3 mixture)" "Blast Furnace Slag (component 2)(kg in a m^3 mixture)"
[3] "Fly Ash (component 3)(kg in a m^3 mixture)" "Water (component 4)(kg in a m^3 mixture)"
[5] "Superplasticizer (component 5)(kg in a m^3 mixture)" "Coarse Aggregate (component 6)(kg in a m^3 mixture)"
[7] "Fine Aggregate (component 7)(kg in a m^3 mixture)" "Age (day)"
[9] "Concrete compressive strength(MPa, megapascals)"
#把特征向量简化一下,方便后续处理
> names(concrete) <- c("cement","slag","ash","water","superplastic","coarseagg","fineagg","age","strength")
> head(concrete)
# A tibble: 6 x 9
cement slag ash water superplastic coarseagg fineagg age strength
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 540 0 0 162 2.5 1040 676 28 80.0
2 540 0 0 162 2.5 1055 676 28 61.9
3 332. 142. 0 228 0 932 594 270 40.3
4 332. 142. 0 228 0 932 594 365 41.1
5 199. 132. 0 192 0 978. 826. 360 44.3
6 266 114 0 228 0 932 670 90 47.0
> str(concrete)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1030 obs. of 9 variables:
$ cement : num 540 540 332 332 199 ...
$ slag : num 0 0 142 142 132 ...
$ ash : num 0 0 0 0 0 0 0 0 0 0 ...
$ water : num 162 162 228 228 192 228 228 228 228 228 ...
$ superplastic: num 2.5 2.5 0 0 0 0 0 0 0 0 ...
$ coarseagg : num 1040 1055 932 932 978 ...
$ fineagg : num 676 676 594 594 826 ...
$ age : num 28 28 270 365 360 90 365 28 28 28 ...
$ strength : num 80 61.9 40.3 41.1 44.3 ...
> range(concrete$cement)
[1] 102 540
> range(concrete$age)
[1] 1 365
> range(concrete$superplastic)
[1] 0.0 32.2
不同的特征的范围很大,进行标准化
> concrete_z <- as.data.frame(lapply(concrete,scale))
> summary(concrete_z$superplastic)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-1.03844 -1.03844 0.02459 0.00000 0.66241 4.35204
> summary(concrete$superplastic)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 0.000 6.350 6.203 10.160 32.200
> #可知已成功的进行了z-score标准化
> #随机抽取训练集 测试集
> sub_1 <- sample(nrow(concrete_z),round(3/4*nrow(concrete_z)),replace = FALSE)
> concrete_train <- concrete_z[sub_1,]
> concrete_test <- concrete_z[-sub_1,]
> dim(concrete_train);dim(concrete_test)
[1] 772 9
[1] 258 9
> #随机抽取772个样本作为训练集 其余的258个样本作为测试集
#运用人工神经网络算法训练模型
> library(neuralnet)
Warning message:
程辑包‘neuralnet’是用R版本3.5.1 来建造的
> concrete_model <- neuralnet(strength ~ . , data = concrete_train,hidden = 1)
Error in terms.formula(formula) : 公式里有'.',而没有'data'这一参数
> concrete_model <- neuralnet(strength ~ cement + slag + ash + water + superplastic + coarseagg + fineagg + age, data = concrete_train,hidden = 1)
> #查看可输出的模型参数
> names(concrete_model)
[1] "call" "response" "covariate" "model.list" "err.fct"
[6] "act.fct" "linear.output" "data" "net.result" "weights"
[11] "startweights" "generalized.weights" "result.matrix"
> concrete_model$call
neuralnet(formula = strength ~ cement + slag + ash + water +
superplastic + coarseagg + fineagg + age, data = concrete_train,
hidden = 1)
> #可视化模型的网络拓扑结构
> plot(concrete_model)
#1)各指标的权重;2)蓝色的偏差项; 3)误差平方和120.17 ;4)训练的步数1545
> #评估模型的预测能力
> model_result <- compute(concrete_model,concrete_test[,1:8])
> names(model_result)
[1] "neurons" "net.result"
> #可知预测变量产生两个结果 $neural用来存储每一层的神经元 $net.result用来存储预测值
> pred_strength <- model_result$net.result
> #由于是数值预测问题,用相关系数检验相关性(分类问题用混淆矩阵)
> cor(pred_strength,concrete_test$strength)
[,1]
[1,] 0.8374656038
> #可知相关系数为0.84,具有相当强的线性关系
#尝试提高模型的预测能力--增加隐藏节点数
> concrete_model_2 <- neuralnet(strength ~ cement + slag + ash + water + superplastic + coarseagg + fineagg + age,data = concrete_train,hidden = 3)
> plot(concrete_model_2)
#可知模型的误差Error从120降到45 步数Steps从1545增加到59546,模型变复杂了
> model_result_2 <- compute(concrete_model_2,concrete_test[,1:8])
> pred_strength_2 <- model_result_2$net.result
> cor(pred_strength_2,concrete_test$strength)
[,1]
[1,] 0.9228845533
仅增加两个隐藏节点数,相关性从0.84上升到0.92, 可以认为模型的预测能力具有相当大的提升了。
有兴趣的小伙伴还可以尝试用max-min标准化来处理数据,进一步评估模型的预测能力。
以上是关于深度学习--人工神经网络算法的主要内容,如果未能解决你的问题,请参考以下文章