こんにちは、塩田です。
前回はPython初心者として奮闘している様子をお伝えしました。
本日はコンペに参加時にリーダーボード(以下LBと記載)について、私が理解につまずいた public LB と private LB におけるデータ分割について整理をしてみました。
LBとは簡単にいうと提出した予測のスコアと順位が表示される順位表のことです。
つまづいたところ
モデルを作成しスコア(例えばAUCや決定係数)をLBで確認をする際に、スコアが場所により大きく異なる値になっていることがあります。
- 手元のPCで確認できるスコア
- public LB :提出した際のLB上で確認できるスコア
- private LB :最終的にモデル評価がされる際のスコア
データ分割と精度の評価
なぜ異なるのか…
それはスコア算出に使用しているデータが異なるからでした。
以下では、よくあるコンペにおけるデータ分割を提示していきます。
まずコンペでは、このようにtrainとtestにデータを分割しています。
このデータに対してコンペ参加者は trainデータを目的変数yと説明変数Xに分け、さらに学習データ(X_trainとy_train)と検証データ(X_valとy_val)に分割します。
検証データを作成する目的は、手元のPCでスコアを確認するためです。
図で表すとこのような状態です。
当然のことながら、testデータの目的変数(y_test)は参加者には非公開にされています。
なおtrainデータを分割するコードは以下です。
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(
train_data_fix,
target,
test_size=0.2,
stratify=target,
random_state=42
)
モデルの精度
手元のPCで確認できるスコア
手元のPCで計算したスコアは、X_trainとy_trainから作成した学習モデルでX_valからval_predを予測し、正解データであるy_valに対するスコアです。
図の薄緑部分です。
public LB
public LB上で示されるスコア算出には、参加者には非公開であるy_testの中から一部が抽出され用いられています。
図の薄オレンジ部分です。
なぜLB上の精度算出のためにy_testの一部を抽出するのかというと、testデータに過学習をさせないためです。
y_test全てに対するスコアが公開されてしまうと、このスコアを利用して精度を向上することが可能になります。
そのため、コンテスト中には一部のデータに対するスコアを表示しています。
private LB
y_testデータすべてに対するスコアは private LB と呼ばれており、最終的な順位の決定に使用されます。
図の赤色部分です。
自分の参加したTryOut! での状況
TryOut!は社内版Kaggleのことです。
すでに研究所メンバーがアップしている記事で TryOut!が紹介されています。
引用元:
社内コンペを開催しました - CCCマーケティング データベースマーケティング研究所の Tech Blog
今回、自分で作成した学習モデルの精度(AUC)は以下でした。
- 手元のPC:0.80
- public LB :0.65
- private LB:0.83
このコンペではデータ全体の性年代が不均衡でしたが、データ分割は以下のようにされていました。
- 手元のPC:性年代が不均衡なデータ
- public LB :性年代を均等になるように抽出されたデータ
- private LB:性年代が不均衡なデータ
上記のようなデータ分割がなされていたことで、手元のPCのAUCと比べて、public LBのAUCが下がっていた、ということのようでした。
おわりに
この記事では一般的なコンペにおけるデータ分割を整理することで、スコアが場面によりなぜ異なるのかについてをまとめました!
引き続き、初心者ながらの観点で機械学習やデータ分析のつまづきポイントをシェアできたらなと思います。