用神经网络对混凝土强度进行建模
实验目的
根据过去案例的历史数据,包括混凝土成分的多个主要特征、强度结果等数据样本,建立神经网络模型,用于预测新样本的抗压强度
实验要求
1、利用已发生的1030条数据样本,8个条件属性包括水泥cement、矿渣slag、灰ash、水water、超塑化剂superplasticizer、粗料集coarse aggregate、细料集fine aggregate、老化时间aging time;1个结论属性:抗压强度。建立神经网络预测模型;
2、对于新样本,根据混凝土成分的特征,预测输出抗压强度。(kg/cm2)
实验原理
基于R语言与数据样本,建立神经网络模型。对模型进行训练、评估和优化,以及部署预测
实验仪器、设备、材料或软件等
1、Windows环境
2、R 3.6.3 安装
3、Rstudio 安装
已装跳过
实验内容及步骤
数据预处理
载入数据文件
concrete <- read.csv(“concrete.csv”)
查看数据字段定义
str(concrete)
文件中的数据都很大,需要进行归一化处理
定义“标准化函数”(归一化)
normalize <- function(x){ return((x - min(x)) / (max(x) - min(x)))}
标准化训练数据集
concrete_norm <- as.data.frame(lapply(concrete, normalize))
对比标准化前后的数据情况
summary(concrete_norm$strength)
summary(concrete$strength)
分析出训练集和测试集
concrete_train <- concrete_norm[1:773,]
concrete_test <- concrete_norm[774:1030,]
使用留出法,比例为3:1.
训练模型
安装升级网络算法包
install.packages("neuralnet”)
加载算法库
library(neuralnet)
建模
- 生成模型
concrete_model <-neuralnet(strength~cement+slag+ash+water+superplastic+coarseagg+fineagg+age, data=concrete_train)
- 查看模型
plot(concrete_model)
模型一共有三层,第一层有八个神经元、第二层和第三层都只有一个神经元,误差平方和为5.666757;迭代次数为1560.
评估模型
- 使用测试数据集进行测试
model_results <- compute(concrete_model,concrete_test[1:8])
- 取出预测的强度结论结果值
predicted_strength <- model_results$net.result
- 计算精确度
cor(predicted_strength,concrete_test$strength)
精确度为0.7214244.
优化模型
- 建模(增加隐藏层神经元个数)
concrete_model2<- neuralnet(strength ~ cement+slag+ash+water+superplastic+coarseagg+fineagg+age,data=concrete_train,hidden=3)
- 查看模型
plot(concrete_model2)
模型一共有三层,第一层有八个神经元、第二层较于优化前的模型增加了两个神经元,共三个神经元,第三层仍然是一个神经元,误差平方和为2.029324;迭代次数为20132.这些数值较于之前有明显的增加。
- 使用测试数据集进行预测
model_results2 <- compute(concrete_model2, concrete_test[1:8])
- 取出预测的强度结论结果值(展示部分)
predicted_strength2 <- model_results2$net.result
- 计算准确度
cor(predicted_strength2,concrete_test$strength)
可见,优化后的模型精确度有所提高,为0.823141。
实际预测
- 读取新数据
concrete_new <- read.csv("concrete-new.csv")
- 标准化
concrete_new_norm <- as.data.frame(concrete_new)
concrete_new_norm$cement=(concrete_new_norm$cement-102)/(540-102)
concrete_new_norm$slag=(concrete_new_norm$slag-0)/(359.4-0)
concrete_new_norm$ash=(concrete_new_norm$ash-0)/(200.1-0)
concrete_new_norm$water=(concrete_new_norm$water-121.8)/(247-121.8)
concrete_new_norm$superplastic=(concrete_new_norm$superplastic-0)/(32.2-0)
concrete_new_norm$coarseagg=(concrete_new_norm$coarseagg-801)/(1145-801)
concrete_new_norm$fineagg=(concrete_new_norm$fineagg-594)/(992.6-594)
concrete_new_norm$age=(concrete_new_norm$age-1)/(365-1)
- 预测-归一化
model_results_new <- compute(concrete_model2,concrete_new_norm)
predicted_strength_new <- model_results_new$net.result
predicted_strength_new
归一化的结果为0.8232523,较于优化后的结果有微小提高。
- 还原抗压强度数据值-反归一化
final_results=predicted_strength_new*(82.6-2.33)+2.33
final_results
反归一化后的值为68.412254。
结果分析
模型架构:
- 原始模型(concrete_model)包含了一个具有8个神经元的输入层,一个具有8个神经元的隐藏层,以及一个具有1个神经元的输出层。模型的均方误差(误差平方和)较高,迭代次数也相对较低。
- 优化后的模型(concrete_model2)增加了隐藏层的神经元数量,共三层,具有更多的参数,从而提高了模型的容量。这使得模型更复杂,适应性更强,均方误差较低,但需要更多的迭代次数。
模型评估:
- 原始模型的精确度为0.7214,而优化后的模型精确度为0.8231。优化后的模型表现更好,但还有改进的空间。
- 在模型评估中,还可以考虑其他指标,如均方根误差(RMSE)或平均绝对误差(MAE),以更全面地了解模型的性能。
实际预测:
- 成功地用新数据进行了预测,并对结果进行了反归一化。预测结果为68.41,这是一个有希望的预测结果。
进一步改进:
- 尝试不同的神经网络架构和超参数,以找到更好的模型性能。
- 考虑使用交叉验证来更全面地评估模型的性能。
- 如果有更多的特征可用,可以尝试添加它们以改进模型的性能。
考虑使用更大规模的数据集,如果可能的话,以提高模型的泛化能力。
end
此次实验仓促,之后会改进。(少点事情啊喂!w(゚Д゚)w
数据:
链接:https://pan.baidu.com/s/1oYU7UYjUJRgJea4TEwyQWQ?pwd=8iz7
提取码:8iz7