昨日,サポートベクタマシンをプロデルで実装したので,使ってみたいと思います。これのSVM版をやります。
はじめに
今回は二値分類です。Irisデータセットは,3クラスなので,データを一部切り捨てて二値分類タスクにします。
前処理
前処理の段階で,正解ラベルを2種類に絞ります。
※コンソール
「..\行列.rdr」を参照する。
「..\サポートベクタマシン.rdr」を参照する。
「..\文字列操作.rdr」を参照する。
「Produire.File.dll」を利用する。
「Produire.Network.dll」を利用する。
アイリスデータは,HTTPで「https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data」を取得したものの行区切りの1番目から100個切り出したもの。
アイリスデータを適当に並び替える。
正解という行列(80,1)を作る。
訓練データという行列(80,4)を作る。
評価データ用正解という行列(20,1)を作る。
評価データという行列(20,4)を作る。
100回,【カウンタ】にカウントしながら繰り返す
【一行】は,アイリスデータ(カウンタ)を「,」で分割したもの。
もしカウンタが80以下なら
4回,添字にカウントしながら繰り返す
訓練データの中身(カウンタ)(添字)は,一行(添字)。
繰り返し終わり
一行(5)について分岐
「Iris-setosa」の場合
正解の中身(カウンタ)は,{1}。
「Iris-versicolor」の場合
正解の中身(カウンタ)は,{-1}。
分岐終わり
でないなら
4回,添字にカウントしながら繰り返す
評価データの中身(カウンタ-80)(添字)は,一行(添字)。
繰り返し終わり
一行(5)について分岐
「Iris-setosa」の場合
評価データ用正解の中身(カウンタ-80)は,{1}。
「Iris-versicolor」の場合
評価データ用正解の中身(カウンタ-80)は,{-1}。
分岐終わり
もし終わり
繰り返し終わり
データをHTTPで取得をするので,繰り返し実行しないで下さい。ダウンロードしたものを使う場合は,「[ファイル名]」から読み込んだものの行区切りの1番目から100個切り出したもの
と書き換えて下さい。
100個中,80個を訓練データ,20個を評価データとします。従って,先にランダムに並べ替えておきます。あとはニューラルネットワークの時と一緒です。
学習・推定をする
線形カーネルを利用します(線形カーネルしか実装していない)。
カーネル君という線形カーネル(訓練データ)を作る。
SVM君というサポートベクタマシン(カーネル君)を作る。
訓練データと正解を{5.00,0.0002}でSVM君が学習する。
結果は,SVM君が評価データを推定したものを転置したもの。
結果を表示。
評価データ用正解を転置したものを表示。
評価データ用正解を転置したものを結果で比較したものを表示。
実行には1分もかかりません。結果は次の通りです。
PS C:\> .\アヤメの分類_SVM.exe
80
76.37834
73.94282
71.80421
69.7756
(略)
5.165431
5.112964
5.062041
5.012619
4.96465
-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1
-1,1,1,1,-1,1,1,1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1
1
最後から3行目が推定した結果,最後から2行目が正解データのラベル,最後の行が正解率です。100%ですね。
(そんなことあるのかなあ・・・どこか間違っているのでは・・・)