
使用這些基本 REST API 最佳實踐構建出色的 API
農場有一群火雞,農夫每天來給它們喂食。經過長期觀察后,一只火雞(火雞中的科學雞)得出結論,“每天早上農夫來到雞舍,我就有吃的”,之后每天的經歷都在證實它的這個結論。但是有一天,農夫來到雞舍,沒有帶來食物而是把它烤了,因為這天是圣誕節,做成了圣誕節火雞。
通過有限的觀察,得出自以為正確的規律性結論的,結局如是此。以這角度,我們去看AI/機器學習的應用,也能看到很多類似的例子。
機器學習是研究怎樣使用計算機模擬或實現人類學習活動的科學,是基于一系列假設(基本的如,獨立同分布假設)歸納得到經驗,進行預測的過程。
也不可避免的,機器學習中也可能出現預測的數據與訓練數據不滿足同分布,歷史數據經驗不那么適用了! 導致預測效果變差或失效的情況。這就類似我們考試的時候,發現這類型的題目我沒有見過,歇菜了…
實際預測與訓練數據不滿足同分布的問題,也就是數據集偏移(Dataset shift),是機器學習一個很重要的問題。
從貝葉斯定理可得P(y,x) = P(y|x) * P(x) = P(x|y) * P(y),當輸入空間的邊緣概率分布P(x) ? , 輸出空間的標簽分布P(y) ?以及表示該機器學習任務的條件概率分布 P(y|x) 之中,有任一項因素發生偏移導致訓練數據與預測數據 P(y,x)造成差異,即為數據集偏移現象。
不同因素對應著如下三種情況得數據偏移:
可能導致數據不滿足同分布的兩個常見的原因是:
比如金融領域的信貸客群是通過某種渠道/規則獲得的,后面我們新增加營銷渠道獲客 或者 放寬了客戶準入規則。這樣就會直接導致實際客群樣本比歷史訓練時點的客群樣本更加多樣了(分布差異)。
比如金融領域,預測用戶是否會償還貸款的任務。有一小類用戶在經濟環境好的時候有能力償還債務,但是由于疫情或其他的影響,宏觀經濟環境不太景氣,如今就無法償還了。
可能我們模型在訓練、驗證及測試集表現都不錯,但一到OOT(時間外樣本)或者線上預測的時候,效果就掉下來了。這時我們就不能簡單說是模型復雜導致過擬合了,也有可能是預測數據的分布變化導致的效果變差。我們可以通過如下常用方式檢測數據分布有沒有變化:
通過統計指標去檢測分布差異是很直接的,我們通常用群體穩定性指標(Population Stability Index,PSI), 衡量未來的樣本(如測試集)及訓練樣本評分的分布比例是否保持一致,以評估數據/模型的穩定性(按照經驗值,PSI<0.1分布差異是比較小的。)。
同理,PSI也可以細化衡量特征值的分布差異,評估數據特征層面的穩定性。PSI指標計算公式為 SUM(各分數段的 (實際占比 – 預期占比)* ln(實際占比 / 預期占比) ),介紹可見:指標。其他的方法如 KS檢驗,KDE (核密度估計)分布圖等方法可見參考鏈接[2]
可以通過訓練數據集訓練一個模型(如 oneclass-SVM),利用模型判定哪些數據樣本的不同于訓練集分布(異常概率)。異常檢測方法可見:異常檢測算法速覽
混合訓練數據與測試數據(測試數據可得情況),將訓練數據與測試數據分別標注為’1‘和’0‘標簽,進行分類,若一個模型,可以以一個較好的精度將訓練實例與測試實例區分開,說明訓練數據與測試數據的特征值分布有較大差異,存在協變量偏移。
相應的對這個分類模型貢獻度比較高的特征,也就是分布偏差比較大的特征。分類較準確的樣本(簡單樣本)也就是分布偏差比較大的樣本。
增加數據是王道,訓練數據只要足夠大,什么場面沒見過,測試數據的效果自然也可以保證。
如上面的例子,作為一只農場中的科學雞,如果觀察到完整周期、全場景的數據,或者被灌輸一些先驗知識,就能更為準確預測火雞的命運。
但是現實情況可能多少比較無奈,可能業務場景的原因限制,并不一定可以搞得到更多數據,諸如聯邦學習、數據增強等方法也是同樣的思路。
在現實情況沒法新增數據的時候,數據增強(Data Augmentation)是一個備選方案,在不實質性的增加數據的情況下,從原始數據加工出更多的表示,提高原數據的數量及質量,以接近于更多數據量產生的價值。
其原理是通過對原始數據融入先驗知識,加工出更多數據的表示,有助于模型判別數據中統計噪聲,加強本體特征的學習,減少模型過擬合,提升泛化能力。具體可見:數據增強方法
我們可以選擇和待預測樣本分布比較一致的數據做模型訓練,使得在待預測樣本的效果變得更好。
這個方法看起來有點投機,這在一些數據波動大的數據競賽中很經常出現,直接用全量訓練樣本的結果不一定會好,而我們更改下數據集劃分split的隨機種子(如暴力for循環遍歷一遍各個隨機種子的效果),或者 人工選擇與線上待預測樣本業務類型、 時間相近的樣本集用于訓練模型(或者 提高這部分樣本的學習權重),線上數據的預測效果就提升了。
半監督學習 是介于傳統監督學習和無監督學習之間,其思想是通過在模型訓練中直接引入無標記樣本,以充分捕捉數據整體潛在分布,以改善如傳統無監督學習過程盲目性、監督學習在訓練樣本不足導致的學習效果不佳的問題。
通過半監督學習,訓練時候可以充分捕捉數據整體潛在分布,同理也可以緩解預測數據分布有差異的問題。半監督分類常用的做法是,通過業務含義或者模型選擇出一些雖然無標簽的樣本,并打上大概率的某個標簽(偽標簽)加入到訓練數據中,驗證待預測樣本的效果有沒有變好。
經典的如金融信貸領域的拒絕推斷方法,我們可以從貸款被拒絕的用戶中(這部分用戶是貸款的時候直接被拒絕了,沒有”是否違約”的標簽),通過現有信貸違約模型(申請評分卡)預測這部分拒絕用戶的違約概率,并把模型認為大概率違約的用戶作為壞樣本加入到訓練樣本中,以提升模型的泛化效果。
對于常見的協變量偏移,用特征選擇是一個不錯的方法。我們可以分析各個特征在分布穩定性(如PSI值)的情況,篩選掉分布差異比較大的特征。需要注意的是,這里適用的是篩掉特征重要性一般且穩定性差的特征。如果重要特征的分布差距也很大,這就難搞了,還是回頭搞搞數據或者整整其他的強特征。特征選擇方法可見:python特征選擇
均衡學習適用與標簽分布差異(先驗偏移)導致的數據集偏移。均衡學習的方法可以歸結為:通過某種方法,使得不同類別的樣本對于模型學習中的Loss(或梯度)貢獻是比較均衡的,以消除模型對不同類別的偏向性,學習到更為本質的決策。
比如原反欺詐訓練樣本中,好壞樣本的比例是1000:1,但到了預測,有時實際的好壞樣本的比例是10:1。這時如果沒有通過均衡學習,直接從訓練樣本學習到模型,會先天認為欺詐壞樣本的概率就是很低的,導致很多欺詐壞樣本的漏判。
不均衡的任務中,一方面可以通過代價敏感、采樣等方法做均衡學習;另一方面也可以通過合適指標(如AUC),減少非均衡樣本的影響去判定模型的效果。具體可見:一文解決樣本不均衡(全)
最后,機器學習是一門注重實踐的科學,在實踐中驗證效果,不斷探索原理。
僅以此文致敬我們的數據科學雞啊。
本文章轉載微信公眾號@算法進階