深度学习--人工神经网络算法

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标准化来处理数据,进一步评估模型的预测能力。





以上是关于深度学习--人工神经网络算法的主要内容,如果未能解决你的问题,请参考以下文章

人工智能——深度学习

机器学习算法汇总:人工神经网络深度学习及其它

09-机器学习.人工智能和深度学习的关系

14 深度学习-卷积

14 深度学习-卷积

深度学习神经网络介绍