Article information
RevisionsShow article in Markdown
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

This post is Private. Only a writer or those who know its URL can access this post.

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)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
Article information
RevisionsShow article in Markdown
Help us understand the problem. What are the problem?