更新: 2018-01-16 12:26:08
生態学のデータ解析 - ニューラルネット
R で使える (artificial) neural newtwork モデル利用のデータ解析について
- ニューラルネットワーク (wikipedia) は一種の統計モデルであり,「すごく非線形な多項ロジスティックモデル」と考えてもよい
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())
-
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 回帰が可能である- R の help: help(multinom)
- また
fit<-multinom()
したときにstepAIC(fit)
つまり AIC によるモデル選択が可能である -
multinom()
のしくみ:nnet()
において隠れ層のない NN,つまり入力層と出力層を直結 (skip-layer connection) した構造をもつ NN を「学習」させている
library(neural)
- このような GUI が使える (教育用?)
library(AMORE)
- library(nnet) よりさらに複雑な NN を構築できる