R言語のIRISデータによるディープラーニング
https://qiita.com/Ringa_hyj/items/1745b8d08386acabe245
に従い、IRISデータの解析を試してみた。統計解析ソフトのR言語は実に5年ぶりに触ったので、IRISデータもすっかり忘れていた。IRISデータとは、3種類のIRIS種(setosa, versicolor, virginica )のペダル(Pedal)とガク(Sepal)の幅と長さを計測したデータ。IRISデータの様子をGUIのRcmdrで見てみよう。(以下、赤はRの入力コマンド)
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
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)
すると次図を得る。
予測精度を検証する。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)
結果は次図
次に予測精度の検証をする。
> 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個違うだけの結果となった。