Dataikuのデータドリフト用プラグイン Drift Plugin


DataikuのDrift Pluginについてちょっとまとめました。

Dataikuのversion 10.0.2で試しています。
うかうかしている間にversion11がでてしまいましたね。でもこのへんは大きくかわってないはず。

# Drift Plugin

Evaluation Storeは便利ですが、以下の欠点があります。

- モデルを作成しないと使えない。一旦作成したモデルに対して評価用データの精度を出すことは可能です。
- 正解データがわからないと使えない

そこで、モデルを作成しないような場合や、正解データがわからないと使えない場合でも、データドリフトを検出したいときに使えるのがDrift Pluginです。DataikuのPluginsからダウンロードして使うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/b8cea5ce-826e-3c48-2753-95e473b2251d.png)


プラグインの中には以下の４つの機能が入っています。
- Compute feature drift of a deployed model
デプロイされたモデルの特徴ドリフトを計算する
モデルの元の学習データと新しいデータセットとの間のデータドリフトを測定。
- Compute drift between two datasets
2つのデータセット間のドリフトを計算する
同じスキーマを持つ2つのデータセット間のデータドリフトを測定。
- Most recent drift score
直近のドリフトスコア
- Data drift analysis
データドリフト解析
新しいデータセットと評価（テスト）データセットがどのように異なるかを調べるためのツール。

順番に使ってみます。


まずは、レシピとして使える以下２つから。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/771266bd-8402-d91c-73c9-1f4dae017a0d.png)


## Compute feature drift of a deployed model
新しいデータセットと、モデル、評価値の出力先データセットを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/e9d32c84-6904-bb69-a50c-27b254b8ac63.png)

算出する評価値を指定して、左下のRUNボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/df702438-1bc3-a40e-271e-a44b1cc63f3d.png)

出力先データセットとして指定したデータセットに、評価値が算出されました。
drift_model_accuracyがドリフトスコアに対応します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/86545b2b-a4ac-c54f-d175-a46bace3c34f.png)

## Compute drift between two datasets
比べたい２つのデータセットを指定し、出力先データセットも指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/dd7d73ac-5998-4f16-53af-d29c4e131a1b.png)


出力する評価値を指定します。ignore columnつまり、計算に使わないカラムを全く指定しなかったところpythonがメモリエラ―おこしてこけたので、とりあえず5カラムくらいまでに絞ってあとは全てignoreに指定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/1284732f-3bdf-503b-9f60-2a2ee92dc046.png)

最終結果です。ドリフトスコア(drift_model_accuracy)が算出されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/9fa028f6-2a01-91ee-ab0e-645f55a24f83.png)

# Most recent drift score
これは、Check&MetricsでDrift Scoreを監視する機能です。Evaluate Storeにも備わっているので、そっちが使えるときはそちらを使う方が簡単です。

まず、レシピのInput/Outputタブで出力先データセットをアペンドモードにしておきます。これにより、出力が追記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/8431e271-7251-28f7-cf03-bef7dc69fa51.png)


出力先データセットのStatus>Edit>Metricsの下の方にあるNEW CUSTOM PROBEをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/f1032b8f-504a-f603-0f9f-69504d9cd046.png)

こんな風にでてくるので、Model drift monitoring>Most recent drift scoreを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/f8d64319-a84f-fed4-7b5a-10a9faaace4d.png)

ONにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/16f0535c-9929-5f45-392e-5e7d99f054b6.png)

SAVEを押下します。あとは普通にCheckでデータドリフトスコアの範囲の設定などできますので、普通のMetricsと同じように好きなように料理します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/fbe165c3-57d2-2967-57c7-45e600bc59af.png)


# Data drift analysis
この機能はVersion10よりEvaluation Storeでも提供されています。Evaluation Storeを用いたほうが、Metrics&Checksに組み込めるので良いと思います。
ここでは、プラグインだと、こうといったことを説明しますが、Evaluation Storeとかなり被るし、向こうの方が上位互換って感じです。

モデルのReportのViews画面を開きます。
View model asでData drift analysisを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/fb8919a5-e1c6-04d2-324b-2bcb5072e142.png)


Select dataset containing new test dataを選択し、[COMPUTE DRIFT]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/b754fe6c-e013-919c-694d-fe9101adbcea.png)

いくつかの可視化画面が表示されます。次に順番に説明します。

## Global Drift Score
### Drift model
データドリフトスコアを表示します。これは0.5付近だと良いスコアです。中身は、ランダムフォレスト分類器で新しいデータセットとテストセットを識別し、そのAccuracy(正答率)の値です。つまり高精度で判別できていたら新しいデータセットとテストセットが区別できてしまい、データドリフトを観測していることを意味します。ちなみにAccuracyが低すぎる値は基本的に出ないはずです(例えばaccuracy0はラベル逆転させればaccuracy1と同様なので）。
Lower boundとUpper boundはAccuracyの信頼区間を示しています。この範囲内に0.5が入っていればまあ大丈夫そうかと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/92a16b0a-9c93-221e-578e-f5fe940ccee7.png)

### Binomial test
 - Hypothesis tested ：二項検定の検定結果です。「ドリフトがない」つまりデータセットが区別できないということを検証される仮説としています。今回はドリフトは無いという結果です。
 - Significance level ：p-valueにおける有意水準αです。
 -  p-value ：ドリフトがないという仮説のもとで、このテストによってドリフトが誤って検出される確率を示します。今回の結果ではここの値がSignificance level(0.05)より大きいので仮説は棄却されません。
 -  Conclusion ：結果どうだったかということで、今回はドリフトは検出されませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/0e72d35e-5a06-46ff-0174-63f75572a2c3.png)

ここからは、この検定についてのちょっと補足です。何を検定しているかという話になります。

二項検定、つまり母集団比率の検定を行っています。
実際の確率が0.5である場合、このドリフトスコアが得られる確率は何%かを求め、その値に対して有意水準を用いて棄却されるかどうか判定しています。
ここで母集団として仮定しているのは母集団比率が0.5(p=0.5)の二項分布。つまりランダムに母集団から１つサンプルをとってきた時に、それが新しいデータ由来か古いデータ由来かの確率が0.5という二項分布を仮定しています。
そして、標本比率にドリフトスコアを使っています。
p=ドリフトスコア、n=レコード数(新しいデータの数＋古いデータの数）の事象が、仮定した母集団において有意水準αとしたときの棄却域に落ちるかどうかで検定をしています。


## Model Information
このへんも、Evaluation Storeと被りますが、Evaluation Storeの方が機能が多いですね。
### Fugacity
モデルが学習した期待される「理想的な」データと、解析している観測された「実際の」データとの差を表します。テストデータセットと入力データセットの両方でスコアリングしたときに、各クラスに予測されるサンプルの割合を比較できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/a2815649-ade7-8894-7d20-39545c24040f.png)

### Predicted Probability density chart
テストデータセットと入力データセットのスコアの分布になります。見た目からも分布はかわらないことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/54d68a95-d0b7-4ba1-a595-9e74828c5ad9.png)

## Feature Drift Overview 
各Featureに対して、縦軸に元のモデルに対する重要度、横軸にドリフトモデルに対する重要度を散布図でしめしています。
もしドリフトが発生していたら、右上にあるやつが原因かも、ということになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/18038e90-60ff-5638-2463-b0682c6f546f.png)

右側の英語のところにどの特徴が要注意かといったことがかかれています。
一番下の「We recommend you to check the following feature(s): card_age, purchase_amount」ですね。card_ageとpurchase_amountこれらは右上にある二つの青丸に相当します。といって、今回のデータはドリフトスコアからみればドリフトが発生していないので、特にここの結果は気にする必要はないでしょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/cc7db9ce-f3a7-81e2-a1f0-a176653ac066.png)


# さいごに
Drift PluginのData Drift Analysisは完全にEvaluation Storeの下位互換ですね。Evaluation Storeの方が機能豊富なので、またそっちもまとめて整理しておきたいと思います。