LeaderBoardProbingという技術の紹介

最近終了したKaggleのコンペ、[instant-gratification(通称kerneler-kunコンペ)](https://www.kaggle.com/c/instant-gratification)や[LANL Earthquake Prediction(地震コンペ)](https://www.kaggle.com/c/LANL-Earthquake-Prediction)それぞれのディスカッションで取り上げられたLeaderBoardProbingについて調べたことをまとめたいと思います。
これ以降LeaderBoardという名称は**LB**と略称します。

# LB Probingとは
Kaggleのようなコンペティション形式の場合、スコアの計算に使われる評価用のデータは2つに分けられており、片方がPublic LBの全員に見える形で表示され、もう片方がPrivate LBコンペ終了時に公開され最終的な順位決定に利用されます。
**Public LBに使われる評価用のデータの中身を表示されるPublic Scoreを用いて推定する技術**がLB Probingと言います。

## 具体的にはどうやるのか
**(注)** これから説明する手法の大半はこちらKaggleのディスカッション、PDFの内容に従って試したものになります。筆者自ら発見した手法ではないことをここで宣言しておきます。

- [PDF - kaggle-mercedes-benz-greener-manufacturing-LB-probing](https://crowdstats.eu/topics/kaggle-mercedes-benz-greener-manufacturing-LB-probing)
- [Kaggle - How to get the exact y-values of all data points in the public LB](https://www.kaggle.com/c/mercedes-benz-greener-manufacturing/discussion/35271)

大まかに説明すると以下の流れでテストデータの中身を推定します。

1. **予測値をすべて0**にして提出する、これをBaselineProbe(BP)とする
1. 次に**一行目の予測値を0から100に変更して**提出します
2. **変更した100の値を200に変更して**再度提出します
3. 上記手順で得られたPublicScoreを用いて1行目のテストデータの値を推定します
4. あとは上記手順の繰り返し

### Mercedes-Benz Greener Manufacturingでの例
こちらのカーネルに具体的な計算方法をまとめました。こちらカーネルに沿って説明します。
[Kaggle - LB Proving](https://www.kaggle.com/wakamezake/leaderboardproving)

この手法はこちらのコンペを対象にしています。
[Kaggle - mercedes-benz-greener-manufacturing](https://www.kaggle.com/c/mercedes-benz-greener-manufacturing)

スコア計算時に用いる評価関数は[決定係数](https://ja.wikipedia.org/wiki/%E6%B1%BA%E5%AE%9A%E4%BF%82%E6%95%B0)となっております。
$$ R^2(y,\hat{y}) = 1 - \frac{\sum_{i=1}^{N}(y_i - \hat{y_i})^2}{\sum_{i=1}^{N}(y_i - \overline{y_i})^2} \tag{1} $$

後の計算のため分母を**定数Stot**とします。
$$ S_{tot} = \sum_{i=1}^{N}(y_i - \overline{y_i})^2 = const. \tag{2} $$


#### 手順① 予測値をすべて0にして提出する
提出した結果がこちらになります。予測値をすべて0にした結果をこれ以降BaseLineと呼称します。
![submit_baseline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40310/c7e57f70-2227-0301-1927-091be919b6c0.png)


$$ Score_{BP} = −59.28220 \tag{3} $$

予測値が全て0のため**(1)**の式に0を代入します。
$$ Score_{BP} = 1 - \frac{\sum_{i=1}^{N}(y_i - 0.0)^2}{S_{tot}} \tag{4} $$

後の計算のために式変形をしておきます、総和を計算する部分を1番目とそれ以降に分けています。
$$ Score_{BP} = 1 - \frac{y_1^2}{S_{tot}} - \frac{\sum_{i=2}^{N}y_i^2}{S_{tot}} $$


#### 手順② １行目の予測値を100に変更して提出する
BaseLineの提出に使ったファイルを再利用し、１行目の予測値を100に変更して提出します。
![kaggle_submit_1_100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40310/e5d2d351-d912-335f-5f98-d00a8fc3f4c5.png)

$$ Score^1_{100.0} = -59.25187 \tag{5} $$

BaseLineの計算同様、0ではなく100を代入します。
$$ Score^1_{100.0} = 1 - \frac{(y_1 - 100.0)^2}{S_{tot}} - \frac{\sum_{i=2}^{N}y_i^2}{S_{tot}} \tag{6} $$

式を展開します。
$$ Score^1_{100.0} = 1 - \frac{y_1^2 - 200.0y_1 + 100.0^2}{S_{tot}} - \frac{\sum_{i=2}^{N}y_i^2}{S_{tot}} $$

$$ Score^1_{100.0} - Score_{BP}  = \frac{200.0y_1 - 10000.0}{S_{tot}} $$

欲しい結果である**テストデータの1行目の結果**を求める式に変換しておきます。すでに2つのスコアは既知のため**残りStotがわかれば**計算できることがわかります。
$$ y_1 = \frac{S_{tot}(Score^1_{100.0} - Score_{BP}) + 10000.0}{200.0} $$


#### 手順③ １行目の予測値を200に変更して提出する
今度は1行目の予測値を200にします。
![kaggle_submit_1_200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40310/f47af516-339f-fbfc-8e39-a5ea400b4c71.png)

$$ Score^1_{200.0} = -59.36366 \tag{3} $$

以下やっていることは手順②と同じため説明は省きます。
$$ Score^1_{200.0} = 1 - \frac{(y_1 - 200.0)^2}{S_{tot}} - \frac{\sum_{i=2}^{N}y_i^2}{S_{tot}} \tag{6} $$

$$ Score^1_{200.0} = 1 - \frac{y_1^2 - 400.0y_1 + 200.0^2}{S_{tot}} - \frac{\sum_{i=2}^{N}y_i^2}{S_{tot}} $$

$$ Score^1_{200.0} - Score^1_{100.0}= \frac{200.0y_1 - 30000.0}{S_{tot}} $$

共通項であるy1が消せます。
$$ (Score^1_{100.0} - Score_{BP}) - (Score^1_{200.0} - Score^1_{100.0})= \frac{20000.0}{S_{tot}} $$

求めたかったStotの計算式です、残りの変数の値は既知なのであとは代入することで結果がわかります。
$$ S_{tot} = \frac{20000.0}{(2Score^1_{100.0} - Score_{BP} - Score^1_{200.0} )} $$


$$ S_{tot} = 140726.14692 $$

これでテストデータの1行目の結果を得ることができました。
$$ y_1 = 71.34112 $$

### LANL Earthquake Predictionでの例

追記予定です


# 参考
- [Kaggle - How to get the exact y-values of all data points in the public LB](https://www.kaggle.com/c/mercedes-benz-greener-manufacturing/discussion/35271)
- [Kaggle Official documents - LeaderBoard](https://www.kaggle.com/docs/competitions#leaderboard)
- [Kaggle - LB proving_tutorial](https://www.kaggle.com/wakamezake/leaderboardproving)