モデルモニタリング基礎
田中VPoE「パイプラインの自動化ができた。しかし、デプロイして終わりではない。本番環境でモデルの性能が劣化していないか、常に監視する仕組みが必要だ。」
あなた「デプロイ直後は精度が良くても、時間が経つと落ちていくことがあるんですよね。」
田中VPoE「そうだ。ユーザーの行動パターンは日々変化する。その変化にモデルが追随できているか、リアルタイムで把握する必要がある。」
なぜモデルモニタリングが必要か
MLモデルは従来のソフトウェアとは異なり、コードに変更がなくても性能が劣化します。
性能劣化の主な原因
| 原因 | 説明 | 例 |
|---|---|---|
| データドリフト | 入力データの分布が変化 | コロナ禍で購買パターンが激変 |
| コンセプトドリフト | 入力と出力の関係が変化 | 季節により離脱要因が変動 |
| スキーマ変化 | データの構造が変化 | 上流システムの仕様変更 |
| データ品質劣化 | 欠損値・異常値の増加 | センサー故障、API仕様変更 |
モニタリングの4つのレイヤー
Layer 4: ビジネスメトリクス(売上、離脱率)
Layer 3: モデルメトリクス(AUC、F1、精度)
Layer 2: データメトリクス(分布、欠損率、統計量)
Layer 1: インフラメトリクス(レイテンシ、エラー率、CPU)
モニタリング指標の設計
Layer 1: インフラメトリクス
| 指標 | 閾値例 | ツール |
|---|---|---|
| レスポンスタイム(p50/p99) | p99 < 200ms | CloudWatch, Prometheus |
| エラー率 | < 1% | CloudWatch |
| CPU/メモリ使用率 | < 80% | CloudWatch |
| リクエスト数 | ベースライン比 | CloudWatch |
Layer 2: データメトリクス
# データ統計量のモニタリング例
import pandas as pd
import numpy as np
def compute_data_metrics(df: pd.DataFrame) -> dict:
"""入力データの統計量を計算する"""
metrics = {}
for col in df.select_dtypes(include=[np.number]).columns:
metrics[f"{col}_mean"] = df[col].mean()
metrics[f"{col}_std"] = df[col].std()
metrics[f"{col}_null_rate"] = df[col].isnull().mean()
metrics[f"{col}_min"] = df[col].min()
metrics[f"{col}_max"] = df[col].max()
return metrics
Layer 3: モデルメトリクス
| 指標 | 計算方法 | 更新頻度 |
|---|---|---|
| 予測分布 | 予測値のヒストグラム | リアルタイム |
| 信頼度スコア | 予測確率の統計量 | リアルタイム |
| 実績精度 | ラベル取得後にAUC/F1を計算 | 日次〜週次 |
| 予測バイアス | 予測値と実績値の差分 | 日次 |
Layer 4: ビジネスメトリクス
| 指標 | 説明 | 監視方法 |
|---|---|---|
| 離脱率 | 実際の離脱率の推移 | ダッシュボード |
| 介入成功率 | モデル予測に基づく施策の効果 | A/Bテスト |
| コスト効率 | 施策コスト対効果 | 週次レポート |
アラート設計
アラートの基本原則
- 段階的エスカレーション: Warning → Alert → Critical
- ノイズ抑制: 閾値の調整、連続N回で発報
- アクショナブル: アラートを受けて何をすべきか明確にする
# アラートルール定義の例
ALERT_RULES = {
"data_drift": {
"metric": "psi_score",
"warning": 0.1,
"critical": 0.25,
"consecutive_count": 3,
"action_warning": "調査開始、再学習の準備",
"action_critical": "即座に再学習を実行",
},
"model_accuracy": {
"metric": "auc_roc",
"warning": 0.82,
"critical": 0.78,
"consecutive_count": 2,
"action_warning": "精度低下の原因を調査",
"action_critical": "前バージョンへロールバック",
},
"latency": {
"metric": "p99_ms",
"warning": 150,
"critical": 200,
"consecutive_count": 5,
"action_warning": "インフラリソースの確認",
"action_critical": "スケールアウトまたはモデル軽量化",
},
}
Evidently AI によるモニタリング
from evidently import ColumnMapping
from evidently.report import Report
from evidently.metric_preset import (
DataDriftPreset,
DataQualityPreset,
ClassificationPreset,
)
def generate_monitoring_report(
reference_data: pd.DataFrame,
current_data: pd.DataFrame,
target_col: str = "churn"
) -> Report:
"""モニタリングレポートを生成する"""
column_mapping = ColumnMapping(
target=target_col,
prediction="prediction",
numerical_features=["age", "tenure_days", "order_count_30d"],
categorical_features=["region", "membership"],
)
report = Report(metrics=[
DataDriftPreset(),
DataQualityPreset(),
ClassificationPreset(),
])
report.run(
reference_data=reference_data,
current_data=current_data,
column_mapping=column_mapping,
)
report.save_html("monitoring_report.html")
return report
まとめ
| 項目 | ポイント |
|---|---|
| 劣化原因 | データドリフト・コンセプトドリフト・スキーマ変化・データ品質 |
| 4つのレイヤー | インフラ → データ → モデル → ビジネスの多層監視 |
| アラート設計 | 段階的エスカレーション、ノイズ抑制、アクション明確化 |
| ツール | Evidently AI でドリフト検知・品質チェックを自動化 |
チェックリスト
- モデル性能が劣化する4つの原因を説明できる
- モニタリングの4つのレイヤーと各レイヤーの指標を説明できる
- アラート設計の基本原則を理解している
- Evidently AIの基本的な使い方を理解している
次のステップへ
モニタリングの基礎を学びました。次はデータドリフト検出の具体的な手法を深掘りしましょう。
推定読了時間:30分