Python實現8種常用抽樣方法
今天來和大傢聊聊抽樣的幾種常用方法,以及在Python
中是如何實現的。
抽樣是統計學、機器學習中非常重要,也是經常用到的方法,因為大多時候使用全量數據是不現實的,或者根本無法取到。所以我們需要抽樣,比如在推斷性統計中,我們會經常通過采樣的樣本數據來推斷估計總體的樣本。
上面所說的都是以概率為基礎的,實際上還有一類非概率的抽樣方法,因此總體上歸納為兩大種類:
概率抽樣:根據概率理論選擇樣本,每個樣本有相同的概率被選中。
非概率抽樣:根據非隨機的標準選擇樣本,並不是每個樣本都有機會被選中。
概率抽樣技術
1.隨機抽樣(Random Sampling)
這也是最簡單暴力的一種抽樣瞭,就是直接隨機抽取,不考慮任何因素,完全看概率。並且在隨機抽樣下,總體中的每條樣本被選中的概率相等。
比如,現有10000條樣本,且各自有序號對應的,假如抽樣數量為1000,那我就直接從1-10000的數字中隨機抽取1000個,被選中序號所對應的樣本就被選出來瞭。
在Python
中,我們可以用random
函數隨機生成數字。下面就是從100個人中隨機選出5個。
import random population = 100 data = range(population) print(random.sample(data,5)) > 4, 19, 82, 45, 41
2.分層抽樣(Stratified Sampling)
分層抽樣其實也是隨機抽取,不過要加上一個前提條件瞭。在分層抽樣下,會根據一些共同屬性將帶抽樣樣本分組,然後從這些分組中單獨再隨機抽樣。
因此,可以說分層抽樣是更精細化的隨機抽樣,它要保持與總體群體中相同的比例。 比如,機器學習分類標簽中的類標簽0和1,比例為3:7,為保持原有比例,那就可以分層抽樣,按照每個分組單獨隨機抽樣。
Python
中我們通過train_test_split
設置stratify
參數即可完成分層操作。
from sklearn.model_selection import train_test_split stratified_sample, _ = train_test_split(population, test_size=0.9, stratify=population[['label']]) print (stratified_sample)
3.聚類抽樣(Cluster Sampling)
聚類抽樣,也叫整群抽樣。它的意思是,先將整個總體劃分為多個子群體,這些子群體中的每一個都具有與總體相似的特征。也就是說它不對個體進行抽樣,而是隨機選擇整個子群體。
用Python
可以先給聚類的群體分配聚類ID,然後隨機抽取兩個子群體,再找到相對應的樣本值即可,如下。
import numpy as np clusters=5 pop_size = 100 sample_clusters=2 # 間隔為 20, 從 1 到 5 依次分配集群100個樣本的聚類 ID,這一步已經假設聚類完成 cluster_ids = np.repeat([range(1,clusters+1)], pop_size/clusters) # 隨機選出兩個聚類的 ID cluster_to_select = random.sample(set(cluster_ids), sample_clusters) # 提取聚類 ID 對應的樣本 indexes = [i for i, x in enumerate(cluster_ids) if x in cluster_to_select] # 提取樣本序號對應的樣本值 cluster_associated_elements = [el for idx, el in enumerate(range(1, 101)) if idx in indexes] print (cluster_associated_elements)
4.系統抽樣(Systematic Sampling)
系統抽樣是以預定的規則間隔(基本上是固定的和周期性的間隔)從總體中抽樣。比如,每 9 個元素抽取一下。一般來說,這種抽樣方法往往比普通隨機抽樣方法更有效。
下圖是按順序對每 9 個元素進行一次采樣,然後重復下去。
用Python
實現的話可以直接在循環體中設置step
即可。
population = 100 step = 5 sample = [element for element in range(1, population, step)] print (sample)
5.多級采樣(Multistage sampling)
在多階段采樣下,我們將多個采樣方法一個接一個地連接在一起。比如,在第一階段,可以使用聚類抽樣從總體中選擇集群,然後第二階段再進行隨機抽樣,從每個集群中選擇元素以形成最終集合。
Python
代碼復用瞭上面聚類抽樣,隻是在最後一步再進行隨機抽樣即可。
import numpy as np clusters=5 pop_size = 100 sample_clusters=2 sample_size=5 # 間隔為 20, 從 1 到 5 依次分配集群100個樣本的聚類 ID,這一步已經假設聚類完成 cluster_ids = np.repeat([range(1,clusters+1)], pop_size/clusters) # 隨機選出兩個聚類的 ID cluster_to_select = random.sample(set(cluster_ids), sample_clusters) # 提取聚類 ID 對應的樣本 indexes = [i for i, x in enumerate(cluster_ids) if x in cluster_to_select] # 提取樣本序號對應的樣本值 cluster_associated_elements = [el for idx, el in enumerate(range(1, 101)) if idx in indexes] # 再從聚類樣本裡隨機抽取樣本 print (random.sample(cluster_associated_elements, sample_size))
非概率抽樣技術
非概率抽樣,毫無疑問就是不考慮概率的方式瞭,很多情況下是有條件的選擇。因此,對於無隨機性我們是無法通過統計概率和編程來實現的。這裡也介紹3種方法。
1.簡單采樣(convenience sampling)
簡單采樣,其實就是研究人員隻選擇最容易參與和最有機會參與研究的個體。比如下面的圖中,藍點是研究人員,橙色點則是藍色點附近最容易接近的人群。
2.自願抽樣(Voluntary Sampling)
自願抽樣下,感興趣的人通常通過填寫某種調查表格形式自行參與的。所以,這種情況中,調查的研究人員是沒有權利選擇任何個體的,全憑群體的自願報名。比如下圖中藍點是研究人員,橙色的是自願同意參與研究的個體。
3.雪球抽樣(Snowball Sampling)
雪球抽樣是說,最終集合是通過其他參與者選擇的,即研究人員要求其他已知聯系人尋找願意參與研究的人。比如下圖中藍點是研究人員,橙色的是已知聯系人,黃色是是橙色點周圍的其它聯系人。
總結
以上就是8種常用抽樣方法,平時工作中比較常用的還是概率類抽樣方法,因為沒有隨機性我們是無法通過統計學和編程完成自動化操作的。
比如在信貸的風控樣本設計時,就需要從樣本窗口通過概率進行抽樣。因為采樣的質量基本就決定瞭你模型的上限瞭,所以在抽樣時會考慮很多問題,如樣本數量、是否有顯著性、樣本穿越等等。在這時,一個良好的抽樣方法是至關重要的。
到此這篇關於Python實現8種常用抽樣方法的文章就介紹到這瞭,更多相關Python 抽樣方法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 淺析Python中的隨機采樣和概率分佈
- 如何用 Python 處理不平衡數據集
- R語言隨機抽樣詳解
- Python集成學習之Blending算法詳解
- python中k-means和k-means++原理及實現