R語言實(shí)現(xiàn)擬合神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)和結(jié)果可視化
原文鏈接:http://tecdat.cn/?p=6691
?
神經(jīng)網(wǎng)絡(luò)一直是迷人的機(jī)器學(xué)習(xí)模型之一,不僅因?yàn)榛ㄉ诘姆聪騻鞑ニ惴?,而且還因?yàn)樗鼈兊膹?fù)雜性(考慮到許多隱藏層的深度學(xué)習(xí))和受大腦啟發(fā)的結(jié)構(gòu)。
神經(jīng)網(wǎng)絡(luò)并不總是流行,部分原因是它們?cè)谀承┣闆r下仍然存在計(jì)算成本高昂,部分原因是與支持向量機(jī)(SVM)等簡(jiǎn)單方法相比,它們似乎沒有產(chǎn)生更好的結(jié)果。然而,神經(jīng)網(wǎng)絡(luò)再一次引起了人們的注意并變得流行起來。
?在這篇文章中,我們將擬合神經(jīng)網(wǎng)絡(luò),并將線性模型作為比較。
數(shù)據(jù)集
波士頓數(shù)據(jù)集是波士頓郊區(qū)房屋價(jià)值數(shù)據(jù)的集合。我們的目標(biāo)是使用所有其他可用的連續(xù)變量來預(yù)測(cè)自住房屋(medv)的中值。
首先,我們需要檢查是否缺少數(shù)據(jù)點(diǎn),否則我們需要修復(fù)數(shù)據(jù)集。
apply(data,2,function(x)sum(is.na(x)))
然后我們擬合線性回歸模型并在測(cè)試集上進(jìn)行測(cè)試。
index < - ?sample(1:nrow(data),round(0.75 * nrow(data)))
MSE.lm < - ?sum((pr.lm ?- ?test $ medv)^ 2)/ nrow(test)
該sample(x,size)
函數(shù)簡(jiǎn)單地從向量輸出指定大小的隨機(jī)選擇樣本的向量x
。
準(zhǔn)備適應(yīng)神經(jīng)網(wǎng)絡(luò)
在擬合神經(jīng)網(wǎng)絡(luò)之前,需要做一些準(zhǔn)備工作。神經(jīng)網(wǎng)絡(luò)不容易訓(xùn)練和調(diào)整。
作為第一步,我們將解決數(shù)據(jù)預(yù)處理問題。
因此,我們?cè)诶^續(xù)之前分割數(shù)據(jù):
maxs < - ?apply(data,2,max)
scaled < - ?as.data.frame(scale(data,center = mins,scale = maxs ?- ?mins))
train_ < - ?scaled [index,]
test_ < - ?scaled [-index,]
請(qǐng)注意,scale
返回需要強(qiáng)制轉(zhuǎn)換為data.frame的矩陣。
參數(shù)
據(jù)我所知,雖然有幾個(gè)或多或少可接受的經(jīng)驗(yàn)法則,但沒有固定的規(guī)則可以使用多少層和神經(jīng)元。通常,如果有必要,一個(gè)隱藏層足以滿足大量應(yīng)用程序的需要。就神經(jīng)元的數(shù)量而言,它應(yīng)該在輸入層大小和輸出層大小之間,通常是輸入大小的2/3
?
該
hidden
參數(shù)接受一個(gè)包含每個(gè)隱藏層的神經(jīng)元數(shù)量的向量,而該參數(shù)linear.output
用于指定我們是否要進(jìn)行回歸linear.output=TRUE
或分類linear.output=FALSE
Neuralnet包提供了繪制模型的好工具:
plot(nn)
這是模型的圖形表示,每個(gè)連接都有權(quán)重:

黑色線條顯示每個(gè)層與每個(gè)連接上的權(quán)重之間的連接,而藍(lán)線顯示每個(gè)步驟中添加的偏差項(xiàng)。偏差可以被認(rèn)為是線性模型的截距。?
使用神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)medv
現(xiàn)在我們可以嘗試預(yù)測(cè)測(cè)試集的值并計(jì)算MSE。?
pr.nn < - ?compute(nn,test _ [,1:13])
然后我們比較兩個(gè)MSE
顯然,在預(yù)測(cè)medv時(shí),網(wǎng)絡(luò)比線性模型做得更好。再一次,要小心,因?yàn)檫@個(gè)結(jié)果取決于上面執(zhí)行的列車測(cè)試分割。下面,在視覺圖之后,我們將進(jìn)行快速交叉驗(yàn)證,以便對(duì)結(jié)果更有信心。
下面繪制了網(wǎng)絡(luò)性能和測(cè)試集上的線性模型的第一種可視方法
輸出圖

通過目視檢查圖,我們可以看到神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)(通常)在線周圍更加集中(與線的完美對(duì)齊將表明MSE為0,因此是理想的完美預(yù)測(cè)),而不是由線性模型。
下面繪制了一個(gè)可能更有用的視覺比較:

?交叉驗(yàn)證
交叉驗(yàn)證是構(gòu)建預(yù)測(cè)模型的另一個(gè)非常重要的步驟。雖然有不同類型的交叉驗(yàn)證方法?
然后通過計(jì)算平均誤差,我們可以掌握模型的運(yùn)作方式。
我們將使用神經(jīng)網(wǎng)絡(luò)的for循環(huán)和線性模型cv.glm()
的boot
包中的函數(shù)來實(shí)現(xiàn)快速交叉驗(yàn)證。
據(jù)我所知,R中沒有內(nèi)置函數(shù)在這種神經(jīng)網(wǎng)絡(luò)上進(jìn)行交叉驗(yàn)證,如果你知道這樣的函數(shù),請(qǐng)?jiān)谠u(píng)論中告訴我。以下是線性模型的10倍交叉驗(yàn)證MSE:
lm.fit < - ?glm(medv~。,data = data)
?請(qǐng)注意,我正在以這種方式分割數(shù)據(jù):90%的訓(xùn)練集和10%的測(cè)試集以隨機(jī)方式進(jìn)行10次。我也正在使用plyr
庫初始化進(jìn)度條,因?yàn)槲蚁胍芮嘘P(guān)注過程的狀態(tài),因?yàn)樯窠?jīng)網(wǎng)絡(luò)的擬合可能需要一段時(shí)間。
過了一會(huì)兒,過程完成,我們計(jì)算平均MSE并將結(jié)果繪制成箱線圖
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:

神經(jīng)網(wǎng)絡(luò)的平均MSE(10.33)低于線性模型的MSE,盡管交叉驗(yàn)證的MSE似乎存在一定程度的變化。這可能取決于數(shù)據(jù)的分割或網(wǎng)絡(luò)中權(quán)重的隨機(jī)初始化。
關(guān)于模型可解釋性的最后說明
神經(jīng)網(wǎng)絡(luò)很像黑盒子:解釋它們的結(jié)果要比解釋簡(jiǎn)單模型(如線性模型)的結(jié)果要困難得多。因此,根據(jù)您需要的應(yīng)用程序類型,您可能也想考慮這個(gè)因素。此外,正如您在上面所看到的,需要格外小心以適應(yīng)神經(jīng)網(wǎng)絡(luò),小的變化可能導(dǎo)致不同的結(jié)果。
?