ASHRAEコンペ参戦記
kaggleで開催されていたASHRAEコンペが先日終了し、結果も出ました。
Leakが発覚したり、コンペ終了後にPrivateScoreが1週間ほど公開されなかったりと、波乱のコンペでしたが、やっぱり1番興奮するのはShakedownした時ですよね。間違いないね。(サンド風)
コンペ概要
以下のブログがかなり分かりやすくまとめられてます。
時系列データで、世界中のビルのエネルギー消費量を予測するコンペでした。
冒頭でも触れたように、いくつかのビルのエネルギー消費量がリークしてしまいましたが、それをまとめてくれた人がいた(しかもPrivateLB1位!)ので実質全員がリークを利用可能でした。
https://sukekiyo-ds.hatenablog.com/entry/2019/12/31/102819
基本方針
かなり邪道な方針ですが、今回は「公開kernelをblendしてメダル取ろう」をテーマにやりました。
途中でLeakValidationという、Leakしたsiteのtargetを使用してアンサンブルの比率を決める方法がkernelで投稿されたので、それを使ってとにかく混ぜまくりました。
結果
PublicLB:108位(/3594位)
PrivateLB:534位(/3594位)
見事にShakedown。銀メダル圏内からメダル圏外に弾き飛ばされました。。
大まかな結果の遷移は以下のような感じでした。
最終的には、PublicLB:0.952まで行きましたが、PrivateLBのスコアは落ちてShakedownとなりました。。3つ目のblendを使用していればPrivateLBでも銀圏でしたが、PublicLBを信じようということになり、選択できませんでした。
Kernelごとの特徴
7つのKernelをblendに使用しましたが、これらのkernelは3つのグループに分けられます。
1. KFold使用グループ
該当:Kernel_No1~4
名前の通り、cvの切り方がKFoldのkernel。
No1はmeterごとにmodelを作成していたり、No3はKFoldではなく期間の前半/後半の2つに分けていたりしていますが、一旦このグループ。
2. siteごとにmodel作成グループ
該当:Kernel_No5
site_idごとにmodelを作成しているkernel。
このkernelを追加すると、LeakValidationの値が激増しました。
これは、siteごとにmodelを作成しているため、各siteにoverfitしているためと考えています。LeakValidationを使用するということは、Leakしているsiteのtargetに寄せていくということなので、各siteにoverfitしている状態でLeakValidationをしてしまうとスコアが悪くなってしまうという理屈です。
単純に良いスコアを出すためなら、各siteにoverfitしても良い(最終的なPublicLB、PrivateLBにも全てのsiteがあるため)と思いますが、LeakValidationはダメだったということですね。
3. stratified KFold使用グループ
該当:Kernel_No6~7
cvの切り方がstratified KFoldのkernel。
これをblendに混ぜた結果、PrivateLBが下がり吹き飛ばされました。
なぜShakedownしたか?
stratifiedKFoldを使用したkernelをblendに加えたからなのですが、なぜstratifiedKFoldはダメだったのか?を少し考えました。
そもそも、stratifiedKFoldはtargetの値が偏らないようにする方法です。(cvの切り方はu++さんのサイトが非常に参考になる:https://upura.hatenablog.com/entry/2018/12/04/224436)
KFoldであれば、3月を使用して4、5月を予測する、などある程度の期間単位でcvが切られますが、今回のような時系列データの回帰問題で使用すると、 cvの切る単位が時系列性を失ってしまうためShakedownしたと考えています。
他のチームのShakedown原因は?
今回は多くのチームがshakedownをしていました。自分が見た限りで、Shakedownの原因となりうるものをまとめておきます。
・cvを2つでしか切らなかった
PublicLB1位だった方は、500位以上のShakedownをしています。そのSolutionのcvの切り方は、有名なkernelであるhalf-and-halfで使われていた、期間で2つに分ける方法でした。
他の上位SolutionはKFoldで複数にcvを切っていたため、ここが原因の一つなのではないか?と考えています。
・pseudo labeling
コンペ概要にリンクを貼った方の記事に乗っていた手法です。
これを使用した際に、大きくPrivateLBが低下していたとのことでした。
まとめ
・blendするとはいえ、cvの切り方は気をつけよう。
・分類問題にはStratifiedKFoldを使用しても良いが、回帰問題では基本的に使わないようにしよう。
・時系列データでも、timeSplitを使用せずにKFoldやGroupKFoldが有効な場合もある。過去のコンペを参考に考えよう。