モモノキ&ナノネと一緒にRで機械学習を試してみよう
Rで機械学習、SVMでIrisデータを分類
ナノネ、統計解析用フリーソフト『R』の使い方を練習するよ。今回は機械学習に挑戦してみよう。
Pythonでは『scikit-learn』を使ってたけど、Rの機械学習は初めてだよね。モモノキは使い方分かるの?
まだよく分からないんだけど、とりあえず動かしてみよう。
Rの機械学習では『caret』パッケージが便利そうなんだけど、今回はシンプルにkernlabのSVMだけ使ってみよう。
サポートベクトル(ベクター)マシンで分類だね。データは何を使う?
毎度定番のIreis様で。
3種類のアヤメの計測データだね。データは何度も利用してるけど、SetosaとかVer?なんとか、いまだにどれがどの花かサッパリ分からない...。
これは『Setosa』で、
こっちが『Versicolor』、
さいごに『Virginica』だよ。
写真を比べると微妙に違うみたいだけど、やっぱり覚えられないなぁ。
アヤメ自体の学習じゃないから、見た目の識別は分からなくてもOK。機械学習でうまく分類できたらヨシとしておこう。
ラジャー。データ確認用にRにおまかせグラフを1つプロットしておく。
plot(df, col=c(2, 3, 4)[df$Species])
プロットは赤がSetosaで、緑がversicolor、青がvirginica。花びら(Petal)のサイズはSetosaが一番小さくて、versicolorとvirginicaは近い感じ。
Irisデータセットの内容は、以前Pythonで練習した記事も参考にしてね。
もものきとデータ解析をはじめよう
Scikit-learnで機械学習(SVMで分類する方法)Iris
https://momonoki2017.blogspot.jp/2018/01/scikit-learnsvm.html
さっそく機械学習をやってみよう。ナノネ、まずはlibrary()で『kernlab』を読み込んでみて。(kernlabは事前にインストールしておいたよ。設定が悪いせいか?Jupyter notebook上ではうまくインスール出来なかったからR-Consoleで入れておいた)
# install.packages( "kernlab" ) # パッケージインストールは必要に応じて
library(kernlab)
df = iris # データセット Iris
kernlabの準備OK。ついでにIrisデータも変数(データフレーム)に入れておいた。
次はデータを訓練用とテスト用に分けてみて。割合は適当に訓練用70%、テスト用30%としておこう。
# 訓練データとテストデータに分割
set.seed(100)
df.rows = nrow(df) # 150
train.rate = 0.7 # 訓練データの比率
train.index <- sample(df.rows, df.rows * train.rate)
df.train = df[train.index,] # 訓練データ
df.test = df[-train.index,] # テストデータ
cat("train=", nrow(df.train), " test=", nrow(df.test))
print(head(df.train)) # 訓練データ
print(head(df.test)) # テストデータ
分割した。訓練用が105データ、テスト用は45データになった。
続いて訓練データを使って学習モデルを作るよ。今回はSVMモデルのksvm()を使ってみよう。引数にモデル式と学習データを指定すれば、とりあえず実行できるよ。
モデル式は目的変数がSpecies(アヤメの種類)、~でつないで、残り4つを説明変数に設定(ピリオドで目的変数以外を全指定)。dataはさっき分割して作った訓練データを指定すればOK。
# 訓練データでモデル作成
svm <- ksvm(Species ~ (.), data = df.train)
Rコードの書き方にまだ慣れないけど、こんな感じかな。
次は作った学習モデルとテストデータを使って予測をやってみよう。
予測はpredict()で、引数に学習済みモデルとテストデータを指定すればOKだよ。
# 作成モデルでテストデータを予測
pred = predict(svm, df.test)
予測の実行完了。
うまく分類できたかな?
print(pred) # モデルの予測結果
print(df.test$Species) # 正解ラベル
予測結果、だいだい合ってるみたいだけど。
tableを使って予測と正解を確認してみよう。
table(pred, df.test$Species) # 予測結果の検証
sum(pred == df.test$Species) / length(pred) # 正解率
1個だけ誤判別あるけど、正解率は約97%でいい感じ。
最後に予測結果をグラフにしてみよう。説明変数が4個(Spal.Length, Sepal.Width, Petal.Length, Petal.Width)あるとプロットが難しいね。変数を2個に絞って簡単な散布を描いてみよう。
# モデル予測結果を図示(Sepal.Length / Petal.Length)
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$Sepal.Length,
main = "Iris SVM",
xlab = "Petal length (cm)",
ylab = "Sepal length (cm)",
# col = pred,
pch=c(1,2,3)[pred],
cex = 2,
cex.main = 2,
cex.lab = 2,
cex.axis = 1.5,
xlim = c(0, 7),
ylim = c(4, 8.5),
yaxp = c(4, 8, 4)
)
par(family = "serif")
par(font = 3)
legend("topleft",
legend = levels(pred),
pch = c(1, 2, 3),
# col = c(1, 2, 3),
cex = 1.7,
pt.cex = 2,
bty = 'n',
inset = c(0.05, 0.03))
Sepal.LengthとPetal.Lengthを軸にグラフを描いてみた。
Rで初めての機械学習、今回は以上で。またね!
0 件のコメント :
コメントを投稿