[Kaggle] Ubiquant Market Predictionの1位から3位までのSolutionを眺めてみる


今回は下記のKaggleコンペティションのリーダーボード1位から3位までのSolutionを眺めてみます。

コンペ概要

このコンペティションでは、投資のリターン率を予測するモデルを構築します。コンペティションホストのUbiquant Investmentは2012年に設立された中国に拠点を置くヘッジファンドです。

訓練データとして各ID、市場データから生成された匿名化された特徴量300個や目的変数が与えられました。

  • row_id - ユニークID

  • time_id - データが収集された時間のid

  • investment_id - 投資のid

  • target -目的変数

  • [f_0:f_299] - 市場データから生成された匿名化された特徴量

評価はtime_idに対するピアソン相関係数の平均値に基づいて行われました。

訓練データはもうダウンロードできませんが、下記のEDAノートブックを見ると、より深く理解できそうです。

リーダーボードのSolution

1位

1位のSolutionは、LGBMとTABNETのアンサンブルです。

モデル

アンサンブルの選択肢として、他にMLPモデルも検討したとのことですが、結果としてstableではなかったとのことで、いくつかのアンサンブルの候補からTABNETが選択されたようです。
損失関数には、RMSEとMSEが使われました。
アンサンブルのメソッドとしてはLGBM x 5 FoldsとTABNET x 5 Foldsの平均とのことです。

特徴量

特徴量エンジニアリングとしては、300個の特徴量に新たに100個の特徴量を追加で生成。この追加した特徴量はCVとLBスコアに大きく寄与したとのことです。カーネルリソースの制限で妥協しているということで、有用な特徴量をもっと追加すればスコアをもっとあげられたかもしれないとしています。

100個の特徴量の生成についてもコードを記載してくれています。
やってる事としては特徴量と目的変数の相関を計算し、相関が高い上位100個の特徴量を選択し、time_idごとの平均値を計算して追加しています。

2位

2位のSolutionも、LGBMです。

特徴量

特徴量エンジニアリングとして元々ある300個の特徴量に加えて新たに100個の特徴量を追加しています。
目標変数と最も相関が高い特徴量について、観測数が31を超える(この閾値はマジックナンバーのようですが)最新の1000個の time_id ごとに平均値を計算したものを追加。
さらに5つの集約特徴量を追加。time_idとinvestment_id毎にmean, std, quantile 0.1, quantile 0.5, quantile 0.9を計算しています。

損失関数/評価関数

損失関数はRMSEです。
クロスバリデーション手法は、Purged K-FOLDを利用してさらにテストと訓練データの間に期間を設け、この期間中のデータを訓練にもテストにも使用しないことで、リークを防いだということです(Embargo)

アーリーストップを使って5つのLightGBMを訓練させたということです。

試したけど機能しなかったものとして下記を挙げています。

3位 

3位のSolutionは、トランスフォーマーモデルです。
1位と2位のSolutionは決定木アルゴリズムのLGBMでしたが、3位でNNが出てきました。

Models
6 layers transformer, max_seq_length=3500 investments

Loss
Optimize PCCLoss directly

Training Method
10 epochs on training data and 3 epochs on supplemental data

Feature Engineering
original 300 features

特徴量に関しては、集約特徴量の生成や、特徴量選択は試されたようですが、オリジナルの300個のみのようです。このコンペには3000人くらい参加があったみたいなので、3位にランクイン出来るのは驚きました。

Augmentation
random zero (feature level) + random mask(sequence level)

Validation Strategy
last k (k=100,200,300) validation

Ensemble Strategy
5 seeds ensemble

5 seeds ensembleとは、5つの異なるランダムシードのモデルを走らせ、平均を取ったとのことです。

試したけど、機能しなかったものとして下記を挙げています。

  • feature clipping

  • avg features group by time_id

  • feature selection by corr

  • sample selecton or sample weight

  • target normalization or target clipping