2019 Data Science Bowl まとめ

# はじめに
やっとテストが終わったので、DataScienceBowl2019の簡単なアウトプットでもしようと思います。今更だとは思いますが、初めてのコンペで、せっかく参加したので復習しようと思いました。

正直な話、初めてのコンペで手も足も出なかったので、上位入賞者の手法を簡単にまとめていきます。
まだまだ若輩者でおかしなところもあると思いますが、何かございましたら是非ご指摘お願いします。

※現在は２位までしかまとめていませんが、時間があればもう少し追加でまとめたいと思ってます。

# コンペの詳細
- 10/24-1/23の間に開催されたコンペ
- 児童用教育ゲームのログデータの分析
- ゲームの最後にテストが用意されており、何回目の思考でそれをクリアするかを予測

## 1st place solution
https://www.kaggle.com/c/data-science-bowl-2019/discussion/127469
### summary
マルチシードの５Foldに基づくLightGBMのシングルモデル
private score: 0.568
public score: 0.563
### Validation
初期の段階で、LBが不安定で local cv との相関が小さかったため local cv のみに着目することにした。
以下の２つの validation set を使用

- GroupK CV
    - installation_idを5分割を５回
    - 格分割で異なる列順序とseed値を使用
    - qwkは安定しなかったので重み付きrmseを使用
- Nested CV
    - GroupK CV が直感に反するような結果の時に使用
    - 全データを使用した1400のユーザデータをtrainに、一部のデータを打ち切った2200のユーザデータをtest に使用
    - 50〜100回繰り返して平均スコアをとる

### Feature Engineering
およそ2万個の特徴量を作成して、[null importances](https://www.kaggle.com/ogrellier/feature-selection-with-null-importances)を利用して500個の特徴量を選択。

1. 多くの統計量。おなじassessmentか似たようなゲームに基づくものが特に重要だった。(ゲームが対応する同様のassessmentにマッピング)
2. 履歴データを部分的に取り出して特徴量を作成。
    1. 全履歴
    2. 最後の5/12/48時間
    3. 前回のassessmentから現在まで
3. 現在のイベントと次のイベントのインターバル。mean/lastをeventid/eventcodeでグルーピングして算出。いくつかはとても有効であった。
4. clip event interval / clip length により算出した video skip 特徴量。
5. event data に関する特徴量。eventid / eventcode の組み合わせの統計量から作成。

### Feature Selection
1. 重複した特徴量の削除
2. adversarial AUC が0.5になるように adversarial validation
3. [null importances](https://www.kaggle.com/ogrellier/feature-selection-with-null-importances)

### Model
1. すべてのデータを使って学習
2. trainにはrmseを、validationには加重平均rmseを使用
3. [Optimizer Rounder](https://www.kaggle.com/naveenasaithambi/optimizedrounder-improved)を使って weighted qwk の閾値を調整
4. 08*lightgbm+0.2*catboost の簡単なブレンディングを行ったが、local cv がよくなかったので最終モデルには使用していない

## 2nd place splution
https://www.kaggle.com/c/data-science-bowl-2019/discussion/127388
### summary
LightGBM, CatBoost, NN のアンサンブルモデル
public score: 0.563
private score: 0.563

### Feature Engineering
- Word2Vec の利用
    - assessment までの title の流れを文章と捉えて Word2Vec でベクトル化
    - 各統計量を計算
- Historical feature
    - session, world, types, title, event_id, event_code の履歴データをワールド別、または全ワールドごとにカウント
    - event_round, game_time, event_count の履歴データの Count, mean, max を計算
- Decayed historical feature
    - title, type, world, event_id, event_code について履歴データの減衰してカウント
    - session ごとに半減
- Density of historical feature
    - title, type, world, event_id, event_code の履歴データの密度を計算
    - 各カウントを初起動日からの経過に数で割る
- Lagged Assessment
    - num_correct, num_incorrect, accuracy, accuracy_group の統計量を計算
    - 過去のassessmentからの経過時間を計算
- Meta Features
    - 各titleのassessmentごとの評価を特徴量として追加
    - それを予測して、その結果を新たに特徴量として追加
    <img width="969" alt="inbox_1846168_f8052d17308d8f21c32d010382ae1150_2020-01-24 0.07.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78102/a98b4bd3-6498-255b-fa0c-2f08ab7f6028.png">

### Feature Selection
- 重複したカラムを削除
- 相関がつよい特徴量を削除(0.99以上)
- 最終的に null importance で上位300のものを選択

### Model
- validation用に1ユーザー辺り、1サンプルになるようにリサンプリング
- StratifiedGroupKFold(5Fold)
- RSA (5 random seed) of LGB, CB, and NN
- 0.5 * LGB + 0.2 * CB + 0.3 * NN でアンサンブル