AIモデルは作った後に劣化する:モデルドリフトの原因と、監視指標・再学習条件の決め方(原材料変更で品質予測の精度が下がったケースで解説)

産業インサイト・課題解決//

モデルドリフトとは、運用中に入力データの傾向や、入力と結果の関係が学習時から変化することで、機械学習モデルの予測精度や判断への信頼性が低下する現象です。導入時に良好だったAIモデルでも、原材料、設備、工程、センサー、顧客行動といったモデルの外側の条件が変われば、学習時の前提からずれていきます。

本記事では、原材料変更後に品質予測の精度が下がった疑似ケースを使い、データドリフトとコンセプトドリフトの違い、監視指標、しきい値と再学習条件の決め方、新旧モデルの比較と切り替え手順を整理します。なお、ケースは「よくある状況をもとにした疑似ケース」であり、特定の企業・業種・製品の実案件ではありません。記事中の数値とコードの出力例もすべて疑似データです。

  • 精度低下は「例外的なトラブル」ではなく、運用中に起こり得る前提の事象として扱う
  • 原因は、データ品質、データドリフト、コンセプトドリフトの順に切り分ける
  • 監視指標、しきい値、判断者、対応手順は、問題が起きる前に決めておく
  • 再学習は万能ではなく、暫定運用や再設計が適切な場合もある

モデルドリフトとは何か

精度低下は運用中に起こる前提の事象

機械学習モデルは、過去のデータに現れたパターンを学習します。その前提には、学習時の入力の傾向や、入力と結果の関係が、将来も大きくは変わらないという仮定があります。ところが現場では、この仮定が崩れる場面が少なくありません。原材料の調達先変更、設備の更新や改造、工程条件の見直し、センサーの交換、前処理ロジックの変更、季節要因などが典型です。

機械学習を組み込んだシステムでは、モデルそのものよりも、運用・保守を含む周辺の仕組みが継続的な負担になり得ると指摘されています(Sculley et al., 2015)。したがって「精度が落ちたのはモデルの出来が悪かったから」と捉えるのではなく、「落ちることを前提に、気づく仕組みと対応手順を最初から設計する」ことが実務の出発点になります。

データドリフトとコンセプトドリフトの違い

モデルドリフトは、大きく2つに分けて整理されます。データドリフトは、モデルに入力するデータ(特徴量)の分布が、学習時と異なってくる現象です。コンセプトドリフトは、入力と予測対象(ラベル、ここでは品質の検査結果)の関係そのものが変化する現象です。コンセプトドリフトは、データストリーム学習の分野で長く研究されてきた概念です(Gama et al., 2014; Lu et al., 2019)。

概念図

データドリフトとコンセプトドリフトの違い

データドリフト

入力データの分布が変わる

変化入力データ
 入力と結果の関係
 結果(品質)
品質予測の例
原材料の水分率の平均が上がり、ばらつきも広がる
検知の方法
入力分布の比較。正解データ(検査結果)を待たずに確認できる
精度への影響
学習範囲から外れるほど悪化しやすいが、影響が小さい場合もある

コンセプトドリフト

入力と結果の関係が変わる

 入力データ
変化入力と結果の関係
 結果(品質)
品質予測の例
同じ水分率でも、品質への効き方が以前と異なる
検知の方法
予測と実測の比較が基本。正解データの到着が必要
精度への影響
入力分布が変わらなくても精度が悪化し得る

両者は同時に起こることもあります。入力分布が変わったことだけで、精度低下が確定するわけではありません。

この違いが実務で重要なのは、見るべきデータと対応が異なるためです。データドリフトは入力データだけで先行して気づける一方、コンセプトドリフトは正解データとの比較が必要で、再学習だけでは対応しきれず、特徴量の見直しなど再設計が必要になる場合もあります。「ドリフトを検知したら必ず精度が落ちている」わけではないため、入力分布の変化は精度の確認とセットで解釈します。

疑似ケース:原材料変更後に品質予測がずれた

ここからは、よくある状況をもとにした疑似ケースで、原因切り分けから切り替えまでの流れを追います。業種、企業名、製品名は特定しません。

発生した状況

ある製造工程で、原材料特性(水分率、粒度)と工程条件(温度、処理時間)から、製品の品質指標を予測するモデルを運用していました。原材料の調達先(ロット)が変わった後、予測と検査結果のずれが徐々に拡大し、現場から「予測が当たらない」という指摘が出ました。

原因の切り分け

切り分けは、疑う順序が重要です。モデルの構造を疑う前に、まず入力側の事実を確認します。

  1. データ品質の確認:欠損、センサー異常、単位や前処理の変更がないかを確認します。ここに問題があれば、ドリフトではなくデータ不具合の修正が先です。
  2. 入力分布の比較:学習期間と直近期間で特徴量の分布を比べます。このケースでは水分率の平均とばらつきが変化しており、データドリフトが確認されました。
  3. 入力と結果の関係の確認:直近の実測データで、水分率と品質の関係を調べます。このケースでは関係自体が変わっており、コンセプトドリフトも生じていました。

実施した対応

  1. データ品質(欠損、センサー異常、前処理)を確認し、不具合がないことを確かめる
  2. 変化後のデータが少ない期間は、予測結果を参考値として扱い、人の判断を厚くする暫定運用に切り替える
  3. 変化後のデータが一定量たまってから再学習する
  4. 新旧モデルを同一の評価データで比較し、承認を経て切り替える

このケースからの学び

  • 原材料、設備、工程の変更を業務イベントとして記録し、再学習を検討するトリガーに含める
  • 監視指標、しきい値、判断者を、問題が起きる前に決めておく

何を監視するか:監視指標の整理

監視(モデルモニタリング)の対象は、予測性能だけではありません。正解データの到着が遅い現場では、予測性能だけを見ていると気づくのが遅れるためです。そこで、次の4種類に分けて考えると整理しやすくなります。

監視対象指標の例わかること正解ラベル注意点
予測性能平均絶対誤差(MAE)、誤差の移動平均、大きな外れの発生頻度実際にどれだけ外れているか必要正解の到着遅れ。件数が少ないと不安定。平均だけでなく大きな外れも見る
入力分布PSI、平均・標準偏差・分位点の比較、学習範囲外の割合入力が学習時と異なってきているか不要変化が精度低下を意味するとは限らない。窓幅やビン数で値が変わる
予測値分布予測値の平均・分布の推移出力の傾向が変わっていないか不要実際の品質変化と、モデルのずれを区別できない
データ品質欠損率、異常値率、センサーの固着、単位・前処理の不整合入力データそのものの不具合不要ドリフトと誤認しやすい。原因切り分けの最初に確認する

PSI(Population Stability Index、母集団安定性指標)は、学習時と直近の分布の差を、区間ごとの構成比から1つの数値にまとめる指標です。ラベルが不要で計算が軽いため、入力分布の監視でよく使われます。

正解データが遅れる場合の考え方

品質検査の結果が製造から遅れて得られるなど、正解データが遅れる場合は、指標を二段構えにします。入力分布、予測値分布、データ品質は先行指標として日次などで監視し、変化の兆候を早めに捉えます。予測性能は遅行指標として、正解が届いた時点でさかのぼって評価します。さらに、一部のロットを優先的に早く検査する、業務イベントを登録しておく、といった運用上の工夫も、検知の遅れを補います。

しきい値と再学習条件の決め方

しきい値は「目安」から始めて自社データで調整する

PSIでは、0.1未満を変化が小さい、0.1以上0.25未満を中程度、0.25以上を大きいと見なす目安が広く使われています。ただし、これは出発点であり、唯一の正解ではありません。サンプル数、窓の長さ、ビンの数、対象の特徴量によって値は変わります。調整は次の流れで進めると、根拠を説明しやすくなります。

  1. 運用が安定していた過去期間で、指標が普段どの程度ゆらぐかを確認する(誤報の目安をつかむ)
  2. 過去に原材料や設備の変更があれば、その前後で指標がどう動いたかを確認する(見逃しの確認)
  3. 業務として許容できる予測誤差を、現場と合意する。これは統計ではなく業務側の判断です
  4. 「注意」と「要対応」の2段階に分け、段階ごとに通知先と対応を変える
  5. 運用を始めたあとも、誤報や見逃しの状況を見て定期的に見直す

定期再学習とトリガー型再学習の比較

観点定期再学習トリガー型再学習
開始条件月次・四半期など、あらかじめ決めた周期誤差の超過、入力分布の変化、業務イベントなどの条件成立
長所運用が単純で、計画に組み込みやすい必要なときに対応でき、不要な更新を減らせる
注意点周期の間に急な変化が起きると遅れる。変化がなくても作業が発生する監視指標としきい値の設計が前提。誤報・見逃しの調整が必要
向く状況変化が緩やかで、データが安定的に得られる原材料や設備の変更など、突発的な変化が起こり得る
必要な準備再学習と評価の手順、担当者監視の仕組み、通知先、判断者、イベント記録の運用

「定期的に再学習すれば解決する」とは限りません。変化後のデータが少ない時期に再学習すると、かえって不安定になることもあります。実務では、定期的な点検を土台にしつつ、トリガー条件も併用する形が現実的です。

再学習条件に入れたい項目

  • 誤差の移動平均が、学習時の誤差水準に対して設定した倍率を超え、その状態が一定期間続いている
  • 主要な特徴量のPSIが、「要対応」の水準を超えている
  • 原材料、設備、工程、センサー、前処理の変更が、業務イベントとして登録されている
  • データ品質に問題がないことが確認されている(これは再学習の前提条件)
  • 再学習に使える変化後のデータが、あらかじめ決めた量以上たまっている

Pythonで試す簡易検知

ここからは、考え方を確認するための簡易コードです。numpyとpandasのみを使い、疑似データを生成します。概念理解用の簡易実装であり、本番の監視基盤に必要な欠損処理、ログ管理、権限管理、通知連携などは含みません。

1. 疑似データの生成

日次180日分のデータを作ります。120日目に原材料が変わり、水分率の平均が上がってばらつきが広がります。同時に、水分率と品質の関係(傾き)も変わります。最初の90日で学習し、その後を運用期間とします。

import numpy as np
import pandas as pd

rng = np.random.default_rng(42)  # 再現性のための乱数シード
N_DAYS, CHANGE_DAY, TRAIN_END = 180, 120, 90

def make_sample_data():
    day = np.arange(N_DAYS)
    after = day >= CHANGE_DAY
    # データドリフト:変更後は水分率の平均が上がり、ばらつきも広がる
    moisture = np.where(after, rng.normal(14.0, 1.8, N_DAYS), rng.normal(12.0, 1.0, N_DAYS))
    particle = rng.normal(50.0, 5.0, N_DAYS)
    temp = rng.normal(180.0, 3.0, N_DAYS)
    minutes = rng.normal(30.0, 2.0, N_DAYS)
    # コンセプトドリフト:水分率と品質の関係(傾き)が変わる
    slope = np.where(after, 1.8, 3.0)
    quality = (50 + slope * (moisture - 12.0) + 0.05 * (particle - 50.0)
               + 0.10 * (temp - 180.0) + 0.20 * (minutes - 30.0)
               + rng.normal(0, 1.5, N_DAYS))
    return pd.DataFrame({"day": day, "moisture": moisture, "particle": particle,
                         "temp": temp, "minutes": minutes, "quality": quality})

df = make_sample_data()
FEATURES = ["moisture", "particle", "temp", "minutes"]

# 学習期間のデータで単純な線形モデルを当てはめる(手法の種類は本質ではない)
train = df[df["day"] < TRAIN_END]
X_train = np.column_stack([np.ones(len(train)), train[FEATURES].to_numpy()])
coef, *_ = np.linalg.lstsq(X_train, train["quality"].to_numpy(), rcond=None)
X_all = np.column_stack([np.ones(len(df)), df[FEATURES].to_numpy()])
df["pred"] = X_all @ coef
# 実際の現場では、検査結果(quality)が遅れて届く点に注意
df["abs_err"] = (df["quality"] - df["pred"]).abs()
Python

2. PSIの計算関数

学習期間の分位点でビン(区間)を作り、直近期間の構成比との差を計算します。数値が大きいほど分布の違いが大きいことを示します。

def calc_psi(expected, actual, bins=5):
    """PSI(母集団安定性指標)の簡易計算。
    学習期間(expected)の分位点でビンを作り、直近期間(actual)の構成比と比べる。"""
    expected = np.asarray(expected, dtype=float)
    actual = np.asarray(actual, dtype=float)
    edges = np.quantile(expected, np.linspace(0, 1, bins + 1))
    edges[0], edges[-1] = -np.inf, np.inf  # 範囲外の値も両端のビンに含める
    e_ratio = np.histogram(expected, bins=edges)[0] / len(expected)
    a_ratio = np.histogram(actual, bins=edges)[0] / len(actual)
    eps = 1e-6  # 構成比が0の場合のlog計算エラーを避ける
    e_ratio = np.clip(e_ratio, eps, None)
    a_ratio = np.clip(a_ratio, eps, None)
    return float(np.sum((a_ratio - e_ratio) * np.log(a_ratio / e_ratio)))
Python

3. 予測誤差の移動平均とアラート

MAE_WINDOW = 14   # 移動平均の窓幅(日)
MAE_FACTOR = 1.5  # 学習時の誤差水準の何倍で通知するか(自社データで調整が必要)

base_mae = df.loc[df["day"] < TRAIN_END, "abs_err"].mean()
df["mae_ma"] = df["abs_err"].rolling(MAE_WINDOW).mean()
df["mae_alert"] = df["mae_ma"] > base_mae * MAE_FACTOR

first_alert = df.loc[df["mae_alert"], "day"].min()
print("学習時MAE:", round(base_mae, 2), "/ 最初の誤差アラート日:", first_alert)
Python

4. 再学習検討フラグの簡易ルール

「PSIが目安を超過」「誤差が基準を超過」「業務イベントの登録あり」のいずれかが成り立てば、再学習を検討するフラグを立てます。フラグは再学習の実行指示ではなく、原因切り分けを始める合図です。

# 広く使われる目安(例:PSI 0.1/0.25)。自社データで調整が必要
PSI_WARN, PSI_ALERT = 0.1, 0.25
RECENT_DAYS = 30

events = pd.DataFrame({"day": [CHANGE_DAY], "memo": ["原材料の調達先(ロット)変更"]})

def review_flag(today):
    recent = df[df["day"].between(today - RECENT_DAYS + 1, today)]
    psi = calc_psi(train["moisture"], recent["moisture"], bins=5)
    mae_ma = df.loc[df["day"] == today, "mae_ma"].iloc[0]
    event_hit = events["day"].between(today - RECENT_DAYS + 1, today).any()

    reasons = []
    if psi >= PSI_ALERT:
        reasons.append(f"水分率のPSIが目安を超過({psi:.2f})")
    elif psi >= PSI_WARN:
        reasons.append(f"水分率のPSIが注意水準({psi:.2f})")
    if mae_ma > base_mae * MAE_FACTOR:
        reasons.append(f"誤差の移動平均が基準を超過({mae_ma:.2f})")
    if event_hit:
        reasons.append("業務イベントが登録されている")
    return reasons  # 空でなければ「再学習検討フラグ」

for today in [100, 119, 125, 179]:
    reasons = review_flag(today)
    print(today, "検討フラグあり" if reasons else "異常なし", reasons)
Python

結果の見方(疑似データの結果例)

下表は、疑似データで見られる傾向を示した結果例です。実行時の乱数やパラメータで値は変わるため、数値そのものではなく、変更後に誤差とPSIが同時に大きくなるという関係に注目してください。

期間MAE水分率のPSI
学習期間約1.2-
変更前の運用期間約1.30.03程度
変更後の運用期間約2.80.3程度

注意点として、直近30日のように短い窓でPSIを計算すると、変化がなくてもサンプル数の少なさだけで値が大きめに出ることがあります。上のコードでビン数を5に抑えているのはそのためです。窓幅とビン数は、過去の安定期間で誤報の出方を確認してから決めます。

新旧モデルの比較と切り替え手順

アラートが出てから切り替えまでの流れを、判断の順序として整理します。再学習はあくまで選択肢の一つで、原因によっては暫定運用や再設計が適切です。

判断フロー

再学習判断フロー:アラートから切り替えまで

  1. 監視アラートの受領

    誤差、入力分布、業務イベントのいずれかが基準に達した旨が、事前に決めた通知先へ届く

  2. 切り分け原因の切り分け

    データ品質、データドリフト、コンセプトドリフト、業務イベントの順に確認する

  3. 方針対応方針の選択
    暫定運用変化後のデータが少ない。予測を参考値とし、人の判断を厚くする
    再学習変化後のデータが十分で、特徴量の設計は妥当と考えられる
    再設計関係が大きく変わった。特徴量や前提条件から見直す
  4. 評価新旧モデルの比較

    同一の評価データで、新旧モデルを業務上の基準で比べる。平均だけでなく大きな外れも確認する

  5. 承認判断者による承認

    監視や評価の自動化とは分け、本番への切り替えは人が承認する

  6. 切り替え切り替えと経過観察

    旧モデルへ戻せる状態を保ち、切り替え後の誤差を継続して確認し、記録を残す

どの方針でも、判断の根拠と結果は記録として残し、次回のしきい値見直しに活用します。

新旧モデルを公平に比べるための原則

  • 同一の評価データで比べる:新旧で異なるデータを使うと、改善したかどうか判断できません。
  • 変化後の期間を評価に含める:時間順に分割し、未来の情報が学習に漏れないようにします。
  • 業務の基準で評価する:平均誤差だけでなく、許容範囲を超える外れの頻度や、変更前後のロット別の結果も確認します。
  • 差が小さければ切り替えない選択肢もある:切り替えには検証と周知のコストがかかります。

自動化と人の承認を分ける

運用の自動化は、「監視・通知の自動化」と「本番モデルの切り替え」に分けて考えると整理しやすくなります。指標の計算、アラート通知、評価レポートの作成は自動化の効果が大きい領域です。一方、本番での切り替えは、業務への影響を踏まえて人が承認する形にしておくと、説明責任を果たしやすくなります。どこまで自動化するかは、予測が外れたときの影響の大きさに応じて決めます。

運用ルール定義シートの例

監視と対応を属人化させないために、「何を、いつ、どの水準で、誰に通知し、誰が判断し、何をするか」を1枚にまとめておきます。以下は項目の例であり、しきい値は初期値の仮置きです。自社のデータと業務に合わせた調整が必要です。

監視項目頻度しきい値(例)通知先判断者対応手順
誤差の移動平均正解到着のたび学習時の水準の一定倍(要調整)運用担当モデル責任者原因切り分けを開始し、結果を記録する
主要特徴量のPSI日次または週次注意0.1程度、要対応0.25程度(要調整)運用担当モデル責任者データ品質を確認し、誤差の推移と照合する
欠損率・異常値率日次通常範囲からの逸脱データ管理者データ管理者センサーや前処理の不具合を確認し、修正する
予測値分布週次通常範囲からの逸脱運用担当モデル責任者入力分布と合わせて確認する
業務イベント登録登録時登録があれば検討開始運用担当・現場責任者モデル責任者参考値扱いの要否を決め、データ蓄積方針を定める

自社で着手できる5つのアクション

  1. 稼働中モデルの棚卸し:用途、入力データ、予測対象、正解データの到着タイミング、担当者を一覧にします。
  2. 業務イベントの記録を始める:原材料、設備、工程、センサー、前処理の変更を、日付つきで記録する運用を決めます。
  3. 監視指標を3〜4個に絞る:予測性能、入力分布、データ品質から、まず少数を選びます。
  4. 初期しきい値と判断者を仮置きする:運用ルール定義シートを作り、通知先と承認者を明確にします。
  5. 過去データで試す:誤報や見逃しがどの程度出るかを確認し、しきい値を見直します。

よくある質問

Q1. 再学習の頻度はどのくらいが適切ですか。

一律の正解はありません。対象の変化の速さ、正解データの到着の早さ、再学習と検証にかかるコスト、予測が外れたときの影響によって異なります。定期的な点検の周期を決めたうえで、誤差の超過や業務イベントをトリガーに加える形が、多くの現場で検討しやすい進め方です。

Q2. PSIのしきい値は0.1と0.25でよいですか。

広く使われる目安ですが、そのまま適用できるとは限りません。サンプル数、窓幅、ビン数、特徴量の性質で値が変わるため、安定していた過去期間で誤報の出方を確認し、自社データに合わせて調整します。PSIの大きさだけで再学習の要否を決めず、誤差の推移と合わせて判断します。

Q3. 正解データが遅れて届く場合、どう監視すればよいですか。

入力分布、予測値分布、データ品質を先行指標として監視し、正解が届いた時点で予測性能をさかのぼって評価します。あわせて、業務イベントを記録しておくと、正解が届く前でも「参考値扱いにするか」を判断しやすくなります。

Q4. 再学習は完全に自動化してよいですか。

指標の計算、通知、再学習ジョブの実行、評価レポートの作成は自動化しやすい領域です。一方で、本番モデルの切り替えまで自動にするかは、予測が外れた場合の影響の大きさ、評価基準の明確さ、説明責任の要件によります。多くの場合、切り替えの承認には人を残す構成が検討しやすいでしょう。

まとめ:意思決定に使い続けられる状態を保つ

モデルドリフトは、運用中に起こり得る前提の事象です。データドリフトとコンセプトドリフトを区別し、データ品質、入力分布、関係の変化の順に切り分けること。監視指標としきい値、判断者、対応手順を事前に決めておくこと。再学習、暫定運用、再設計を状況に応じて使い分け、新旧モデルを同一条件で比較して承認を経て切り替えること。こうした運用設計が、モデルを意思決定に使い続けるための土台になります。

AIモデルは、作って終わりではなく、意思決定に使い続けられる状態を保つことで価値を発揮します。

モデル運用の状況に合わせてご相談ください

SCI総合研究所では、モデルの運用状況の確認、監視指標・再学習条件の設計、業務の判断プロセスへの組み込みまで、状況に合わせた支援が可能です。しきい値の妥当性、再学習か再設計かの判断、業務への組み込みなど、個別の判断が必要な点はお気軽にご相談ください。

時系列データ解析や予測モデルの評価に関する関連記事は、技術ブログSCI-Naviでも公開しています。

参考文献

  • Gama et al. 2014. A survey on concept drift adaptation. ACM Computing Surveys. Vol. 46. Issue 4. Article 44. https://doi.org/10.1145/2523813
  • Lu et al. 2019. Learning under Concept Drift: A Review. IEEE Transactions on Knowledge and Data Engineering. Vol. 31. Issue 12. pp. 2346-2363. https://doi.org/10.1109/TKDE.2018.2876857
  • Sculley et al. 2015. Hidden Technical Debt in Machine Learning Systems. Advances in Neural Information Processing Systems. Vol. 28. pp. 2503-2511. https://papers.nips.cc/paper/2015/hash/86df7dcfd896fcaf2674f757a2463eba-Abstract.html