主要是記錄一些採樣方面的知識。參考來源如下:
https://blog.csdn.net/fengying2016/article/details/80593266
https://www.cnblogs.com/xinzhihao/p/11289108.html
爲什麼要採樣?
從概率論的角度來解釋機器學習,就是我們的模型是學習了樣本的概率分佈,我們認爲我們的目標都遵從這個概率分佈從而能有效的進行分類或者預測。但是對於我們已有的數據來說,一次性採樣得到的數據可能非常的龐大(相對於建立的模型來說會花費特別多的資源),也有可能比較小(小樣本問題)。
討論大樣本的問題,這時候我們沒法也沒有必要對所有的數據進行擬合,我們可以利用採樣的方式,從原始的數據集構造出一個訓練集,然後用剩下的部分作爲測試集。
所以問題就是,在已知數據概率分佈的情況下,如何對數據進行採樣。這裏有一道阿里的面試題:
一道編程題,現在有包含很多個樣本數據的數組,現在對這些數進行多次有放回採樣,但每個數都有自己的採樣概率,這個概率存在另外一個數組裏面,總概率是1,問怎麼實現這個採樣過程。
常見的採樣算法
一、逆變換採樣
逆變換法殘生隨機數的步驟:
Len = 1000000;
u = rand(1,Len);
lemda = 2;
x = -1/lemda*(log(1-u));
二、拒絕採樣(Rejection Samping)
其採樣過程如下:
三、重要性採樣
四、馬科夫蒙特卡洛採樣法
失衡樣本採樣
我們在實際的建模中總會遇到很多失衡的數據集,比如點擊率模型、營銷模型、反欺詐模型等等,往往壞樣本(or好樣本)的佔比才千分之幾。雖然目前有些機器學習算法會解決失衡問題,比如XGBoost,但是很多時候還是需要我們去根據業務實際情況,對數據進行採樣處理,主要還是分兩種方式:
過採樣(over-sampling):從佔比較少的那一類樣本中重複隨機抽樣,使得最終樣本的目標類別不太失衡;
欠採樣(under-sampling):從佔比較多的那一類樣本中隨機抽取部分樣本,使得最終樣本的目標類別不太失衡;
科學家們根據上述兩類,衍生出了很多方法,如下:
一、過採樣類
1、 Random Oversampling
從樣本少的類別隨機抽樣進行擴充,但是大部分情況會造成過擬合
2、SMOTE
在少數類樣本之間通過插值操作來產生額外的樣本。
對於一個少數類樣本,使用K-Mean法(K值需要人工確定)求出距離。距離最近的k個少數類樣本,其中距離定義爲樣本之間n維特徵空間的歐式距離,然後從k個樣本點中隨機抽取一個,使用下面的公式生成新的樣本點:
但是,SMOTE算法也是有缺點的:
(1)如果選取的少數類樣本週圍都是少數類樣本,那麼新合成的樣本可能不會提供太多有用的信息;
(2)如果選取的少數類樣本週圍都是多數類樣本,那麼這可能會是噪聲,也無法提升分類效果。
其實,最好的新樣本最好是在兩個類別的邊界附近,這樣子最有利於分類,所以下面介紹一個新算法——Border-Line SMOTE。
3、Border-Line SMOTE
這個算法一開始會先將少數類樣本分成3類,分別DANGER、SAFE、NOISE,如下圖:
而Border-line SMOTE算法只會在“DANGER”狀態的少數類樣本中去隨機選擇,然後利用SMOTE算法產生新樣本。
二、降採樣類
- Random Undersampling
這類也是比較簡單的,就是隨機從多數類中刪除一些樣本,這樣子的缺失也是很明顯,那就是造成部分信息丟失,整體模型分類效果不理想。
- EasyEnsemble 和 BalanceCascade
這兩個算法放在一起的原因是因爲都用到了集成思想來處理隨機欠採樣的信息丟失問題。
-
EasyEnsemble :將多數類樣本隨機劃分成n份,每份的數據等於少數類樣本的數量,然後對這n份數據分別訓練模型,最後集成模型結果。
-
BalanceCascade:這類算法採用了有監督結合boosting的方式,在每一輪中,也是從多數類中抽取子集與少數類結合起來訓練模型,然後下一輪中丟棄此輪被正確分類的樣本,使得後續的基學習器能夠更加關注那些被分類錯誤的樣本。
-
NearMiss
NearMiss本質上是一種原型選擇(prototype selection)方法,即從多數類樣本中選取最具代表性的樣本用於訓練,主要是爲了緩解隨機欠採樣中的信息丟失問題。NearMiss採用一些啓發式的規則來選擇樣本,根據規則的不同可分爲3類:
NearMiss-1: 選擇到最近的K個少數類樣本平均距離最近的多數類樣本
NearMiss-2: 選擇到最遠的K個少數類樣本平均距離最近的多數類樣本
NearMiss-3: 對於每個少數類樣本選擇K個最近的多數類樣本,目的是保證每個少數類樣本都被多數類樣本包圍
NearMiss-1和NearMiss-2的計算開銷很大,因爲需要計算每個多類別樣本的K近鄰點。另外,NearMiss-1易受離羣點的影響,如下面第二幅圖中合理的情況是處於邊界附近的多數類樣本會被選中,然而由於右下方一些少數類離羣點的存在,其附近的多數類樣本就被選擇了。相比之下NearMiss-2和NearMiss-3不易產生這方面的問題。
隨機數的一些問題
一、10%生成0,90%生成1.均勻生成0和1的rand2()
解決:生成01的概率和生成10的概率相等,將01作爲0輸出,10作爲1輸出,可以得到均勻的rand2()
二、任意範圍的隨機數生成randn()
1、有了均勻的0和1可以通過生成二進制數的方式生成任意數。
2、
rand7() -> rand5() 均勻生成0-6,篩出大於5的數得到均勻的0-4
rand5() -> rand7() 生成rand5()*2 + rand()5 //均勻生成0-15
篩除大於13的得到均勻的0-13,對7求餘生成均勻的0-6;
三、按概率生成,a=5/17,b=3/17,c=6/17,d=2/17
1、就是擴充數據,構成五個a,三個b。。。然後隨機1-17的隨機數進行採樣
2、作比較,
生成均勻分佈的氛圍爲0-17的隨機數。0-5/17爲a, 5/17-8/17爲b,以此類推
每次採樣查詢logN次
數據集的劃分
對於得到的數據,我們分爲訓練集(train),測試集(test)和驗證集(validation)。
不管哪一種方式,測試集是不會參與到訓練當中的。
一、按比例劃分
按照一定的比例,例如訓練集,驗證集,測試集按照7:2:1或者5:3:2等比例進行劃分
二、N折交叉驗證
1、除了測試集外的數據平均分爲N份(採樣成N份等其他方式)。
2、選擇其中一份作爲驗證集,其他作爲訓練集進行模型訓練,最後在測試集中得到模型的精度。
3、將2重複N次,求平均精度作爲此時模型的精度。
4、修改模型超參數,重複1-3.
N折交叉驗證一般用作超參數調整,學習率、正則化等等。