データ分析ガチ勉強アドベントカレンダー 11日目。
モデルを選び、試行錯誤しながら作っていく、そんな過程まで勉強してきました。 実装寄りの内容になったので、ここで一度機械学習界隈を俯瞰してみようと思いまして、調べると出てくる有名なチートシート
について、ここでまとめておきます。
- 用途ベースのMicrosoft Azure Machine Learning Cheat Sheet
- データベースのMachine Learning Cheat Sheet (for scikit-learn)
- 両者の違い
- 見て判断できるようにしておく
- まとめ
用途ベースのMicrosoft Azure Machine Learning Cheat Sheet
Microsoftが提供しているチートシート用途別にできるだけ分岐を行って、その後でデータの性質別に分けている。
用途 | アルゴリズム |
---|---|
データの隠れた構造を見つけたい | クラスタリング |
カテゴリを予測したい | 分類 |
値を予測したい | 回帰 |
普通じゃないデータを予測したい | 異常検知 |
データベースのMachine Learning Cheat Sheet (for scikit-learn)
こちらはpythonで機械学習を行うときには必須のツールsklearn
のチートシート。
どういうデータかというところに着目してチートシートが描かれている。
その中で、データの種類によって4種類に分けている。ニュアンスは下表な感じ
データの種類 | アルゴリズム |
---|---|
カテゴリのラベルを持っている | 分類 |
カテゴリラベルを持っていない | クラスタリング |
値のラベルを持っている | 回帰 |
どうしようもないデータを見やすくしたい | 次元削減 |
両者の違い
上の説明を見ればわかるが、Microsoftのチートシートは用途ベースで話を進めている。なので、どういうことをしたいかって言うのがわかりやすい。また、ほとんど定性的な説明で書かれているので、イメージがしやすい。
一方でsklearnはデータの中身を見ながら分岐している。チェーンソーで紙を切るような無駄を起さないために、また良い妻で立っても計算が終わらないなどの悲劇を起さないために、なるべく簡単な学習器から初めてうまくいかなかったら高度な学習器をっていう感じになっている。
ぱっと見タスクは何かを把握するにはMicrosoftのチートシートだが、データ分析従事者にとってはsklearnのチートシートを見るのがいいのかなっていう気がした。各アルゴリズムの中身を見ていると
など、割と細かく分かれている。これをベースにアルゴリズムを勉強して、「なぜそういう分岐になっているのか」を理解していくのもよさそう。
見て判断できるようにしておく
上記のチートシートはアルゴリズムを選ぶ際の参考になる。コレに加えて、自分で実験しながら視覚的&数値的にその学習器の性質を判断できると良いのかなと思う。Day-9で少し触れたが、評価したり可視化したりできていると、たとえば分類ならどんな分類面の引き方をするのかな~がわかる。
いつものGithubに、データを投げるといろんな学習器を調べるスクリプトを作ってみた。
まだ改良中だが、これからもう少し整備したい。
分類
今回は簡単な分類問題と、三日月形の分類で、その識別境界を色付けしてみた。濃いほど自信があるように色をつけてある。
blobs
線形分離がほぼできる分布 LogisticRegressionやLinearSVMなどのシンプルな分類器が一番わかりやすそう。 一方で、RBFカーネルはちょっとぐにゃぐにゃとした分離選を作りすぎかなというようにも感じられる。 加えて、アンサンブル学習系(Decision Tree/ Adaboost/ RandomForest)なども斜めに選を引かずかくかくとした線になっていて少し苦しそう*1
三日月形
三日月形になると、線形分類器たちは太刀打ち不能になってしまう。一方で、GaussianProcessなどの非線形分類器は、かなりきれいな分離面を引いているのがわかる。ただGaussianProcess等は計算コストが大きいので、そのあたりも考慮しながらの運用になりそう。
クラスタリング
クラスタリングも、パラメータの有無だったり、クラスタ形成の仕方だったりで、いろいろと結果に違いが生じる
blobs
簡単なクラスタリング問題では、ほとんどのアルゴリズムが正しく機能している。 一方で、DBSCANだけはクラスタが多くなってしまっているようだ。
三日月形
じゃあDBSCANが悪いのかといわれると、実はそんなことはない。非線形な分布のクラスタリングでは威力を発揮することも多い。下図だと、DBSCANだけが狙ったクラスタリングを達成できている。 閾値の調整が結構めんどくさいが、パラメータ次第では協力に機能する。
まとめ
きょうはチートシートを眺めたり、アルゴリズムを俯瞰したりしてみた。 結局時と場合によることが多いので、そのときにより良い判断ができるような基準を自分の中でもっておくことが必要かなと思う。
などを総合的に判断できるようになると、データサイエンティストに近づけるのかなと思う。
結構長い間sklearnメインで話を進めてきたけど、データ分析の基礎ができたところで、明日からは少し別の話題に触れようと思う。明日は時系列データについて書いていきたい。それではまた明日。
*1:座標変換すれば何とかなるのかな?