数据准备
1.收集数据
UC Irvine Machine Learning Repository-Concrete Compressive Strength Data Set
把下载到的Concrete_Data.xls拷贝到R的工作目录,然后用Excel打开另存为concrete.cvs。
或者从这里下载:
http://files.cnblogs.com/files/yuananyun/concrete.rar
2.数据预处理
> setwd("F://R语言/练习/")
> 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))
as.data.frame是一个通用的方法很多功能,用户和包可以提供进一步的方法。
如果提供一个列表,每个元素都被转换为数据框中的一列。同样,矩阵的每一列分别被转换。
数据分割
我们把concrete_norm分成训练数据集concrete_train(75%);测试数据集concrete_test(25%)
> concrete_train <- concrete_norm[1:773,]
> concrete_test <- concrete_norm[774:1030,]
我们将用训练数据集生成神经网络模型,并用测试数据集来评价检验。
3.生成训练模型
我们将使用R中的neuralnet包来生成一个前馈神经网络。
安装和载入需要的包
> install.packages("neuralnet")
> library(neuralnet)
我们首先训练一个简单的只包括一个隐含层的多层前馈神经网络模型:
> concrete_model <- neuralnet(strength ~ Cement+slag+ash+water+superplastic+coarseagg+fineagg+age,data=concrete_train)
我们现在来看看我们刚刚建立的模型:
在这个简单模型中,数据集的八个特性作为八个输入节点,然后接着一个简单的隐含层节点,最后一个输入节点表示预测的混泥土强度。图中每个连接的权重都已经标识出来了,其中蓝色的1节点表示偏置(bias)。图中也显示了训练的步骤数,采用的测量方法是SSE,这些测量数据对于评价模型性能非常重要。
4.评估模型的性能
上一步的网络图给了我们一个直观的表象,但是并没有给我们提供较多关于这个模型与我们的数据匹配程度的信息。我们将使用compute()函数来在测试数据集上进行预测计算。
> model_results <- compute(concrete_model,concrete_test[1:8])
> predicted_strength <- model_results$net.result
使用cor()函数来获取我们的预测值与实际值之间的线性关联度:
> cor(predicted_strength,concrete_test$strength)
下面是我本机的结果:
[,1]
[1,] 0.7142372144
关联度越接近1表明两个变量之间线性相关性越强。我们这个结果约为0.72,表明我们的预测结果和实际结果还是比较接近,即使我们是在仅有一个隐含层的情况下,下面我们将提高预测的性能。
5.提高模型的性能
我们这节看看如果我们把隐含层数目增加到5会发生什么奇迹。我们可以再次使用neuralnet()函数,把隐含层数目改成5。
> concrete_model2 <- neuralnet(strength ~ Cement+slag+ash+water+superplastic+coarseagg+fineagg+age,data=concrete_train,hidden=5)
我们再次看看生成的网络图:
> plot(concrete_model2)
从图中可以看到我们的Error已经降低了很多。此外,模型训练步骤数上升到了39302,难怪我们的模型变得复杂很多了。
我们使用同样的方法来验证一下模型的预测性能:
> model_results2 <- compute(concrete_model2,concrete_test[1:8])
> predicted_strength2 <- model_results2$net.result
> cor(predicted_strength2,concrete_test$strength)
[,1]
[1,] 0.7295445435
可以看到,我们的预测性能提高了。
最后,本文简单的介绍了如何使用R来编写一个简单的神经网络实例。任何预测模型都不能做到100%,神经网络模型也一样,为了提高预测的性能,我们可以加大隐含层的数目,但是这样会导致训练步骤增加,训练时间变长,模型变复杂。