SVM 處理不平衡數據
https://stats.stackexchange.com/questions/94295/svm-for-unbalanced-data
https://stats.stackexchange.com/questions/41190/libsvm-for-unbalanced-data
在分類中如何處理訓練集中不平衡問題
http://blog.csdn.net/heyongluoyao8/article/details/49408131
在很多機器學習任務中,訓練集中可能會存在某個或某些類別下的樣本數遠大於另一些類別下的樣本數目。即類別不平衡,為了使得學習達到更好的效果,因此需要解決該類別不平衡問題。
Jason Brownlee的回答:
原文標題:8 Tactics to Combat Imbalanced Classes in Your Machine Learning Dataset
當你在對一個類別不均衡的數據集進行分類時得到了90%的准確度(Accuracy)。當你進一步分析發現,數據集的90%的樣本是屬於同一個類,並且分類器將所有的樣本都分類為該類。在這種情況下,顯然該分類器是無效的。並且這種無效是由於訓練集中類別不均衡而導致的。
首先舉幾個所收到的郵件中關於類別不均衡的例子:
- 在一個二分類問題中,訓練集中class 1的樣本數比class 2的樣本數是60:1。使用邏輯回歸進行分類,最后結果是其忽略了class 2,即其將所有的訓練樣本都分類為class 1。
- 在分類任務的數據集中,有三個類別,分別為A,B,C。在訓練集中,A類的樣本占70%,B類的樣本占25%,C類的樣本占5%。最后我的分類器對類A的樣本過擬合了,而對其它兩個類別的樣本欠擬合。
什么是類別不均衡問題
類別數據不均衡是分類任務中一個典型的存在的問題。簡而言之,即數據集中,每個類別下的樣本數目相差很大。例如,在一個二分類問題中,共有100個樣本(100行數據,每一行數據為一個樣本的表征),其中80個樣本屬於class 1,其余的20個樣本屬於class 2,class 1:class2=80:20=4:1,這便屬於類別不均衡。當然,類別不均衡問同樣會發生在多分類任務中。它們的解決方法是一樣的。因此,為了便於討論與理解,我們從二分類任務入手進行講解。
類別不均衡問題是現實中很常見的問題
大部分分類任務中,各類別下的數據個數基本上不可能完全相等,但是一點點差異是不會產生任何影響與問題的。
在現實中有很多類別不均衡問題,它是常見的,並且也是合理的,符合人們期望的。如,在欺詐交易識別中,屬於欺詐交易的應該是很少部分,即絕大部分交易是正常的,只有極少部分的交易屬於欺詐交易。這就是一個正常的類別不均衡問題。又如,在客戶流失的數據集中,絕大部分的客戶是會繼續享受其服務的(非流失對象),只有極少數部分的客戶不會再繼續享受其服務(流失對象)。一般而已,如果類別不平衡比例超過4:1,那么其分類器會大大地因為數據不平衡性而無法滿足分類要求的。因此在構建分類模型之前,需要對分類不均衡性問題進行處理。
在前面,我們使用准確度這個指標來評價分類質量,可以看出,在類別不均衡時,准確度這個評價指標並不能work。因為分類器將所有的樣本都分類到大類下面時,該指標值仍然會很高。即,該分類器偏向了大類這個類別的數據。
八大解決方法
- 可以擴大數據集嗎?
當遇到類別不均衡問題時,首先應該想到,是否可能再增加數據(一定要有小類樣本數據),更多的數據往往戰勝更好的算法。因為機器學習是使用現有的數據多整個數據的分布進行估計,因此更多的數據往往能夠得到更多的分布信息,以及更好分布估計。即使再增加小類樣本數據時,又增加了大類樣本數據,也可以使用放棄一部分大類數據(即對大類數據進行欠采樣)來解決。 -
嘗試其它評價指標
從前面的分析可以看出,准確度這個評價指標在類別不均衡的分類任務中並不能work,甚至進行誤導(分類器不work,但是從這個指標來看,該分類器有着很好的評價指標得分)。因此在類別不均衡分類任務中,需要使用更有說服力的評價指標來對分類器進行評價。如何對不同的問題選擇有效的評價指標參見這里。
上面的超鏈接中的文章,講述了如何對乳腺癌患者復發類別不均衡數據進行分類。在文中,推薦了幾個比傳統的准確度更有效的評價指標:- 混淆矩陣(Confusion Matrix):使用一個表格對分類器所預測的類別與其真實的類別的樣本統計,分別為:TP、FN、FP與TN。
- 精確度(Precision)
- 召回率(Recall)
- F1得分(F1 Score):精確度與找召回率的加權平均。
特別是:
- Kappa (Cohen kappa)
- ROC曲線(ROC Curves):見Assessing and Comparing Classifier Performance with ROC Curves
-
對數據集進行重采樣
可以使用一些策略該減輕數據的不平衡程度。該策略便是采樣(sampling),主要有兩種采樣方法來降低數據的不平衡性。- 對小類的數據樣本進行采樣來增加小類的數據樣本個數,即過采樣(over-sampling ,采樣的個數大於該類樣本的個數)。
- 對大類的數據樣本進行采樣來減少該類數據樣本的個數,即欠采樣(under-sampling,采樣的次數少於該類樣本的個素)。
采樣算法往往很容易實現,並且其運行速度快,並且效果也不錯。更詳細的內容參見這里。
一些經驗法則:- 考慮對大類下的樣本(超過1萬、十萬甚至更多)進行欠采樣,即刪除部分樣本;
- 考慮對小類下的樣本(不足1為甚至更少)進行過采樣,即添加部分樣本的副本;
- 考慮嘗試隨機采樣與非隨機采樣兩種采樣方法;
- 考慮對各類別嘗試不同的采樣比例,比一定是1:1,有時候1:1反而不好,因為與現實情況相差甚遠;
- 考慮同時使用過采樣與欠采樣。
- 嘗試產生人工數據樣本
一種簡單的人工樣本數據產生的方法便是,對該類下的所有樣本每個屬性特征的取值空間中隨機選取一個組成新的樣本,即屬性值隨機采樣。你可以使用基於經驗對屬性值進行隨機采樣而構造新的人工樣本,或者使用類似朴素貝葉斯方法假設各屬性之間互相獨立進行采樣,這樣便可得到更多的數據,但是無法保證屬性之前的線性關系(如果本身是存在的)。
有一個系統的構造人工數據樣本的方法SMOTE(Synthetic Minority Over-sampling Technique)。SMOTE是一種過采樣算法,它構造新的小類樣本而不是產生小類中已有的樣本的副本,即該算法構造的數據是新樣本,原數據集中不存在的。該基於距離度量選擇小類別下兩個或者更多的相似樣本,然后選擇其中一個樣本,並隨機選擇一定數量的鄰居樣本對選擇的那個樣本的一個屬性增加噪聲,每次處理一個屬性。這樣就構造了更多的新生數據。具體可以參見原始論文。
這里有SMOTE算法的多個不同語言的實現版本:
- Python: UnbalancedDataset模塊提供了SMOTE算法的多種不同實現版本,以及多種重采樣算法。
- R: DMwR package。
- Weka: SMOTE supervised filter。
- 嘗試不同的分類算法
強烈建議不要對待每一個分類都使用自己喜歡而熟悉的分類算法。應該使用不同的算法對其進行比較,因為不同的算法使用於不同的任務與數據。具體可以參見“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。
決策樹往往在類別不均衡數據上表現不錯。它使用基於類變量的划分規則去創建分類樹,因此可以強制地將不同類別的樣本分開。目前流行的決策樹算法有:C4.5、C5.0、CART和Random Forest等。基於R編寫的決策樹參見這里。基於Python的Scikit-learn的CART使用參見這里。 - 嘗試對模型進行懲罰
你可以使用相同的分類算法,但是使用一個不同的角度,比如你的分類任務是識別那些小類,那么可以對分類器的小類樣本數據增加權值,降低大類樣本的權值(這種方法其實是產生了新的數據分布,即產生了新的數據集,譯者注),從而使得分類器將重點集中在小類樣本身上。一個具體做法就是,在訓練分類器時,若分類器將小類樣本分錯時額外增加分類器一個小類樣本分錯代價,這個額外的代價可以使得分類器更加“關心”小類樣本。如penalized-SVM和penalized-LDA算法。
Weka中有一個懲罰模型的通用框架CostSensitiveClassifier,它能夠對任何分類器進行封裝,並且使用一個自定義的懲罰矩陣對分錯的樣本進行懲罰。
如果你鎖定一個具體的算法時,並且無法通過使用重采樣來解決不均衡性問題而得到較差的分類結果。這樣你便可以使用懲罰模型來解決不平衡性問題。但是,設置懲罰矩陣是一個復雜的事,因此你需要根據你的任務嘗試不同的懲罰矩陣,並選取一個較好的懲罰矩陣。 - 嘗試一個新的角度理解問題
我們可以從不同於分類的角度去解決數據不均衡性問題,我們可以把那些小類的樣本作為異常點(outliers),因此該問題便轉化為異常點檢測(anomaly detection)與變化趨勢檢測問題(change detection)。
異常點檢測即是對那些罕見事件進行識別。如通過機器的部件的振動識別機器故障,又如通過系統調用序列識別惡意程序。這些事件相對於正常情況是很少見的。
變化趨勢檢測類似於異常點檢測,不同在於其通過檢測不尋常的變化趨勢來識別。如通過觀察用戶模式或銀行交易來檢測用戶行為的不尋常改變。
將小類樣本作為異常點這種思維的轉變,可以幫助考慮新的方法去分離或分類樣本。這兩種方法從不同的角度去思考,讓你嘗試新的方法去解決問題。 - 嘗試創新
仔細對你的問題進行分析與挖掘,是否可以將你的問題划分成多個更小的問題,而這些小問題更容易解決。你可以從這篇文章In classification, how do you handle an unbalanced training set?中得到靈感。例如:
- 將你的大類壓縮成小類;
- 使用One Class分類器(將小類作為異常點);
- 使用集成方式,訓練多個分類器,然后聯合這些分類器進行分類;
- ….
這些想法只是冰山一角,你可以想到更多的有趣的和有創意的想法去解決問題。更多的想法參加Reddit的文章http://www.quora.com/In-classification-how-do-you-handle-an-unbalanced-training-set。
選擇某一種方法並使用它
你不必成為一個精通所有算法的算法奇才或者一個建立准確而可靠的處理數據不平衡的模型的統計學家,你只需要根據你的問題的實際情況從上述算法或方法中去選擇一種或兩種方法去使用。希望上述的某些方法能夠解決你的問題。例如使用其它評價指標或重采樣算法速度快並且有效。
總結
記住,其實並不知道哪種方法最適合你的任務與數據,你可以使用一些啟發式規則或經驗去選擇某一個較優算法。當然最好的方法測試每一種算法,然后選擇最好的方法。最重要的是,從點滴開始做起,根據自己現有的知識,並不斷學習去一步步完善。
Further Reading…
這里有一些我認為有價值的可供參考的相關資料,讓你進一步去認識與研究數據不平衡問題:
- 相關書籍
- 相關論文
Sergey Feldman的回答:
- 設超大類中樣本的個數是極小類中樣本個數的L倍,那么在隨機梯度下降(SGD,stochastic gradient descent)算法中,每次遇到一個極小類中樣本進行訓練時,訓練L次。
- 將大類中樣本划分到L個聚類中,然后訓練L個分類器,每個分類器使用大類中的一個簇與所有的小類樣本進行訓練得到。最后對這L個分類器采取少數服從多數對未知類別數據進行分類,如果是連續值(預測),那么采用平均值。
- 設小類中有N個樣本。將大類聚類成N個簇,然后使用每個簇的中心組成大類中的N個樣本,加上小類中所有的樣本進行訓練。
- 無論你使用前面的何種方法,都對某個或某些類進行了損害。為了不進行損害,那么可以使用全部的訓練集采用多種分類方法分別建立分類器而得到多個分類器,采用投票的方式對未知類別的數據進行分類,如果是連續值(預測),那么采用平均值。
- 在最近的ICML論文中,表明增加數據量使得已知分布的訓練集的誤差增加了,即破壞了原有訓練集的分布,從而可以提高分類器的性能。這篇論文與類別不平衡問題不相關,因為它隱式地使用數學方式增加數據而使得數據集大小不變。但是,我認為破壞原有的分布是有益的。
- More details than you need: imho, the most interesting of the corrupting distributions is the blankout distribution, where you just zero out a random subset of features. Why is it interesting? Because you are helping your classifier be sturdier/hardier by giving it variations of your data that have essentially missing features. So it has to learn to classify correctly even in adverse conditions. 一個相關的想法是,在神經網絡中,隨機選擇部分隱藏層單元來繼續訓練(即,隨機去掉一部分隱藏層單元,(zeroed-out))。具體見http://web.stanford.edu/~sidaw/cgi-bin/home/lib/exe/fetch.php?media=papers:fastdropout.pdf
Kripa Chettiar的回答:
- 增加新數據,可以使用SMOTE或SMOTEBoost產生人造數據。
- 將大類壓縮。壓縮比例需要具體情況具體分析,取決於你所擁有的數據。例如,A類中有30個樣本,B類中有4000個樣本,那么你可以將B類壓縮成1000(進行采樣)。
- 可以結合1與2
- 對於那種極小類是異常點的分類任務,因此分類器需要學習到大類的決策分界面,即分類器是一個單個類分類器(One Class Classifier)。Weka中有相關的庫。
- 獲得更多的數據。
Roar Nybø的回答:
- 對小類進行過采樣。並且使用集成模式會獲得更好的效果。
Dan Levin的回答:
- 一個很好的方法去處理非平衡數據問題,並且在理論上證明了。這個方法便是由Robert E. Schapire於1990年在Machine Learning提出的”The strength of weak learnability” ,該方法是一個boosting算法,它遞歸地訓練三個弱學習器,然后將這三個弱學習器結合起形成一個強的學習器。我們可以使用這個算法的第一步去解決數據不平衡問題。
首先使用原始數據集訓練第一個學習器L1。
然后使用50%在L1學習正確和50%學習錯誤的的那些樣本訓練得到學習器L2,即從L1中學習錯誤的樣本集與學習正確的樣本集中,循環一邊采樣一個。
接着,使用L1與L2不一致的那些樣本去訓練得到學習器L3。
最后,使用投票方式作為最后輸出。
那么如何使用該算法來解決類別不平衡問題呢?
假設是一個二分類問題,大部分的樣本都是true類。讓L1輸出始終為true。使用50%在L1分類正確的與50%分類錯誤的樣本訓練得到L2,即從L1中學習錯誤的樣本集與學習正確的樣本集中,循環一邊采樣一個。因此,L2的訓練樣本是平衡的。L使用L1與L2分類不一致的那些樣本訓練得到L3,即在L2中分類為false的那些樣本。最后,結合這三個分類器,采用投票的方式來決定分類結果,因此只有當L2與L3都分類為false時,最終結果才為false,否則true。
自己已經在實踐中使用過很多次,並且效果都不錯。
Kaushik Kasi的回答:
- 對小類中的樣本進行復制以增加該類中的樣本數,但是可能會增加bias。
- 對小類中的樣本通過調整特征值來人工生成樣本,而使得該類中樣本個數增多。如在圖像中,對一幅圖像進行扭曲得到另一幅圖像,即改變了原圖像的某些特征值。但是該方法可能會產生現實中並存在的樣本。
Quora User的回答:
- 簡單快速的方法:對大類欠采樣或者對小類過采樣。
- 更有效的方法:使用代價函數學習得到每個類的權值,大類的權值小,小類的權值大。剛開始,可以設置每個類別的權值與樣本個數比例的倒數,然后可以使用過采樣進行調優。
Dayvid Victor的回答:
在類別不平衡中,以下幾個點需要注意:
- 常規的分類評價指標可能會失效,比如將所有的樣本都分類成大類,那么准確率、精確率等都會很高。這種情況下,AUC時最好的評價指標。
- 你能夠使用原型選擇技術去降低不平衡水平。選擇那些重要的樣本。One-Sided Selection (OSS) 是一個預處理技術(模型訓練之前使用),能夠處理類別不平衡問題。
- 從另一個角度,可以增加小類的樣本個數,可以使用過采樣與原型生成技術(prototype-generation techniques)。
- 在K-Fold 校驗中,每一份數據集中原則上應該保持類別樣本比例一樣或者近似,如果每份數據集中小類樣本數目過少,那么應該降低K的值,知道小類樣本的個數足夠。
一般來說,如果事前不對不平衡問題進行處理,那么對於小類別的樣本則會錯誤率很高,即大部分甚至全部小類樣本都會分錯。
Muktabh Mayank的回答:
- 這里有一個類似SVM的方法來處理不平衡問題。具體參見這里。
Sandeep Subramanian的回答:
- 使用SMOTE(Synthetic Minority Oversampling TEchnique)方法人工生成小類數據。其類似於最近鄰算法。
Quora User的回答:
- 賦予小類樣本更高的訓練權值
- 對小類進行過采樣
- 某些時候,高不平衡性下仍然可以得到效果較好的訓練結果。我認為對於某些評價指標是有意義的,如AUC。
Sumit Soman 的回答:
- 如果你使用SVM分類器進行分類,那么可以使用Twin SVM(Twin Support Vector Machines for Pattern Classification),其能夠應付類別不平衡問題。
Abhishek Ghose的回答:
原文:https://www.quora.com/In-classification-how-do-you-handle-an-unbalanced-training-set
http://blog.csdn.net/u011414200/article/details/47310795
概論
- 傳統的樣本一般是從精心設計的實驗裝置中篩選出來的,這些樣本往往滿足一定條件。
- 而我們獲得的網絡樣本、金融樣本以及生物樣本中,這些觀測樣本往往具有涌現性,且與傳統意義的樣本並不相同,大量的樣本中往往有用的樣本點卻很少。這種某類樣本的數量明顯少於其他類樣本數量的樣本集稱為不均衡樣本集
問題的本質
- 從技術角度上說,任何在不同類之間展現出不等分布的樣本集都應該被認為是不均衡的,並且應該展現出明顯的不平衡特征。具體來說,這種不均衡形式被稱為類間不均衡,常見的多數類與少數類比例是100:1,1000:1,10000:1
- 有時對少數類錯分情況的后果很嚴重,比如癌症患者被誤診為健康人。所以需要的分類器應該是在不嚴重損失多數類精度的情況下,在少數類上獲得盡可能高的精度
- 同時也暗示着使用單一的評價准則,例如全局精度或是誤差率,是不能給不均衡問題提供足夠的評價信息。因此利用含有更多信息的評價指標,例如接收機特性曲線、精度-recall曲線和代價曲線
-
樣本不均衡的程度不是阻礙分類學習的唯一因素,樣本集的復雜度也是導致分類性能惡化的重要因素,另外相對不平衡比例的增大也可能使分類性能進一步惡化 。其中樣本集復雜度是廣義的術語,它包括重疊、缺少代表性樣本、類別間分離程度小等
-
一個簡單的例子,考慮到上圖中,三角和空心圓分別代表少數類和多數類,通過檢測,我們發現(a),(b)中的分布都是相對不均衡的,但是(a)中類間沒有重疊的樣本,且每一類只有一個聚類。而在(b)中既有多個聚類還有重疊的樣本,其中的子集(聚類)C也許不會被分類器學習,這是因為它缺乏具有代表性的樣本
- 由目標樣本稀少導致的不均衡問題,所關注的目標類(少數類)很少,即類間的不均衡。此外,少數類樣本集中也許還包含一個少數有限樣本的子集(分離項),稱之為類內的不均衡。小分離項存在導致分類性能大大地下降
符號定義
為了清晰的表述,首先定義一些用於描述不均衡樣本分類的一些概念,考慮一個給定的含有 m 個樣本的訓練樣本集 s 即 |s|=m ,我們定義:
- s={(xi,yi)},i=1,…,m,其中 xi∈X是n維特征空間 X={f1,f2,...,fn}的樣本,且yi∈Y={1,...,C}是與樣本xi相關的類別標簽。特別的,C=2代表兩類分類問題
- 定義子集 Smin∈S 且Smaj∈S,其中 Smin是集合S中少數類樣本的集合,且Smaj是集合S中多數類樣本的集合,所以 Smin∩Smaj={∅} 且Smin∪Smaj={S}
- 在集合S上抽樣產生的任何集合都標記為 E,不相交的子集Emin 和 Emaj分別表示E中的少數類樣本和多數類樣本
國內外不均衡學習研究現狀
目前針對SVM在不均衡樣本集中應用的研究主要包括兩個層面的內容:
- 算法層面的處理方法
- 樣本層面的處理方法,利用適當的方法重構訓練樣本,以提高分類性能
- 將算法和樣本處理相結合使用,更能提高分類器的性能
算法層面的處理方法
- 利用兩個不同的正規化參數(C+和C-)來分別控制兩類樣本的錯誤懲罰。其主要是預防SVM的過學習預防SVM的過學習,這時分類錯誤基本上都歸結於這些越界的支持向量,這樣就能得到兩類樣本分類錯誤率近似相等的SVM分類器
- 單類支持向量機算法(One-Class SVM)是對支持向量機算法的擴展,基本思想是利用估計目標類樣本在特征空間的密度分布,對未知的樣本做出“是”或者“非”的判斷。根據單類樣本提供的信息,找到類似的目標樣本,而對非目標的其它樣本作為一個整體考慮,這樣就避免了復雜的樣本采樣以及需要對背景信息進行完整描述的問題。
樣本層面的處理方法
- 欠抽樣,是通過減少多數類樣本來均衡兩類樣本,但是可能會忽略潛在有用的多數類樣本
- 過抽樣,則是通過復制少數類樣本來實現均衡兩類樣本,但是由於其引入了額外的樣本集,嚴重情況下可能會導致樣本的過度擬合問題
- SMOTE算法引入了新的非重復人造少數類樣本,這種算法增加了通用性,而不像精確復制樣本一樣會導致過度擬合,SMOTE是一種過抽樣方法,它與隨機過抽樣算法的最大不同在於,它能生成一些人工樣本然后加入到新的訓練樣本集中
- 基於過抽樣/欠抽樣/SMOTE的代價敏感 SVM 算法,但是當樣本集出現嚴重不均衡時,該算法可能會失效
- Boosting算法,它的目標是增加給定算法的分類准確率。在此基礎上將SVM與AdaBoost算法相結合構成的新算法,稱其為AdaBoost-SVM,該算法提升了SVM預測精度並且優化了算法學習的效率
- s-AdaBoostRBFSVM 算法通過動態調整 RBF-SVM 核參數的方式來產生差異基分類器
評估指標
-
二類分類問題的評價指標是精確度(少數類查准率)與召回率(少數類樣本正確率),通常以關注的類為正類(少數類),其他類為負類,以下4種情況出現的總數分別記作:
- TP —— 將正類預測為正類數
- FN—— 將正類預測為負類數
- FP —— 將負類預測為正類數
- TN—— 將負類預測為負類數
-
少數類精確率(少數類查准率)定義為:Precision=TPTP+FP
少數類召回率(少數類樣本正確率)定義為:Sensitivity=TPTP+FN
多數類召回率定義為:Specificity=TNFP+TN -
幾何平均正確率 G-mean: G=Sensitivity∗Specificity−−−−−−−−−−−−−−−−−−−−√
性能指標G綜合考慮了少數類和多數類兩類樣本的分類性能,G的值是隨 Sensitivity 和 Specificity 的值在[0,1]區間里單調遞增,由於分類器分類偏向於其中一類會影響另一類的分類正確率 -
此外還有F值,是精確率和召回率的調和均值,即 F-measure:
F=2∗Sensitivity∗PrecisionSensitivity+Precision
精確率和召回率都很高時,F}值也會高, 性能指標F考慮了少數類樣本的查全率和查准率,因此其中任何一個值都能影響F值的大小。所以它能綜合體現出分類器對多數類和少數類的分類效果,但更側重於體現少數類樣本的分類效果 - AUC (Area Under the ROC Curve)則是另一個有效地不均衡樣本分類性能評價手段,對於一個給定的兩分類,ROC曲線是利用多個(FRP,TPR)對描述性能的方法,AUC是這個曲線形成的面積