u++の備忘録

Solafune「夜間光データから土地価格を予測」コンペ 6 位解法

衛星データに関するコンペティションプラットフォーム「Solafune」で開催されていた「夜間光データから土地価格を予測」コンペ*1で、 6 位になりました。終了直前の参加だったので、優勝した方が公開していた特徴量に少し足して、pseudo labeling で水増しした程度の解法です。後述しますが、ある程度の順位変動が予想できたので、あまり突き詰めることはなく放置してお祈りしていました。

コンペ概要

夜間光データを元に土地価格を予測するコンペでした。データセットで与えられている列は目的変数を含めて 5 つのみでした。土地価格を推定する回帰問題です。その他の詳細は、他の参加者の方が公開しているブログ記事*2を参照してください。

解法概要

コンペ用の GitHub リポジトリを公開したので、Commit ログを辿ると具体的な雰囲気が分かるかもしれません。

github.com

私がコンペに参戦したのが 3 月 30 日で、終了まで残り 1 週間足らずでした。その時点でも上位に相当するスコアが出るベースラインの記事*3が公開されていたので、こちらを軸に進めることに決めました。

具体的には、当該記事で紹介されていた特徴量を丸々流用しつつ、最終的に以下の 377 個の特徴量を生成しました。

  • 当該記事の特徴量
  • 元々の特徴量
  • カテゴリ変数をラベルに置換
  • カテゴリ変数を登場回数に置換
  • カテゴリ変数を軸にした集計

この特徴量を用いて、LightGBM および CatBoost のモデルを作成しました。2 つの出力を、検証用データセットに対する性能が最大化するように重み付き平均することで、最終的な予測値としています。

コンペでは、しばしば全ての予測値を定数倍することで順位表のスコアが良くなる場合があります。今回、予測値をそれぞれ 0.9、0.8 倍したところ、以下のような結果が得られました。0.9 倍の予測値を提出した時点で public の順位表で 10 位に入りました。データセットがそれほど大きくないコンペだったこともあり、今回は以下のような意思決定をしました。

  • 定数倍で順位を上げても private には反映されなさそう
  • public の順位表の上位がどれほど後処理を頑張っているのか読めないので、ある程度頑張ったらコンペを終了してお祈りすれば良さそう
public private
original 0.490048 0.494568
original * 0.9 0.483107 0.497904
original * 0.8 0.501885 0.526949

最終的には、少しでも private で使われているデータセットに強いモデルにしようと思い、評価用データセットに対して疑似ラベルを付与する「pseudo labeling」を実施したところでコンペを終了しました。最終提出は 2 つ選ぶことができたので、定数倍の有無で 2 種類を用意しました。

順位はある程度の想像通り定数倍をしていない提出が最良のスコアを取り、public の 14 位から private の 6 位になりました。5 位までが入賞圏内で少々残念ですが、自分のデータセットに対する勘所を確認できた点で有意義なコンペだったなと感じます。

運営・参加者の皆さまにお礼申し上げます。

f:id:upura:20210430234327p:plain