煙臺微信網(wǎng)站建設網(wǎng)站搜索優(yōu)化
本文作者:楊健,九章云極 DataCanvas 主任架構師
數(shù)據(jù)漂移問題近年在機器學習領域來越來越得到關注,成為機器學習模型在實際投產(chǎn)中面對的一個主要挑戰(zhàn)。當數(shù)據(jù)的分布隨著時間推移逐漸發(fā)生變化,需要預測的數(shù)據(jù)和用于訓練的數(shù)據(jù)分布表現(xiàn)出明顯的偏移,這就是數(shù)據(jù)漂移問題。
數(shù)據(jù)漂移分為三種類型:
-
變量偏移(Covariate Drift),某些獨立的特征發(fā)生偏移
-
先驗概率偏移(Prior probability Drift),目標變量發(fā)生偏移
-
概念偏移(Concept Drift),特征和目標變量之間的關系發(fā)生偏移
為什么不能通過提升泛化能力來解決數(shù)據(jù)漂移問題?
數(shù)據(jù)漂移問題無法通過提升模型泛化能力的方法來解決,因為我們目前的機器學習方法基本是建立在IID(獨立同分布)前提下的。在一個真實分布下可觀測的訓練數(shù)據(jù)有限,訓練好模型在預測時遇到了符合同一個分布但未觀測到的樣本時準確度下降,這種情況我們通過選擇合適的算法、交叉驗證、正則化、Ensemble等方式是可以有效改善模型的泛化能力的。但數(shù)據(jù)漂移的本質(zhì)是數(shù)據(jù)的真實分布發(fā)生了較大的變化,因此僅僅提升泛化能力是無法有效提升模型效果的。
常用的解決方案
數(shù)據(jù)漂移常見的解決方案是不斷的引入最新的數(shù)據(jù)重新訓練模型,但這種方案存在很大的缺陷,例如:我們在客戶流失預警中通常會用歷史標注的數(shù)據(jù)訓練模型來預測當月是否有用戶流失,模型預測的結果要等下個月通過用戶行為反饋后得到標注才能評估,如果我們發(fā)現(xiàn)結果大幅下降才能判斷數(shù)據(jù)發(fā)生了漂移,因此這種方案存在比較明顯的滯后性,這也是有監(jiān)督學習的主要短板。
使用Adversarial Validation半監(jiān)督學習解決數(shù)據(jù)漂移
隨著近年來無監(jiān)督和半監(jiān)督學習的發(fā)展,一種基于Adversarial Validation(對抗驗證)的半監(jiān)督學習技術被提出用于解決數(shù)據(jù)漂移問題。它的核心思想是通過訓練一個Adversarial Classifier來判斷是否發(fā)生漂移以及哪些特征發(fā)生了漂移,進而刪除發(fā)生漂移的特征來保證模型在新數(shù)據(jù)上的效果。如下圖所示:
對抗驗證的基本過程是把訓練數(shù)據(jù)(先刪除目標列)和待預測數(shù)據(jù)(數(shù)據(jù)中本身就沒有目標列)合并后添加新的二分類目標列(來自訓練集為0, 來自測試集為1)。新的數(shù)據(jù)集shuffle后使用分層采樣分割成訓練集和評估集,用訓練數(shù)據(jù)fit模型后使用評估集評估AUC,通常如果數(shù)據(jù)沒有發(fā)生偏移AUC會接近0.5,否則就可以判斷發(fā)生了不同程度的數(shù)據(jù)漂移。接下來就是識別哪些特征發(fā)生了漂移,有兩種方法:一種是把每一個特征列做為X,單獨訓練Adversarial Classifier來評估AUC,超過一定閾值(如>0.6),就確定該列發(fā)生了漂移。另一種方法是:用全部特征訓練Classifier然后評估AUC,如果超過一定閾值,就刪除掉特征重要性最高的n個特征,然后重復迭代這個過程,直到AUC降到可接受的范圍內(nèi)。
上面的方法是通過刪除漂移特征來保證模型不被干擾,還有一種方法是通過選擇合適的驗證集來獲得更接近于測試集(待預測數(shù)據(jù))的模型評估結果,被成為Validation Data Selection。這種方法是訓練一個模型來識別訓練集中的哪些樣本的分布和測試集更相似,把這些樣本拿出來做為Validation Data來指導模型訓練,讓模型可以更好的擬合測試數(shù)據(jù)的分布。
在HyperGBM中如何自動完成數(shù)據(jù)漂移檢測和處理?
以上這些方法在很多數(shù)據(jù)集上可以很明顯的改善模型的預測效果,目前在HyperGBM中都已經(jīng)支持,通過配置參數(shù)就可以完成。HyperGBM中只需要在構建experiment時設置drift_detection=True就會自動完成數(shù)據(jù)漂移的檢測和處理,需要注意的是Adversarial Validation是一種半監(jiān)督學習,所以訓練時需要提供未觀測到目標數(shù)據(jù)的測試集(比如待預測的下個月的數(shù)據(jù),Kaggle競賽中的測試集),在下面示例中我們只是從數(shù)據(jù)集中分割了一部分數(shù)據(jù)刪除目標列做為測試集:
from tabular_toolbox.datasets import dsutils
from sklearn.model_selection import train_test_split
from hypergbm.search_space import search_space_general
from hypergbm import make_experiment
# load data into Pandas DataFrame
df = dsutils.load_bank()
target = 'y'
train, test = train_test_split(df, test_size=0.3)
test.pop(target)
#create an experiment
experiment = make_experiment(train, target=target, test_data=test,drift_detection=True)
#run experiment
estimator = experiment.run()
# predict on test data without target values
pred = estimator.predict(test)
實現(xiàn)Validation Data Selection只需要設置train_test_split_strategy=‘a(chǎn)dversarial_validation’,示例代碼入下:
from tabular_toolbox.datasets import dsutils
from sklearn.model_selection import train_test_split
from hypergbm.search_space import search_space_general
from hypergbm import make_experiment
# load data into Pandas DataFrame
df = dsutils.load_bank()
target = 'y'
train, test = train_test_split(df, test_size=0.3)
test.pop(target)
#create an experiment
experiment = make_experiment(train, target=target, test_data=test,train_test_split_strategy='adversarial_validation')
#run experiment
estimator = experiment.run()
# predict on test data without target values
pred = estimator.predict(test)
更多HyperGBM相關內(nèi)容請參考:
https://github.com/DataCanvasIO/HyperGBM