提分策略:數(shù)據(jù)采樣方法最全總結(jié)!
采樣策略匯總

背景

數(shù)據(jù)采樣很多人都聽過,書上亦或是博客上面,但并不是每個人在實踐中都會用到,按實踐經(jīng)驗來講,原始數(shù)據(jù)包含了所有的信息,我們隨意增加數(shù)據(jù)亦或者是刪除數(shù)據(jù),完全是沒有必要的操作。那為什么要采樣?又有哪些采樣策略?這些策略又大概能帶來什么幫助呢?怎么做?需要注意什么?本文對數(shù)據(jù)采樣做個簡單的匯總。有些是個人理解(例如偽標簽等),可能存在些許小的爭議,大家按自己理解參考融入自己知識體系即可。

采樣策略匯總


1.隨機降采樣

常見使用場景

2.模型訓練驗證:在很多問題中我們的數(shù)據(jù)量是巨大的,例如搜索推薦等問題,我們的用戶數(shù)都是上億的,這個時候我們的數(shù)據(jù)動則上幾十億,做完特征之后可能都會上PB級別,這個時候如果還是采用全量數(shù)據(jù)訓練的話,那么可能一個模型需要一周甚至更久才會看到效果,這樣的迭代速度往往是不能接受的,所以我們需要不斷的采樣,在保證我們線下有提升的同時線上全量時也有提升;
操作
直接隨機sample,亦或是直接截取topN%的數(shù)據(jù)。
注意
模型訓練預測時,先做特征再采樣再集成。

2.Tomek Links采樣


模型訓練:該方法一般個人很少在數(shù)據(jù)分析時使用,往往是在模型訓練的時候,Tomek Links會將決策邊界附近的樣本剔除,整理出一個看上去更加易于分割的決策邊界。在模型訓練的時候有嘗試過,效果略有下降,有興趣的朋友可以自己嘗試一下。
操作
python的imblearn中有TomekLinks采樣。
注意
無

3.基于聚類中心的采樣


數(shù)據(jù)分析:該方法思路很簡單,就是先聚類然后用聚類中心作為采樣的點代表整個類中的樣本,比如100個樣本聚類成了10個,那么就可以用10個點來代表這100個樣本,從而達到降采樣的作用。一般用作數(shù)據(jù)分析可視化相對較好,用于模型訓練可能效果會差一些。
操作
python的imblearn中有ClusterCentroids采樣。
注意
無

4.時間序列采樣


時間驗證分析:幾乎所有涉及到時間的問題,例如推薦問題,銷量預測,流量預測等問題在線下驗證的時候都需要按照時間順序進行劃分,因為存在較強的時間關系,如果使用未來的信息肯定會導致穿越問題,帶來線上線下不一致,導致所有線下的實驗都是白努力。所以如果應用在工業(yè)實踐中,必須在做任何特征工程之前就將數(shù)據(jù)進行拆分,然后再進行特征建模。
操作
直接按照某個特定的時間軸進行切分即可,選擇python里面也有TimeSeriesSplit等函數(shù)。
注意
某些特殊節(jié)假日等數(shù)據(jù)考慮剔除最好。

5.分組采樣


防止穿越:也可以認為是防止穿越的一種,例如我們用戶一次在一個頁面中只會點擊一個商品,而如果我們隨機采樣線下訓練驗證的話,就會出現(xiàn)一個頁面中的不同item被分配到訓練集和驗證集中,這個時候我們只要發(fā)現(xiàn)訓練集中的item有被點擊的情況,那么在驗證集中的樣本肯定就是沒有點擊的,而這明顯是出現(xiàn)了穿越,出現(xiàn)了我們的驗證分數(shù)虛高的情況,所以此時按照頁面進行分組采樣時更好更靠譜的選擇。
操作
目前python的采樣策略中已經(jīng)有現(xiàn)成的分組采樣包GroupKFold,直接調(diào)用即可。
注意
無

6.分層采樣


數(shù)據(jù)驗證:舉個例子,訓練集合有三個城鎮(zhèn)的數(shù)據(jù),A城鎮(zhèn)有100萬樣本,B城鎮(zhèn)有10萬樣本,C城鎮(zhèn)有1萬樣本,測試集的比例類似。這個時候我們需要對其進行分析驗證,如果隨機采樣訓練驗證,會出現(xiàn)我們把C城鎮(zhèn)的樣本全部采樣到了訓練集合里面,那么此時我們的驗證的分數(shù)和測試的分數(shù)相差較大,而且五折的時候因為采樣的問題折折的gap也不是很穩(wěn)定。這個時候分層采樣就十分重要了。
操作
目前python的采樣策略中已經(jīng)有現(xiàn)成的分層采樣包,直接調(diào)用即可。
注意
無

7.簡單過采樣


常見使用場景
類別不平衡:過采樣一般出現(xiàn)在類別不平衡問題中,對label較少的樣本進行過采樣,用來降低過擬合的風險。操作
很簡單,直接random一定比例拷貝即可。
注意
過采樣不同的比例訓練模型預測再進行集成往往效果更好。

8.SMOTE過采樣


常見使用場景
操作
目前python自帶SMOTE函數(shù),直接調(diào)用即可。
注意
無

9.翻轉(zhuǎn)裁剪等數(shù)字圖像處理常見方案


數(shù)字圖像處理:這是一種數(shù)據(jù)擴充的方案,通過翻轉(zhuǎn),裁剪等操作來處理圖片從而擴充數(shù)據(jù)樣本。
操作
目前python里面處理圖像的函數(shù)中一般都自帶。
注意
無

10.GAN生成對抗樣本



11.人工采樣or外部數(shù)據(jù)

常見使用場景
可以拿到相關數(shù)據(jù)的所有場景?,F(xiàn)在有很多數(shù)據(jù)是可以通過外部數(shù)據(jù)得到的,比如很多標注圖片,還有一些數(shù)據(jù)是可以通過人工進行收集的,比如一些手機的行為等數(shù)據(jù)。
操作
上網(wǎng)或者自行收集。
注意
無

12.偽標簽


常見使用場景
幾乎所有場景:偽標簽技術其實是一種半監(jiān)督技術,它用在訓練集合上訓練好的模型對測試集進行預測,然后選取測試集高置信度的樣本加入到訓練集中,也類似于數(shù)據(jù)擴充了,所以我把它加入進來,僅供參考。操作
參見之前的偽標簽技術。
注意
可多輪迭代,需要微調(diào)置信度。

參考文獻

Strategies for Addressing Class Imbalance:https://medium.com/@ODSC/strategies-for-addressing-class-imbalance-5b31b73f7b6f The 5 Sampling Algorithms every Data Scientist need to know:https://towardsdatascience.com/the-5-sampling-algorithms-every-data-scientist-need-to-know-43c7bc11d17c https://scikit-learn.org/stable/modules/classes.html#module-sklearn.model_selection Tackling Class imbalance:https://www.kaggle.com/shahules/tackling-class-imbalance Learning from Imbalanced Classes:https://www.svds.com/learning-imbalanced-classes/ Dealing with Imbalance Data:https://medium.com/@patiladitya81295/dealing-with-imbalance-data-1bacc7d68dff Resampling strategies for imbalanced datasets:https://www.kaggle.com/rafjaa/resampling-strategies-for-imbalanced-datasets
