用R語言代寫實現神經網絡預測股票實例


原文鏈接:http://tecdat.cn/?p=5725

 

神經網絡是一種基於現有數據創建預測的計算系統。

如何構建神經網絡?

神經網絡包括:

  • 輸入圖層:根據現有數據獲取輸入的圖層
  • 隱藏圖層:使用反向傳播優化輸入變量權重的圖層,以提高模型的預測能力
  • 輸出圖層:基於輸入和隱藏圖層的數據輸出預測

 

用神經網絡解決分類問題

在這個特定的例子中,我們的目標是開發一個神經網絡來確定股票是否支付股息。

因此,我們使用神經網絡來解決分類問題。通過分類,我們指的是按類別對數據進行分類的分類。例如,水果可分為蘋果,香蕉,橙等。

 

我們的自變量如下:

 

  • fcfps:每股自由現金流量(以美元計)
  • income_growth:過去一年的盈利增長(%)
  • de:債務與權益比率
  • mcap:股票的市值
  • current_ratio:流動比率(或流動資產/流動負債)

我們首先設置目錄並將數據加載到R環境中:

setwd(
setwd("your directory")
 attach(mydata)
“你的目錄”)
數據規范化

形成神經網絡時最重要的過程之一是數據標准化。這涉及將數據調整到共同的比例,以便准確地比較預測值和實際值。無法對數據進行標准化通常會導致所有觀察結果中的預測值保持不變,而與輸入值無關。

 

我們在下面實現了這兩種技術,但選擇使用max-min規范化技術。

縮放標准化

scaleddata <-scale(mydata)

最大最小標准化

對於此方法,我們調用以下函數來規范化我們的數據:

normalize < -  function(x){ 
  return((x  -  min(x))/(max(x) -  min(x)))
} 

然后,我們使用lapply在我們現有的數據上運行該函數(我們將數據集稱為加載到R中的數據集為mydata):

我們現在已經縮放了我們的新數據集並將其保存到名為maxmindf的數據框中:

我們的訓練數據(訓練集)基於80%的觀測值。測試數據(測試集)基於剩余的20%的觀察結果。

#訓練和測試數據訓練集
trainset <- maxmindf[1:160, ]
testset <- maxmindf[161:200, ]

用神經網絡訓練神經網絡模型

我們現在將神經網絡庫加載到R.

使用神經網絡將依賴的“紅利”變量“回歸” 到其他自變量

  • 根據hidden =(2,1)公式將隱藏層數設置為(2,1)
  • 給定自變量對因變量(被除數)的影響假設是非線性的,linear.output變量設置為FALSE
  • 閾值設置為0.01,這意味着如果迭代期間的誤差變化小於1%,則模型不會進行進一步的優化

確定神經網絡中隱藏層的數量並不是一門精確的科學。事實上,有些情況下,沒有任何隱藏層,准確度可能會更高。因此,反復試驗在這一過程中起着重要作用。

一種可能性是比較預測的准確性如何隨着我們修改隱藏層的數量而改變。例如,對於該示例,使用(2,1)配置最終產生92.5%的分類准確度。

 
 
nn $ result .matrix 
plot(nn)

我們的神經網絡看起來像這樣:

我們現在生成神經網絡模型的誤差,以及輸入,隱藏層和輸出之間的權重:

測試模型的准確性

如前所述,我們的神經網絡是使用訓練數據創建的。然后,我們將其與測試數據進行比較,以評估神經網絡預測的准確性。

temp_test < - subset(testset,select = c(“fcfps”,“earnings_growth”,“de”,“mcap”,“current_ratio”)) head(temp_test) nn.results < - compute(nn, temp_test) 
結果< - data.frame(actual = testset $ dividend,prediction = nn.results $ net.result)

 

將預測結果與實際結果進行比較:

0.999985252611 

混亂矩陣

然后,我們使用sapply對結果進行舍入,並創建一個混淆矩陣來比較真/假陽性和陰性的數量:


 
table(actual,prediction)      prediction 
actual 0 1 
     0 17 0 
     1 3 20 

混淆矩陣用於確定由我們的預測生成的真實和誤報的數量。該模型生成17個真陰性(0),20個真陽性(1),而有3個假陰性。

最終,我們在確定股票是否支付股息時產生92.5%(37/40)的准確率。

使用神經網絡解決回歸問題

在這個例子中,我們希望分析解釋變量容量汽油小時數對因變量消耗的影響

 

數據規范化

同樣,我們將數據標准化並分為訓練和測試數據:

#MAX-MIN NORMALIZATION 
normalize < -  function(x){ 
} 

#TRAINING AND TEST DATA 
trainset < -  maxmindf [1:32,] 
testset < -  maxmindf [33:40,] 

神經網絡輸出

然后我們運行我們的神經網絡並生成我們的參數:


  
 Intercept.to.1layhid1 1.401987575173 
capacity.to.1layhid1 1.307794013481 
gasoline.to.1layhid1 -3.102267882386 
hours.to.1layhid1 -3.246720660493 
Intercept.to.1layhid2 -0.897276576566 
capacity.to.1layhid2 -1.934594889387 
gasoline.to。 1layhid2 3.739470402932

hours.to.1layhid2 1.973830465259 
Intercept.to.2layhid1 -1.125920206855 
1layhid.1.to.2layhid1 3.175227041522 
1layhid.2.to.2layhid1 -2.419360506652 
Intercept.to.consumption 0.683726702522 
2layhid.1.to.consumption -0.545431580477 

生成神經網絡

以下是我們的神經網絡在視覺格式中的樣子:

模型驗證

然后,我們通過比較從神經網絡產生的估計汽油消耗與測試輸出中報告的實際支出來驗證(或測試我們模型的准確性):

 

准確性

在下面的代碼中,我們然后將數據轉換回其原始格式,並且在平均絕對偏差的基礎上產生90%的准確度(即估計和實際汽油消耗之間的平均偏差平均為10%)。請注意,我們還將數據轉換回標准值,因為它們之前使用max-min標准化技術進行了縮放:

predicted=results$prediction * abs(diff(range(consumption))) + min(consumption)
 
accuracy

可以看到我們使用(2,1)隱藏配置獲得90%的准確率。這非常好,特別是考慮到我們的因變量是區間格式。但是,讓我們看看我們是否可以讓它更高!

如果我們現在在神經網絡中使用(5,2)隱藏配置會發生什么?這是生成的輸出:



我們看到我們的准確率現已增加到近96%,表明修改隱藏節點的數量已經增強了我們的模型!

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


免責聲明!

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



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