1. 程式人生 > >解決樣本不平衡問題的奇技淫巧 彙總

解決樣本不平衡問題的奇技淫巧 彙總

先舉一個“恐怖”的例子,直觀的感受一下樣本不平衡問題:

你根據1000個正樣本和1000個負樣本正確訓練出了一個準確率90%召回率90%的分類器,且通過實驗驗證沒有欠取樣過取樣的問題哦~完美的樣本,完美的模型,破費,你心裡暗自得意。然後模型上線,正式預測每天的未知樣本~。

開始一切都很美好,準確率召回率都很好。直到有一天,資料發生了一點變化,還是原來的資料型別和特徵,只是每天新資料中正負樣本變成了100個正樣本,10000個負樣本。注意,先前準確率90%的另一種表達是負樣本有10%的概率被誤檢為正樣本。好了,模型不變,現在誤檢的負樣本數是10000*0.1=1000個,正樣本被檢出100*0.9(召回)=90個,好了,這個時候召回率不變仍為90%,但是

新的準確率=90/(1000+90)=8.26% 。震驚嗎!?恐怖嗎!?

結論: 同一個模型僅僅是改變了驗證集的正負樣本比例,模型已經從可用退化成不可用了!!樣本不平衡問題可怕就可怕在這,往往你的模型引數,訓練,資料,特徵都是對的!能做的都做了,但你的準確率就是上不去!!絕望吧。。。。。。

問題定義:資料集中,每個類別下的樣本數目相差很大(數量級上的差距)。以下以二分類問題為例說明。

1. SMOTE(Synthetic Minority Over-sampling Technique)過取樣小樣本(擴充小類,產生新資料)
即該演算法構造的資料是新樣本,原資料集中不存在的。該基於距離度量選擇小類別下兩個或者更多的相似樣本,然後選擇其中一個樣本,並隨機選擇一定數量的鄰居樣本對選擇的那個樣本的一個屬性增加噪聲,每次處理一個屬性。這樣就構造了更多的新生資料。(優點是相當於合理地對小樣本的分類平面進行的一定程度的外擴;也相當於對小類錯分進行加權懲罰(解釋見3))


2. 欠取樣大樣本(壓縮大類,產生新資料)

設小類中有N個樣本。將大類聚類成N個簇,然後使用每個簇的中心組成大類中的N個樣本,加上小類中所有的樣本進行訓練。(優點是保留了大類在特徵空間的分佈特性,又降低了大類資料的數目)


3. 對小類錯分進行加權懲罰
對分類器的小類樣本資料增加權值,降低大類樣本的權值(這種方法其實是產生了新的資料分佈,即產生了新的資料集,譯者注),從而使得分類器將重點集中在小類樣本身上。一個具體做法就是,在訓練分類器時,若分類器將小類樣本分錯時額外增加分類器一個小類樣本分錯代價,這個額外的代價可以使得分類器更加“關心”小類樣本。如penalized-SVM和penalized-LDA演算法。
對小樣本進行過取樣(例如含L倍的重複資料),其實在計算小樣本錯分cost functions時會累加L倍的懲罰分數。


4. 分治ensemble

將大類中樣本聚類到L個聚類中,然後訓練L個分類器;每個分類器使用大類中的一個簇與所有的小類樣本進行訓練得到;最後對這L個分類器採取少數服從多數對未知類別資料進行分類,如果是連續值(預測),那麼採用平均值。


5. 分層級ensemble
使用原始資料集訓練第一個學習器L1;將L1錯分的資料集作為新的資料集訓練L2;將L1和L2分類結果不一致的資料作為資料集訓練L3;最後測試集上將三個分類器的結果彙總(結合這三個分類器,採用投票的方式來決定分類結果,因此只有當L2與L3都分類為false時,最終結果才為false,否則true。)


6. 基於異常檢測的分類

用異常檢測演算法(如高斯混合模型、聚類等)檢測得到離群點或異常點;再對這些異常點為訓練集學習一個分類器。

7. 其他...待補充。

相關推薦

解決樣本平衡問題的 彙總

先舉一個“恐怖”的例子,直觀的感受一下樣本不平衡問題: 你根據1000個正樣本和1000個負樣本正確訓練出了一個準確率90%召回率90%的分類器,且通過實驗驗證沒有欠取樣過取樣的問題哦~完美的樣本,完美的模型,破費,你心裡暗自得意。然後模型上線,正式預測每天的未知樣本~。

Vue.js 你知道的

自己先想一分鐘。       關於上面的面試題的具體解釋,請移步這裡,本文不在累述。正文開始,下面列舉的一些奇技淫巧有的或許你用過,有的或許你沒用過。不管有的沒的,希望你看完之後有所收穫吧。文筆和知識有限,不對的地方,請留言斧正! 給 prop

那些你可能知道的視訊下載

之前已經寫過好幾篇的奇技淫巧系列了,今天說說怎麼快速下載視訊。 我平常經常看視訊的網站就是愛奇藝,b站,微博,知乎,網易這些。

關於字符串和文件流的

童鞋 err pen spa 關於 文件大小 ood c_str 64bit 早早起來,發一篇來概括一下昨天晚上搞到深夜才學到的一些字符串和文件流的簡單操作。 (寫在前面:以下所有的文件流都以輸入文件流為例,另外這種文件讀寫方式與競賽時使用的有較大差別,NOIP黨裏C++剛

Mysql數據閃回的(binlog2sql)

mysql binlog2sql 一、概述binlog2sql是一個開源項目,應用於大眾點評線上環境。類似於ORACLE中的閃回功能,binlog2sql可以基於時間點或者位置偏移量進行數據恢復。從MySQL binlog解析出你要的SQL。根據不同選項,你可以得到原始SQL、回滾SQL、去除主鍵的I

CSS布局:各種居中

設置 ybds orm 必須 解決 html prim 分享 post CSS布局奇技淫巧:各種居中 2017-08-23 無雙 前端開發 作者:無雙 鏈接:www.cnblogs.com/2050/p/3392803.html 居中是我們使用css來布局時常

黑暗中的生物:利用快活生存

not 正在 ever reading 自己的 which cat 世界 round 今日導讀 如果讓你在伸手不見五指的黑暗當中生存,你能熬過幾天呢?而大千世界,無奇不有。在很多你不知道的角落,有些生物在完全黑暗的世界裏不僅活得相當快活,還進化出了各種令人瞠目結舌的驚奇技能

C#開發一:調試windows系統服務

選項 nbsp 調試 方法 href info bubuko 系統 .html 原文:C#開發奇技淫巧一:調試windows系統服務windows系統服務不能直接運行,只能在安裝完服務之後啟動、暫停、繼續、停止服務,導致服務的調試不能使用一般的斷點調試。 要調試系統服務,

C#開發二:根據dll文件加載C++或者Delphi插件

man int cnblogs 需要 pat method msg initial 函數指針 原文:C#開發奇技淫巧二:根據dll文件加載C++或者Delphi插件 這兩天忙著把框架改為支持加載C++和Delphi的插件,來不及更新blog了。 原來的

javascript 向下取整

mat asc floor math 轉化 java 目的 奇技淫巧 移位運算 let a=5/4|0 輸出a=1 利用了javascript在進行位運算前,先把浮點數轉化為整數的特性。 同理,也可以用移位運算,達到同樣目的 let a =5/4<

」博客園頁面美化(差不多是劃水

http 沒有 博客 -- erl text 頁面 ash spa 何為頁面美化?永遠沒有止境的亂搞也。 ——hzz 教材: 博客園美化

C的

如果 %s def 完全 逆序 函數 遞歸實現 -s r+ 直接上代碼: (1).交換兩參數的值 #include <stdio.h>int main(){    int a = 10,b = 5;    a^=b^=a^=b;  

CF1063A Oh Those Palindromes

傳送門(當然上洛咕能搜到) 求指定字串最多回文子串個數 Ssy太強了... 學到一個新東西 就是如果一個字元有x個 那麼它能產生的最多的迴文串個數為C(x,2) 可以理解為選擇兩個字母作為邊界 然後發現 如果所有一樣的字母全都拼在一起 那麼總個數就是C(x,2) 所以答案就是一樣的放一起就OK

java的--意外行為與特性(譯文)

Java是一種非常成熟的程式語言 - 事實上,它已經走過21年了,如果它是一個人,它可以在美國隨便混!隨著年齡的增長,智慧也在增長,而至少有時候,有些東西會變得很怪異。在本文中,我將介Java語言的一些奇技淫巧的行為和特徵。 在這裡,沒有特別的順序去介紹一系列Java的奇技淫巧,僅供娛樂,或者你向朋友們推介

Noip前的大抱佛腳----

STL函式 set set查詢前驅後繼 multiset<int>::iterator iter; S.insert(x); iter=S.find(x);//返回迭代器 iter--;//前驅 int ans=*iter; S.erase(find(x)); return ans; 或者

那些

1.交換兩個變數的值。 分析:常用的做法是新增第三個變數來作為中介完成,這裡分享一個不太常用的做法: 變數為字串時: $a = "hello"; $b = "php"; list($a,$b) = array($b,$a); 或者: $a = $a.$b; $b = strlen(

Puppet的一些

puppet這個工具真的很神奇,先不說商業版有哪些黑科技,單是開源版本就有很多可能讓你摸不著頭腦的地方,下面來列舉一下puppet是怎麼查詢puppet server的 其實很簡單,puppet agent只要知道puppet是什麼就可以了,你可以將“puppet”寫在

C++ 進階筆記:一些庫函式……還有一些

一、奇技淫巧 1.取帶小數的餘數 (1)“整除”取餘法 #include<iostream> using namespace std; void main() { float a = 362.75; int b = 360; float aMod= a - ((i

Python之將你的女神照片變成字元畫!女朋友就答應嘿嘿

這次不寫爬蟲,來看看如何利用Python強大的影象處理庫將女神照片轉換成字元畫。下面有請重量級女神如花登場:       那清秀的面龐,水靈的雙眸,俏皮的雙馬尾,粉撲撲的髮卡,性感的鬍鬚還有略帶羞意的摳鼻動作,滿足了童年的我對美的無線遐想。就連背後

【深入淺出jQuery】原始碼淺析2--

原文:http://www.cnblogs.com/coco1s/p/5303041.html 最近一直在研讀 jQuery 原始碼,初看原始碼一頭霧水毫無頭緒,真正靜下心來細看寫的真是精妙,讓你感嘆程式碼之美。 其結構明晰,高內聚、低耦合,兼具優秀的效能與便利的擴充套件性,在瀏覽器的相容性