記録帳

クラウド、データ分析、ウイスキーなど。

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を信じようということになり、選択できませんでした。

f:id:supa25:20200101191941p:plain

 

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が有効な場合もある。過去のコンペを参考に考えよう。