ML基礎 | 機械学習の作業工程の初歩の初歩

kaggleなど前処理やモデルの学習などに没頭していると、ふと作業工程を忘れてしまう。なのでまとめておきます。
自問自答もまとめておきます。

# 機械学習の作業工程

1. ビジネスの理解
  - 特徴量の意味とか、問題への理解があるとデータ探索も少しは楽であるため。
2. データ探索
  - でも結局わからないのでデータをバシバシ眺めるフェーズ。
3. 前処理
  - #2で方針決まったら、ざくざく特徴量を整理する。
  - #4のモデルを決めながらやることで、モデルに沿った前処理をすることも意識。
4. モデリング
  - モデルを学習させる。
  - 一番わくわくする瞬間。ショータイム。
5. 評価
  - 自分のモデリングを他人が正しく評価できるように、評価を数値で表す。オレのモデル最強、ではダメ。
6. 導入
  - 分析結果をまとめて提出する。
  - kaggleでしたら、test.csvを使って提出。

# 自問自答
## 前処理
##### Q) ざっと前処理を語って。
A. [参考資料](https://www.slideshare.net/hajimesasaki1/wi2-55598897)からリストアップ。

1. 分析できるデータフォーマットに加工
  - カラムに沿ったデータの整理。分析可能な特徴量を得ることがファースト。
2. カテゴリデータを数値データ化にする。（機械学習では数値データ化を前提にしているものが多いため。ダミー変数化っていう。）
  - 質的変数を量的変数に変換。ex) TitanicのSex column. Sex: Male/Female から Male: 1/0に変更。
    - いっつも忘れるが、質的はカテゴリ、量的は連続量。そして量的変数には連続と離散のカテゴリがある。
  - n-1個特徴量を作成する。カテゴリが３つ以上の場合は２個。
3. 外れ値や __欠損値__ の補完
  - 外れ値は統計的、空間的、またはクラスタリングに基づく方法で外れ値を排除することができる。排除により、分析の計算結果の歪みを防ぐことができる。
  - 欠損値は削除、最尤法、補完をすることで、分析可能なデータセットを得ることができる。データ量も減らすことを避けることができる。
4. 連続値の離散化（必要であれば）
  - 相関がありそうな特徴量で、欠損値を多く含む場合など、存在するデータを離散化・カテゴリに分け、それらの平均値や中央値を使うことで、誤差を含まない外れ値の補完をすることができる。    
5. __正規化/標準化__（必要であれば）
  - 同じものさしで数値を見ないと真実が見えない場合がある。[違う指標のものを比べたりする場合に単位が違う効果を打ち消す必要がある。](http://retrofocus.hatenablog.com/entry/2015/05/02/151526) 例えばテストの合計点。
  - Eng: 10,60,20 / Math: 80,70,75の場合、一見Math80点が高そうに見えるが、平均を見るとEng: 30, Math:75なので、Eng60点の方が良い点と判断できる。
  - そのほかにも学習に影響を及ぼす。例えばカーネルSVMなんかは破壊的な影響があるとオライリーの本に書いてある。こわ。
6. 特徴量の作成
  -  かっこよくいうとfeature engineering。既存の特徴量をもとに新しい特徴量を作ること。

##### Q) 正規化と標準化ちゃんと区別できてる？
A. できていないので、まとめる。

- 特徴量の尺度をそろえることを正規化と呼び、正規化と標準化の２つの方法がある。
- 正規化とは、特徴量を[0,1]の範囲でスケールし直すこと。
- 標準化とは、平均が0、標準偏差が1であるような正規分布としてスケールを合わせること。
- 基本的には標準化。正規化は外れ値が強く影響してしまうそう。標準化であれ、変換後も外れ値は外れ値として扱われる。

個人的にはよく標準化を見るかなぁ。今まで見た記事だとこんな傾向がありました。

- 正規化使うべき
  - わかりません。。。

- 正規化使わないでOK
  - わかりません。。。追ってまとめます。

- 標準化使うべき
 - ロジスティック回帰
 - SVM
 - KNN
 - k-meansとか距離を用いるモデル
 - Feature Extraction(PCA,LDA)

- 標準化使わないでOK
 - Random Forest　いいね！
 - 決定木

##### Q) 欠損値の対応方法って？
A) 欠損値の対応奥が深すぎます。こちらが大変[参考](http://smrmkt.hatenablog.jp/entry/2013/01/06/164758)になりました、本当にありがとうございます。欠損がランダムか否かという観点が大切なんだ。。。

結論として、MARを前提に最尤法か多重代入法にすることがオススメのようです。
[欠損値の割合に注目](https://www.slideshare.net/hajimesasaki1/wi2-55598897)すると良いらしい！
10％未満なら、リストワイズ。10％以上なら最尤法か多重代入法。

僕がアホでした。titanicのAgeの欠損値をknnで埋めていました。偏りに弱いことやってるんで良いスコアは出ないわけか。。。ショック。多重代入法はあとで勉強します。

__1. MCAR（Missing Completely At Random）__

- 欠測が完全にランダムなこと
- 対応方法
  - ◎FIML(完全情報最尤推定法)
  - ◎MI(多重代入法)
  - 〇回帰による推定(偏りに弱い)
  - △リストワイズ法(データ量減る．偏りに弱い)
  - △ペアワイズ法(計算面倒．偏りに弱い)
  - △平均値・中央値など(そもそも補完の意味があまりない)

__2. MAR （Missing At Random） だいたいこれらしい。__

- 欠測をデータ内で統制すればランダム 各データの欠損確率が欠損データには依存しない.これを仮定することが多い
- 対応方法
  - ◎FIML(完全情報最尤推定法)
  - ◎MI(多重代入法)
  - △回帰による推定(偏りに弱い)

__3. NMAR （Not Missing At Random）__

- 欠測がランダムではない 各データの欠損確率が欠損データにも依存
- 対応方法(欠測メカニズムをモデル化して対応)
  - △FIML(完全情報最尤推定法)
  - △MI(多重代入法)
  - △回帰による推定(偏りに弱い)


## モデル選定
##### Q. さて、どのような視点からモデルを選択すれば良いか。
A.
1. 予測精度([参考](https://datumstudio.jp/blog/機械学習におけるモデルの選択方法について))
2. モデル自体の中身のわかりやすさ(同上)
3. 訓練・テストデータの分布([P29](https://www.slideshare.net/canard0328/ss-44288984))
4. カテゴリの予測([参考](http://scikit-learn.org/stable/tutorial/machine_learning_map/))
5. 教師データの有り無し(同上)
6. 数量の予測か(同上)

[こんな観点もあるのか。。。](https://datumstudio.jp/blog/機械学習におけるモデルの選択方法について)
- 説明変数の予測値への寄与を大雑把に知りたい：線形判別/回帰
- 予測値の正確性が命：ディープラーニング、サポートベクタマシン/回帰
- 予測精度が実用的で因果関係の類推も行いたい：CART(ランダムフォレスト)

## モデル検証
##### Q. モデル検証って回帰と分類で違うの？
A. 違う。例えば下記。

- 回帰
  - MSE

- 分類
  - Accuracy（精度）
  - Precision
  - Recall
  - F measure

##### Q. Accuracyってなに？何に使えるの？
Accuracyは過学習や未学習の精度を含んでいるため、評価の信頼性が比較的低い、かつ汎化性能が検証できない

> パラメータ値を得るために学習に使用した訓練データを性能評価に使用すると過適応（Overfitting）、あるいは未適応（Underfitting）の状態を含んだ見積り値になるため、汎化性能を検証できない。
>[機械学習における学習方法と性能評価の基礎知識](http://www.buildinsider.net/small/bookthinkingmachines/0103)

##### Q. Fittingで使うデータは、学習データをまんまつかうのか？
A. 違う。交差検証するために、train.csvをさらに分割する。

スタート：train.csvとtest.csv
評価時：train_70%.csv, test_30%.csv (train.csvを7:3で分割)とtest.csv

test.csvは大事に大事に取っておく。

##### Q. 交差検証ってなに？
A. 学習データをテスト用と学習用に分割して、__正解率や誤分類を求める__ 手法。（やっぱり定義をしっかり理解しないとダメ。）
チューニング（ハイパーパラメータの調整）は自分でやって、それから交差検証する感じ。

主な検証方法は以下。

- K-Fold Cross-Validation
- ROC曲線(Receiver Operating Characteristic)
- AUC (Area Under the Curve)

##### Q. K-分割交差検証についてまとめておいてー。
A. [[交差確認（交差検証、Cross-Validation）の簡単な説明](https://mathwords.net/kousakakunin)]を参考にしています。

- データをk個に分割してサブサンプルグループを作る。k−1(サブサンプルグループ) で訓練をする。これをk回繰り返す（Test foldされるサブサンプルグループデータは各繰り返しの中でそれぞれ異なる）。それぞれの訓練データで残った1サブサンプルグループの集合がテストデータになる。
- 上記のように評価用データを変更しながら k 回繰り返した結果の平均を精度に用いることが多い
- k回繰り返すため、kが大きくなるほど、計算時間がかかる。

- 例：k=10個、データ数が800の場合
  1. サブサンプルグループのデータは80個(800/10)。80個のサブサンプルグループが10個。
    - サブサンプルグループ#1をテストデータとする。
    - すると訓練データ数は720個。テストデータは80個（サブサンプルグループ#1）です。
  4. 訓練データで学習。
  5. テストデータで精度を測る。
  6. サブサンプルグループ（#2,3....とテストデータを回す）を回しながら、10回繰り返す。
  7. 1~10回目の制度の平均値を計算して、これがモデルの制度になる。

##### Q. 実は層化K-分割交差検証というのがあるらしい。。。なにそれ。
A. [諸先輩方](http://datanerd.hateblo.jp/entry/2017/09/14/163233)がまとめてくれていたので大変感謝です。バイブル読んでもよくわからなかった。。。

  > 目的変数が[0,0,0,1,1,1,2,2,2]のデータがあるとき、単純に3分割すると0だけからなるテストデータ、1だけからなるテストデータ、2だけからなるテストデータとなり、スコアが0になってしまいます。

層化K-foldのときは、

- 1-fold [0,0,0]
- 2-fold [1,1,1]
-  3-fold [2,2,2]

ではなくて、

- 1-fold [0,1,2]
- 2-fold [0,1,2]
- 3-fold [0,1,2]

にする、ということ。より偏りに対応できるようになりますね。

##### Q. 学習曲線っていつ使うの？
A. バイアスとバリアンスの問題を診断するとき。知らなかった。。。

##### Q. 検証曲線は？
A. 過学習と学習不足を診断するときに使う。

##### Q. バイアスとバリアンス。ちゃんと説明できる？
A. 下記にまとめる。

- Var
 - アルゴリズムの良し悪しを決めるスペック。
 - Var高だと、過学習気味。汎化性能が低い。（モデルが複雑になると教師データに偏りがある場合に結果が偏る可能性がある。）
- Bias
  - Biasは真のデータと学習モデルの結果のデータとのズレ。
  - Bias高だと、未学習気味。真のデータと結果が異なっている。（モデルが単純な場合は教師データに偏りがあっても引きずられる度合いは低いが、真のデータとモデルの結果データとはズレがある。）

Varが低い/Biasが高い場合は、訓練データが偏っていても、その偏りに引きずれることはないが、真のデータと結果にずれがある。

##### Q. やばい、過学習しそう（or してしまった）。確認・改善はどうやってやるの？
- 正則化
- 交差検証によるパラメータチューニング
- 学習曲線を確認

##### Q. 正則化ッテナンデスカ？？
A. 正則化を使って、モデルの複雑さを調整し、バイアスとバリアンスのトレードオフを行い、過学習を直す。

もっとクールに言うと、

> こでこれにペナルティ項E(w)E(w)を加えて、ED(w)+λE(w)ED(w)+λE(w)を最小化するように最適化問題を解く問題に置き換えることで、「ほどよく」過学習を避けつつ穏当なモデルに落ち付かせようというのが、いわゆる「正則化」(regularization / penalized regression)の考え方です。
> [RでL1 / L2正則化を実践する](http://tjo.hatenablog.com/entry/2015/03/03/190000)

種類が2つ。違いは何を正則化項とするか。

**L1 正則化**

L1正則化の場合のペナルティ項のL1 normは、マンハッタン距離を使っており、
等高線はひし形になる。
[【機械学習】LPノルムってなんだっけ？](https://qiita.com/kenmatsu4/items/cecb466437da33df2870)でイメージが掴みやすい。

そうするとだ、このojtさんのコメントが少し理解できるようになる。
> L1ノルム正則化であれば尖った形の領域に接するようにしなければならないため自ずとw2の軸上に最適点が定まってw1=0となり,,,,

だから **不要と判断されるパラメータが0になって変数の数を削減すること**　とか、**L1正則化はそもそも不要な変数を消しちゃうこと** と言う意味もなんとなく頭に入ってくる。締めは我らのojtさんのお言葉。

> 「w2だけに値が入りw1はゼロになる」というような、いわゆるスパース（疎）な解を得やすいことが分かります。そこでL1正則化は「不要なパラメータを削りたい」（次元・特徴量削減）という時によく使われるんですね。

L1 norm の使うときは、無関係な次元の数 が多いときのようです。了解です！

**L2 正則化**
L2 normはユークリッド距離を使うので、等高線は円になる。

> L2ノルム正則化であれば円状の領域に接するようにしなければならないためw1,w2w1,w2ともにnon-zeroな値が入る、という感じになるわけ

ほほー。だから、 **変数の影響が大きくなりすぎないようにする**　とか、L2の方が良さそうな感じで聞こえるのか。

> L2正則化の場合は過学習を抑えて汎化された滑らかなモデルを得やすいことが知られています。

実際はL1にするかL2にするかは、ケースバイケースのようです。
あと、正則化を使った回帰のアプローチがリッジ回帰、LASSO、Elastic Net法です。

1. LASSOは、L1ペナルティを使ったモデル。
2. リッジ回帰は、L2ペナルティ付きのモデル。
3. Elastic Net法が折衷案で、L1とL2を共に使うモデル。


力尽きました。