R語言實現擬合神經網路 神經網路包

2021-09-24 09:52:05 字數 3926 閱讀 8795

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

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

在這篇文章中,我們將使用neuralnet包裝擬合乙個簡單的神經網路,並將線性模型作為比較。

我們將在mass包中使用boston資料集。

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

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

沒有遺漏資料,很好。我們通過隨機將資料分成火車和測試集來進行,然後我們擬合線性回歸模型並在測試集上進行測試。請注意,我正在使用該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]中縮放往往會產生更好的結果。

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

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)

neuralnet包提供了繪製模型的好工具:

plot(nn)
這是模型的圖形表示,每個連線都有權重:

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

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

現在我們可以嘗試**測試集的值並計算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)

輸出圖

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

交叉驗證是構建**模型的另乙個非常重要的步驟。雖然有不同型別的交叉驗證方法 

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

lm.fit < -  glm(medv~。,data = data)
過了一會兒,過程完成,我們計算平均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:

如您所見,神經網路的平均mse(10.33)低於線性模型的mse,儘管交叉驗證的mse似乎存在一定程度的變化。這可能取決於資料的分割或網路中權重的隨機初始化。通過使用不同的種子執行模擬不同的時間,您可以獲得更精確的平均mse點估計。

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

神經網路 python實現神經網路

神經網路系列目錄 神經網路 神經網路原理介紹 bp演算法 神經網路 sklearn引數介紹及應用 神經網路實戰 主播綜合評分回歸 實戰 最小二乘法 梯度下降法區別及python實現 本篇博文通過python 實現神經網路,採用sklearn自帶的手寫數字集,看分類情況如何 一 匯入資料集並標準化 資...

用R實現神經網路

神經網路是一種運算模型,由大量的節點 或神經元 和之間的相互連線構成,每個節點代表一種特定的輸出函式。每兩個節點間的連線都代表乙個對於通過該連線訊號的加權值,稱為權重,這相當於神經網路的記憶。神經網路分為倆類 分類和回歸 注意點1難解釋2會學習過度,需要恰當的使用嚴格衡量神經網路的方法,如測試集和交...

神經網路 卷積神經網路

這篇卷積神經網路是前面介紹的多層神經網路的進一步深入,它將深度學習的思想引入到了神經網路當中,通過卷積運算來由淺入深的提取影象的不同層次的特徵,而利用神經網路的訓練過程讓整個網路自動調節卷積核的引數,從而無監督的產生了最適合的分類特徵。這個概括可能有點抽象,我盡量在下面描述細緻一些,但如果要更深入了...