天天看點

拓端tecdat|R語言代寫實作拟合神經網絡; 神經網絡包

神經網絡一直是迷人的機器學習模型之一,不僅因為花哨的反向傳播算法,而且還因為它們的複雜性(考慮到許多隐藏層的深度學習)和受大腦啟發的結構。

神經網絡并不總是流行,部分原因是它們在某些情況下仍然存在計算成本高昂,部分原因是與支援向量機(SVM)等簡單方法相比,它們似乎沒有産生更好的結果。然而,神經網絡再一次引起了人們的注意并變得流行起來。

 在這篇文章中,我們将使用

neuralnet

包裝拟合一個簡單的神經網絡,并将線性模型作為比較。

資料集

我們将在MASS包中使用Boston資料集。

波士頓資料集是波士頓郊區房屋價值資料的集合。我們的目标是使用所有其他可用的連續變量來預測自住房屋(medv)的中值。

首先,我們需要檢查是否缺少資料點,否則我們需要修複資料集。

apply(data,2,function(x)sum(is.na(x)))
            

沒有遺漏資料,很好。我們通過随機将資料分成火車和測試集來進行,然後我們拟合線性回歸模型并在測試集上進行測試。請注意,我正在使用該

gml()

函數而不是

lm()

這将在以後交叉驗證線性模型時變得有用。

index < -  sample(1:nrow(data),round(0.75 * nrow(data)))
   MSE.lm < -  sum((pr.lm  -  test $ medv)^ 2)/ nrow(test)
           

sample(x,size)

函數簡單地從向量輸出指定大小的随機選擇樣本的向量

x

。預設情況下,采樣無需替換:

index

本質上是一個随機的indeces向量。 

準備适應神經網絡

在拟合神經網絡之前,需要做一些準備工作。神經網絡不容易訓練和調整。

作為第一步,我們将解決資料預處理問題。

在訓練神經網絡之前規範化資料是一種很好的做法。我無法強調這一步驟的重要性:根據您的資料集,避免标準化可能會導緻無用的結果或非常困難的訓練過程(大多數情況下算法在允許的最大疊代次數之前不會收斂)。您可以選擇不同的方法來縮放資料(z-normalization,min-max scale等)。我選擇使用min-max方法并在區間[0,1]中縮放資料。通常在區間[0,1]或[-1,1]中縮放往往會産生更好的結果。

是以,我們在繼續之前縮放和分割資料:

maxs < -  apply(data,2,max) 
 scaled < -  as.data.frame(scale(data,center = mins,scale = maxs  -  mins))
train_ < -  scaled [index,]
test_ < -  scaled [-index,]
           

請注意,

scale

傳回需要強制轉換為data.frame的矩陣。

參數

據我所知,雖然有幾個或多或少可接受的經驗法則,但沒有固定的規則可以使用多少層和神經元。通常,如果有必要,一個隐藏層足以滿足大量應用程式的需要。就神經元的數量而言,它應該在輸入層大小和輸出層大小之間,通常是輸入大小的2/3。至少在我的簡短經驗中,一次又一次的測試是最好的解決方案,因為無法保證這些規則中的任何一個最适合您的模型。

由于這是一個玩具示例,我們将使用此配置使用2個隐藏層:13:5:3:1。輸入層有13個輸入,兩個隐藏層有5個和3個神經元,輸出層當然是單個輸出,因為我們正在進行回歸。

f < -  as.formula(paste(“medv~”,paste(n [!n%in%“medv”],collapse =“+”)))
nn < -  neuralnet(f,data = train_,hidden = c(5,3),linear.output = T)
           

幾個筆記:

  • 由于某種原因

    y~.

    ,該

    neuralnet()

    函數不接受該公式。您需要先編寫公式,然後将其作為拟合函數中的參數傳遞。
  • hidden

    參數接受一個包含每個隐藏層的神經元數量的向量,而該參數

    linear.output

    用于指定我們是否要進行回歸

    linear.output=TRUE

    或分類

    linear.output=FALSE

Neuralnet包提供了繪制模型的好工具:

plot(nn)
            

這是模型的圖形表示,每個連接配接都有權重:

拓端tecdat|R語言代寫實作拟合神經網絡; 神經網絡包

黑色線條顯示每個層與每個連接配接上的權重之間的連接配接,而藍線顯示每個步驟中添加的偏差項。偏差可以被認為是線性模型的截距。

網基本上是一個黑盒子,是以我們不能說拟合,重量和模型。可以說訓練算法已經收斂,是以可以使用該模型。

使用神經網絡預測medv

現在我們可以嘗試預測測試集的值并計算MSE。請記住,網絡将輸出标準化預測,是以我們需要将其縮小以進行有意義的比較(或僅僅是簡單的預測)。

pr.nn < -  compute(nn,test _ [,1:13])
pr.nn_ < -  pr.nn $ net.result *(max(data $ medv)-min(data $ medv))+ min(data $ medv)
test.r < - (test_ $ medv)*(max(data $ medv)-min(data $ medv))+ min(data $ medv)
MSE.nn < -  sum((test.r  -  pr.nn _)^ 2)/ nrow(test_)
           

然後我們比較兩個MSE

顯然,在預測medv時,網絡比線性模型做得更好。再一次,要小心,因為這個結果取決于上面執行的列車測試分割。下面,在視覺圖之後,我們将進行快速交叉驗證,以便對結果更有信心。

下面繪制了網絡性能和測試集上的線性模型的第一種可視方法

plot(test $ medv,pr.nn_,col ='red',main ='Real vs expected NN',pch = 18,cex = 0.7)
abline(0,1,LWD = 2)
legend('bottomright',legend ='NN',pch = 18,col ='red',bty ='n')
plot(test $ medv,pr.lm,col ='blue',main ='Real vs expected lm',pch = 18,cex = 0.7)
abline(0,1,LWD = 2)
legend('bottomright',legend ='LM',pch = 18,col ='blue',bty ='n',cex = .95)
           

輸出圖

拓端tecdat|R語言代寫實作拟合神經網絡; 神經網絡包

通過目視檢查圖,我們可以看到神經網絡的預測(通常)線上周圍更加集中(與線的完美對齊将表明MSE為0,是以是理想的完美預測),而不是由線性模型。

下面繪制了一個可能更有用的視覺比較:

拓端tecdat|R語言代寫實作拟合神經網絡; 神經網絡包

 交叉驗證

交叉驗證是建構預測模型的另一個非常重要的步驟。雖然有不同類型的交叉驗證方法 

然後通過計算平均誤差,我們可以掌握模型的運作方式。

我們将使用神經網絡的for循環和線性模型

cv.glm()

boot

包中的函數來實作快速交叉驗證。

據我所知,R中沒有内置函數在這種神經網絡上進行交叉驗證,如果你知道這樣的函數,請在評論中告訴我。以下是線性模型的10倍交叉驗證MSE:

lm.fit < -  glm(medv~。,data = data)
            

 請注意,我正在以這種方式分割資料:90%的訓練集和10%的測試集以随機方式進行10次。我也正在使用

plyr

庫初始化進度條,因為我想要密切關注過程的狀态,因為神經網絡的拟合可能需要一段時間。

過了一會兒,過程完成,我們計算平均MSE并将結果繪制成箱線圖

cv.error
10.32697995
17.640652805 6.310575067 15.769518577 5.730130820 10.520947119 6.121160840
6.389967211 8.004786424 17.369282494 9.412778105 
           

上面的代碼輸出以下boxplot:

拓端tecdat|R語言代寫實作拟合神經網絡; 神經網絡包

如您所見,神經網絡的平均MSE(10.33)低于線性模型的MSE,盡管交叉驗證的MSE似乎存在一定程度的變化。這可能取決于資料的分割或網絡中權重的随機初始化。通過使用不同的種子運作模拟不同的時間,您可以獲得更精确的平均MSE點估計。

關于模型可解釋性的最後說明

神經網絡很像黑盒子:解釋它們的結果要比解釋簡單模型(如線性模型)的結果要困難得多。是以,根據您需要的應​​用程式類型,您可能也想考慮這個因素。此外,正如您在上面所看到的,需要格外小心以适應神經網絡,小的變化可能導緻不同的結果。

如果您有任何疑問,請在下面發表評論。

▍關注我們

【大資料部落】第三方資料服務提供商,提供全面的統計分析與資料挖掘咨詢服務,為客戶定制個性化的資料解決方案與行業報告等。

▍咨詢連結:http://y0.cn/teradat

▍聯系郵箱:[email protected]