33
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

KaggleAdvent Calendar 2019

Day 8

LeaderBoardProbingという技術の紹介

Last updated at Posted at 2019-06-30

最近終了した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の内容に従って試したものになります。筆者自ら発見した手法ではないことをここで宣言しておきます。

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

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

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と呼称します。
submit_baseline.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}} $$

手順② 1行目の予測値を100に変更して提出する

BaseLineの提出に使ったファイルを再利用し、1行目の予測値を100に変更して提出します。
kaggle_submit_1_100.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} $$

手順③ 1行目の予測値を200に変更して提出する

今度は1行目の予測値を200にします。
kaggle_submit_1_200.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での例

追記予定です

参考

33
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?