? 作者:韓信子@ShowMeAI
? 資料分析實戰系列:https://www.showmeai.tech/tutorials/40
? 機器學習實戰系列:https://www.showmeai.tech/tutorials/41
? 本文地址:https://www.showmeai.tech/article-detail/331
? 宣告:版權所有,轉載請聯絡平臺與作者並註明出處
? 收藏ShowMeAI檢視更多精彩內容
? 資料漂移
The Only Constant in Life Is Change. 世界上唯一不變的就是變化本身。
這是一句來自希臘的哲學家赫拉克利特寫的話,它很簡單但卻道出了世界的真理之一。在資料科學與機器學習領域,這句話同樣是非常有意義的,在生產中部署機器學習模型的許多實際應用中,資料通常會隨著時間的推移而變化,因此之前構建的模型會隨著時間的推移而變得不準確,效果大打折扣,這就是典型的資料漂移問題。
? 真實案例
2022年3月17日至4月6日,信用報告機構 Equifax 的系統出現問題,導致 ?信用評分不正確,影響到百萬級別的消費者,並導致了針對公司的法律索賠和集體訴訟,業內專家稱,這個問題的根源就是資料漂移。
? 資料漂移
? 何為資料漂移
當我們在使用資料科學方法解決場景問題時,得到方案之後,在實際生產環境中,如果我們拿到的實時預測資料,分佈與用於訓練模型的訓練資料分佈有差異時,就發生了『資料漂移』,而它的後果就是預估不再準確,效果下降甚至直接影響公司的收益。
簡單的例子,例如用『口罩政策』之前的網際網路資料建模,對『口罩政策』實施時的使用者行為預估,那一定會有偏差;又如我們用日常資料建模,構建電商推薦系統,在 618 和雙11當天預測,可能也會有偏差,模型效果下降。
訓練資料和生產資料之間的差異可能是由多種因素造成的。可能本來使用的訓練資料就不合適。
例如,如果使用美國道路資料集訓練和檢測道路狀況,應用在中國的道路上,效果就會差非常多,這也是明顯的資料漂移。
現代網際網路時代,沒分每秒都迅速產生海量大資料,我們的資料來源呈現爆炸式增長也更容易會有變化。我們並不能每次都提前預判到『資料漂移』問題,甚至有時候我們會遇到特殊的網路攻擊,基於『資料漂移』的知識進行調整和切換攻擊方式。
例如,我們基於歷史資料構建了效果非常良好的垃圾郵件檢測功能,但攻擊者可能在某個時候改變傳送垃圾郵件的行為,因為送入模型的資料發生了變化,我們原本構建的模型可能真的會被『欺騙』。
因此,很重要的是,我們需要有一套比對和檢測的機制,可以及時發現『資料漂移』,並對其進行處理。
? 檢測方法概述
有很多資料漂移的檢測方法,最簡單的方式是基於統計方法來比較『訓練資料』(稱為基線或參考)和『實時資料』(生產資料)的分佈,如果兩個分佈之間有著顯著差異,我們就判斷為發生資料漂移。
最流行的統計檢驗方法包括 ?Kolmogorov-Smirnov 檢驗、?卡方檢驗、 ?Jensen-Shannon 散度、 ?Wasserstein 距離。 另一類方法是使用機器學習模型來監控資料質量。 我們也可以把兩類方法混合使用。
實際生產環境中,統計的方法使用得很多,它們簡單且有很不錯的效果。下面 ShowMeAI 就基於程式碼告訴大家如何進行『資料漂移』檢測。
? 程式碼實現
? 資料漂移檢測
我們在這裡會使用到 evidently
這個非常簡單易用的工具庫,它是一個專門針對『資料漂移』問題構建的工具庫,可以對資料 / 標籤 / 模型表現等進行檢測,不僅可以輸出報告,還可以啟動實時看板監控。
下面匯入工具庫
import pandas as pd
from sklearn import datasets
from evidently.dashboard import Dashboard
from evidently.dashboard.tabs import DataDriftTab, CatTargetDriftTab
evidently
的使用步驟如下,我們會先載入資料,然後做漂移分析和檢測,最後可以構建看板進行分析結果的呈現。
我們使用sklearn
自帶的 iris 資料集作為示例來給大家講解,我們把對應的資料和標籤讀取出來。
iris = datasets.load_iris()
iris_frame = pd.DataFrame(iris.data, columns = iris.feature_names)
iris_frame['target'] = iris.target
我們把完整的資料集切分為訓練集和測試集,對其進行對比和資料漂移分析,最後構建儀表盤看板:
iris_data_drift_report = Dashboard(tabs=[DataDriftTab(verbose_level=verbose),
CatTargetDriftTab(verbose_level=verbose)])
iris_data_drift_report.calculate(iris_frame[:75], iris_frame[-new_samples:], column_mapping = None)
iris_data_drift_report.show(mode="inline")
注意到引數verbose
,它是布林值,用於控制顯示儀表板的詳細程度。 上述程式碼中我們設定為 False
,會得到一個報告如下,裡面詳細分析了訓練集和測試集的『特徵欄位』和『標籤』的分佈差異情況:
我們也可以透過下列程式碼去開啟看板和儲存html報告。
iris_target_drift_dashboard.show()
iris_target_drift_dashboard.save('iris_target_drift.html')
參考資料
- ? Equifax issued wrong credit scores for millions of consumers:https://www.cnn.com/2022/08/03/business/equifax-wrong-credit-scores/index.html
- ? Kolmogorov-Smirnov 檢驗:https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_test
- ? 卡方檢驗:https://en.wikipedia.org/wiki/Chi-squared_test
- ? Jensen-Shannon 散度:https://en.wikipedia.org/wiki/Jensen%E2%80%93Shannon_divergence
- ? Wasserstein 距離:https://en.wikipedia.org/wiki/Wasserstein_metric