【机器学习基础】5种数据同分布的检测方法!
作者:小雨姑娘,康涅狄格大學,Datawhale成員
在數據挖掘比賽中,很重要的一個技巧就是要確定訓練集與測試集特征是否同分布,這也是機器學習的一個很重要的假設。但很多時候我們知道這個道理,卻很難有方法來保證數據同分布,這篇文章就分享一下我所了解的同分布檢驗方法。
一、KS檢驗
KS是一種非參數檢驗方法,可以在不知道數據具體分布的情況下檢驗兩個數據分布是否一致。當然這樣方便的代價就是當檢驗的數據分布符合特定的分布事,KS檢驗的靈敏度沒有相應的檢驗來的高。在樣本量比較小的時候,KS檢驗作為非參數檢驗在分析兩組數據之間是否不同時相當常用。
具體操作方法如下:
1. 畫出數據的累積分段圖
舉個例子,對于數據集 {1.26, 0.34, 0.70, 1.75, 50.57, 1.55, 0.08, 0.42, 0.50, 3.20, 0.15, 0.49, 0.95, 0.24, 1.37, 0.17, 6.98, 0.10, 0.94, 0.38},先對其排序為 {0.08, 0.10, 0.15, 0.17, 0.24, 0.34, 0.38, 0.42, 0.49, 0.50, 0.70, 0.94, 0.95, 1.26, 1.37, 1.55, 1.75, 3.20, 6.98, 50.57}。其中比0.24小的一共有4個,占數據集的 1/5,所以0.24的累積分布值是0.2,依次類推我們可以畫出累積分布圖。
2. 對于累積分布圖取Log變換
3. 通過兩個數據的累積分布圖直接最大垂直距離描述兩數據的差異
實際操作中并不建議自己手寫,可以直接調用Python scipy庫中封裝好的函數:
from scipy.stats import ks_2samp ks_2samp(train[col],test[col]).pvalue二、Overlap Rate
對于連續型變量我們可以使用KS檢驗來檢測數據分布是否一致,對于類別型變量我們可以對其進行編碼然后檢測,或者選擇通過特征重合率來進行檢測,在高基數變量中此方法經常被用到。
通過特征重合率檢測的思想是檢測訓練集特征在測試集中出現的比率,舉個例子:
訓練集特征:[貓,狗,狗,貓,狗,狗,狗,貓] 測試集特征:[貓,貓,魚,豬,魚,魚,豬,豬]即使該特征在訓練集表現很好,但在測試集上的用處并不大,因為重合率僅有1/4,反而會導致過擬合或者模型忽略到其他更有用的特征。
三、KL散度
雖然特征重合率可以篩掉一些不好的特征,但是在下面這種情況下,覆蓋率雖然是100%,但是特征的作用并不大:
訓練集特征:[貓,貓,魚,豬,魚,魚,豬,豬] 測試集特征:[貓,狗,狗,狗,狗,狗,狗,狗]該特征在訓練集可能有很大的作用,但在測試集無法有效的劃分樣本,因為在測試集大多是一樣的取值。在這種情況下,我第一個想法是在用Overlap Rate篩選過后,再計算測試集的信息熵(在決策樹中我們提到過,信息熵更大代表著可以更好的對樣本進行劃分)。今天發現有個更好的end-to-end的方法,那就是KL散度。
KL 散度是一種衡量兩個概率分布的匹配程度的指標,兩個分布差異越大,KL散度越大。注意如果要查看測試集特征是否與訓練集相同,P代表訓練集,Q代表測試集,這個公式對于P和Q并不是對稱的。
四、KDE 核密度估計
KDE核密度估計,看起來好像是統計學里面一個高端的非參數估計方法。我簡單的理解下哈,大概就是通過一個核函數把一個頻率分布直方圖搞成平滑的了。具體核函數是啥,問就是不知道,我不是學統計的,自己看看叭。
我一般都是這么用的,從seaborn中找到KDE plot這個方法,然后把測試集和訓練集的特征畫出來,看看圖像不像,不像的直接扔了就行/敷衍。
>>> import numpy as np; np.random.seed(10) >>> import seaborn as sns; sns.set(color_codes=True) >>> mean, cov = [0, 2], [(1, .5), (.5, 1)] >>> x, y = np.random.multivariate_normal(mean, cov, size=50).T >>> ax = sns.kdeplot(x)五、機器學習模型檢測
然后就是這個月我從Kaggle了解的一個驚為天人的方法,聽完我就驚了,用機器學習模型檢測分布是否一致。
中心思想就是使用特征訓練模型來分辨測試集與測試集,若模型效果好的話代表訓練集和測試集存在較大差異,否則代表訓練集和測試集分布比較相似。
具體做法是構建一個二分類模型,對train-set打上0,測試集打上1,然后shuffle一下進行訓練,若分類效果好,代表訓練集和測試集區分度很高,那么分布差異就較大。
我感覺它最大的價值是,針對不同的模型檢測分布會得到不同的效果,在實踐中由于選定了預測模型,它對于某個特定場景的適應效果應該比常規的檢測方法好很多。
由此延申出來,我們用訓練好的二分類模型對訓練集進行預測,然后輸出預測概率,根據這個概率為訓練集設置權重(概率越接近1代表訓練集分布更接近測試集),這樣就可以強行過擬合到測試集上!對于非線上測試型的數據挖掘比賽應該會有比較大的提升!
六、參考
為什么要同分布:https://zhuanlan.zhihu.com/p/52530189
KS檢驗:https://www.cnblogs.com/arkenstone/p/5496761.html
Scipy KS檢驗:https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.stats.ks_2samp.html
離散變量編碼:https://zhuanlan.zhihu.com/p/87203369
特征重合率:?https://zhuanlan.zhihu.com/p/82435050
KDE:https://blog.csdn.net/pipisorry/article/details/53635895
KDE Drawer:http://seaborn.pydata.org/generated/seaborn.kdeplot.html
Kaggle Adversarial validation:?https://www.kaggle.com/kevinbonnes/adversarial-validation
總結
以上是生活随笔為你收集整理的【机器学习基础】5种数据同分布的检测方法!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】装上后这 14 个插件后
- 下一篇: 【学术相关】研究生通常都有怎样的作息时间