機械学習がプロダクトに応用されることが、非常に多くなりました。とはいえ、機械学習を学ぼうと思うと、数式の理解など非常に大変です。そこで、とりあえず機械学習というものを使ってみる、ということを目指して、少し書いてみたいと思います。
SVMって何?
SVMというのは、ざっくり言えば、二値分類をしてくれるプログラムで(数学的にもう少し正確に言うと、パターン識別モデルです)、機械学習の一種です。二値分類というのは、あるデータを入力した時、そのデータがあるジャンルに含まれそうか含まれそうではないか、というのを分類することです。例えば、メールの文章を入力した時、それがスパムであるかスパムでないかを分類することなどが考えられます。
図にすると、次のような感じです。
最初に、分類したいデータとそのデータがジャンルに含まれるかどうかという情報を用意します。これを訓練データとか、教師データとか言います。このデータを元に、プログラム内で良い感じに直線を引いてくれます(正確には入力データの次元をnとしたとき、n-1次元の超平面)。この「良い感じの直線」さえ作ってしまえば、未知のデータが入力された時に、その直線に基づいて分類してくれそうですね。なお、訓練データを用いて、分類をするための情報(モデル)を作成することを、学習といいます。
TinySVMをインストールを使ってみる
自然言語処理の世界ではしばしば使われるSVMに、TinySVMというものがあります。これをインストールして、実際にSVMを使ってみようと思います。
パッケージなども用意されていますが、ソースからインストールしたいと思います。configureの–prefixオプションで、ホームディレクトリ下のlocalにインストールしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ wget http://chasen.org/~taku/software/TinySVM/src/Tiny SVM-0.09.tar.gz --2015-01-13 11:53:39-- http://chasen.org/~taku/software/TinySVM/src/TinySVM-0. 09.tar.gz chasen.org (chasen.org) をDNSに問いあわせています... 210.166.214.16 chasen.org (chasen.org)|210.166.214.16|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 317636 (310K) [application/x-gzip] `TinySVM-0.09.tar.gz' に保存中 100%[======================================>] 317,636 684KB/s 時間 0.5s 2015-01-13 11:53:40 (684 KB/s) - `TinySVM-0.09.tar.gz' へ保存完了 [317636/317636 ] $ tar xzvf TinySVM-0.09.tar.gz $ cd TinySVM-0.09/ $ ./configure --prefix=$HOME/local $ pwd /home/jsa/local/bin $ ls svm_classify svm_learn svm_model $ export PATH=$PATH:$HOME/local/bin $ which svm_learn ~/local/bin/svm_learn |
このエントリーの筆者の環境ではCentOS7を用いましたが、OSインストール直後の状態ではCコンパイラが含まれておりません。コンパイラはなんでも良いと思うのですが、個人的にg++に慣れているので、それをインストールしました。
1 |
$ sudo yum install gcc-g++ |
実際にTinySVMを動かしてみる
TinySVMを展開すると、展開先のtestsディレクトリにサンプルデータがあります。配布元のページの例に基づいて、動かしてみましょう。
学習させる
訓練データを用いて、モデルを作成しましょう。TinySVMでは、学習用のコマンドがsvm_learnとなっています。これにオプションをつけて実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ svm_learn -t 1 -d 2 -c 1 train.svmdata model TinySVM - tiny SVM package Copyright (C) 2000-2002 Taku Kudo, All rights reserved. 1000 examples, cache size: 1524 .................... 1000 1000 1524 0.0165 64.3% 64.3% ............ Checking optimality of inactive variables re-activated: 0 Done! 1627 iterations Number of SVs (BSVs) 719 (4) Empirical Risk: 0.002 (2/1000) L1 Loss: 4 Object value: -19.1549 CPU Time: 00:00:00 |
svm_learnのコマンドライン引数の最後から2番目が訓練データのパス、最後がモデルファイルの出力ファイル名となります。それよりも前のオプションが、学習のパラメータとなります。
正しく実行できれば、modelという名前のファイルが新たに作成されているはずです。
分類させる
モデルファイルを用いて、実際にデータを与えて分類させてみます。TinySVMでは分類用のコマンドとしてsvm_classifyが用意されています。
1 2 3 4 5 |
$ svm_classify test.svmdata model Accuracy: 77.80000% (389/500) Precision: 66.82927% (137/205) Recall: 76.11111% (137/180) System/Answer p/p p/n n/p n/n: 137 68 43 252 |
コマンドライン引数の第1位引数が入力データ、第2引数がモデルファイルとなっています。学習によってモデルファイルを作り、そのモデルファイルと未知のデータから、実際に分類を行う、という感じです。
とりあえず、まずは実行してみるというところで、次回は入力データについて少し見て行きたいと思います。