Azure Machine Learningで「最適なアルゴリズムを選択する」には

## はじめに
Azure Machine Learningを触りはじめました。
アルゴリズムはすべてAzure側で実装されているけれど、
最適なアルゴリズムを選択するにはどうすればいいのだろうという疑問がありました。

そのような疑問を元に公式ドキュメントを読んで気づいたことを今回まとめます。

- [Microsoft Azure Machine Learning のアルゴリズムの選択方法](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/algorithm-choice)
- [Microsoft Azure Machine Learning Studio の機械学習アルゴリズム チート シート](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/algorithm-cheat-sheet)

機械学習は入門したてですので、間違いがありましたら指摘していただけるとうれしいです。

## ドキュメントを読むまで
これまでAzure Machine LearningのClassificationのハンズオンに取り組んでいます。
[Azure Machine Learningの初歩](https://qiita.com/ftnext/items/5852d142050b960b2777)
学習済みモデルを作成し、評価用データで予測をし、モデルを評価しました。

この経験からモデル作成時のアルゴリズムの選択が適切にできれば
精度の高いモデルができるはずだと考えていました。
アルゴリズムの選択を適切に行うために、それぞれのアルゴリズムのイメージをつかもうと
上記の公式ドキュメントを読み始めました。

## 機械学習のスタンスへの誤解
[Microsoft Azure Machine Learning のアルゴリズムの選択方法](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/algorithm-choice)を読み始めてすぐ、
私は大きな誤解をしていたと思い知らされました。

>最も経験豊富なデータ科学者であっても、試してみる前にどのアルゴリズムが最適か判断することはできません。

アルゴリズムを知れば、試さなくても適切な選択ができるだろうと私は考えていましたが、
実際のところは、試すことなしに「アルゴリズムの適切な選択」はありえないのだそうです。
複雑なアルゴリズムの数々を前にどれを使おうかと考えすぎるのではなく、
**これがよさそうというアルゴリズムをまず試してみる**というのが機械学習のスタンスなのだと認識しました。

## アルゴリズム選択の上での指針
Classificationのうち、**2クラス分類**のアルゴリズムの選択の指針を表にまとめます。[^1][^2]

|アルゴリズム|精度[^3]|トレーニング時間[^4]|線形性[^5]|パラメタ数|特記事項|
|:--------:|:-:|:------------:|:---:|:------:|:-----:|
|support vector machine||中程度|線形性|5|特徴の数が多い場合に適す|
|averaged perceptron|高い精度|中程度|線形性|4||
|logistic regression||高速|線形性|5||
|Bayes’ point machine||中程度|線形性|3||
|decision forest|極めて高い精度|中程度||6||
|boosted decision tree|極めて高い精度|中程度||6|**メモリを多く使用する**|
|decision jungle|極めて高い精度|中程度||6|**メモリ使用量が少ない**|
|locally deep support vector machine|高い精度|||8|特徴の数が多い場合に適す|
|neural network|極めて高い精度|||9|**トレーニングに時間がかかる**|

モデルに求められる精度や学習に使える時間を考慮して
この表と相談すれば、まず試すアルゴリズムは決定できると考えています。

[Microsoft Azure Machine Learning のアルゴリズムの選択方法](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/algorithm-choice)より
>可能な限り最も正確な回答を得ることが常に必要であるとは限りません。 使用目的によっては、近似で十分な場合があります。

>時間が限られている場合、アルゴリズムの選択を左右することがあります。

>危険性はありますが、線形アルゴリズムは最初に使用する方法として非常に一般的です。 アルゴリズムが簡単で、速くトレーニングできる傾向があります。

## 機械学習入門者の視点でのメモ
[Microsoft Azure Machine Learning のアルゴリズムの選択方法](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/algorithm-choice)を読んで興味深かった点を引用します。

#### 線形性とは
>線形分類アルゴリズムは、クラスを直線 (またはその高次元版) で分離できるものと想定します。

Azure Machine Learningの2クラス分類における線形アルゴリズムは、
SVM、平均化パーセプトロン、ロジスティック回帰、ベイズポイントマシンの4つ。

#### パラメタ数
>利点として、通常、パラメーターの数の多さはアルゴリズムがより柔軟であることを示します。 多くの場合、非常に高い精度を得られます。
>通常、パラメーター数の多いアルゴリズムは、適切な組み合わせを見つけるのに多くの試行錯誤が必要です。

#### 特徴の数
> 特定の種類のデータでは、特徴の数がデータ ポイントの数と比較して非常に大きくなる可能性があります。（中略）このケースには、Support Vector Machine が最適です

#### Logistic regression (ロジスティック回帰)
>高速で単純です。 直線ではなく「S」型の曲線を使用するため、データをグループに分割するのに適しています。（中略）使用するときは、線形近似を受け入れ可能なことを確認します。

#### ツリー、フォレスト、ジャングル
>デシジョン ツリーには多くのバリエーションがありますが、行うことはすべて同じで、特徴空間をほとんど同じラベルを持つ領域に分割します。

>特徴空間は任意の小さい領域に分割できるので、領域ごとに 1 つのデータ ポイントを持つようになるまで細かく分割することを簡単に想像できます。 これは極端な過剰適合の例です。 これを回避するには、ツリーが相互に関連しないように数学的に特別に考慮したツリーの大きなセットを作成します。

「ツリーが相互に関連しないように数学的に特別に考慮したツリーの大きなセット」がデシジョンフォレスト

>Decision forest は多くのメモリを使用する場合があります。 Decision jungle は、トレーニング時間が若干長くなるのと引き替えにメモリ消費が少ないバリエーションです。

Boosted decision tree
>結果は非常に正確ですが、メモリを多く使用する傾向があります。

#### Neural network (ニューラル ネットワーク)
>この単純な計算の組み合わせにより、一見マジックのように、高度なクラス境界とデータ傾向を学習できます。

>ただし、この高パフォーマンスにはコストがかかります。 Neural network はトレーニングに時間がかかり、多数の特徴を持つ大規模なデータ セットの場合は特にそうです。

neural networkからトレーニング時間を短時間化したのがaveraged perceptron
>two-class averaged perceptron (2 クラス平均化パーセプトロン) は、急激に増加するトレーニング時間に対する Neural network の回答です。

#### SVM
>2 つのクラスを明確に分離できない場合、アルゴリズムは最善の境界を検出します。 Azure Machine Learning の two-class SVM (2 クラス SVM) は、直線のみでこれを行います。

>特に有効なのは、テキストやゲノムのような特徴の多いデータの場合です。 このような場合、SVM は、他のほとんどのアルゴリズムより速く、少ない過剰適合でクラスを分離でき、さらに必要なメモリ量も中程度です。

locally deep SVM
>（前略）two-class locally deep SVM (2 クラス ローカル詳細 SVM) は、SVM の非線形バリエーションであり、線形バージョンの速度とメモリ効率性をほぼ維持しています。 線形アプローチでは十分に正確な回答を得られない場合に最適です。

#### ベイズ法
>パラメーターが非常に少ない
>データを直線で分割または適合できるものと想定している

## まとめ

- 「最適なアルゴリズムを選択する」ためには**まず試さなくてはならない**
- 今回まとめた情報を元にし、精度やトレーニング時間の制約を考慮することで、まず試すアルゴリズムを決定できそう

## 終わりに
今後は以下に取り組んでいきます。

- Azure Machine Learningでの学習済みモデルの比較 （複数のアルゴリズムを試す際に必要と思われる）
- データから適切な特徴量を選択するにはどうすればいいか

## 脚注
[^1]: [Microsoft Azure Machine Learning のアルゴリズムの選択方法](https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/algorithm-choice)をもとにまとめています。
[^2]: [Azure Machine Learning 分析アルゴリズムの選択](https://qiita.com/hiiyan0402/items/3e1584b25bfb6f453f52)というQiita記事には見やすいグラフ形式のまとめがあります。
[^3]: 精度が空欄のアルゴリズムは精度低めと理解しています。
[^4]: トレーニング時間が空欄のアルゴリズムはトレーニング時間長めと理解しています。
[^5]: 線形性が空欄のアルゴリズムは非線形と理解しています。