Rでデータ解析を始めよう005 Rで機械学習(SVMでIris分類)

Rでデータ解析を始めよう005 Rで機械学習(SVMでIris分類)

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

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




Rで機械学習、SVMでIrisデータを分類

ナノネ、統計解析用フリーソフト『R』の使い方を練習するよ。今回は機械学習に挑戦してみよう。

Pythonでは『scikit-learn』を使ってたけど、Rの機械学習は初めてだよね。モモノキは使い方分かるの?

まだよく分からないんだけど、とりあえず動かしてみよう。

Rの機械学習では『caret』パッケージが便利そうなんだけど、今回はシンプルにkernlabのSVMだけ使ってみよう。

サポートベクトル(ベクター)マシンで分類だね。データは何を使う?

毎度定番のIreis様で。

3種類のアヤメの計測データだね。データは何度も利用してるけど、SetosaとかVer?なんとか、いまだにどれがどの花かサッパリ分からない...。

これは『Setosa』で、

こっちが『Versicolor』、

さいごに『Virginica』だよ。

写真を比べると微妙に違うみたいだけど、やっぱり覚えられないなぁ。

アヤメ自体の学習じゃないから、見た目の識別は分からなくてもOK。機械学習でうまく分類できたらヨシとしておこう。

ラジャー。データ確認用にRにおまかせグラフを1つプロットしておく。

In [18]:
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で入れておいた)

In [6]:
# install.packages( "kernlab" ) # パッケージインストールは必要に応じて
library(kernlab)
df = iris # データセット Iris

kernlabの準備OK。ついでにIrisデータも変数(データフレーム)に入れておいた。

次はデータを訓練用とテスト用に分けてみて。割合は適当に訓練用70%、テスト用30%としておこう。

In [7]:
# 訓練データとテストデータに分割
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))
train= 105  test= 45
In [8]:
print(head(df.train)) # 訓練データ
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
47          5.1         3.8          1.6         0.2     setosa
39          4.4         3.0          1.3         0.2     setosa
82          5.5         2.4          3.7         1.0 versicolor
9           4.4         2.9          1.4         0.2     setosa
69          6.2         2.2          4.5         1.5 versicolor
71          5.9         3.2          4.8         1.8 versicolor
In [9]:
print(head(df.test)) # テストデータ
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
8           5.0         3.4          1.5         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa

分割した。訓練用が105データ、テスト用は45データになった。

続いて訓練データを使って学習モデルを作るよ。今回はSVMモデルのksvm()を使ってみよう。引数にモデル式と学習データを指定すれば、とりあえず実行できるよ。

モデル式は目的変数がSpecies(アヤメの種類)、~でつないで、残り4つを説明変数に設定(ピリオドで目的変数以外を全指定)。dataはさっき分割して作った訓練データを指定すればOK。

In [10]:
# 訓練データでモデル作成
svm <- ksvm(Species ~ (.), data = df.train)

Rコードの書き方にまだ慣れないけど、こんな感じかな。

次は作った学習モデルとテストデータを使って予測をやってみよう。

予測はpredict()で、引数に学習済みモデルとテストデータを指定すればOKだよ。

In [11]:
# 作成モデルでテストデータを予測
pred = predict(svm, df.test)

予測の実行完了。

うまく分類できたかな?

In [12]:
print(pred) # モデルの予測結果
 [1] setosa     setosa     setosa     setosa     setosa     setosa    
 [7] setosa     setosa     setosa     setosa     setosa     setosa    
[13] setosa     setosa     setosa     setosa     setosa     setosa    
[19] setosa     versicolor versicolor versicolor versicolor versicolor
[25] versicolor versicolor versicolor versicolor versicolor versicolor
[31] versicolor versicolor virginica  versicolor virginica  virginica 
[37] virginica  virginica  virginica  virginica  virginica  virginica 
[43] virginica  virginica  virginica 
Levels: setosa versicolor virginica
In [13]:
print(df.test$Species) # 正解ラベル
 [1] setosa     setosa     setosa     setosa     setosa     setosa    
 [7] setosa     setosa     setosa     setosa     setosa     setosa    
[13] setosa     setosa     setosa     setosa     setosa     setosa    
[19] setosa     versicolor versicolor versicolor versicolor versicolor
[25] versicolor versicolor versicolor versicolor versicolor versicolor
[31] versicolor versicolor virginica  virginica  virginica  virginica 
[37] virginica  virginica  virginica  virginica  virginica  virginica 
[43] virginica  virginica  virginica 
Levels: setosa versicolor virginica

予測結果、だいだい合ってるみたいだけど。

tableを使って予測と正解を確認してみよう。

In [14]:
table(pred, df.test$Species) # 予測結果の検証
sum(pred == df.test$Species) / length(pred) # 正解率
            
pred         setosa versicolor virginica
  setosa         19          0         0
  versicolor      0         13         1
  virginica       0          0        12
0.977777777777778

1個だけ誤判別あるけど、正解率は約97%でいい感じ。

最後に予測結果をグラフにしてみよう。説明変数が4個(Spal.Length, Sepal.Width, Petal.Length, Petal.Width)あるとプロットが難しいね。変数を2個に絞って簡単な散布を描いてみよう。

In [15]:
# モデル予測結果を図示(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 件のコメント :

コメントを投稿