最近終了したKaggleのコンペ、instant-gratification(通称kerneler-kunコンペ)や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
- Kaggle - How to get the exact y-values of all data points in the public LB
大まかに説明すると以下の流れでテストデータの中身を推定します。
- 予測値をすべて0にして提出する、これをBaselineProbe(BP)とする
- 次に一行目の予測値を0から100に変更して提出します
- 変更した100の値を200に変更して再度提出します
- 上記手順で得られたPublicScoreを用いて1行目のテストデータの値を推定します
- あとは上記手順の繰り返し
Mercedes-Benz Greener Manufacturingでの例
こちらのカーネルに具体的な計算方法をまとめました。こちらカーネルに沿って説明します。
Kaggle - LB Proving
この手法はこちらのコンペを対象にしています。
Kaggle - mercedes-benz-greener-manufacturing
スコア計算時に用いる評価関数は決定係数となっております。
$$ 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と呼称します。
$$ 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}} $$
手順② 1行目の予測値を100に変更して提出する
BaseLineの提出に使ったファイルを再利用し、1行目の予測値を100に変更して提出します。
$$ 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} $$
手順③ 1行目の予測値を200に変更して提出する
$$ 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での例
追記予定です