モモノキ&ナノネと一緒にRで機械学習を試してみよう
Rで機械学習、ランダムフォレストでIrisデータを分類
ナノネ、統計解析用フリーソフト『R』の使い方を練習するよ。今回は機械学習のランダムフォレストを試してみよう。
モモノキ、ランダムフォレストって?
簡単にいうと、ランダムに抽出したデータから決定木をたくさん作って多数決で予測を決めるやつだよ。
使うデータはまたIris?
うん、今回もIrisだよ。
『Setosa』、
『Versicolor』、
『Virginica』だよね。
データもグラフで再々確認。
plot(iris, col=c(2, 3, 4)[iris$Species])
ランダムフォレストは名前と一緒で『randomForest』を使うよ。randomForestはナノネのPCにインストールしておいたから、library()で読み込んでみて。
# install.packages("randomForest") # 必要に応じてインストール
library(randomForest)
randomForest準備OK。
さっそくランダムフォレストで分類をやってみよう。randomForest()で引数にモデル式とデータを指定すれば、とりあえず分類を実行できるよ。
モデル式は目的変数がSpecies(アヤメの種類)、~でつないで、残り4つを説明変数に設定(ピリオドで目的変数以外を全指定)。dataにはirisを指定すればOKだね。
iris.rf <- randomForest(Species ~ ., data = iris) # ランダムフォレストでモデル作成
モデル作成完了、内容をチェックしてみる。
iris.rf
Tableで分類結果も表示されるんだね。OOBっていうのは何?
OOBは間違った率だよ。間違いが4.67%だから正解率にすると95.33%になるね。
importance()で、分類での説明変数の重要度(影響度)を表示できるよ。値が大きいほど分類で重要な変数だよ。
importance(iris.rf)
今回の場合、4つの説明変数のうちPetal.LengthとPetal.Widthが重要ってことだね。
varImpPlot()で、重要度のプロットも簡単にできるよ。
varImpPlot(iris.rf)
前(SVM、決定木)と同じように、ランダムフォレストでも予測をやってみよう。
まずは訓練用とテスト用データを準備。割合は適当に訓練用70%、テスト用30%としておこう。
# 訓練データとテストデータに分割
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))
データ準備完了。訓練用が105データ、テスト用は45データ。
次は訓練データを使ってランダムフォレストのモデルをつくるよ。
model.rf <- randomForest(Species ~ ., data = df.train) # ランダムフォレスト、データは訓練用を指定
モデルを変えてもキホン的な書き方は一緒だね。
続いて訓練データで学習したモデルを使って、テストデータの予測をやってみよう。予測はpredict()で、引数にモデルとデータを指定してね。
# テストデータの予測
prediction = predict(model.rf, df.test)
tableを使って予測と正解を確認するね。
(result <- table(prediction, df.test$Species)) # ()で括って内容表示
# 精度の計算(行列の対角合計 / 行列の合計)
(accuracy_prediction = sum(diag(result)) / sum(result))
正解率は95.5%でまずまずの結果。グラフにプロットしてみる。
# モデル予測結果を図示(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 件のコメント :
コメントを投稿