LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.

More than 1 year has passed since last update.

posted at

updated at

NumeariトーナメントのValid Corrをちょびっとだけ上げる小技

表題の件、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

01.png

当然ですが、相関はおよそ0.87とかなり高いです。またご存じの通りtarget_kazutsugiは一様分布、target_nomiは正規分布に近い分布であり、それぞれ5分位のデータとなっています。

合成ターゲットの作成

さて上記の散布図ですが、それぞれのプロットの数量を確認すると以下のようになります(下左図)。極端に少ない数量があることが分かります。従ってこれらを無視してプロットを再描画し、以下の新たにターゲットを付与します(下右図)。

02.png

具体的にコードで書くと以下のようになります。

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)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up