Courses
「ドリフト」とは、機械学習において、本番環境で稼働するモデルのパフォーマンスが時間の経過とともに徐々に悪化していく現象を指す用語です。これは、入力データの分布が時間とともに変化したり、入力(x)と目的変数(y)の関係が変化したりするなど、さまざまな理由で発生します。
現実世界で機械学習を用いる場合、データは動的で常に変化するため、ドリフトは大きな課題になり得ます。この記事では、モデルがドリフトする理由、ドリフトの種類、それらを検知するアルゴリズムを掘り下げ、最後にPythonでのオープンソース実装で締めくくります。
ドリフトとは?
機械学習モデルは過去データで学習しますが、実世界で使用されると、ドリフトと呼ばれる現象により時間の経過とともに陳腐化し、精度を失うことがあります。ドリフトとは、モデルの学習に用いたデータの統計的性質が時間とともに変化することを指します。これにより、モデルの精度が低下したり、想定と異なる挙動を示したりします。
言い換えると、「ドリフト」とは、モデルが使用される環境の変化によって、正確に予測する能力が低下していくことです。
なぜ機械学習モデルはドリフトするのか?
機械学習モデルが時間とともにドリフトする理由はいくつかあります。
一般的な理由のひとつは、モデルの学習に使われたデータが古くなり、現状を表さなくなることです。
例えば、過去データをもとに企業の株価を予測するモデルを考えます。安定した市場のデータで学習すれば、当初はうまく機能するかもしれません。しかし、市場が時間とともにより不安定になれば、データの統計的性質が変化するため、モデルはもはや株価を正確に予測できなくなる可能性があります。
もう一つの理由は、モデルがデータの変化に対応できるよう設計されていないことです。データの変化に強いモデルもありますが、完全にドリフトを避けられるモデルはありません。
ドリフトの種類
考慮すべきドリフトのタイプは主に2つあります。
1. コンセプトドリフト
コンセプトドリフト(モデルドリフトとも呼ばれる)は、モデルが本来遂行するよう設計されたタスクが時間とともに変化する場合に発生します。例えば、メール本文に基づいてスパムを検知するモデルを考えます。受信されるスパムの種類が大きく変化すると、モデルはもはや正確にスパムを検知できないかもしれません。
コンセプトドリフトはさらに4つのカテゴリに分けられます(Learning under Concept Drift: A Review, Jie Lu et al.)。
- 突発的ドリフト
- 漸進的ドリフト
- 増分的ドリフト
- 再発するコンセプト

出典: https://arxiv.org/pdf/2004.05785.pdf
2. データドリフト
データドリフト(共変量シフトとも呼ばれる)は、入力データの分布が時間とともに変化する場合に発生します。例えば、年齢と収入に基づいて顧客の購買確率を予測するモデルを考えます。顧客の年齢や収入の分布が時間の経過とともに大きく変わると、モデルは購買確率を正確に予測できなくなる可能性があります。
コンセプトドリフトとデータドリフトの両方を認識し、その影響を防止・軽減する対策を講じることが重要です。対策としては、モデルのパフォーマンスを継続的に監視・評価すること、新しいデータでモデルを更新すること、ドリフトに対してより堅牢な機械学習モデルを用いることなどがあります。
デプロイ後のデータサイエンス(ドリフトなど)については、DataFramedのポッドキャストエピソードで詳しく学べます。
3. LLM と埋め込みのドリフト
LLM は、上記の手法が想定していない種類のドリフトをもたらします。対象のデータは表形式の行ではなく自由形式のテキストであり、時間とともにシフトするのは多くの場合、ユーザーが求める内容の意味合いです。現在では、監視すべき LLM ドリフトには3つの形があると考えられています。
埋め込みドリフト
表面上のテキストが同じに見えても、ユーザーがモデルに送るテキストの意味が変わると埋め込みドリフトが起きます。LLM はテキストを埋め込みと呼ばれる長い数列に変換しますが、その数値にドリフトが表れても、通常の計測項目には現れないことがあります。
たとえば、当初はセットアップやオンボーディングの質問が中心だったカスタマーサポートのチャットボットを想像してください。6か月後、メッセージ数や平均長は変わらないのに、問い合わせの大半が請求や解約に関するものになっているかもしれません。テキスト統計は安定して見えても、埋め込みの分布はシフトしています。これを検知するには、最近の埋め込みのバッチを基準バッチと統計的距離で比較します。
プロンプト/入力ドリフト
プロンプトドリフトは埋め込みドリフトと同じ発想ですが、1段上のレベルで追跡します。生の埋め込みを比較する代わりに、受信クエリを分類器や別の LLM でカテゴリ分けし、その構成比の変化を監視します。
たとえば、バックエンドエンジニア向けに開始した社内コーディングアシスタントが、徐々にデータサイエンティストからの pandas に関する質問を拾い始めるかもしれません。アシスタントは引き続き妥当な回答を返せるとしても、想定していたユーザー層とは異なる集団にサービスを提供しており、システムプロンプトや検索インデックスが時間とともに適合しなくなる可能性があります。
評価基準(ルーブリック)ドリフト
評価基準ドリフトとは、自動評価器がモデル出力に与える品質スコアが時間とともに変化することです。多くの本番チームは、LLM を判定者として用い、各応答を有用性、正確性、口調などの観点で採点します。同種の入力に対するスコアが下がり始めたら、たいてい何かが変わっています — API 背後のモデル、検索対象の文書、あるいはユーザー構成です。
評価基準ドリフトが特に有用なのは、生成系出力ではリアルタイムの正解ラベルがほとんど得られない状況でも、品質シグナルを得られる点にあります。
ドリフトはどう検知するか?
ドリフトの検知方法は2つあります。
1. 機械学習モデルベースのアプローチ:入力データがドリフトしたかどうかを判定するモデルベースの手法。
2. 統計的検定:データドリフトを検知する統計的検定が多数あります。主に次の3カテゴリに分類されます。
-
- 逐次解析手法
- ドリフト検知用のカスタムモデル
- 時間分布法(一般的)
時間分布に基づく方法では、2つの確率分布間の差を統計的に算出してドリフトを検知します。代表例として、Population Stability Index、KL Divergence、JS Divergence、KS 検定、Wasserstein 距離があります。
データドリフト検知のアルゴリズム
Kolmogorov-Smirnov(K-S)検定
Kolmogorov-Smirnov(K-S)検定はノンパラメトリックな統計検定で、2つのデータ集合が同じ分布に従うかどうかを判定します。特定母集団からのサンプルかどうかの検定や、2つのサンプルが同一母集団由来かどうかの比較に用いられます。
この検定の帰無仮説は「分布は同じ」です。仮説が棄却されれば、モデルにドリフトがあることを示唆します。
K-S 検定は、データセット同士を比較し、同一分布かどうかを判断するのに有用です。
Population Stability Index
Population Stability Index(PSI)は、2つのデータセットにおけるカテゴリ変数の分布を比較するための統計指標です。
PSI は、2つのサンプル間や時間の経過に伴う変数分布の変化量を測定するツールです。母集団特性の変化を監視し、機械学習モデルの性能に関する潜在的な問題を特定するのに用いられます。
PSI はもともとリスクスコアカードにおけるスコア分布の変化監視のために開発されましたが、現在では従属・独立変数を含むすべてのモデル関連属性の分布シフトの検査に使われています。
PSI が高い値であれば、2つのデータセット間で当該変数の分布に有意な差があり、モデルにドリフトがある可能性を示唆します。
変数の分布が大きく変化したり、複数の変数が一定程度変化している場合は、性能改善のためにモデルの再較正や再構築が必要になることがあります。
Page-Hinkley 法
Page-Hinkley 法は、時系列データの平均値の変化を検知する統計的手法です。機械学習モデルの性能監視や、モデルドリフトを示唆するデータ分布の変化検出によく用いられます。
Page-Hinkley 法を用いるには、まず閾値と判定関数を定義します。閾値は平均の変化を有意と見なす基準であり、判定関数は変化が検知された場合に1、検知されない場合に0を返す関数です。
次に、各時点で系列の平均を計算し、判定関数を適用して変化の有無を判断します。判定関数が1を返せば、変化が検知されたことを意味し、モデルがドリフトしている可能性があります。
Page-Hinkley 法は、時間とともに平均が変化する小さな兆候を捉えるのにシンプルかつ有効です。ただし、データの変化を十分に検知しつつ、誤警報を避けるために、閾値と判定関数の選定には注意が必要です。
Python によるドリフト検知の実装
このセクションでは、ドリフト検知に Evidently を使用します。Evidently は、機械学習に携わるデータサイエンティストやエンジニア向けのオープンソースの Python ライブラリで、検証から本番まで、モデルのテスト、評価、監視を支援します。
ライブラリのインポート
import pandas as pd
import numpy as np
from sklearn import datasets
from evidently import Report
from evidently.presets import DataDriftPreset
データセットの読み込みと参照・対象パーティションの作成
# create ref and cur dataset for drift detection
adult_data = datasets.fetch_openml(name='adult', version=2, as_frame=True)
adult = adult_data.frame
adult_ref = adult[~adult.education.isin(['Some-college', 'HS-grad', 'Bachelors'])].copy()
adult_cur = adult[adult.education.isin(['Some-college', 'HS-grad', 'Bachelors'])].copy()
adult_cur.iloc[:2000, 3:5] = np.nan
ドリフトレポートの生成
#dataset-level metrics
report = Report([DataDriftPreset()], include_tests=True)
my_eval = report.run(current_data=adult_cur, reference_data=adult_ref)
my_eval

EvidentlyAI を用いて作成したドリフト検知ダッシュボード
ドリフトレポートを JSON 形式でエクスポート
#report in a JSON format
my_eval.json()
完全版の Datacamp ノートブックはこちらをご覧ください。
まとめ
データドリフトとモデルドリフトは、本番環境の機械学習システムに大きな課題をもたらします。ドリフトの原因と影響を理解し、効果的な監視体制を構築することで、モデルの精度と信頼性を長期的に維持できます。
モデルのパフォーマンスの監視、ドリフト検知モデルの利用、最新データでの定期的な再学習は、ドリフトのリスクを軽減するための代表的なベストプラクティスです。予防的に監視を行うことで、機械学習システムが組織に継続的な価値を提供し続けられます。
ドリフト監視は、MLOps と呼ばれるより広い分野の一部に過ぎません。MLOps の概念を理解することは、データサイエンティスト、エンジニア、リーダーが、ローカルのノートブックから本番稼働のモデルへと発展させるために不可欠です。
MLOps を深く理解し、キャリアにどう役立つか知りたい方は、MLOps Concepts コースをご覧ください。MLOps とは何か、MLOps プロセスの各フェーズ、MLOps の成熟度レベルを学べます。重要な MLOps の概念を習得すれば、継続的・信頼的・効率的に機械学習を実装するための準備が整います。
ドリフト検知に関するFAQ
機械学習のモデルドリフトとは何ですか?
機械学習のモデルドリフトとは、モデルが新しいデータに対して示す性能が、学習に用いたデータでの性能と異なってしまう現象です。これは、データ分布の経時変化、元のモデルの前提に合わない新規データの追加、変化する条件へのモデルの適応不足など、さまざまな理由で発生します。
なぜモデルドリフトは問題なのですか?
モデルドリフトは、機械学習モデルの性能と精度に大きな影響を与えます。予測の信頼性が下がると、誤った意思決定や行動につながり、負の結果を招く恐れがあります。例えばヘルスケアでは、誤診や不適切な治療提案につながる可能性があり、金融では不適切な投資判断の原因になり得ます。
モデルドリフトはどのように検知しますか?
モデルがドリフトしているかどうかを判断する方法には、統計的検定、ドリフト検知アルゴリズム、モデルの性能指標の監視などがあります。リアルタイム検知に適したものもあれば、定期的・バッチ的な評価に適したものもあります。用途やデータ環境に合った適切な手法を選ぶことが重要です。
モデルドリフトはどのように防ぎますか?
モデルドリフトの防止には、慎重なモデル選定、定期的な監視・テスト、そして能動的な介入の組み合わせが必要です。ドリフトに強いアルゴリズムの採用、最新データでの定期的な再学習、検知時に積極的に対処する戦略の実装などが考えられます。ドリフトの原因となり得る要因を正しく理解し、事前に手を打つことも重要です。
データ分布はモデルドリフトにどのように影響しますか?
データ分布は機械学習モデルの性能に大きく影響します。データ分布が時間とともに変化すると、モデルは当初の前提に合わない新しいデータを正確に予測できなくなり、モデルドリフトを引き起こします。これは、データの自然変動、新たなデータソースの追加、データを生成する基盤プロセスやシステムの変化など、さまざまな形で起こり得ます。
モデルドリフトは可逆ですか?
場合によっては、新しいデータで再学習したりパラメータを調整したりすることで、モデルドリフトを可逆的に対処できます。しかし、データ分布の変化が大きい場合や、モデルが過度に複雑・専門化している場合は困難であり、その際は新しいモデルでやり直す必要があるかもしれません。
モデルドリフトを完全に排除できますか?
モデルドリフトを完全になくすことは難しく、場合によっては不可能です。最も堅牢で優れた設計のモデルでも、データやそれを生成する基盤プロセスの変化の影響を受けます。最善策は、定期的な監視・テスト・介入を通じて、ドリフトの影響を管理・軽減することです。
モデルドリフトはモデルのパフォーマンスにどのような影響を与えますか?
モデルドリフトは、モデルのパフォーマンスに大きな影響を与えます。予測が不正確になると、精度、適合率、再現率、総合的な有効性といった重要指標が低下します。場合によっては、モデルが完全に機能不全に陥り、誤った・信頼できない予測をもたらすこともあります。
モデルドリフトはモデルの精度にどのように影響しますか?
モデルドリフトは、モデルの精度に負の影響を及ぼします。予測の正確性が下がると、誤った意思決定や行動につながり、実世界のアプリケーションで悪影響を生む可能性があります。例えばヘルスケアでは誤診や不適切な治療提案、金融では不適切な投資判断を招きかねません。モデルの精度を維持するため、ドリフトを定期的に監視・検査することが重要です。