# Kaggleで勝つデータ分析の技術 輪読会
###### tags: `kaggle` `GTUGGirls`
[Git Repository: Winning-Data-Analysis-Techniques-with-Kaggle](https://github.com/shinseitaro/Winning-Data-Analysis-Techniques-with-Kaggle)
## 第2章タスクと評価指標
### 2.1分析コンペにおけるタスクの種類
- [x] 2.1.1回帰タスク @omohayui
- 数値を予測するのが回帰タスク
- RMSE,MAE (`2.3.2` で詳しくやる)
- RMSE (RootMeanSquaredError:平均平方二乗誤差)
- scikitlearnのmetricsモジュールのmean_squared_errorで計算することができる
- MAEと比較すると外れ値の影響を受けやすいので、あらかじめ外れ値を除く処理などをしておかないと外れ値に過剰に適合したモデルを作成してしまう可能性がある
- MAE (MeanAbsoluteError)
- 真の値と予測値の差の絶対値の平均
- 外れ値の影響を低減した形での評価に適した関数
- [x] 2.1.2分類タスク @shinseitaro
- 二値分類:
- 0もしくは1の2種類のラベルで分ける:F1-score
- 0〜1の間の確率を表す数値の予測:logloss / AUC
- 多クラス分類
- マルチクラス分類:レコードが複数のクラスのどれかに属する。multi-class logloss
- マルチラベル分類:レコードが複数のクラスに同時に属する。(二値分類をクラスの数だけ繰り返す方法が使われる)。mean-F1, macro-F1
- [x] 2.1.3レコメンデーション @kazura
- ユーザが購入しそうな商品や反応しそうな広告を予測するタスク
- amazonのレコメンドとか有名
- 最近はこの商品を買ったならこちらもどうですかっておすすめされるやつ増えた
- 予測提出
- 購入可能性に応じた順位をつける
- 順位をつけない
- マルチラベル分類と同じ感じ(複数の予測値を提出する)
- 商品を購入「する」「しない」の二値分類として解くことが一般的
- 評価指標
- 順位あり:MAP@K
- 順位なし:mean-F1, macro-F1
- [x] 2.1.4その他のタスク @omohayui
- 物体検出
- 画像に含まれる物体のクラスとその存在する領域を矩形領域で推定するタスク
- セグメンテーション
- 画像に含まれる物体の存在領域を画像のピクセル単位で推定するタスク
### 2.2分析コンペのデータセット
- [x] 2.2.1テーブルデータ @shinseitaro
- 行列を持つデータ
- テーブルデータのコンペは、 `train.csv` `test.csv` `sample_submission.csv` の3つのファイルを与えられることが最もシンプルでよくあるパタン
- `train.csv` `test.csv` の違いは、目的変数の columns があるかないか
- `train.csv` `test.csv` で前処理と特徴量を作成して、
- `train.csv` でモデル学習
- `test.csv` で予測
- `sample_submission.csv`形式で提出という流れ
- その他のファイルが与えられる場合も多数あり、その時はマージなどの前処理後、特徴量として使う
- [x] 2.2.2外部データ @kazura
- kaggleでは許可されていないことが多い
- 学習済モデルも外部データ扱い
- 外部データ許可のコンペでは、Discussionの専用スレッドで共有するルールのことが多い
- [x] 2.2.3時系列データ @omohayui
- コンペで時系列データは頻繁に出てくるが、タスクやデータの形式によってどのように扱うべきかはさまざま
- RecruitRestaurantVisitorForecasting
- 飲食店の日別の来客数から将来の来客数を予測するタスク
- SantanderProductRecommendation
- 月単位の金融商品の購入履歴から最新月の購入商品を予測するタスク
- TwoSigmaFinancialModelingChallenge
- 金融市場の匿名化された時系列データから、ある変数の将来の値を予測するタスク
- CouponPurchasePrediction
- 共同購入型クーポンサイトの購入履歴から、将来各ユーザーがどのクーポンを買うか予測するタスク
- 時系列データの特徴量の作成やバリデーション方法は3章でやる
- [x] 2.2.4画像や自然言語などのデータ @shinseitaro
- 本書では、テーブルデータを対象にしていて、画像、動画、音声、波形などの分類、検知は対象外
- しかしコンペでは、こういったデータの分類分析も必要なことがある
- 簡単な説明を、3.12.5 と 3.12.8 で行う
### 2.3評価指標
- [x] 2.3.1評価指標(evaluationmetrics)とは @kazura
- モデルの性能や予測値の良し悪しを測る指標
- コンペは評価指標に基づいて順位付けがされる
- 実務でも役に立つ
- 元から評価指標がある場合
- 新しいプロジェクトで評価指標から策定する場合
- [x] 2.3.2回帰における評価指標 @omohayui
- RMSE (RootMeanSquaredError:平均平方二乗誤差)
- 回帰タスクの中でも代表的な評価指標
- 各レコードの目的変数の真の値と予測値の差の二乗をとり、それらを平均したあとに平方根をとる計算
- RMSEを最小化する予測値は平均値を取る
- 最尤推定法とは?(さいゆうかいってなんぞや)
- 統計学で、与えられた観測値(標本)から、それらが得られる確率を最大化する確率分布の母数を推定する手法
- MAEと比較すると外れ値の影響を受けやすいので、あらかじめ外れ値を除く処理などをしておかないと外れ値に過剰に適合したモデルを作成してしまう可能性がある
- scikitlearnのmetricsモジュールのmean_squared_errorで計算することができる
- [x] 2.3.3二値分類における評価指標~正例か負例かを予測値とする場合 @shinseitaro
- 二値分類の評価指標
1. 各レコードが正例か、負例かの予測 (←この章で)
2. 各レコードが正例である確率の予測
- **各レコードが正例か、負例か、の予測するための評価指標**
1. **混同行列**
2. **accuracy(正答率)と error late(誤答率)**
3. **precision(適合率)と recall(再現率)**
4. **F1-scoreとFβ-score**
5. **MCC**
- ==混同行列==
- 予測として真偽値をだし、その真偽値が正しかったかどうかの組み合わせ
- ( `偽陽性` `偽陰性` はPCR検査のときに、ホットワードだったね。参考:[検査/東京大学保健センター](https://www.hc.u-tokyo.ac.jp/covid-19/tests/))
名前|予測値|予測値が正しかったかどうか
--- | ---| ---
TP(True Positive 真陽性)| 正例 | 正しい
TN (True Negative 真陰性)| 負例 | 正しい
FP (False Positive 偽陽性)| 正例 | 誤り
FN (False Negative 偽陰性)| 負例 | 誤り
- マトリックスにするとこういう図になる。 注意: 通常の表現方法と `sklearnのconfusion_matrix` メソッドを使うと要素の配列方法が異なるので注意

- [混同行列作成 P68 ch02-02-metrics.ipynb](https://colab.research.google.com/drive/1qFACpdUrjsJ4Qul-3ygCrs7RKIxBbMbu?authuser=1#scrollTo=DapROxgpI1QC)
- ==accuracy(正答率)と error rate(誤答率)==
- accuracy: 予測が正しい割合
- error rate: 予測が誤っている割合
- $accuracy = {TP + TN \over TP+TN+FP+FN}$
- $error rate = 1 - accuracy$
- 注意:不均衡なデータには性能評価しづらい
- 不均衡なデータ:目的変数の割合が均一でない。
- accuracy は 正例である確率が50%以上と50%以下に振り分ける判断能力。モデルの性能を評価するものではない
- 例:
- 重病の可能性が高い患者のスクリーニング
- 重病である割合は0.1%の状況下で、正例である(重病である)確率が5%(以上)ある患者であるかどうか予測したい場合
- この時、予測確率が50%以下であれば負例として予測できない accuracy は不適切
- この状況下では、全部負例と予測するモデルと変わらない
- [混同行列作成 P68 ch02-02-metrics.ipynb](https://colab.research.google.com/drive/1qFACpdUrjsJ4Qul-3ygCrs7RKIxBbMbu?authuser=1#scrollTo=DapROxgpI1QC)
- ==precision(混合率)と recall(再現率)==
- $precision = {TP \over TP+FP}$
- モデルが正と予測したもので、本当に正だったものの割合
- $recall = {TP \over TP+FN}$
- モデルが正と予測したものと、モデルが負だと予測したものの中で、正だった割合
- 0〜1の値とり、1に近ければ近いほど良い
- 誤検知を少なくしたい場合は、 precision 重視
- 正例の見逃しを避けたい場合は、 recall 重視
- どちらかを高めようとすると、どちらかが低くなる(トレードオフ)
- [PrecisionとRecallがトレードオフとはどういうことなのか? - Qiita](https://qiita.com/dl_from_scratch/items/309f98c11156b4ab6b52)
- ==F1-scoreとFβ-score==
- F1-score
- precision と recall の調和平均
- precision と recall のバランスをとった指標
- よく使う
- Fβ-score
- F1-score の recallをどれだけ重視するか
- $F1 = {2 \times recall \times precision \over recall + precision} = {2 TP \over 2TP + FP + FN}$
- $Fβ = {(1 + β^2) \over {β^2 \over recall} + {1 \over precision}} = {(1 + β^2) \times recall \times precision \over recall + β^2precision}$
- $F1$ の分子にはTPしかないことから、正例と負例を対称に扱っていない
- よって何を正にするか、を変えるとスコアも振る舞いも変わる
- `sklearn.matrix.f1_score, fbeta_score`
- ==MCC==
- Matthews Correlation Coefficient
- 不均衡なデータに対してモデルの性能を評価しやすい指標
- $MCC = {TP \times TN - FP \times FN \over \sqrt{(TP+FP)(TP+FN)(TN+FP)(TN+FN)}}$
- -1から+1 の数字を返す
- -1が逆相関、+1が相関
- `sklearn.metrics.matthews_corrcoef`
- [x] 2.3.4二値分類における評価指標~正例である確率を予測値とする場合 @kazura
- ==logloss(cross entropy)==
- 分類タスクでの代表的な評価指標。
$$
logloss = -{1 \over N}{\displaystyle \Sigma_{i=1}^{n}}{(y_i log p_i + (1-y_i)log(1-p_i))}\\
= -{1 \over N}{\displaystyle \Sigma_{i=1}^{n}}{log p'_i}
$$
- $y_i$ は正例かどうかを表すラベル(0が正例、1が負例)
- $p_i$ は各レコードが正例である予測確率
- $P'_i$ は真の値を予測している確率
- 真の値が正例 $p_i$
- 真の値が負例 $1-p_i$
- 真の値を予測している確率の対数をとり、符号を反転させた値(ちょっとこの説明何言ってるかわからない)
- entropyが0に近いほうが=値が低いほうが良い数値
- 結果が正例であるにもかかわらず、予測が正例であると判断した確率が低かった場合→ペナルティが多く与えられる→値が上がる
- モデルを学習する際の目的変数としてもよく使われる
- `sklearn.metrics.log_loss`
- ==AUC(Area Under the ROC Curve)==
- 二値分類における代表的な評価指標
- ROC曲線
- (予測値を正例とする閾値を1から0に動かし、)その時の偽陽性率/真陽性率を(x,y)としてプロットした図
- ROC曲線の下部の面積がAUC
- 正例と負例をそれぞれランダムに選んだときに、正例の予測値が負例の予測値より大きい確率としても定義できる
$$
AUC = {(y_i=1,y_j=0,y_i>y_j)である(i,j)の組の個数 \over (y_i=1,y_j=0)である(i,j)の組の個数}
$$
- 曲線図では改善の結果、どのくらい改善されたかがわかりにくいので、上記の式で考えたほうがわかりやすい
- 各レコードの予測値の大小関係のみが値に影響する
- 正例が非常に少ない不均衡データの場合、正例の予測値をどれだけ高確率の側に寄せることができるかが大きく影響する
- 負例の予測値の誤差の影響はあまり大きくない
- 評価指標Gini係数の場合は評価指標がAUCであるのとほぼ同じ
- `sklearn.metrics.roc_auc_score`
- [x] 2.3.5多クラス分類における評価指標 @omohayui
- ==multi-class accuracy==
- 二値分類のaccuracyを他クラスへ拡張したもの
- 予測が正解であるレコード数をすべてのレコード数で割ったもの
- $accuracy = {TP + TN \over TP+TN+FP+FN}$
- 二値分類と同様に `scikit-learn.metrics.accuracy_score` を使う
- ==multi-class logloss==
- 各クラスの予測確率を提出し、レコードが属するクラスの予測確率の対数をとり符号を反転させた値がスコア
- $multiclass logloss = -{1 \over N}\sum_{i=1}^{N} \sum_{m=1}^{M}y_{i,m}\log p_{i,m}$
- M = クラス数
- $y_{i,m}$ = レコードiがクラスmに属する? 1 : 0
- $p_{i,m}$ = レコードiがクラスmに属する予測確率
- 予測値はレコード数×クラス数の行列で提出
- `scikit-learn.metrics.log_loss` を使う
- [Colab: multi-class log-loss](https://colab.research.google.com/drive/180zjZT6hZnaNfNTzoisNxzJorZSl3Y2e#scrollTo=0_0nArQ-Ucox)
- ▼accuracy と logloss の違いとか
- https://www.atmarkit.co.jp/ait/articles/2103/04/news023.html
- mean-F1 と macro-F1 と micro-F1
- 前述のF1scoreを多クラス分類に拡張したものが、meanF1、macroF1、microF1
- mean-F1
- レコード単位でF1scoreを計算し、その平均値が評価指標のスコアになる
- macro-F1
- 各クラスごとのF1scoreを計算し、それらの平均値が評価指標のスコアとなる
- micro-F1
- レコード×クラスのペアのそれぞれに対してTP、TN、FP、FNのどれに当てはまるかをカウントする
- [Colab: meanF1、macroF1、microF1](https://colab.research.google.com/drive/180zjZT6hZnaNfNTzoisNxzJorZSl3Y2e#scrollTo=QwZ7yqxGnWtV)
- quadratic weighted kappa
- マルチクラス分類でクラス間に順序関係があるような場合に使用
- $k = 1-{\sum_{i,j}w_{i,j}O_{i,j} \over \sum{i,j}w_{i,j}E_{i,j}}$
- $O_{i,j}$ :真のクラスがi,予測値のクラスがjのレコード数
- $E_{i,j}$ :真の値がiである割合×予測値がjである割合×データ全体のレコード数
- $w_{i,j}$ :真の値と予測値の差の二乗 $(i-j)^2$
- 差が大きい程、この値が跳ねるので、大きく予測を外すと大きなペナルティが課せられる
- 図の表を見ると分かりやすい!
- 完全な予測は1,ランダムな予測は0,ランダムよりも悪い予測はマイナスになる
- [Colab: quadratic weighted kappa](https://colab.research.google.com/drive/180zjZT6hZnaNfNTzoisNxzJorZSl3Y2e#scrollTo=sbALvS9oTYeV)
- [x] 2.3.6レコメンデーションにおける評価指標 @shinseitaro
- レコメンデーション(この本を買った人はこの本にも興味があるみたいなやつ)
- **MAP@K** Mean Average Precision @ K
- 各レコードが一つまたは複数のクラスに属している時に、属している可能性が高いと予測する値をK個予測し、かつ可能性の高い順に並べてその正確性を図る
- コード的には
```python
K = 3
#各レコードの真の値
y_true = [[1,2], [1,2], [4], [1,2,3,4],[3,4]]
#予測値 K=3 なので通常予測値は3個まで、順位を付けて予測
y_pred = [[1,2,4], [4,1,2], [1,4,3], [1,2,3]]
```
- 全コードは: https://colab.research.google.com/drive/1Y6tzm_6LS3XHPRVfmUN-jw6GI68w-jc_?authuser=1#scrollTo=QZB5hWdMNDEX
- $MAP@K = {1 \over N}\sum_{i=1}^{N}({1 \over min(m_i, K)}\sum_{k=1}^{K}P_i(k))$
- コードで説明したほうがわかりやすいのでコードで説明します
### 2.4評価指標と目的関数
- [x] 2.4.1評価指標と目的関数の違い @kazura
- 目的関数
- モデルの学習において最適化される関数
- (感想)最適化することを目的にする、と言い換えても?
- 最小を目指す
- 回帰タスク:RMSE / 分類タスク:logloss (のことが多い)
- 微分可能なものでなければならないなど、いくつかの制約がある
- 評価指標
- モデルや予測値の「性能の善し悪し」を測る指標
- 真の値や予測値から計算できれば特に制約はない
- スコアの変化が数学的に扱いにくいなど、目的関数として使おうとしてもうまく使えないものが多い
- 目的関数や評価指標は同一のものになることもある
- その手のコンペはやりやすい
- 同一でないと、評価指標に対してモデルが最適化されないことがある
- [x] 2.4.2カスタム評価指標とカスタム目的関数 @omohayui
- モデルやライブラリで提供していない評価指標や目的関数をユーザー定義して使用できる
- カスタム目的関数を指定: その関数を最小化するように学習が進む
- カスタム評価指標を指定: その評価指標を使ったスコアが学習時のモニタリングで表示される
- どちらも使用するライブラリのAPIに沿う形で実装する必要がある
- [Colab: xgboostにおけるカスタム評価指標とカスタム目的関数の実装例](https://colab.research.google.com/drive/180zjZT6hZnaNfNTzoisNxzJorZSl3Y2e#scrollTo=vtUNEPAgSZ4D&line=1&uniqifier=1)
### 2.5評価指標の最適化
- [x] 2.5.1評価指標の最適化のアプローチ @shinseitaro
- [x] 2.5.2閾値の最適化 @kazura
- [x] 2.5.3閾値の最適化をoutoffoldで行うべきか?COLUMNoutoffoldとは? @omohayui
- [x] 2.5.4予測確率とその調整 @shinseitaro
### 2.6評価指標の最適化の例
- [x] 2.6.1balancedaccuracyの最適化 @kazura
- [x] 2.6.2meanF1における閾値の最適化 @omohayui
- [x] 2.6.3quadraticweightedkappaにおける閾値の最適化 @shinseitaro
- [x] 2.6.4カスタム目的関数での評価指標の近似によるMAEの最適化 @kazura
- [x] 2.6.5MCCのPRAUCによる近似とモデル選択 @omohayui
### 2.7リーク(dataleakage)
- [x] 2.7.1予測に有用な情報が想定外に漏れている意味でのリーク @shinseitaro
- [x] 2.7.2バリデーションの枠組みの誤りという意味でのリーク @kazura
## 第3章特徴量の作成
### 3.1本章の構成
### 3.2モデルと特徴量
- [x] 3.2.1モデルと特徴量 @omohayui
- [x] 3.2.2ベースラインとなる特徴量 @shinseitaro
- [x] 3.2.3決定木の気持ちになって考える @kazura
- [x] 3.3欠損値の扱い @omohayui
- [x] 3.3.1欠損値のまま取り扱う @omohayui
- [x] 3.3.2欠損値を代表値で埋める @shinseitaro
- [ ] 3.3.3欠損値を他の変数から予測する @kazura
- [ ] 3.3.4欠損値から新たな特徴量を作成する @omohayui
- [ ] 3.3.5データ上の欠損の認識 @shinseitaro