LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-11-03

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

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
  3. You can use dark theme
What you can do with signing up