使用RStudio學習一個簡單神經網絡


數據准備

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)

5隱含層網絡圖

從圖中可以看到我們的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%,神經網絡模型也一樣,為了提高預測的性能,我們可以加大隱含層的數目,但是這樣會導致訓練步驟增加,訓練時間變長,模型變復雜。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM