初めて真面目に取り組んだコンペで疑問に思ったこと(ProbSpace)

はじめに

僕は現在Probspaceというデータ分析プラットフォームにおける「Re:不動産取引価格予測」というコンペに参加しています。
今までもマネーフォワードのコンペやkaggleのコンペに参加したり、つまみ食い程度にやっていたのですが、始まってすぐに高順位に行けたことから少しモチベーションが上がったので、今回かなり真面目に取り組んでます。

あ、一応現時点では残り9日だそうなので、興味ある人はチームマージなりなんなりしましょ。

どんなコンペ?

このコンペは土地の面積や場所から不動産の価格を予測したいというコンペ。かなりわかりやすいデータで、取扱しやすいです。

prob.space

さて、このコンペ、僕はLightGBMでモデルを組んでいるのですが、非常に不思議だなと思うところがありました。

1つ目のpipeline

pipelineを作るとき、初めに以下のようなものを作りました。

  1. ハイパーパラメータの選択肢を作成
  2. trainデータを使って、LightGBMのcvでearly_stoppingをかける
  3. 2.の動作を各種ハイパラで行い、最もスコアがよかったハイパラを決定する
  4. 確定したハイパラと、early_stoppingがかかったround数を用いて全データで学習
  5. できたモデルでtestデータの推論を行う

まあ割と素直なものだと思います。
しかしここで、どうやらsignateの土地コンペがこのコンペの参考になると聞きました。そこで以下の解法を拝見しました

signate.jp

こちらの一位解法にはこのように書いてありました。

LightGBM(5fold CVの各モデルのアンサンブル)

あれ、CVしたときの各モデルの予測をアンサンブルすることってもしかして必要??
実は前にも考えたことがあったので、以下のようなpipelineも作ってみました

2つ目のpipeline

f:id:arenzero:20200801024043p:plain
weight averaging??

このような形でtrainデータをCVする中で各foldごとにハイパラの調整とearly_stoppingを行いました
そして5つのモデルができたので、5つのモデルそれぞれにtestを入れ、5つの予測が出てきます。
5つの予測を、各foldの精度の逆数を取ってweight averageをしました。

そして、上記のpipelineを単純な5foldのCVの内側でNestするように実行してみると、どうやら1つ目の方が精度がいいそうです。LBのスコアもやはり1つ目の方が精度がいいので、では1つ目がいいのでしょうか

ここで疑問

これ自体は実装が間違っている可能性が大いにあるんですが、どこが違うのでしょうか
また、僕は今まで特徴量を少し変更したりハイパラの選択肢を少し変更したりしながらsubを出してきました。その中でも、よいsubトップ5を単にaverageしたものを試しに提出したところLBの数値がかなりよくなりました。
では、なぜ2つ目のアプローチが効かなかったんでしょうか。なんとなく2つ目のアプローチと、subをaveragingするのはそれほど変わらないように思います。

いやいや、特徴量変えたら全然違うでしょ

いうてそんなに変えてないときもあるんです。ハイパラの選択肢を少しいじったりするくらいのsubしかないものもあります。

seed値では?

seed値は2020で固定しています。

実装が間違っている線がきっと正しいのでしょう。そしてコードも公開したいところですが、まだコンペ期間中です。
同じようなことを体験された方がいるか、はちゃめちゃ天才がいたらご教授くださいな。