はじめに
Signateのコンペに参加し始めた頃は「ベースラインを作っても上位に入れない」という壁にぶつかりました。上位入賞者の解法を研究して学んだことをまとめます。スコアを上げるためのアプローチは「モデルを変える」より「データを理解する」が9割です。
コンペで勝つための基本フロー
EDA(探索的データ分析)で徹底的にデータを理解することから始めます。次にシンプルなベースラインを素早く作ります。クロスバリデーションを正しく設定して信頼できる評価基準を作ります。特徴量エンジニアリングで改善を積み重ねます。最後にアンサンブルで最終スコアを上乗せします。
EDAで何を見るか
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib
# 1. 基本情報
print(train.shape, test.shape)
print(train.dtypes.value_counts())
print(train.isnull().sum().sort_values(ascending=False).head(20))
# 2. 目的変数の分布
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
train['target'].hist(bins=50)
plt.title('目的変数の分布')
plt.subplot(1, 2, 2)
train['target'].value_counts().plot(kind='bar')
plt.title('クラス分布')
plt.show()
# 3. 訓練データとテストデータの分布比較(乖離検知)
for col in ['feature1', 'feature2']:
plt.figure(figsize=(10, 4))
train[col].hist(bins=50, alpha=0.7, label='train')
test[col].hist(bins=50, alpha=0.7, label='test')
plt.legend()
plt.title(f'{col}の分布比較')
plt.show()
# 4. 特徴量と目的変数の相関
corr = train.corr()['target'].sort_values()
print('相関が高い特徴量 TOP10:')
print(corr.tail(10))
コンペで使えるテクニック集
# ターゲットエンコーディング(カテゴリ変数をターゲットの平均で置換)
def target_encoding(train, test, cat_col, target_col, n_folds=5):
from sklearn.model_selection import KFold
kf = KFold(n_splits=n_folds, shuffle=True, random_state=42)
train_encoded = train[cat_col].copy()
global_mean = train[target_col].mean()
for train_idx, val_idx in kf.split(train):
fold_mean = train.iloc[train_idx].groupby(cat_col)[target_col].mean()
train_encoded.iloc[val_idx] = train[cat_col].iloc[val_idx].map(fold_mean).fillna(global_mean)
# テストデータは全訓練データの平均を使う
test_encoded = test[cat_col].map(train.groupby(cat_col)[target_col].mean()).fillna(global_mean)
return train_encoded, test_encoded
# Adversarial Validation(訓練・テストデータの乖離を検知)
def adversarial_validation(train_df, test_df, features):
import lightgbm as lgb
from sklearn.model_selection import cross_val_score
combined = pd.concat([
train_df[features].assign(is_test=0),
test_df[features].assign(is_test=1)
])
X = combined[features]
y = combined['is_test']
model = lgb.LGBMClassifier(n_estimators=100, random_state=42)
auc = cross_val_score(model, X, y, cv=5, scoring='roc_auc').mean()
print(f'Adversarial AUC: {auc:.3f}')
print(f' 0.5に近い→乖離なし, 1.0に近い→乖離大(要注意)')
return auc
まとめ
コンペのスコアを上げる道筋は「EDAで深くデータを理解→正しいCVを設定→特徴量エンジニアリングを積み重ねる→アンサンブル」です。上位入賞者の解法を読んで学ぶことが最短の成長路線で、上位解法はコンペ終了後にDiscussionに公開されます。まずはSignateのチュートリアルコンペから始めて、徐々に本コンペへと挑戦してみましょう。
💼 ITエンジニア転職特化
自分らしく働けるエンジニア転職を目指すなら【strategy career】
年収1000万・残業月30時間以下・リモート可の求人多数
※アフィリエイト広告を含みます
![]()
※本記事にはアフィリエイトリンクが含まれます。


コメント