神經網絡一直是迷人的機器學習模型之一,不僅因為花哨的反向傳播算法,而且還因為它們的復雜性(考慮到許多隱藏層的深度學習)和受大腦啟發的結構。
神經網絡並不總是流行,部分原因是它們在某些情況下仍然存在計算成本高昂,部分原因是與支持向量機(SVM)等簡單方法相比,它們似乎沒有產生更好的結果。然而,神經網絡再一次引起了人們的注意並變得流行起來。
在這篇文章中,我們將使用neuralnet
包裝擬合一個簡單的神經網絡,並將線性模型作為比較。
數據集
我們將在MASS包中使用Boston數據集。
波士頓數據集是波士頓郊區房屋價值數據的集合。我們的目標是使用所有其他可用的連續變量來預測自住房屋(medv)的中值。
首先,我們需要檢查是否缺少數據點,否則我們需要修復數據集。
沒有遺漏數據,很好。我們通過隨機將數據分成火車和測試集來進行,然后我們擬合線性回歸模型並在測試集上進行測試。請注意,我正在使用該gml()
函數而不是lm()
這將在以后交叉驗證線性模型時變得有用。
該sample(x,size)
函數簡單地從向量輸出指定大小的隨機選擇樣本的向量x
。默認情況下,采樣無需替換:index
本質上是一個隨機的indeces向量。
准備適應神經網絡
在擬合神經網絡之前,需要做一些准備工作。神經網絡不容易訓練和調整。
作為第一步,我們將解決數據預處理問題。
在訓練神經網絡之前規范化數據是一種很好的做法。我無法強調這一步驟的重要性:根據您的數據集,避免標准化可能會導致無用的結果或非常困難的訓練過程(大多數情況下算法在允許的最大迭代次數之前不會收斂)。您可以選擇不同的方法來縮放數據(z-normalization,min-max scale等)。我選擇使用min-max方法並在區間[0,1]中縮放數據。通常在區間[0,1]或[-1,1]中縮放往往會產生更好的結果。
因此,我們在繼續之前縮放和分割數據:
請注意,scale
返回需要強制轉換為data.frame的矩陣。
參數
據我所知,雖然有幾個或多或少可接受的經驗法則,但沒有固定的規則可以使用多少層和神經元。通常,如果有必要,一個隱藏層足以滿足大量應用程序的需要。就神經元的數量而言,它應該在輸入層大小和輸出層大小之間,通常是輸入大小的2/3。至少在我的簡短經驗中,一次又一次的測試是最好的解決方案,因為無法保證這些規則中的任何一個最適合您的模型。
由於這是一個玩具示例,我們將使用此配置使用2個隱藏層:13:5:3:1。輸入層有13個輸入,兩個隱藏層有5個和3個神經元,輸出層當然是單個輸出,因為我們正在進行回歸。
幾個筆記:
- 由於某種原因
y~.
,該neuralnet()
函數不接受該公式。您需要先編寫公式,然后將其作為擬合函數中的參數傳遞。 - 該
hidden
參數接受一個包含每個隱藏層的神經元數量的向量,而該參數linear.output
用於指定我們是否要進行回歸linear.output=TRUE
或分類linear.output=FALSE
Neuralnet包提供了繪制模型的好工具:
這是模型的圖形表示,每個連接都有權重:
黑色線條顯示每個層與每個連接上的權重之間的連接,而藍線顯示每個步驟中添加的偏差項。偏差可以被認為是線性模型的截距。
網基本上是一個黑盒子,所以我們不能說擬合,重量和模型。可以說訓練算法已經收斂,因此可以使用該模型。
使用神經網絡預測medv
現在我們可以嘗試預測測試集的值並計算MSE。請記住,網絡將輸出標准化預測,因此我們需要將其縮小以進行有意義的比較(或僅僅是簡單的預測)。
然后我們比較兩個MSE
顯然,在預測medv時,網絡比線性模型做得更好。再一次,要小心,因為這個結果取決於上面執行的列車測試分割。下面,在視覺圖之后,我們將進行快速交叉驗證,以便對結果更有信心。
下面繪制了網絡性能和測試集上的線性模型的第一種可視方法
輸出圖
下面繪制了一個可能更有用的視覺比較:
交叉驗證
交叉驗證是構建預測模型的另一個非常重要的步驟。雖然有不同類型的交叉驗證方法
然后通過計算平均誤差,我們可以掌握模型的運作方式。
我們將使用神經網絡的for循環和線性模型cv.glm()
的boot
包中的函數來實現快速交叉驗證。
據我所知,R中沒有內置函數在這種神經網絡上進行交叉驗證,如果你知道這樣的函數,請在評論中告訴我。以下是線性模型的10倍交叉驗證MSE:
請注意,我正在以這種方式分割數據:90%的訓練集和10%的測試集以隨機方式進行10次。我也正在使用plyr
庫初始化進度條,因為我想要密切關注過程的狀態,因為神經網絡的擬合可能需要一段時間。
過了一會兒,過程完成,我們計算平均MSE並將結果繪制成箱線圖
上面的代碼輸出以下boxplot:
如您所見,神經網絡的平均MSE(10.33)低於線性模型的MSE,盡管交叉驗證的MSE似乎存在一定程度的變化。這可能取決於數據的分割或網絡中權重的隨機初始化。通過使用不同的種子運行模擬不同的時間,您可以獲得更精確的平均MSE點估計。
關於模型可解釋性的最后說明
神經網絡很像黑盒子:解釋它們的結果要比解釋簡單模型(如線性模型)的結果要困難得多。因此,根據您需要的應用程序類型,您可能也想考慮這個因素。此外,正如您在上面所看到的,需要格外小心以適應神經網絡,小的變化可能導致不同的結果。