跳轉到內容

R 中的資料探勘演算法/包/nnet

來自華夏公益教科書,開放的書籍,為了一個開放的世界

本章介紹用於預測和分類資料的 Feed-Forward 神經網路包。 人工神經網路 (ANN),通常被稱為“神經網路”(NN),是一種數學模型或計算模型,其靈感來自生物神經網路的結構和/或功能方面。 神經網路由相互連線的人工神經元組成,它使用連線主義方法處理資訊。 在大多數情況下,ANN 是一種自適應系統,它根據學習階段流經網路的外部或內部資訊改變其結構。 現代神經網路是非線性統計資料建模工具。 它們通常用於對輸入和輸出之間的複雜關係進行建模或查詢資料中的模式。 在本章中,我們將探索透過 Ripley 建立的 NNET 包[1][2] 使用前饋神經網路。

前饋神經網路

[編輯 | 編輯原始碼]

前饋神經網路是一種人工神經網路,其中單元之間的連線形成有向迴圈。 這與迴圈神經網路不同。

前饋神經網路是最早也是最簡單的型別的人工神經網路。 在這種網路中,資訊僅沿一個方向移動,即從輸入節點,透過隱藏節點(如果有)到輸出節點。 網路中沒有迴圈或迴路。

ADALINE 代表Adaptive Linear Element。 它由伯納德·維德羅教授及其斯坦福大學的研究生泰德·霍夫於 1960 年開發。 它基於麥卡洛克-皮茨模型,包含權重、偏差和求和函式。

操作:

它的適應性是透過殘差 的成本函式(誤差度量)來定義,其中 是期望的輸入。 使用MSE 誤差度量,自適應的權重和偏差變為:

Adaline 在控制領域有實際應用。 具有抽頭延遲輸入的單個神經元(輸入數量受存在的最低頻率和奈奎斯特速率限制)可用於透過雙線性 z 變換確定物理系統的較高階傳遞函式。 這是因為 Adaline 在功能上是自適應 FIR 濾波器。 與單層感知器一樣,ADALINE 在統計建模中也有對應項,在本例中是最小二乘法 迴歸

Adaline 有一種擴充套件,稱為多重 Adaline (MADALINE),它由兩個或多個串聯連線的 Adaline 組成。

Ripley 建立的 NNET 包提供了使用具有單個隱藏層的向前神經網路以及多項式對數線性模型的方法。具體來說,本書的本章將介紹 NNET 方法。以下是簡要描述的方法和使用引數。

NNET 用於 R 的前饋神經網路的實現可在 CRAN 上獲得,並且已經嵌入到 R 環境中。

擬合單隱藏層神經網路,可能具有跳層連線。


//Usage
nnet(x, ...)

//S3 method for class 'formula':
nnet(formula, data, weights, ...,
subset, na.action, contrasts = NULL)

//Default S3 method:
nnet(x, y, weights, size, Wts, mask,
linout = FALSE, entropy = FALSE, softmax = FALSE,
censored = FALSE, skip = FALSE, rang = 0.7, decay = 0,
maxit = 100, Hess = FALSE, trace = TRUE, MaxNWts = 1000,
abstol = 1.0e-4, reltol = 1.0e-8, ...)


  • formula 形式為 class ~ x1 + x2 + ... 的公式。
  • x 矩陣或資料框,包含示例的 x 值。
  • y 矩陣或資料框,包含示例的目標值。
  • weights 每個示例的(案例)權重 - 如果缺失,則預設為 1。
  • size 隱藏層中單元的數量。如果存在跳層單元,則可以為零。
  • data 資料框,優先從中獲取公式中指定的變數。
  • subset 指定用於訓練樣本的案例的索引向量。(注意:如果給出,則此引數必須命名。)
  • na.action 指定在找到 NA 時要採取的操作的函式。預設操作是程式失敗。另一種選擇是 na.omit,這將導致拒絕任何必需變數上具有缺失值的案例。(注意:如果給出,則此引數必須命名。)
  • contrasts 用於模型公式中出現的一些或所有因子的對比列表。
  • Wts 初始引數向量。如果缺失,則隨機選擇。
  • mask 邏輯向量,指示應最佳化哪些引數(預設情況下為全部)。
  • linout 線性輸出單元的開關。預設情況下為邏輯輸出單元。
  • entropy 用於熵(= 最大條件似然)擬合的開關。預設情況下為最小二乘法。
  • softmax 用於 softmax(對數線性模型)和最大條件似然擬合的開關。linoutentropysoftmaxcensored 是互斥的。
  • censored softmax 的變體,其中非零目標表示可能的類別。因此,對於 softmax,(0, 1, 1) 的一行表示類別 2 和 3 的一個示例,但對於 censored,它表示一個類別僅知為 2 或 3 的示例。
  • skip 開關,用於從輸入到輸出新增跳層連線。
  • rang 在 [-rang, rang] 上的初始隨機權重。值約為 0.5,除非輸入很大,在這種情況下,應選擇它,以便 rang * max(|x|) 約為 1。
  • decay 用於權重衰減的引數。預設值為 0。
  • maxit 最大迭代次數。預設值為 100。
  • Hess 如果為真,則返回在找到的最佳權重集中擬合度量的 Hessian 作為元件 Hessian。
  • trace 用於跟蹤最佳化的開關。預設值為 TRUE。
  • MaxNWts 允許的最大權重數。程式碼中沒有固有限制,但增加 MaxNWts 可能允許非常緩慢且耗時的擬合。
  • abstol 如果擬合準則降至 abstol 以下,則停止,表示基本完美的擬合。
  • reltol 如果最佳化器無法將擬合準則減少至少 1 - reltol 的因子,則停止。
  • ... 傳遞給其他方法或來自其他方法的引數。

如果 formula 中的響應是因子,則會構造一個適當的分類網路;如果級別數為兩個,則它具有一個輸出和熵擬合,如果級別數更多,則具有與類別數相同的輸出數和 softmax 輸出階段。如果響應不是因子,則會將其原樣傳遞給 nnet.default

最佳化透過 optimBFGS 方法完成。

類為 nnetnnet.formula 的物件。主要是內部結構,但具有以下元件

  • wts 找到的最佳權重集。
  • value 擬合準則值加上權重衰減項。
  • fitted.values 訓練資料的擬合值。
  • residuals 訓練資料的殘差。
  • convergence 如果達到最大迭代次數,則為 1,否則為 0。
'''Utilizing Example'''

//use half the iris data
library(nnet)

ir <- rbind(iris3[,,1],iris3[,,2],iris3[,,3])
targets <- class.ind( c(rep("s", 50), rep("c", 50), rep("v", 50)) )
samp <- c(sample(1:50,25), sample(51:100,25), sample(101:150,25))

ir1 <- nnet(ir[samp,], targets[samp,], size = 2, rang = 0.1,
decay = 5e-4, maxit = 200)

test.cl <- function(true, pred) {
   true <- max.col(true)
   cres <- max.col(pred)
   table(true, cres)
}

test.cl(targets[-samp,], predict(ir1, ir[-samp,]))

// or
library(nnet)

ird <- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]),
species = factor(c(rep("s",50), rep("c", 50), rep("v", 50))))

ir.nn2 <- nnet(species ~ ., data = ird, subset = samp, size = 2, rang = 0.1,
decay = 5e-4, maxit = 200)

table(ird$species[-samp], predict(ir.nn2, ird[-samp,], type = "class"))

案例研究

[編輯 | 編輯原始碼]

案例研究旨在說明 NNET 包的眾多可能應用中的一個。

準確的診斷可以避免患者的併發症。為了確定患者是否患有乳腺癌,分析幾個因素有助於確定準確的診斷。因此,從收集的許多患者資料中,試圖推斷出患者的診斷,並獲得令人滿意的準確性。

資料詳情

[編輯 | 編輯原始碼]

本案例研究中使用的資料來自 UCI[3][4][5][6] 的資料庫。該資料庫包含 10 個變數(9 個輸入和 1 個輸出),有 569 個診斷患者記錄的例項。

輸入

  • 團塊厚度
  • 細胞大小均勻性
  • 細胞形狀均勻性
  • 邊緣粘附
  • 單層上皮細胞大小
  • 裸核
  • 淡色染色質
  • 正常核仁
  • 有絲分裂

輸出(類別)

  • 診斷:良性或惡性

執行和結果

[編輯 | 編輯原始碼]

使用該包的實現非常簡單。以下是訓練資料和測試資料的一部分。

trainingInput <- read.table("trainingInput.data", sep=", ", header=TRUE)
trainingOutput <- read.table("trainingOutput.data", sep=",", header=TRUE)

library("nnet")
neuralNetworkModel <- nnet(trainingInput, trainingOutput, size = 19, rang = 0.1, decay = 5e-4, maxit = 2000)

neuralNetworkTest <- function(true, pred) {
	true <- max.col(true)
	cres <- max.col(pred)
	table(true, cres)
}

neuralNetworkTest(trainingOutput, predict(neuralNetworkModel, trainingInput))

作為訓練函式 neuralNetoworkModel <- nnet (...) 的結果,具有根據為 rangdecaymaxit 設定的引數進行迭代和逼近操作的步驟。

  # weights:  230
  initial  value 146.391298 
  iter  10 value 14.225442
  iter  20 value 0.478782
  iter  30 value 0.149068
  iter  40 value 0.140717
  iter  50 value 0.131745
  iter  60 value 0.124368
  iter  70 value 0.116663
  
  iter 740 value 0.086414
  iter 750 value 0.086414
  final  value 0.086414 
  converged

訓練後,對矩陣(函式 neuralNetworkTest)獲得的結果進行混淆。從矩陣中,可以應用各種指標來獲取資訊,例如準確率、錯誤率等等。

       cres
   true  1    2
     1  180   0
     2   0   120

從這個矩陣中,我們發現測試非常成功,因為 真陽性 = (1,1), 假陽性 = (1,2), 假陰性 = (2,1) 和真陰性 (2,2)

從這個案例研究中,從患者資料集獲得的神經網路模型足以提供可靠的診斷。但是,為此,患者資料必須符合網路表示的模型的實際情況,否則 ANN 會出現誤診。因此,值得注意的是,NNET 包使用方便,使其適用於各種不同的受眾,他們可以在不需要深入瞭解該主題的情況下使用它。

  1. ^ B. D. Ripley: "模式識別與神經網路", 1996 年劍橋。
  2. ^ W. N. Venables 和 B. D. Ripley: "S 語言的現代應用統計學", 第四版,斯普林格,2002 年。
  3. ^ O. L. Mangasarian 和 W. H. Wolberg: "透過線性規劃進行癌症診斷", SIAM 新聞,第 23 卷,第 5 期,1990 年 9 月,第 1 & 18 頁。
  4. ^ William H. Wolberg 和 O.L. Mangasarian: "應用於乳腺細胞學的多表面模式分離方法", 美國國家科學院院刊,第 87 卷,1990 年 12 月,第 9193-9196 頁。
  5. ^ O. L. Mangasarian、R. Setiono 和 W.H. Wolberg: "透過線性規劃進行模式識別:理論及其在醫學診斷中的應用", 載於:"大規模數值最佳化", Thomas F. Coleman 和 Yuying Li 編輯,SIAM 出版物,費城 1990 年,第 22-30 頁。
  6. ^ K. P. Bennett & O. L. Mangasarian: "兩個線性不可分離集的魯棒線性規劃判別", 最佳化方法與軟體 1, 1992, 23-34 (Gordon & Breach 科學出版社)。
華夏公益教科書