Shikata Ga Nai

Private? There is no such things.

38. Kaggleのコンペで勝つためのモデル選び

Hello there, ('ω')ノ

📌 1. Kaggleのコンペの種類と適したモデル

Kaggleのコンペは、大きく分けて以下の3つのタイプがあります。
各タスクに適したモデルを理解することが、勝率を上げるポイントです!

タスク 代表的なデータセット 最適なモデル
テーブルデータ(構造化データ) 住宅価格予測、顧客の購買予測 XGBoost / LightGBM / CatBoost
画像データ 犬・猫の分類、医療画像 CNN(ResNet, EfficientNet)
自然言語処理(NLP) 感情分析、機械翻訳 Transformer(BERT, GPT)

「タスクに応じて適切なアルゴリズムを選ぶ!」


📌 2. コンペでよく使われる強力なモデル

✅ ① XGBoost / LightGBM(テーブルデータに最強)

特徴量エンジニアリングとの相性が良く、Kaggleで定番!
大量のデータでも高速に学習できる!
過学習を抑えるハイパーパラメータ調整が豊富!

📌 XGBoostの実装例

import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# データの準備
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# XGBoostモデル
xgb_model = xgb.XGBRegressor(n_estimators=500, learning_rate=0.05, max_depth=6)
xgb_model.fit(X_train, y_train)

# 予測
y_pred = xgb_model.predict(X_test)

# 評価
rmse = mean_squared_error(y_test, y_pred, squared=False)
print(f"RMSE: {rmse:.2f}")

構造化データ(表形式のデータ)では、まずXGBoostを試すのが鉄則!


✅ ② CNN(画像データ)

画像認識コンペで必須!
事前学習済みのResNetやEfficientNetを使うと高精度!
データ拡張(Augmentation)で汎化性能を向上!

📌 ResNetを使った画像分類

import tensorflow as tf
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.models import Model

# 事前学習済みモデルのロード
base_model = ResNet50(weights="imagenet", include_top=False, input_shape=(224, 224, 3))
x = Flatten()(base_model.output)
x = Dense(256, activation="relu")(x)
x = Dense(1, activation="sigmoid")(x)

# モデルの作成
model = Model(inputs=base_model.input, outputs=x)
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])

# モデルの概要
model.summary()

画像コンペでは、CNN(特にResNet・EfficientNet)が基本!


✅ ③ Transformer(NLP)

BERTやGPTを使うと、高精度なテキスト処理が可能!
事前学習済みモデルをファインチューニングすると、少ないデータでも高性能!

📌 Hugging Face Transformers を使ったBERTの実装

from transformers import BertTokenizer, TFBertForSequenceClassification
import tensorflow as tf

# トークナイザーの準備
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

# モデルの準備
model = TFBertForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)

# コンパイル
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=2e-5), loss="sparse_categorical_crossentropy", metrics=["accuracy"])

NLPコンペでは、Transformer(BERT, GPT)が必須!


📌 3. Kaggleのコンペでのモデル選びのフロー

✅ Step 1: EDA(探索的データ分析)

データの特徴を把握し、適切な前処理を決める!
カテゴリ変数の処理・欠損値の対応・データの分布を確認!

import pandas as pd
import seaborn as sns

df = pd.read_csv("data.csv")

# データの概要
print(df.info())

# ヒストグラムでデータの分布を確認
df.hist(figsize=(10, 8))
sns.pairplot(df)

✅ Step 2: ベースラインモデルを作る

まずは単純なモデルを作り、目安となるスコアを確認!
XGBoost or LightGBM(構造化データ)、CNN(画像)、BERT(NLP)を試す!

# 必要なライブラリのインポート
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

# データの読み込み
data = load_diabetes()
X, y = data.data, data.target

# データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ランダムフォレストでモデル作成
baseline_model = RandomForestRegressor(n_estimators=100, random_state=42)
baseline_model.fit(X_train, y_train)

# 予測
y_pred = baseline_model.predict(X_test)

# RMSE の計算
print(f"Baseline RMSE: {mean_squared_error(y_test, y_pred, squared=False):.2f}")

ベースラインができたら、特徴量エンジニアリングやモデルの最適化を進める!


✅ Step 3: アンサンブル学習で精度を向上

XGBoostとLightGBMを組み合わせる!
スタッキングを活用し、複数モデルの長所を活かす!

from lightgbm import LGBMRegressor
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler

# 📚 データの読み込み
data = load_diabetes()
X, y = data.data, data.target

# ✂️ データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ⚡️ スケーリング (必須)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# ✅ LightGBM モデルの設定
lgbm_params = {
    'n_estimators': 500,
    'learning_rate': 0.05,
    'force_col_wise': True,  # ✅ 明示的に col-wise を指定
    'min_gain_to_split': 0.01,
    'max_depth': 5
}

# 🌟 LightGBM モデルの作成
lgbm_model = LGBMRegressor(**lgbm_params)

# 🔥 モデルの学習
lgbm_model.fit(X_train_scaled, y_train)

# 🎯 予測
y_pred_lgbm = lgbm_model.predict(X_test_scaled)

# 📏 RMSE を計算
print(f"LightGBM RMSE: {mean_squared_error(y_test, y_pred_lgbm, squared=False):.2f}")


lgbm_params = {
    'n_estimators': 500,
    'learning_rate': 0.05,
    'force_row_wise': True,  # ✅ col-wise がダメなら row-wise を強制
    'min_gain_to_split': 0.01,
    'max_depth': 5
}


lgbm_model = LGBMRegressor(**lgbm_params, verbose=-1)


!pip uninstall -y xgboost lightgbm
!pip install xgboost==1.6.2 lightgbm==3.3.2


lgbm_model = LGBMRegressor(**lgbm_params, verbose=-1)


from lightgbm import LGBMRegressor
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler

# 📚 データの読み込み
data = load_diabetes()
X, y = data.data, data.target

# ✂️ データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ⚡️ スケーリング (必須)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# ✅ LightGBM モデルの設定
lgbm_params = {
    'n_estimators': 500,
    'learning_rate': 0.05,
    'force_col_wise': True,  # ✅ col-wise を明示
    'min_gain_to_split': 0.01,
    'max_depth': 5
}

# 🌟 LightGBM モデルの作成
lgbm_model = LGBMRegressor(**lgbm_params, verbose=-1)  # ✅ 警告抑制

# 🔥 モデルの学習
lgbm_model.fit(X_train_scaled, y_train)

# 🎯 予測
y_pred_lgbm = lgbm_model.predict(X_test_scaled)

# 📏 RMSE を計算
print(f"LightGBM RMSE: {mean_squared_error(y_test, y_pred_lgbm, squared=False):.2f}")

アンサンブル学習を活用すると、さらに高精度なモデルが作れる!


🎯 まとめ

Kaggleのコンペでは、タスクに応じて適切なモデルを選ぶのが重要!
テーブルデータならXGBoost / LightGBM、画像ならCNN、NLPならBERT!
EDA → ベースラインモデル → モデルの最適化 → アンサンブルの流れで精度を向上!

Best regards, (^^ゞ