Day 086 — AutoML活用 — AutoGluon・PyCaretで素早くベースライン構築

2026-07-06 水 / Phase 3 コーディング AutoGluon / PyCaret / ベースライン / AUC / スタッキングアンサンブル

📚 背景知識(読んでから問題へ)

🤖
Day 085 で House Prices の特徴量工学を学びました。今日はAutoMLを活用し、コード数行で競合モデルを構築する方法を習得します。Kaggle初参加の最速ベースライン戦略として必須のスキルです。

AutoMLとは何か?

AutoML(Automated Machine Learning)は「機械学習パイプライン全体を自動化するツール」です。本来20〜50行かかる作業をほぼゼロにします。

手動でやることAutoMLが自動化
欠損値補完・エンコーディング✅ 自動(中央値・One-Hot 等)
複数モデルの比較(RF・XGB・LGB…)✅ 自動(15〜20種類を並列比較)
ハイパーパラメータ探索✅ 自動(ベイズ最適化等)
スタッキングアンサンブル✅ 自動(AutoGluon が特に強い)
ドメイン知識による特徴量工学❌ 人間が必要
コンペ特有の評価指標への最適化△ 設定次第
生データ
AutoML(前処理自動)
モデル自動比較
アンサンブル自動生成
予測 / LBスコア
💡
Kaggle流の使い方: コンペ開始後まず AutoML で ベースライン を提出 → Public LBに上がる → そこから EDA + 特徴量工学でカスタム改善を積む。「AutoMLを超えること」が Expert 以上の証明になります。

🗂️ データスキーマ — Titanic(AutoML に投入するカラム)

seaborn の titanic データセット。リーク列を削除した後のカラム構成。

カラム名 説明 AutoMLの扱い
survivedint生存フラグ(目的変数)0=死亡 / 1=生存target に指定
pclassint客室クラス 1=1等 / 2=2等 / 3=3等そのまま数値特徴量
sexstr性別 male / female自動でOne-Hotエンコード
agefloat年齢(欠損あり約20%)欠損は中央値で自動補完
sibspint兄弟・配偶者の同乗人数数値特徴量
parchint親・子の同乗人数数値特徴量
farefloat運賃(欠損ほぼなし)数値特徴量
embarkedstr乗船港 C/Q/S自動でOne-Hotエンコード
削除するリーク列alive / class / who / adult_male / alone / deck / embark_town

⚖️ PyCaret vs AutoGluon — 比較表

観点 PyCaret AutoGluon
得意な用途モデル比較・可視化・プロトタイプ精度重視・コンペ提出ベースライン
アンサンブル△ 手動設定が必要✅ 自動スタッキング(WeightedEnsemble_L2)
セットアップsetup() → compare_models() の2ステップTabularPredictor().fit() の1ステップ
モデル比較の視認性✅ 美しい表形式で出力leaderboard() で確認
時間制御折数・モデル数で制御time_limit (秒) で直感的に制御
特徴量重要度plot_model('feature') で可視化feature_importance() で数値出力
Kaggle精度Silver圏 目安Gold圏も狙えるスコアが出ることがある
おすすめシーン「どのモデルが良いか知りたい」探索時「とにかくスコアを出したい」提出時

🎯 問題

⚠️
AutoGluon と PyCaret は pip install が必要です。Google Colab での実行を推奨します(!pip install pycaret autogluon.tabular -q)。

タスク1: PyCaret でモデル比較

1
Titanic データを読み込み、リーク列を削除する
seaborn.load_dataset('titanic') → drop(['alive', 'class', 'who', 'adult_male', 'alone', 'deck', 'embark_town'])
2
setup() で実験環境を初期化する
target='survived', session_id=42, fold=5
3
compare_models() で上位3モデルを確認する
n_select=3, sort='AUC'
4
ベストモデルで5件サンプル予測する

タスク2: AutoGluon でベースライン構築

1
TabularPredictor で time_limit=60秒学習する
label='survived', eval_metric='roc_auc'
2
leaderboard() で各モデルのスコアを確認する
3
feature_importance() で重要特徴量 Top5 を確認する

📊 AUC スコア — モデル比較イメージ(参考値)

Titanic での典型的な各モデルの AUC スコア(time_limit=60秒程度の場合)

WeightedEnsemble_L2 ★AG
AUC ≈ 0.88
0.88
LightGBM
AUC ≈ 0.85
0.85
XGBoost
AUC ≈ 0.84
0.84
Random Forest
AUC ≈ 0.82
0.82
ExtraTrees
AUC ≈ 0.80
0.80
Logistic Regression
AUC ≈ 0.76
0.76
🏆
AutoGluon の WeightedEnsemble_L2 は複数モデルの予測を「最適な重みで組み合わせ」たもので、通常 leaderboard のトップになります。これが AutoML の真骨頂です。

🗺️ Kaggle AutoML ワークフロー図

コンペ開始からメダル獲得までの戦略的な時間配分

Day1 AutoML ベースライン提出 time_limit=60s LBスコア確認 Day2-3 EDA + 特徴量工学 ドメイン知識を活かす AutoMLが自動化 できない領域 Week2 カスタム LightGBM Optuna チューニング AutoMLを超えること = Expert の証明 最終週 AutoML + カスタム ブレンド / アンサンブル best_quality で再学習 メダル獲得を狙う

💡 ヒント

ヒント1 方向性

PyCaret は pycaret.classification をインポートします。AutoGluon は autogluon.tabular を使います。どちらも pip install が必要(Colab 推奨)。

ヒント2 アプローチ
  • PyCaret: setup(data=df, target='survived', session_id=42)compare_models(n_select=3)
  • AutoGluon: TabularPredictor(label='survived').fit(train_data, time_limit=60)
  • Titanic は sns.load_dataset('titanic') で取得できる
ヒント3 コード骨格
# PyCaret
import seaborn as sns
from pycaret.classification import setup, compare_models, finalize_model, predict_model

df = sns.load_dataset('titanic')
df = df.drop(['deck', 'embark_town', 'alive', 'class', 'who', 'adult_male', 'alone'], axis=1)
df = df.dropna(subset=['survived'])

setup(data=df, target='survived', session_id=42, verbose=False)
top3 = compare_models(n_select=3)
best = finalize_model(top3[0])

# AutoGluon
from autogluon.tabular import TabularPredictor

predictor = TabularPredictor(label='survived').fit(df, time_limit=60)
print(predictor.leaderboard())
print(predictor.feature_importance(df))

模範解答

# ===== インストール(Colabでは実行が必要) =====
# !pip install pycaret autogluon.tabular -q

import warnings
warnings.filterwarnings('ignore')

import seaborn as sns
import pandas as pd

# ── データ読み込み ────────────────────────────────────────────────
df = sns.load_dataset('titanic')
print("Shape:", df.shape)

# リーク列・重複列を削除
drop_cols = ['deck', 'embark_town', 'alive', 'class', 'who', 'adult_male', 'alone']
df_clean = df.drop(columns=drop_cols)
df_clean = df_clean.dropna(subset=['survived'])
df_clean['survived'] = df_clean['survived'].astype(int)

print("\nクリーニング後 Shape:", df_clean.shape)


# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# タスク1: PyCaret でモデル比較
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
from pycaret.classification import (
    setup, compare_models, finalize_model,
    predict_model, pull
)

# 実験環境セットアップ
setup(
    data=df_clean,
    target='survived',
    session_id=42,
    fold=5,
    verbose=False
)

# 全モデル比較(上位3を取得)
print("\n=== PyCaret: モデル比較中(数分かかります)===")
top3_models = compare_models(n_select=3, sort='AUC', verbose=True)

# 結果テーブル取得
results_df = pull()
print("\n=== 上位3モデル ===")
print(results_df.head(3)[['Model', 'Accuracy', 'AUC', 'Recall', 'Prec.', 'F1']])

# ベストモデルをファイナライズ(全データで再学習)
best_model = finalize_model(top3_models[0])
print("\nベストモデル:", type(best_model).__name__)

# サンプル5件で予測
sample = df_clean.head(5).drop(columns=['survived'])
predictions = predict_model(best_model, data=sample)
print("\n予測サンプル:")
print(predictions[['sex', 'age', 'pclass', 'prediction_label', 'prediction_score']])


# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# タスク2: AutoGluon でベースライン構築
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
from autogluon.tabular import TabularPredictor
from sklearn.model_selection import train_test_split

# 学習/検証分割
train_df, val_df = train_test_split(
    df_clean, test_size=0.2, random_state=42,
    stratify=df_clean['survived']
)

print("\n=== AutoGluon: 学習開始(60秒制限)===")
predictor = TabularPredictor(
    label='survived',
    eval_metric='roc_auc',
    path='./autogluon_titanic',
).fit(
    train_data=train_df,
    time_limit=60,
    presets='medium_quality'
)

# リーダーボード確認
print("\n=== AutoGluon: リーダーボード ===")
lb = predictor.leaderboard(val_df, silent=True)
print(lb[['model', 'score_val', 'pred_time_val', 'fit_time']].head(8).to_string())

# 特徴量重要度 Top5
print("\n=== 特徴量重要度 Top5 ===")
fi = predictor.feature_importance(val_df)
print(fi.head(5))

# バリデーションスコア確認
val_score = predictor.evaluate(val_df)
print(f"\nValidation AUC: {val_score:.4f}")

🪜 Step-by-Step 解説

1データ準備とリーク列の除去

drop_cols = ['deck', 'embark_town', 'alive', 'class', 'who', 'adult_male', 'alone']
df_clean = df.drop(columns=drop_cols)
削除した列理由
alivesurvived と同じ情報(yes/no表記) → データリーク
classpclass の文字列版(重複情報)
whosex + age から決まる → リーク気味
adult_malesex + age から決まる → リーク
alonesibsp + parch から計算できる
deck欠損77%で情報量が乏しい
🔴
リークとは: テスト時には本来知れないはずの情報をモデルに与えること。Public LBが異常に高いのに Private LBで大崩れする原因の多くがリークです。

2PyCaret の setup() が裏でやること

setup(data=df_clean, target='survived', session_id=42, fold=5, verbose=False)

setup() が自動で実行する処理:

欠損値補完(数値 → 中央値、カテゴリ → 最頻値)
カテゴリ変数のエンコーディング(One-Hot)
K-Fold CV の設定(fold=5)
トレイン / バリデーション分割(デフォルト 70/30)

これが 1行のコードで済むのが AutoML の強み。手動なら 20 行以上になります。

3compare_models() の仕組み

top3_models = compare_models(n_select=3, sort='AUC')

内部で以下を自動実行します:

  • 15〜20種類のモデルを候補に
  • 各モデルで 5-Fold CV を実行
  • AUC・Accuracy・F1 などを計算
  • sort='AUC' で AUC 降順にソート

4AutoGluon の presets とスコアの関係

presets特徴目安時間Kaggle用途
medium_qualityベースライン構築向け1〜5分探索・最初の提出
good_qualityバランス型5〜30分中間スコア確認
high_qualityコンペ用途30分〜本番学習
best_quality精度最優先(スタッキング)数時間最終提出

5leaderboard() でスタッキングアンサンブルを確認

lb = predictor.leaderboard(val_df, silent=True)
print(lb[['model', 'score_val', 'pred_time_val', 'fit_time']])

score_val が検証データでの AUC スコア。通常 WeightedEnsemble_L2 がトップになります。これは各モデルの予測確率を「最適な重みで加重平均」したものです。

🧮 AUC の直感的理解(文系向け)

📐
AUC(Area Under the ROC Curve)の直感的な意味:
「ランダムに選んだ生存者と死亡者のペアで、モデルが正しく生存者に高いスコアを付ける確率」です。
AUC の値意味Kaggle での感覚
0.5コインフリップと同じ(役に立たない)ベースライン以下
0.7まあまあ中級者レベル
0.85良いSilver メダル圏
0.9+非常に良いGold メダル圏
1.0完璧(現実にはほぼあり得ない)

なぜ Accuracy より AUC が良いか? → Titanic は 生存者:死亡者 = 38%:62% の不均衡データです。「全員死亡」と予測するだけで Accuracy 62% になってしまいます。AUC はこの不均衡の影響を受けにくい指標です。

ROC 曲線のイメージ(曲線が左上に近いほど AUC が高い)

偽陽性率 (FPR) 真陽性率 (TPR) AUC=0.5(ランダム) AutoGluon AUC≈0.88 0 1 0 1

🏆 Kaggleでの実践的な使い方

AutoMLで銅メダルまで取れる?

多くのコンペで AutoGluon(best_quality)は銅メダル圏に達することがあります。ただし:

コンペ別 AutoML の有効性
コンペタイプAutoML の効果理由
Getting Started(Titanic等)✅ 高い(Bronze〜Silver)特徴量が整備されている
Tabular Playground Series✅ 高い(Bronze〜Silver)ドメイン知識不要が多い
本格的なタブラーコンペ△ 中程度(Bronze程度)特徴量工学で差がつく
NLP・画像コンペ❌ 低い専用アーキテクチャが必要
💡
Gold への道: AutoML のスコアを「基準線」として、EDA → 特徴量工学 → カスタムモデルで少しずつ超えていく。「今日の変更で AutoML より 0.005 改善できた」という積み上げが Expert・Master への道です。

⚠️ よくある誤解・ミス

誤解・ミスなぜ起こるか正しい理解
AutoMLのスコアがそのままKaggle LBスコアになる ローカルCVとKaggle LBの分布差を無視 LBとCVのギャップを常に記録する
time_limitを長くすれば必ず精度が上がる 過学習の可能性を忘れる 長くするほど検証スコアを慎重に見る
AutoMLを使えば特徴量工学不要 AutoMLは生データを最適化するだけ ドメイン知識による特徴量は手動でないと作れない
PyCaretの結果テーブルは外部データで使える setup()の前処理はトレインデータ基準 テストデータはpredict_model()に渡すべき
AutoGluonのアンサンブルは常に最強 計算時間が短い場合は過学習しやすい time_limitを増やすほど安定する

🚀 次のステップ

  • 発展: AutoGluon の best_quality + カスタム特徴量で House Prices に挑戦し、手動 LightGBM のスコアと比較する
  • 次回予告: Kaggle API — データダウンロード・提出の自動化(Day 087)

📝 自己評価(解いた後に記入)

自分の回答・気づき・メモ: