R言語のIRISデータによるディープラーニング

次のサイト「R言語でもディープラーニングがしたい!」

https://qiita.com/Ringa_hyj/items/1745b8d08386acabe245

に従い、IRISデータの解析を試してみた。統計解析ソフトのR言語は実に5年ぶりに触ったので、IRISデータもすっかり忘れていた。IRISデータとは、3種類のIRIS種(setosa, versicolor, virginica )のペダル(Pedal)とガク(Sepal)の幅と長さを計測したデータ。IRISデータの様子をGUIのRcmdrで見てみよう。(以下、赤はRの入力コマンド

f:id:Bravo-Astrox:20201003081123j:plain
f:id:Bravo-Astrox:20201003082744j:plain
f:id:Bravo-Astrox:20201003083036j:plain
f:id:Bravo-Astrox:20201003083221j:plain

virginicaと言う種は、Pedal.LengthとPedal.Width、Sepal.Lengthで最も大きい種となっているが、Sepal.Widthでは、virginicaは2番目である。また、setosaと言う種では、Sepal.Widthで外れ値が存在する。

 >library(nnet)

ライブラリのnnetを入力。以下は、150個のIRISデータを学習データiris.trainと検証データiris.testに2等分し、検証データの種だけactual_speciesに取り出す。

> samples <- sample(1:150,75)

> iris.train <- iris[samples,]

> iris.test  <- iris[-samples,1:4]

> actual_species <- iris[-samples,5]

nnetにより、モデルのオプションは、size=3が中間層の個数

decay=0.1が過学習抑制のための値、maxit=100が繰り返し回数

> iris.nnet <- nnet(Species~., size=3, decay=0.1,maxit=100,data=iris.train)

繰り返し回数ごとの評価値は次の通り。

# weights:  27

initial  value 87.565439

iter  10 value 43.368227

iter  20 value 23.721795

iter  30 value 17.135719

iter  40 value 17.103610

final  value 17.103544

converged

> iris.nnet

iris.nnetの結果は次の通り

a 4-3-3 network with 27 weights

inputs: Sepal.Length Sepal.Width Petal.Length Petal.Width

output(s): Species

options were - softmax modelling  decay=0.1

ライブラリNeuralNetToolsでグラフ化する。

> library(NeuralNetTools)

> plotnet(iris.nnet)

すると次図を得る。

f:id:Bravo-Astrox:20201003072358j:plain

予測精度を検証する。iris.testをiris.nnetに入力し、種の予測値pred_speciesを得る。

> pred_species <- round(predict(iris.nnet,iris.test))

種の予測値pred_speciesの列の和を求める。

> colSums(pred_species)

    setosa versicolor  virginica

        26         22         27

検証データの種の個数は次の通り。

> table(actual_species)

actual_species

    setosa versicolor  virginica

        26         24         25

Versicolorが2個違う結果となった。

ライブラリのneuralnetでも試した。

> library("neuralnet")

> network = neuralnet(Species~., hidden=5, err.fct = "ce", linear.output = FALSE,data=iris.train)

> plot(network)

結果は次図

図6

次に予測精度の検証をする。

> pred_neuralnet <- round(predict(network, iris.test))

> pred_neuralnet <- data.frame(setosa=pred_neuralnet[,1],versicolor=pred_neuralnet[,2],virginica=pred_neuralnet[,3])

> colSums(pred_neuralnet)

setosa versicolor  virginica

 26     23        26

検証データの種の個数は次の通り。

> table(actual_species)

actual_species

    setosa versicolor  virginica

      26         24         25

versicolorが1個違うだけの結果となった。