📚 背景知識(読んでから問題へ)
🤖
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の扱い |
|---|---|---|---|
survived | int | 生存フラグ(目的変数)0=死亡 / 1=生存 | target に指定 |
pclass | int | 客室クラス 1=1等 / 2=2等 / 3=3等 | そのまま数値特徴量 |
sex | str | 性別 male / female | 自動でOne-Hotエンコード |
age | float | 年齢(欠損あり約20%) | 欠損は中央値で自動補完 |
sibsp | int | 兄弟・配偶者の同乗人数 | 数値特徴量 |
parch | int | 親・子の同乗人数 | 数値特徴量 |
fare | float | 運賃(欠損ほぼなし) | 数値特徴量 |
embarked | str | 乗船港 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'])
seaborn.load_dataset('titanic') → drop(['alive', 'class', 'who', 'adult_male', 'alone', 'deck', 'embark_town'])
2
setup() で実験環境を初期化する
target='survived', session_id=42, fold=5
target='survived', session_id=42, fold=5
3
compare_models() で上位3モデルを確認する
n_select=3, sort='AUC'
n_select=3, sort='AUC'
4
ベストモデルで5件サンプル予測する
タスク2: AutoGluon でベースライン構築
1
TabularPredictor で time_limit=60秒学習する
label='survived', eval_metric='roc_auc'
label='survived', eval_metric='roc_auc'
2
leaderboard() で各モデルのスコアを確認する
3
feature_importance() で重要特徴量 Top5 を確認する
📊 AUC スコア — モデル比較イメージ(参考値)
Titanic での典型的な各モデルの AUC スコア(time_limit=60秒程度の場合)
WeightedEnsemble_L2 ★AG
0.88
LightGBM
0.85
XGBoost
0.84
Random Forest
0.82
ExtraTrees
0.80
Logistic Regression
0.76
🏆
AutoGluon の WeightedEnsemble_L2 は複数モデルの予測を「最適な重みで組み合わせ」たもので、通常 leaderboard のトップになります。これが AutoML の真骨頂です。
🗺️ Kaggle AutoML ワークフロー図
コンペ開始からメダル獲得までの戦略的な時間配分
💡 ヒント
ヒント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)
| 削除した列 | 理由 |
|---|---|
alive | survived と同じ情報(yes/no表記) → データリーク |
class | pclass の文字列版(重複情報) |
who | sex + age から決まる → リーク気味 |
adult_male | sex + age から決まる → リーク |
alone | sibsp + 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 が高い)
🏆 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)
📝 自己評価(解いた後に記入)
自分の回答・気づき・メモ: