2013-12-17 23 views
0

我是相當新的Liblinear/Libsvm和我在這裏有一個很好的問題。我有非常大的訓練數據(2.883.584高度不平衡的樣本,每個21維),也有大數據用於測試(262.144樣本也有21維)。我正在使用LIBSVM(或LibLinear)的線性內核實現,因爲我的數據具有大數據特性。文獻警告我用這些數據使用RBF內核的問題。50%的準確度問題與liblinear

我的問題是:無論我做什麼,分類器只能預測一個類(類中包含更多樣本,或者在我的實驗中爲負類)。

我試過到目前爲止:

1列車平衡和不平衡數據,規模做不大的數據,並沒有參數選擇。 2-訓練平衡和不平衡的數據,用不同範圍([-1,1]和[0,1])縮放數據,但不選擇參數。

3-訓練平衡和不平衡數據,使用參數選擇對不同範圍([-1,1]和[0,1])的數據進行縮放。

所有這些實驗的結果都有81%的準確性,但這些正確的預測都來自負面的類。所有正類都被線性svm錯誤分類。

的。模型文件是非常奇怪的,你可以看到如下:

solver_type L2R_L2LOSS_SVC_DUAL 
nr_class 2 
label 1 -1 
nr_feature 21 
bias -1 
w 
0 
0 
nan 
nan 
0 
0 
0 
0 
0 
nan 
nan 
0 
0 
0 
0 
0 
nan 
nan 
0 
0 
0 

當我通過電網參數選擇搜索最佳Ç總是給我50%的5倍交叉驗證的最佳精度。這就是我做在Matlab中網格搜索:

for log2c = 1:100, 
    cmd = ['-v 5 -c ', num2str(2^log2c)]; 
    cv = train(label, inst, cmd); 
    if (cv >= bestcv), 
     bestcv = cv; bestc = 2^log2c; 
    end 
    fprintf('%g %g (best c=%g, rate=%g)\n', log2c, cv, bestc, bestcv); 
end 

編輯:這裏是我的訓練數據的一個正面和負面的例子:

1 1:4.896000e+01 2:3.374349e+01 3:2.519652e-01 4:1.289031e+00 5:48 6:4.021792e-01 7:136 8:4.069388e+01 9:2.669129e+01 10:-3.017949e-02 11:3.096163e+00 12:36 13:3.322866e-01 14:136 15:4.003704e+01 16:2.168262e+01 17:1.101631e+00 18:3.496498e+00 19:36 20:2.285381e-01 21:136 
-1 1:5.040000e+01 2:3.251025e+01 3:2.260981e-01 4:2.523418e+00 5:48 6:4.021792e-01 7:136 8:4.122449e+01 9:2.680350e+01 10:5.681589e-01 11:3.273471e+00 12:36 13:3.322866e-01 14:136 15:4.027160e+01 16:2.245051e+01 17:6.281671e-01 18:2.977574e+00 19:36 20:2.285381e-01 21:136 

這裏是一個正面和負面的樣品我測試數據:

1 1:71 2:2.562365e+01 3:3.154359e-01 4:1.728250e+00 5:76 6:0 7:121 8:7.067857e+01 9:3.185273e+01 10:-8.272995e-01 11:2.193058e+00 12:74 13:0 14:121 15:6.675556e+01 16:3.624485e+01 17:-1.863971e-01 18:1.382679e+00 19:76 20:3.533593e-01 21:128 
-1 1:5.606667e+01 2:2.480630e+01 3:1.291811e-01 4:1.477127e+00 5:65 6:0 7:76 8:5.610714e+01 9:3.602092e+01 10:-9.018124e-01 11:2.236301e+00 12:67 13:4.912373e-01 14:128 15:5.886667e+01 16:3.891050e+01 17:-5.167622e-01 18:1.527146e+00 19:69 20:3.533593e-01 21:128 

我的數據有問題嗎?我應該增加網格搜索的C範圍嗎?或者我應該使用另一個分類器?

+1

您是否嘗試過其他模型(可能是其他內核,RBF)以確保它不是格式化數據的問題? – Ray

+0

@Ray:看看我的編輯,在其中顯示我的一些數據。我認爲他們是在Libsvm/Liblinear格式,或者不是?無論如何,我會嘗試與其他內核相關的建議。感謝您的回覆。 – mad

+0

我不確定,因爲我不熟悉libsvm。對我很好, :) – Ray

回答

1

對於不平衡的情況,假陽性和假陰性錯誤的成本是不一樣的,所以對正面和負面類的懲罰應該是不同的。您可能需要爲每個班級選擇權重C +和C-。如果您有正面圖案更負的模式,那麼你可能想使C +大於C-

model = svmtrain(trainLabels, trainFeatures, '-h 0 -b 1 -s 0 -t 0 -c 10 -w1 C+ -w-1 C-');

通常C+ * N+ = C- * N-其中N +和N-分別是正,負類的樣本數。

另外請確保您選擇了正確的options。對於你的情況,訓練樣本數量比特徵數量大得多,線性內核是你在文章中說的最好的選擇。

+0

我不同意最後一點。如果輸入空間的尺寸很小並且數據集較大 – Dthal

+0

謝謝Dthal。在這種情況下,邏輯迴歸可能會更好。如果特徵較小(10^0 - 10^3),而數據集處於中間(10^1 - 10^4),則非線性內核可能是最適合的。 – lennon310