入力データを作成して、学習させる

早速、訓練データとテストデータを作成してみたいと思います。非常に簡単な例として、一次関数のグラフを書いて、適当に点をプロットして、そのグラフよりも下にある点を+1、そのグラフよりも上にある点を-1としたものをデータとして与えることを考えます。適当にPerlでプログラムを書いてみました。

第一引数がxの範囲(0<x<与えた値)、第二引数がxの範囲(0<y<与えた値)、第三引数がグラフの傾き、第四引数が出力データ数です(あまり細かいチェックはしていません…)。このプログラムを実行すると、次の出力が得られます。

とりあえず、一次関数の傾きが1のものと5のもののデータを、訓練用とテスト用それぞれ100データ生成し、訓練用のデータを学習させ、識別までさせてみようと思います。

イメージとしては、次のような感じです。

150119

まずは、傾きが1のもの。

次に、傾きが5のもの。

両方共、PrecisionもRecallも高い数値が出ています。狙いどおりの結果になったと思います。

これより先の文章は(これまでにも増して)、さらにいい加減なものですが…

これを、仮に、モデルを入れ替えて識別させてみるとどうでしょう。つまり、y<xのモデルにy<5xのデータを与えてみた場合と、y<5xのモデルにy<xのモデルを与えてみた場合の出力を試しに見てみようと思います。

上のほうが、y<5xのデータに対して、y<xのモデルで識別した場合です。Precisionが100%ですね。逆にy<xのデータに対してy<5xのモデルで識別した場合はRecallが100%となっています。考えてみればなんとなく分かることですが、学習によって推定された境界線と、実際にテストとして与えたデータを重ねてみると、上記の結果になることは視覚的に分かると思います…、が、多分間違った使い方のような気もしています。

とはいえ、とりあえず、実際にデータを作成して訓練と識別を実際にしてみることで、SVMの使い方が具体的になったと思います。

次は、もう少しSVMが中でしている計算などを追ってみたいのですが、少し勉強のため日が開くと思います…。