表題の件、NumeraiのトーナメントでValid Corrをちょびっとだけ上げる小技を紹介します。具体的には、target_kazutsugiとtarget_nomiの合成ターゲットを作ります。
※本小技は、taraget_kazutsugiとtarget_nomiが含まれているデータセットが必要です。トーナメントにおけるターゲットは、ROUND238から"target"の呼称で"target_nomi"に統合されています。tournament_kazutsugi期間中は訓練データの構造は変わらないため、taraget_kazutsugiとtarget_nomiが含まれているデータセットを使えばほんのわずかですが有利となります。
#データセット読み込み
まず、taraget_kazutsugiとtarget_nomiが含まれているデータセットを読み込みます。
import pandas as pd
data = pd.read_csv("numerai_training_validation_target_nomi.csv").set_index("id")
training_data = data[data.data_type=="train"]
validation_data = data[data.data_type=="validation"]
#ターゲットの確認
それではtarget_kazutsugiとtarget_nomiの関係を見てみましょう。まずはそれぞれの相関を確認し、散布図を書きます。
import numpy as np
import seaborn as sns
print(np.corrcoef(training_data.target_kazutsugi, training_data.target_nomi)[0, 1])
sns.jointplot(x="target_kazutsugi", y="target_nomi", data=training_data)
<出力結果>
0.8691090858835623
当然ですが、相関はおよそ0.87とかなり高いです。またご存じの通りtarget_kazutsugiは一様分布、target_nomiは正規分布に近い分布であり、それぞれ5分位のデータとなっています。
#合成ターゲットの作成
さて上記の散布図ですが、それぞれのプロットの数量を確認すると以下のようになります(下左図)。極端に少ない数量があることが分かります。従ってこれらを無視してプロットを再描画し、以下の新たにターゲットを付与します(下右図)。
具体的にコードで書くと以下のようになります。
t = training_data # 記述を簡素化します
t["target_new"] = t["target_kazutsugi"]
t["target_new"][(t.target_kazutsugi==1) & (t.target_nomi<1)] = 0.875
t["target_new"][(t.target_kazutsugi==0.75) & (t.target_nomi==0.5)] = 0.625
t["target_new"][(t.target_kazutsugi==0.25) & (t.target_nomi==0.5)] = 0.375
t["target_new"][(t.target_kazutsugi==0) & (t.target_nomi>0)] = 0.125
#改善効果
この合成ターゲットに対して訓練を行うと、Validation corrが改善します。どのくらい改善するかはご自身でお確かめ下さい(ちょびっとですよ)。
from xgboost import XGBRegressor
def score(df):
return np.corrcoef(df["traget_nomi"], df["pred"].rank(pct=True, method="first"))[0, 1]
feature_names = [f in t.columns if "feature" in f]
model = XGBRegressor(max_depth=5, learning_rate=0.01, n_estimators=2000, n_jobs=-1, colsample_bytree=0.1)
model.fit(t[feature_names], t["target_new"])
validation_data["pred"] = model.predict(validation_data[feature_names])
valid_corr = validation_data.groupby("era").apply(score)
print(valid_corr)