株を自動取引するにあたって、予測に使っているデータに問題が無いかどうかを監視したい。
市況の変化に伴って一時データに変化が生じる可能性もあるし、前処理の何らかのバグによって生成された特徴量がおかしくなる可能性も考えられる。
Concept Driftの定義と分類
この論文に基づいてざっくりと定義を確認した。
が論文内で言及されているように、人によって各概念の呼び方にブレがあるので
文脈に応じて適切に応じて相手が何を行っているのか察するのが良さそう。
このライブラリみたいにドキュメント内に定義が書かれていると親切だなとは思う。
論文内では説明変数Xと目的変数Yの同時分布が時刻によって異なること、Concept Driftだと定義している。
ベイズの定理で条件付き確率を使って表現すれば、入力される値の傾向が変わる可能性、XとYの関係性が変化した結果P(X, Y)が変わる可能性、に場合分けができる。
$$
P_t(Y, X) \ne P_u(Y, X)
$$
Class Drift(Concept Drift)
P(Y|X)が変化すること。つまり同じXを与えたとしても、時間によって得られる目的変数の分布が変化すること。
ある納税者の挙動を観測した際に、時間によって税法が変わるので、時間によって振る舞いも変わるみたいな話。
あくまで入力の分布P(X)は変化せずに、XとYの関係性(=P(Y|X))が変化することをClass Driftと読んでいる。
論文や文献によってはこれをConcept Driftと呼んでいたりするので注意。
Covariate Drift(Data Drift)
日本語だと共変量ドリフト、 共変量シフトなどと呼ばれるやつだと思われる。XとYの関係性P(X|Y)は変わらないが、入力の分布P(X)が変化すること。
時間経過によって入力値が変わる例は無数にあるが、例えばサービスの拡大によってユーザーの年齢層が変化したりというパターンなどが考えられる。
ドリフトの検出方法
ここからは上の分類で言うところのCovariate Driftの話。
説明変数が1つの機械学習モデルであれば、古典的な統計手法で比較すれば簡単に共分散ドリフトが発生していることが分かる。
ただ最近の機械学習の手法は入力が高次元の場合が多いため、別の手法を検討する必要がある。
ドリフト検出のライブラリである FROUROSのData Driftの表を見てみると、他変量の比較方法はMMDという方法しか存在していない(ほか全部単変量)。
雑にあさって見つけたこの論文では以下のような分布比較手法がまとめられている。
Maximum Mean Discrepancy (MMD)
よくわからないがカーネル法を使って分布の比較ができるらしい。そしてよくわからないが有意性の検定もできるらしい。すごい。
コルモゴロフ-スミルノフ (KS) 検定 + ボンフェローニ補正
KS検定は単一の変数に対して2つの分布が同一の確率分布関数に従っているか検定する方法。
ただ複数の変数に対して検定すると、多重比較の問題が出てきて帰無仮説が棄却される(=ドリフトがあると判断される)可能性が上がってしまう。
そこをボンフェローニ補正でよしなにすることで妥当な比較を実現する。
どの変数がおかしいかわかりやすいは強みな気がする。
カイ二乗検定
分類問題限定の方法。
予めトレーニングされた分類器に過去のデータと新しいデータを突っ込んで、そぜぞれの経験分布を生成する。
生成した経験分布に対してカイ二乗検定(というより適合度検定)で有意に差があるかを検定する。
あまりしっかり論文内の実験結果を読んでいないが、MMDとKS検定でパフォーマンスあまり変わらなかったと言っているのでKS検定していればいい気がする。
論文内には高次元の分布を比較するためのデータ圧縮の方法などについても議論があるので参考になる。
この記事ではKL距離使っていたりするみたいだが、しきい値決めたり大変では?という気持ちがある。