Rでデータ解析を始めよう007 Rで機械学習(ランダムフォレストでIris分類)

Rでデータ解析を始めよう007 Rで機械学習(ランダムフォレストでIris分類)

モモノキ&ナノネと一緒に統計ソフトRの使い方を学習していきます。

モモノキ&ナノネと一緒にRで機械学習を試してみよう




Rで機械学習、ランダムフォレストでIrisデータを分類

ナノネ、統計解析用フリーソフト『R』の使い方を練習するよ。今回は機械学習のランダムフォレストを試してみよう。

モモノキ、ランダムフォレストって?

簡単にいうと、ランダムに抽出したデータから決定木をたくさん作って多数決で予測を決めるやつだよ。

使うデータはまたIris?

うん、今回もIrisだよ。

『Setosa』、

『Versicolor』、

『Virginica』だよね。

データもグラフで再々確認。

In [26]:
plot(iris, col=c(2, 3, 4)[iris$Species])

ランダムフォレストは名前と一緒で『randomForest』を使うよ。randomForestはナノネのPCにインストールしておいたから、library()で読み込んでみて。

In [27]:
# install.packages("randomForest") # 必要に応じてインストール
library(randomForest)

randomForest準備OK。

さっそくランダムフォレストで分類をやってみよう。randomForest()で引数にモデル式とデータを指定すれば、とりあえず分類を実行できるよ。

モデル式は目的変数がSpecies(アヤメの種類)、~でつないで、残り4つを説明変数に設定(ピリオドで目的変数以外を全指定)。dataにはirisを指定すればOKだね。

In [28]:
iris.rf <- randomForest(Species ~ ., data = iris) # ランダムフォレストでモデル作成

モデル作成完了、内容をチェックしてみる。

In [29]:
iris.rf
Call:
 randomForest(formula = Species ~ ., data = iris) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 2

        OOB estimate of  error rate: 4.67%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         50          0         0        0.00
versicolor      0         47         3        0.06
virginica       0          4        46        0.08

Tableで分類結果も表示されるんだね。OOBっていうのは何?

OOBは間違った率だよ。間違いが4.67%だから正解率にすると95.33%になるね。

importance()で、分類での説明変数の重要度(影響度)を表示できるよ。値が大きいほど分類で重要な変数だよ。

In [30]:
importance(iris.rf)
MeanDecreaseGini
Sepal.Length 9.439055
Sepal.Width 2.492976
Petal.Length44.386457
Petal.Width42.884197

今回の場合、4つの説明変数のうちPetal.LengthとPetal.Widthが重要ってことだね。

varImpPlot()で、重要度のプロットも簡単にできるよ。

In [31]:
varImpPlot(iris.rf)

前(SVM、決定木)と同じように、ランダムフォレストでも予測をやってみよう。

まずは訓練用とテスト用データを準備。割合は適当に訓練用70%、テスト用30%としておこう。

In [32]:
# 訓練データとテストデータに分割
set.seed(100)
df.rows = nrow(iris) # 150
train.rate = 0.7 # 訓練データの比率
train.index <- sample(df.rows, df.rows * train.rate)
df.train = iris[train.index,] # 訓練データ
df.test = iris[-train.index,] # テストデータ
cat("train=", nrow(df.train), " test=", nrow(df.test))
train= 105  test= 45

データ準備完了。訓練用が105データ、テスト用は45データ。

次は訓練データを使ってランダムフォレストのモデルをつくるよ。

In [33]:
model.rf <- randomForest(Species ~ ., data = df.train) # ランダムフォレスト、データは訓練用を指定

モデルを変えてもキホン的な書き方は一緒だね。

続いて訓練データで学習したモデルを使って、テストデータの予測をやってみよう。予測はpredict()で、引数にモデルとデータを指定してね。

In [34]:
# テストデータの予測
prediction = predict(model.rf, df.test)

tableを使って予測と正解を確認するね。

In [35]:
(result <- table(prediction, df.test$Species)) # ()で括って内容表示
            
prediction   setosa versicolor virginica
  setosa         19          0         0
  versicolor      0         13         2
  virginica       0          0        11
In [36]:
# 精度の計算(行列の対角合計 / 行列の合計)
(accuracy_prediction = sum(diag(result)) / sum(result))
0.955555555555556

正解率は95.5%でまずまずの結果。グラフにプロットしてみる。

In [37]:
# モデル予測結果を図示(Petal.Length / Petal.Width)
par(mar = c(6, 7, 5, 2))
par(mgp = c(4, 1.2, 0.4))
par(lwd = 2)

plot(df.test$Petal.Length, df.test$Petal.Width,
     main = "Iris (random forest)",
     xlab = "Petal length (cm)",
     ylab = "Petal width (cm)",
     #col = prediction,
     pch=c(1,2,3)[prediction],
     cex = 2,
     cex.main = 2,
     cex.lab = 2,
     cex.axis = 1.5,
     xlim = c(0, 7),
     ylim = c(0, 3.5),
     yaxp = c(0, 3, 3)
    )

par(family = "serif")
par(font = 3)

legend("topleft",
       legend = levels(prediction),
       pch = c(1, 2, 3),
       # col = c(1, 2, 3),
       cex = 1.7,
       pt.cex = 2,
       bty = 'n',
       inset = c(0.05, 0.03))

グラフ軸は重量度の高い2変数でプロットしてみた(Petal.LengthとPetal.Width)。

今回のランダムフォレストでもパラメータのチューニングとか試す?

今回はここまでとして、別の機会に練習しよう。
またね!





スポンサーリンク

0 件のコメント :

コメントを投稿