Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築

194,469 views

Published on

Published in: Software

Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築

  1. 1. サポートベクターマシン入門 〜オブジェクト自動識別システムの構築〜 @salinger001101 さりんじゃー 1
  2. 2. 自己紹介 •  新潟にある長岡技術科学大学で修士まで6年。 •  4月からデータ分析のお仕事始めました。 •  職場まで徒歩0分です。 •  主な使用言語 •  Python、R、シェルスクリプト  (+  mcmd) •  Clojure  もちょこちょこ学習中 •  前々回の  Tokyo.R  では  「R  でダイエット」  という タイトルで  LT  しました。 •  http://www.slideshare.net/tojimat/diet-by-r 2
  3. 3. 注意 •  内容は個人の見解であり、 所属する組織の公式見解ではありません。 •  って言っとけばだいたいセーフらしい。 •  数式少なめ •  適当な説明になってる部分が多々あり。 3
  4. 4. 今回の内容 1.  はじめに 2.  サポートベクターマシンの理論 3.  最適化のお話 4.  オブジェクトの識別 4
  5. 5. 今回の内容 1.  はじめに 2.  サポートベクターマシンの理論 3.  最適化のお話 4.  オブジェクトの識別 5
  6. 6. 突然ですが… 6
  7. 7. 次の画像を 2種類に分けるなら、 どのように分ける? 7
  8. 8. 分けるとしたら… 8
  9. 9. 眼鏡っ娘他 9
  10. 10. もしこの識別が コンピュータで 自動化できれば… 10
  11. 11.   ネットの海       眼鏡っ娘  分類器 俺 画像を大量に自動収集 大量の眼鏡っ娘画像 =  幸せ   11
  12. 12. 分類器作成のための機械学習の手法 • サポートベクターマシン • ランダムフォレスト • 単純ベイズ分類器 • ニューラルネットワーク etc. 今回は これを詳しく 12
  13. 13. 今回の内容 1.  はじめに 2.  サポートベクターマシンの理論 3.  最適化のお話 4.  オブジェクトの識別 13
  14. 14. 未知の        は        と        どちらに分類される? 14
  15. 15. 2つのグループ間のマージンが 最大になるような  P  を決定する P:  分離超平面 15
  16. 16.        はどちら側? P 16
  17. 17. サポートベクターマシン  (SVM)  とは? •  教師あり学習  (入力例を与える) •  さっきの例では          &        が学習データ 未知の        を分類する         •  マージン最大化学習を行う2値分類器 •  分離超平面を決定する •  線形分類器  (真っ直ぐなものしか切れない) だったのだが… 17
  18. 18. Q:  じゃあ、こういう場合どうするの? 18
  19. 19. 高次元空間に射影すると… (空間の方をねじ曲げる) y = Φ(x) 19
  20. 20. A:  直線で切れる! 20
  21. 21. これと等価 21
  22. 22. カーネル法の話 •  非線形なカーネル関数により、 非線形な識別関数を学習可能。 •  カーネル関数を取り入れた一連の手法では、 どのような写像が行われるか知らずに 計算できる。 ⇒  カーネルトリック 線形以外のカーネル関数を使うと、 さっきの図のような変換をやってくれる。 22
  23. 23. カーネル関数の例 •  線形 (Linear) •  多項式 (Polynomial) •  RBF:  “Gaussian” (Radial  Basis  Function) •  シグモイド(Sigmoid) K( ix , jx ) = i T x jx K( ix , jx ) = exp(−γ i T x − jx 2 ) K( ix , jx ) = (γ i T x jx +r)d (γ > 0) (γ > 0) K( ix , jx ) = tanh(γ i T x jx +r) 基本的に普段使うのは  線形カーネル  と、 非線形の  RBFカーネル  ぐらい。RBF  の名前だけは覚えておこう。 23
  24. 24. マージンの話 •  問題を解く際には、どの程度誤りを許容するかが問題となる。 •  コストパラメータ:C  で決定する。 分類精度を向上させるためには適当さも必要 C  が大きい C  が小さい= = or 24
  25. 25. 実際にSVMを 使いたいときは これを自力実装? 25
  26. 26. R  で使える  SVM  のライブラリ •  e1071 •  Libsvm  のアルゴリズム(Chang  and  Lin,  2001)を 利用することができる。視覚化やパラメーター調整などを 行なえる(Dimitriadou  et  al.,  2005)。 •  kernlab •  カーネル法に基づく  SVM  アルゴリズムを利用できる。 そのほかに、libsvm  や  bsvm  (Hsu  and  Lin,  2002)  を 改良した柔軟性のある  SVM  を提供している。 •  klaR •  SVMlight  アルゴリズムを利用できる。 26
  27. 27. 今回の内容 1.  はじめに 2.  サポートベクターマシンの理論 3.  最適化のお話 4.  オブジェクトの識別 27
  28. 28. SVMのダメな使い方 1.  データをSVMで使えるように整形。 2.  デフォルトのパラメータで試行。 3.  「精度悪いなぁ…」 4.  「パラメータの調整とやらで精度が上がるらしいぞ?」 5.  適当に選択したカーネルとパラメータで試行。 6.  「精度悪いなぁ…別の手法試すか…」 ダメ!絶対! 28
  29. 29. BETTERな手順 1.  データをSVMで使えるように整形。 2.  素性の選択 3.  データのスケーリング 4.  カーネルの決定 5.  交差検定・グリッドサーチにより、 最適なコストやカーネルのパラメータを調べる。 6.  実行! 29
  30. 30. 1.  データの整形 •  学習用データ •  「素性ベクトル」  と  「正解ラベル」  のペア •  本番用のデータ •  学習用に使用した素性ベクトルと 同じ要素数からなる素性ベクトル v1:  [  [0.50,  0.33,  -0.21],                [0.12,  0.98,    1.34],                …                                                    ] l:  [  1,        -1,        …        ] v2:  [  [0.23,  0.55,  -0.19],                [0.10,  0.24,    0.78],                …                                                    ] O:  [  1,            -1,            …        ] システムの出力 30
  31. 31. 2.  素性の選択(1) •  数値データ •  そのまま使用 [10.0,  2.5,  6.4,  -8.2] •  範囲ごとに分割 [10,  0,  5,  -10] •  バイナリ化 [1,  1,  1,  0] •  テキストデータ •  単語の出現回数  (n-gram) •  品詞情報  等を数値化 •  画像・音声データ •  元データをそのまま行列からベクトルに •  フィルタリング •  圧縮して単純化 •  フーリエ変換・ウェーブレット変換  等 31
  32. 32. 2.  素性の選択(2) •  次元の呪い  (curse  of  dimensionality) •  超高次元になるとモデルが複雑に •  学習データが不足する。 •  球面集中現象 •  次元の増加に伴って各データ間の距離が 互いに等しくなる。 •  まとめられるものはまとめる  ⇒  特徴選択・次元削減      Ex.  単語の出現回数  ⇒  類語をまとめてカウント 32
  33. 33. 3.  スケーリングの話 •  値のとりうる範囲が大きい素性が支配的に •  正規化したほうが良い結果になる場合も 例.   -118  <=  x  <=  200 0  <=  x  <=  1    or    -1  <=  x  <=  1 33
  34. 34. 4.カーネル関数の決定 •  基本はRBFカーネルでOK。 (気になる人は後で補足部分読んで) 34
  35. 35. 5.  パラメータの決定 •  RBFカーネルの場合 •  コストパラメータ:C •  カーネルパラメータ:γ •  最適なパラメータは? ⇒  交差検定  ・  グリッドサーチ  を利用し決定。 35
  36. 36. 5.1  交差検定 •  訓練データとテストデータの分割方法 1 2 3 4 5 全データをk個に分割 1 2 3 4 5 テストデータ 訓練データ 1 2 3 4 5 〜 •  k  回試行してその平均を利用 •  テストデータは常に未知のデータ ⇒  過剰適応  (Over  fitting)  を防げる。 テストデータ 訓練データ 36
  37. 37. 5.2.  グリッドサーチ •  2種類のパラメータを網羅的に探索 •  グラフの赤い点を網羅的に試す。(粗  ⇒  細) •  指数増加列がよい。    Ex.  C  =  2n  (n  =  -5  〜  15),    γ  =  2m  (m  =  -15  〜  3) 0 1 2 3 4 5 6 0 1 2 3 4 5 6 log2γ log2C 37
  38. 38. 最適化のまとめ •  素性の選択大事! •  とりあえず、RBFカーネルでOK! •  パラメータ調整大事! 38
  39. 39. 今回の内容 1.  はじめに 2.  サポートベクターマシンの理論 3.  最適化のお話 4.  オブジェクトの識別 39
  40. 40. サンプルコード •  ここにあります! https://github.com/Salinger/glasses_classifier/blob/ master/glasses_classifier.R •  ただし、学習データセットは含めていないので、 サンプルコードを実行したい場合は自分で 画像を集めてきてください。 •  ていうか、学習データ足らないので眼鏡っ娘 画像持ってる方、ください。 40
  41. 41. 用意したデータ •  データ数 •  学習  &  チューニング用データ •  眼鏡っ娘画像:  75枚 他:  75枚 計150枚 •  テスト用データ  (作成した分類器の動作確認用) •  眼鏡っ娘画像:  3枚 他:  3枚 計  6枚 •  内容 •  ネットで拾ったアニメのキャプ画。 •  主に人物単体写ってるもの •  基本顔がはっきりとわかるもの。 41
  42. 42. biOps ライブラリ  で画像を加工 42 1.  元画像 2.  グレースケール変換 3.  エッジ検出 4.  ダウンサイジング  (48x27) 要素  (次元)  数  1296  の  素性ベクトル (眼鏡:75  個  Not:  75  個  計150個) 5. 0〜1に なるよう 正規化 imgRGB2Grey() imgCanny() imgAverageShrink() vec / 255
  43. 43. 動作確認 •  SVMは  R  の  e1071  ライブラリを利用。 •  RBFカーネル  &  デフォルトパラメータで試行。 •  交差検定は  分割数  =  学習データ数   とする  Leave-one-out  法  を用いる。 •  今回の場合149個学習させて残り1個を分類 結果やいかに? 43
  44. 44. 動作確認の結果 44 •  2値分類なので、完全ランダムに振り分けた とすると分類精度は理論上  50  %  。 •  ランダムよりはだいぶ良くなってる。
  45. 45. グリッドサーチで最適なパラメータを決定 45 Gamma Cost 誤分類率 良 悪
  46. 46. 最適化の結果 •  精度  7割  達成。 •  このあたりが単純な手法だと限界っぽい。 •  実用化はまだまだっぽい。 46
  47. 47. テスト用データを分類 47 眼鏡 眼鏡 眼鏡じゃない 眼鏡じゃない 眼鏡じゃない 眼鏡 •  素性ベクトルの作成方法等をもっと工夫すれば もっと精度上がるかも。
  48. 48. 眼鏡っ娘いいよね あとSVMって便利だね 本日のまとめ 48
  49. 49. 参考文献 ・SVM実践ガイド  (A  Practical  Guide  to  Support  Vector  Classification) http://d.hatena.ne.jp/sleepy_yoshi/20120624/p1 ・カーネル法 http://www.eb.waseda.ac.jp/murata/research/kernel ・TAKASHI  ISHIDA HomePage  SVM http://www.bi.a.u-tokyo.ac.jp/~tak/svm.html ・バイオインフォマティクス  Rで行うSVM解析,  e1071,  kernlab,  klaR  パッケージの使い方   http://bi.biopapyrus.net/compute/r-svm.html ・眼鏡っ娘分類器  サンプルコード (学習データを含んでいないので、そのまま実行はできない) https://github.com/Salinger/glasses_classifier/blob/master/glasses_classifier.R 49
  50. 50. 補足資料 50
  51. 51. カーネル関数の決定(1) •  最初に試すのはRBFカーネル •  事前知識がない場合これが無難 •  高次元の非線形空間 •  線形カーネルはRBFカーネルの特殊系 •  シグモイドカーネルもRBFカーネルとほぼ同じように動作 •  γパラメータ  +  Cパラメータ  のみの調整で良い •  じゃ他のカーネルを使う場合はあるの? 51
  52. 52. カーネル関数の決定(2) •  線形カーネルの利点 •  高速な  LIBLINEAR  が使用出来る •  Cパラメータのみの調整で良い •  事前に線形分離できると予想できる場合                ⇒  線形カーネルを用いるほうがいいかも 52
  53. 53. カーネル関数の決定(3) 1.  事例数  <<  素性数  の場合 •  素性が高次元なので写像する必要がない •  線形カーネルを使うべき 2.  事例数  >>  素性数  の場合 •  非線形カーネルを利用して高次元に写像すべき 3.  事例数も素性数も大きい  場合 •  学習に時間がかかる。LIBSVMが苦手なケース •  線形カーネル  &  LIBLINEARの利用を検討 53

×