KuboWeb top

更新: 2018-01-16 12:26:08

生態学のデータ解析 - ニューラルネット

R で使える (artificial) neural newtwork モデル利用のデータ解析について

  • ニューラルネットワーク (wikipedia) は一種の統計モデルであり,「すごく非線形な多項ロジスティックモデル」と考えてもよい

Rlogo

library(nnet) 

  • R 上でもっとも手軽につかえるニューラルネットワーク (NN) package
    • R の help: library(help = nnet)
    • これは install.packages("VR") でインストールされる
      • というか,R の default package なのでユーザーがわざわざインストールする必要はない
    • 詳しい説明は MASS4 本 8.10 Neural Netowrks に
  • nnet() で NN を学習させることができる
    • R の help: help(nnet)
    • feedforward 型 NN,三層 (入力層・隠れ層・出力層)
    • 隠れ層-出力層だけでなく入力層-隠れ層の結線加重を最適化される
      • この「学習」には optim(..., method = "BFGS") を使っている
    • 隠れ層・出力層の応答関数は default では exp(z) / (1 + exp(z)) の logistic 関数
    • 隠れ層の unit 数は size オプションで指定する
  • nnet() で作った neural network の例 (作図は久保の自作関数 plot.nn())

nn25b

  • example(nnet) (の後半) を動かしてみる: これは Fisher の 3 種の iris 花形態データつかった例題である
# ここでは iris 3 種 (c, s, v) 各 50 個体のうち 25 個体ずつで
# 「訓練用データ」 (<code>ird</code>) をつくって <code>ir.nn2</code>
# を教育している
> 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)
# 次に訓練に使わなかったデータで 3 種を識別できるか「試験」している.
# preidct(nn.2, ...) で「試験」つまり NN による予測ができる
> table(ird$species[-samp], predict(ir.nn2, ird[-samp,], type = "class"))

     c  s  v
  c 24  0  1
  s  0 25  0
  v  1  0 24
# 上の結果はほとんどまちがいなく識別できていることを示す
  • NN は複雑なので訓練用データが同じであっても結線加重は出力の異なる NN が作られることがある
  • 上の例 ir.nn2 のさらに詳しい情報が必要なときは summary(ir.nn2)
> summary(ir.nn2)
a 4-2-3 network with 19 weights
options were - softmax modelling  decay=5e-04
 b->h1 i1->h1 i2->h1 i3->h1 i4->h1 
  0.27   0.53   2.07  -2.93  -1.54 
 b->h2 i1->h2 i2->h2 i3->h2 i4->h2 
-28.00  -0.50  -1.15   4.10   8.07 
 b->o1 h1->o1 h2->o1 
  9.06  -8.75 -15.06 
 b->o2 h1->o2 h2->o2 
 -0.87   9.03  -6.42 
 b->o3 h1->o3 h2->o3 
 -8.19  -0.28  21.48 
  • また結線の加重だけ知りたいときは coef(ir.nn2)
> coef(ir.nn2)
    b->h1    i1->h1    i2->h1    i3->h1 
  0.26907   0.52813   2.07060  -2.92903 
   i4->h1     b->h2    i1->h2    i2->h2 
 -1.53701 -27.99819  -0.50310  -1.15181 
   i3->h2    i4->h2     b->o1    h1->o1 
  4.09778   8.07398   9.05733  -8.75121 
   h2->o1     b->o2    h1->o2    h2->o2 
-15.06093  -0.86823   9.03452  -6.42153 
    b->o3    h1->o3    h2->o3 
 -8.18849  -0.28325  21.48211 

multinom() : 多項ロジスティック回帰, nnet() 利用 

  • NN は本質的に logistic 回帰なので,nnet() を利用して (glm() では不可能な) 多項 logistic 回帰が可能である
  • また fit<-multinom() したときに stepAIC(fit) つまり AIC によるモデル選択が可能である
  • multinom() のしくみ: nnet() において隠れ層のない NN,つまり入力層と出力層を直結 (skip-layer connection) した構造をもつ NN を「学習」させている

library(neural) 

  • このような GUI が使える (教育用?)

mlptrain

library(AMORE)