機械学習・データ分析のプロセス手法の決定版
TL;DR
銀の弾丸はない
けれど試行錯誤してやってみた結果、以下の手法がオススメ乁( ˙ ω˙乁)
- 問題定義 (Define the Problem)
- データ準備 (Prepare Data) + EDA (Exploratory Data Analysis)
- アルゴリズムを色々試す (Spot Check Algorithms)
- 改善 (Improve Results)
- 結果をまとめる (Present Results)
以下のサイトで紹介している内容 + EDAを追加しただけなので、詳しくはそっち見た方がいいです。
参照: Applied Machine Learning Process
各ステップの中身
簡単に各ステップを説明します。
ついでに、関連するオススメ本も挙げておきます。
1. 問題定義 (Define the Problem)
当然ですが、まずはどのような問題を解決したいかを決める必要があります。
よくあるケースとして、「何でも良いので機械学習をやりたい」「既にデータがあるのでこれを活用したい」というのがありますが、これは問題と手法を混同しているアンチパターンなので避けましょう。まずは何を解決したいかを明確にします。
また、本当に機械学習でなければ解決できないのか?は念頭においておく必要があります。単純なルールベースの手法の方が機械学習より良いというケースは多いです。その場合には、機械学習の手法を使わないというのも一つの選択肢です。また、ルールベースの手法をベースラインとして、機械学習の手法を使う場合には、最低限ベースライン以上の精度は出す必要がある、という評価指標に使うこともできます。
2. データ準備 (Prepare Data) + EDA (Exploratory Data Analysis)
機械学習はデータありきなので、データを準備します。もしなければデータ収集の方法や仕組みから考える必要があります。
EDAとは、データを可視化したり統計値としての分布などを見ることです。それによりどの特徴量が重要か、またどのような前処理や変換処理が必要かを判断することができます。
元々のデータは値が欠けていたり(欠損)、外れ値があったりと、汚いデータであることが多いためこのステップでデータを綺麗にします。
- データ選択
- データ前処理
- データ変換
同じモデル・アルゴリズムだとしても、往々にしてデータが綺麗な方が精度が出ることが知られているため、とても重要なプロセスです。しかし、最も面倒で時間のかかるタスクでもあります。
また、データが欠けているならば○○すればよいと決まっているわけではなく、ケースバイケースで判断する必要があります。例えば欠損の場合には、①対象データを削除する、②中央値で埋める、③平均値で埋める、④他データから類推する、など様々な選択肢があります。
3. アルゴリズムを色々試す (Spot Check Algorithms)
最強のアルゴリズムはありません。解決したい問題やデータによって有効なアルゴリズムは異なるため、色々試して見るのが重要です。
機械学習の問題には大きく分けて以下3種類があり、それにより使用できるアルゴリズムが異なります。
- 回帰
- 分類
- クラスタリング
例えば、以下サイトはscikit-learnというpythonの機械学習ライブラリで使用できるアルゴリズムの一部です。 この中から対象の問題に適用可能な10〜20個程度試してみて性能を見てみましょう。
Supervised learning Algorithms
4. 改善 (Improve Results)
試したものの中で精度が良さそうなアルゴリズムをピックアップし、性能を改善します。
このステップでできることは多種多様なため、機械学習タスクの一番面白いところだと思います。大きく分けて以下3種類の改善手法があります。
- アルゴリズムのチューニング(パラメータチューニング)
- 特徴量生成
- アンサンブル
以下、kaggleという機械学習のコンペのサイトがあり、そこの Kernels
に様々な情報が載っているのでここ見たほうが良いです。また、コンペの入賞者が実践した手法を説明している winner's interview
というkaggleのブログ記事も勉強になります。
最近では、日本人の人のwinner's interviewが出てました。すごいな〜乁( ˙ ω˙乁)
Instacart Market Basket Analysis, Winner's Interview: 2nd place, Kazuki Onodera
5. 結果をまとめる (Present Results)
これまでのプロセスから得た評価や結果、発見などをまとめます。フォーマットはなんでもいいと思いますが、個人的にはjupyterやmarkdownでまとめた方がバージョン管理などできて楽だと思います。
少なくとも以下のポイントがまとまっていれば良いと思います。
- 問題
- 解決方法
- 発見
- 結論
終わりに
オススメのプロセスをまとめました。実際には各ステップをサイクルとして回していく感じになります。
試行錯誤して色々やっていくしかないのが、大変なところであり面白いところだと思います。
今度は各ステップを深掘りして説明していきたい。。。(死亡フラグ)
補足
なぜプロセス手法が重要なのか?
機械学習のプロジェクトを行うにあたって、どのようなプロセスで行うかは重要だと思います。 フェーズで分割したりサイクルを決めることで、プロジェクトの見通しも良くなりますし、より早く効率的に求める結果を得ることができます。また、他のメンバーやチームと情報共有するために、どのようなプロセスでプロジェクトを行っているかはできるだけ明確にしておいた方が良いと思います*1
機械学習には標準的なプロセスがない?
例えば、通常のITのプロジェクトでは ウォーターホール
や アジャイル
などの手法があり、プロジェクトの規模やビジネスニーズなどによって任意に選択することができます。
しかし、機械学習やデータ分析のプロジェクトに関して言うと、実際にどのような手法を使えばいいのかはあまり明瞭ではありません。 教科書などによく出てくる手法の一つに CRISP-DM があります。これは以下のような6つのステップを行うものですが、正直なところ使いづらいなという印象ですし、現場ではあまり使われていないのではと思います。*2
- ビジネス理解 (Business Understanding)
- データ理解 (Data Understanding)
- データ準備 (Data Preparation)
- モデリング (Modeling)
- 評価 (Evaluation)
- 導入 (Deployment)