「じゃあ、他の手法と比べてみたときにどうなんだ？」

#### **「じゃあ、他の手法と比べてみたときにどうなんだ？」**
 アルゴリズムの開発者は、この言葉が出ることを（かなりの頻度で）おびえていると思います。実用になるシステムを期限までに開発しなければとせかされている場合はなおさらです。学術論文を書こうとしていない状況では、避けて通れるなら避けて通りたい問題です。この言葉がでると、（１＋比較する手法数）倍、作業量がとたんに増えてしまうのです。同じ学習データ、同じ特徴量を用いて、学習アルゴリズムだけを差し替えた学習と評価を作ることがどれほど面倒かを、意識することのない人が「じゃあ、他の手法と比べてみたときにどうなんだ？」という、いかにももっともな発言をするわけです。(注)
　**開発リソースが限られている状況では、その中で許容できる水準のものを作り上げることこそが重要です。**開発のボトルネックになっているのはそこじゃないという項目に対して、プロジェクトの優先順位を上げてしまう判断にならないように、用心する必要があります。機械学習の場合には、データの取得や、評価結果をふまえてデータを増強することや、どのように特徴量を設計するかというデータの前処理と、未知のデータに対する混同行列などの結果を得た後の今後のデータの増強の方針設定などの方が、どの機械学習のアルゴリズムを選択するかよりも重要な問題であることに気づいてもらうように、回りの人たちに理解をうながしておくことです。
　開発リソースが制約になっていないときなら「じゃあ、他の手法と比べてみたときにどうなんだ？」は、開発者自身でも確かめてみたいものです。


### **開発初期はデータの不足がボトルネックになる**
　scikit-learnの評価の枠組みなどを使い、精度と再現率の両方について値を評価します。開発の初期の段階ではデータがまったく足りていなく、精度・再現率ともボロボロです。そこで再現率が低いカテゴリに限って学習データを増やしてみると、そのカテゴリの再現率が改善するはずです。また、そのカテゴリに誤認識を生じていたカテゴリの精度も改善するはずです。そのような挙動をしているかぎり、地道に学習データ・評価データを増やすべきです。そのようについて作ったデータセットは、無駄にならないはずです。

　機械学習では、自由度が高いモデルほど、学習データ対しては少ない残差で当てはめることができます。しかし、それが学習に用いていないときに精度・再現率が出ることを意味しません。どのような機械学習のアルゴリズムでも、学習・評価のデータ量が不足している状況では、本来の性能を出しえないままになります。データ量の不足が影響を受けやすい度合いが、各アルゴリズムによって違うだけです。


### **サポートベクターマシン(SVM)**
　サポートベクターマシン(SVM)は、(他のアルゴリズムに比べて)比較的少ないデータでも安定な学習結果を与えやすいと言われています。そのSVMのアルゴリズムひとつとっても、いくつも事前のデータ処理によって、機械学習を成功に導くためのノウハウがあります([A Practical Guide to Support Vector Classification](https://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf))。

- データを[-1, 1] もしくは [0, 1]の範囲に正規化すること
- まず、RBFカーネルを最初の選択に用いること
- 交差検定と　ハイパーパラメータ　Cとγのgrid search すること
　
これらが、上記のリンク先のpdf ファイルに書いてあります。

SVMの学習時に与えるパラメータgamma、Cの値をどう決めるのかという作業があります。libSVMではそのためのツールgrid.pyを提供しています。
　[Grid Parameter Search for Regression](https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/#grid_parameter_search_for_regression)

まずは、SVMを使って十分な結果を出すことを提案します。

SVMには初期値依存性という問題が存在しないことも、私がSVMを最初に使う手法として気に入っている理由の１つです。　
（アルゴリズムによっては、初期値依存性の問題があります。「使った初期値が悪かったため、うまくいかなかったのでは？　（別の初期値を使ったらうまくいくのでは？）」などということになりかねません。　いつまでたっても十分な判断がつかないままになってしまいかねません）
　

「じゃあ、他の手法と比べてみたときにどうなんだ？」という質問が意味を持つのは、学習データ数・評価データ数が足りていて、データの前処理などで現行の手法が適切に性能を引き出せている状況においてです。まずそこまでの状況に開発チームの状況を高めることに関心を持たせてください。


### **scikit-learnはアルゴリズムの比較の宝庫**
　データが足りてくるとアルゴリズムの比較をするのに意味が生じる状況になってきます。
そんなときにはscikit-learnを使ってアルゴリズムによる違いを評価してみましょう。
　「同じアルゴリズムでもライブラリが異なれば、インタフェースが異なって当然。
　同じ目的の機械学習でもアルゴリズムが異なれば、インタフェースが異なって当然。」
　こういった状況が長く続いていたのを、scikit-learnは打ち砕いてくれました。
[Face completion with a multi-output estimators](http://scikit-learn.org/stable/auto_examples/plot_multioutput_face_completion.html#example-plot-multioutput-face-completion-py)中で次のようにかけているのは、
とてもすばらしいことなのです。

```.py:
for name, estimator in ESTIMATORS.items():
    estimator.fit(X_train, y_train)
    y_test_predict[name] = estimator.predict(X_test)
```



### **scikit-learnのAPI設計は、他のライブラリの見本となりつつある**
　様々な機械学習のライブラリが存在しますが、それらに対してscikit-learnと同様なAPIのラッパーを作成しているのが多数見受けられます。ですからsciki-learnに慣れておいて損はありません。

[chainerをscikit-learn likeに使えるようにした](http://qiita.com/lucidfrontier45/items/0568d0d9e2c125e72734)

[scikit-chainer](https://github.com/lucidfrontier45/scikit-chainer)

複数のscikit-learn風の実装が存在する。どの実装が一番よくメンテナンスされているのかは、最新の状況を調べてみてください。


[tensorflow/skflow](https://github.com/tensorflow/skflow)

[tensorflow/tensorflow/examples/skflow/](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/skflow)
digits.py
iris.py
mnist.py
などをみれば、scikit-learnと同じインタフェースで使えるようになっているのが分かります。

###  [scikit-learn 準拠の予測モデルのつくりかた](http://nykergoto.hatenablog.jp/entry/2017/05/14/003503)
> 機械学習で色々やっていると、いろいろなモデルを複合したアンサンブルモデルなど、自分で新しい予測モデルを作りたい場合があります。 その場合自分でいちから作り上げても良いのですが、そうやって作ったモデルは、たとえば scikit-learn のパラメータ最適化モジュールである GridSearch や RandomSearch を利用することができなくて、少々不便です。 この際に scikit-learn の定義にしたがってモデルを定義すればうまく連携がとれて効率的です


#### **さらにアルゴリズムを改善したいとき**
　学習と評価のためのデータセットが適切に集められていれば、[Kaggle](https://www.kaggle.com/)などの外部のリソースを使って、より効率的なアルゴリズム・より精度がでるアルゴリズムを開発することができます。


#### **異なるアルゴリズムでの学習後の評価結への解釈上の注意点**
- モデルの自由度とデータ数との兼ね合いで、どのアルゴリズムがよいかは変わってくる。
- 間違ってラベリングされてしまった学習画像の影響の受けやすさが、アルゴリズムによって違ってくる。
- 学習データの統計的な分布によって影響を受けるのかも、アルゴリズムによって違ってくる。

それらのことも考慮しつつ、最適な手法を見つけてください。

　


付記：過学習の問題を指摘している記事
　[声優の声を分類してみた](http://qiita.com/1234224576/items/f785eef6eed68271be64)
　
[ニューラルネットの学習過程を雑にグラフ化してみた](http://qiita.com/deltam/items/fa78f32670b8ee3cc431)

## **付記：データセットの重要性**
記述が増えたので、別の記事として独立させました。
[データセットの重要性](http://qiita.com/nonbiri15/items/b29fe079d359d531bf85)


付記：
SVMを使う場合には、どのライブラリを使うかの選択肢があります。多クラス分類で確率を返すことができる点では、libSVMのpythonバインディングやscikit-learnのSVMを勧めます。

[SVMについて調べてみる](http://qiita.com/nonbiri15/items/3b0440a95e61f134413d)


機械学習のデータを集める記事のリンク集を作成しました。
[機械学習のデータの集め方](http://qiita.com/nonbiri15/items/f5c5c4357458bfeb03bb)


### **参考情報**
Qiita [サポートベクトルマシンとその他の機械学習手法](http://qiita.com/ynakayama/items/afa2212cf561f2067606)
Qiita [【Python で機械学習】サポート・ベクター・マシン（SVM）情報掲載 参考ウェブサイトまとめ](http://qiita.com/HirofumiYashima/items/c5b11a9b4c81c8ece51d)
Qiita [chainerをscikit-learn likeに使えるようにした](http://qiita.com/lucidfrontier45/items/0568d0d9e2c125e72734)
Qiita [scikit-learn から学ぶ機械学習の手法の概要](http://qiita.com/ynakayama/items/9c5867b6947aa41e9229)



### SSII2016から ###
画像センシングシンポジウムから

「物体認識に関しては、問題対象となる適切な量と質のデータを準備できれば、誰でもある程度のシステムを構築可能な位にコモディティ化している。」と[SSII2016 画像認識の最先端と近未来]
(https://confit.atlas.jp/guide/event/ssii2016/static/speciallecture)の中で書かれている。問題対象となる適切な量と質のデータを準備　することは依然残っている。


川西 康友氏 「何か手法を作った時に、「SVMと比べたの？Random Forestでやると精度はどうなるの？」と聞かれることが多々あると思います。 本チュートリアルでは、近頃の機械学習ライブラリの普及により、ある認識問題に対して様々な機械学習法を適用し、性能を比較することが容易になっていること、またそれらを上手く使っていく方法について解説を行います。」（https://confit.atlas.jp/guide/event/ssii2016/static/tutorial） 

川西 康友氏  slideShare [Pythonによる機械学習入門 ～SVMからDeep Learningまで～](http://www.slideshare.net/yasutomo57jp/python-svmdeep-learning)

川西 康友氏  [SSII2016でのチュートリアル用サンプルコードです](https://github.com/yasutomo57jp/ssii2016_tutorial)

注：他の人が実行した（はずの）結果を再現することの方が、今の開発をすることよりも優先するような判断をされてしまうと、本来の作業がまったく実行できないという、恐ろしい状況になってしまいます。

　
追記
[「歩行者検出におけるグランドチャレンジ」](http://vision.cs.chubu.ac.jp/~hf/PRMU-GrandChallenge2016.pdf)



[[サーベイ論文] Deep Learningを用いた歩行者検出の研究動向](http://www.slideshare.net/greentea1125/deep-learning-70190103)


### この文章を書いた時期から変化しつつあること(2018.07 追記）
- 比較対象のアルゴリズムがソースコードが公開されていることが増えてきた。
- しかも githubに公開している場合が増えてきた。
- `git clone` して `cmake` して `make` すれば比較対象のアルゴリズムが用意できる。
- それぞれソースコードで前提とするライブラリのバージョンが異なりうまく動作しないという状況を、Dockerを使うことで回避できるようになってきている。配布元によってはDockerの設定ファイルを含めて配布してある状況も増えてきている。
- 着目されている分野、着目されている課題に応じた公開データベースが増えてきている。
- 場合によっては、集計用のツールが標準化されていて、比較がしやすくなってきている。

## 付記：「じゃあ、他の手法と比べてみたときにどうなんだ？」という指摘をする方へのお願い。

- 「じゃあ、他の手法と比べてみたときにどうなんだ？」という指摘は、とても便利な指摘です。しごく最もな指摘であることは間違いないから、指摘したあなたの評価は高まることでしょう。
- でも、ちょっとだけお願いです。何を懸念し、何との比較を優先すべきかを提示してください。よい手法というのは、評価するデータセット・利用できる計算資源で変わります。追跡アルゴリズムでも、固定カメラからの動画での追跡とカメラ自体が動いている動画での追跡では変わってきます。フレームレートがとても高いデータでの追跡とフレームレートが低いときでも変わってきます。評価するということによって必要な作業量を念頭において、本当に必要な比較を提案してください。
- 例：「GPUなどの計算リソースを使って計算できる状況では、むかしだったら重くてリアルタイムで動作できなかったものが、利用できるようになっているから、小細工をせずに、素直なアプローチをした方がいいのではないか？」とか、比較する対象の選択を選択する理由をあげて述べてください。それがお互いにとって幸福な状況を作り出します。