C++でdlibのSVMを動かした話
巷ではディープラーニングが流行っていますがdlibを使ってサポートベクトルマシーンをやってみる話です.
結論からいうと
- 凄い使いやすかった.
- いい感じに抽象化されている.
- パラメータの調整も何をやっているのか分かりやすい.
てな感じ.
この記事ではライブラリの導入から実際に動かすまでをつらつら書きます.
マシンのOSはWindows10です.
dlib C++ Library
ちょうど今研究でSVMを使って画像をちょこちょこする予定で,簡単に使える機械学習ライブラリを探していました.
機械学習のライブラリというとScikit-learnが有名ですが,僕はC++で書かなければいけなかったので他に探していたらdlibにたどり着きました.
公式を見てみると一通りの機械学習の手法がそろってる感じ.
畳み込みネットワークとかディープ系もあるみたいです.
あとデータはあるけど,どんな手法を使ったらいいのか分からない人のためにYes/Noクエストシートみたいなのがあるんですがこういうのは機械学習にそこまで詳しくない人にはいいですね.
ダウンロードからサンプル動くまで
公式の左下あたりに青い「Download dlib...」からダウンロード.
僕が使ったバージョンは19.2でした.
解凍してみるとCMakeListsがあったので「うげっ...」と思いましたが,手順をすでに詳しく書いてくれている人がいました.
というか公式に書いてある手順で全く問題なかった.
dlib C++ Library - How to compile
僕はVisualStudio2015だったので何も変更せずに成功しました.
ビルドは6分くらいかかりました.
そして,サンプルの中のsvm_exを動かしてみる.
動いた..
なにやら見える「cross validation..」の文字.交差検証をやってくれてるみたい.
それは分かるけど他の値がなんだかわからなかったのでソースコードを見てみる.
nuとかgammaのパラメータがいまいち分からない...そういえばOpenCVのSVMを動かしたときもよく分からなかった.
ちょっと調べてみると
このサイトがSVMのパラメータについてわかりやすかったです.
ただnu-SVMがまだもやっとしていたんですが
http://www.ism.ac.jp/~fukumizu/ISM_lecture_2006/svm-ism.pdf
この資料に書いてあった.nuは訓練データのうちいくつ誤分類を許すかを決める割合の上限値ってことかな?
交差検証の結果に2つ値があるけどソースコードのコメントによると真陽性/陽性と真陰性/陰性らしい (感度とかいうやつ?).
値が0.99と0.99 だったり 0.3と0.3だったり,よく教科書にある「ハイパーパラメータの決め方が結果にも影響する」ってやつがよくわかります.
その他にサンプルを動かして分かったことは
- 陽性の確率も計算してくれる
- 学習した決定関数をdatファイルとして保存が可
- 決定関数に関与するサポートベクトルの数を精度を保ったまま減らす機能があるらしい
です.実際にこの機能を使って269個のサポートベクトルを10個に減らしても精度は下がってませんでした(むしろ上がってる?).
まとめ
dlibを使ってSVMを動かしてみました.
僕が動かしたsvmは正確にはnu-svmみたいです.c-cvmも動かしたんですが凄い遅かった...なんでだろ?
OpenCVのSVMも使ったことがありますがdlibのほうが他人におすすめできる.理由はただOpenCVのsvmで沼にはまったから...
OpenCVは2系と3系でSVMの使い方が結構変わっていた(スマートポインタを使うようになってた).