2013-09-30 63 views
6

當我使用由75%'true'標籤和25%'false'標籤組成的不平衡數據集時,我應該如何在libSVM中設置gamma和Cost參數?由於數據不平衡,我得到的所有預測標籤都設置爲「真」的常數錯誤。使用libSVM支持向量機中的數據不平衡使用libSVM

如果問題不在libSVM中,而是在我的數據集中,那麼從理論機器學習的角度來看,我應該如何處理這種不平衡? *我使用的功能數量在4-10之間,我有一小組250個數據點。

+2

存在的常見問題網頁,其中可能幫助一個類似的問題: 問:我的數據是不平衡的。 libsvm可以處理這些問題嗎? http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f410 – McKelvin

回答

6

類失衡無關與選擇C和伽瑪,來處理這個問題,你應該使用class weighting scheme這是在例如scikit-learn包(內置於libsvm)的最佳Cgamma

選擇avaliable使用網格搜索進行交叉驗證。你應該在這裏嘗試大量的值,對於C選擇110^15之間的值是合理的,而gamma範圍值的簡單和良好的啓發式是計算所有數據點之間的成對距離並根據這個百分點選擇伽馬分佈 - 想想中的每個點放的高斯分佈的方差等於1/gamma - 如果你選擇這樣gamma這個分佈重疊意志多少分,你會得到非常「暢通」的模式,在使用小變化導致過度擬合。

+1

類加權方案意味着'C'在實際的SVM訓練問題中發生了變化,所以課堂平衡*與「C」的選擇有關,即使它發生在窗簾後面。 –

+1

這純粹是語言上的事情,因爲我的意圖是選擇C不會解決不平衡問題。然而這個問題的解決方案改變了C,我沒有在這裏看到真正的矛盾 – lejlot

4

不平衡的數據集可以通過各種方式處理。類平衡對內核參數沒有影響,例如對於RBF內核的gamma

兩種最流行的方法是:每類

  1. 使用不同的分類錯誤的懲罰,這基本上意味着改變C。通常,最小的班級體重要高一些,常用的方法是npos * wpos = nneg * wneg。 LIBSVM允許您使用-wX標誌來執行此操作。
  2. 子樣本過表達的類獲得肯定和否定的同等量和訓練進行,你會傳統的一套平衡。注意你基本上忽略了大量的數據,這在直覺上是一個壞主意。
+1

爲什麼不**過度採樣**更小的呢?這不會忽略任何信息 – lejlot

+0

@lejlot使用後一種策略的大多數情況是大規模問題(例如數百萬到數十億個實例),其中忽略部分數據實際上被用作降低複雜性的黑客攻擊。對較小的一組進行過採樣基本上是以低效的方式採用前一種方法(過採樣與再稱重完全相同)。 –

+0

我完全意識到這一點,只是想知道爲什麼你沒有包括這個選項。過採樣的主要優勢在於它是一種通用方法,即使對於不允許您對樣本進行加權(以效率爲代價)的模型(及其實現),也可以使用它。 – lejlot

2

我知道這已被問過一段時間了,但我想回答它,因爲你可能會發現我的答案有用。

正如其他人所說,你可能要考慮使用不同的權重爲民族班,或者使用不同的分類錯誤的懲罰。但是,處理不平衡數據集有一個更聰明的方法。

可以使用SMOTE小號 ynthetic 中號 inority ö VER-採樣 chnique)算法以生成用於少數類合成數據。這是一個簡單的算法,可以很好地處理一些不平衡數據集。

在算法的每次迭代中,SMOTE考慮少數類的兩個隨機實例,並在兩者之間的某處添加相同類的人爲示例。該算法不斷向數據集註入樣本,直到兩個類成爲平衡或其他標準(例如添加一定數量的示例)。在下面,您可以找到一張圖片,描述該算法在二維特徵空間中爲簡單數據集所做的工作。

將權重與少數類關聯是該算法的一個特例。當您將權重$ w_i $與實例i相關聯時,您基本上將在實例i上添加額外的$ w_i - 1 $實例!

SMOTE

  • 你需要做的是增加自己與這個算法創建的初始樣本數據集,並與這個新的數據集訓練SVM。您還可以在Python和Matlab等不同語言中在線查找許多實現。

  • 這個算法還有其他的擴展,如果你願意的話,我可以指出更多的材料。

  • 要測試你需要對數據集分成測試和培訓,合成實例添加到訓練集(不添加任何到測試集)的分類,培養對列車編組的模型,最後在測試集上進行測試。如果您在測試時考慮生成的實例,則最終會出現偏差(並且可以更高)的準確度和回憶。