分層抽樣原理及Oracle實現

2021-08-22 02:27:57 字數 1599 閱讀 6917

在實際的資料探勘應用中,我們往往會從各方收集很多的資料,這些資料每分每秒都在增加,但我們如果用所有的這些資料並無益處。一是資料量過大,處理起來難度會大非常多,要求你的基礎計算平台效能很好,甚至需要用到平行計算,有時是沒有必要的;二是資料都是基於人及人的行為所產生的影響的,而人是會發生變化的,所以久遠的資料我們可能用不到;三是建模的過程並不一定都是在內部進行,可能會與別的部門或公司合作,選擇全部資料對於合作方式會產生不利影響。所以,我們常常需要對資料進行抽樣。

那麼抽樣的方法也有很多種,隨機抽樣、分層抽樣、系統抽樣、整群抽樣等。隨機抽樣當然就是在整體中隨機抽取一定比例的樣本;系統抽樣是將總體樣本按照某順序分成n個分組後,從第一部分隨機抽取第k個樣本,並依次抽取之後每個部分的第k個樣本組成樣本空間;整群抽樣是根據樣本的聚類結果,抽取其中某些類的所有樣本進行分析,適合樣本間特徵相差較大的時候,分群進行建模或分析;分層抽樣則是將樣本按照某個特徵分為多個類別,在每個類別中進行隨機抽樣,最後再組合成新的樣本。這裡我們只詳細討論分層抽樣。

分層抽樣最適合用於樣本不均衡的情況,說句老實話,這樣的情況在實際應用中是非常非常廣泛的,比如你的分類結果是好客戶和壞客戶,又或者你的分類結果是**使用者使用優惠券的概率,在這些情況下,壞客戶比例必然遠低於好客戶比例,而很多優惠券的使用概率也是要遠低於不使用概率的。

假設原始樣本中正樣本有9000個,負樣本有1000個,如果直接進行比例為50%的隨機抽樣,並劃分訓練集和測試集,那麼有可能抽到的正樣本和負樣本比例會發生變化,而這樣的變化會導致抽取的樣本分佈和原始樣本分佈不一致,從而導致建立的模型對原始樣本的**產生偏差。

那麼怎麼實現分層抽樣呢?我用的是oracle實現分層抽樣。假設是按照註冊時間來劃分樣本,然後在每個時間段分好壞客戶進行一定比例的隨機抽樣,或者計算好每個層需要抽取的樣本個數進行抽樣,這裡要說明一下,如果你想要固定個數的樣本,推薦第二種方法,因為用第一種方法由於小數點後面四捨五入的影響,容易造成最後取出來的樣本和你想要的樣本個數有偏差。

1. 按比例抽樣

下面的**是從時間為2023年2月的未違約客戶中隨機抽取16%的客戶,注意sample函式中的引數表示的是16%,不是1600%。

select * from tablename sample(16)

where datechar=to_char(to_date('2018-02','yyyy-mm'),'yyyy-mm') and y=0

2. 按數量抽樣

下面的**是先向時間為2023年2月的未違約客戶賦予乙個隨機數,然後根據隨機數排序,最後取前8000個。

select * from (

select * from tablename

where datechar=to_char(to_date('2018-02','yyyy-mm'),'yyyy-mm') and y=0

order

by dbms_random.value

) where rownum<=8000

只要根據需要的樣本比例和分布計算好每個層正負樣本中需要抽取的樣本比例,或者樣本個數,以上面兩種方法對各層進行隨機抽樣,最後再union這些表,就能實現分層抽樣了,so easy~

python分層抽樣 抽樣方法 分層抽樣

接著上文說,簡單隨機抽樣法和分層抽樣法的對比有過乙個經典的例子。1936年美國 文學文摘 雜誌對結果進行了調查 他們根據當時的 號碼簿及該雜誌訂戶俱樂部會員名單,郵寄一千萬份問卷調查表,約240萬份,結論是蘭登取勝,而蓋洛普也組織了抽樣調查,進行民意測試。他的 與 文學文摘 截然相反,認為羅斯福必勝...

Python實現分層抽樣

首先說明一下我的需求。result 33.txt的檔案中有一些號碼標籤及分類的標記。具體如下 中國農業銀行 銀行 招商銀行信用卡 信用卡 門窗 無關我想做的是從每乙個類標記中隨機抽出1000個標籤。如果該類標籤下的樣本數不足1000,則全部抽取。然後將抽取的結果儲存到另乙個檔案中。具體 如下 盡可能...

記錄抽取及隨機抽樣及分層抽樣

單條件抽取 bc.columns id comments title 將字元型轉成整數型 bc id bc id astype int bc comments bc comments astype int bc title bc title astype str 抽取comments大於10000的...