0

私は Liblinear/Libsvm の初心者で、ここで問題を抱えています。

トレーニング用の非常に大きなデータ (非常に不均衡な 2.883.584 サンプル、それぞれが 21 次元) と、テスト用のビッグ データ (21 次元の 262.144 サンプル) があります。データのビッグデータの性質のため、LIBSVM (または LibLinear) の線形カーネル実装を使用しています。文献では、これらのデータで RBF カーネルを使用する際の問題について警告しています。

私の問題は次のとおりです。私が何をしても、分類子は 1 つのクラス (より多くのサンプルを持つクラス、または私の実験では負のクラス) のみを予測します。

私はこれまでに試しました:

1- バランスのとれたデータと不均衡なデータをトレーニングし、データをスケーリングせず、パラメーターを選択しません。

2-バランスのとれたデータと不均衡なデータをトレーニングし、データをさまざまな範囲 ([-1,1] と [0,1]) でスケーリングしますが、パラメーターは選択しません。

3-バランスのとれたデータと不均衡なデータをトレーニングし、パラメーターを選択してさまざまな範囲 ([-1,1] と [0,1]) でデータをスケーリングします。

これらの実験はすべて 81% の精度という結果になりますが、これらの正しい予測はすべてネガティブ クラスからのものです。正のクラスはすべて、線形 svm によって誤分類されます。

以下に示すように、.model ファイルは非常に奇妙です。

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 

グリッド検索を介してパラメーターを選択すると、最高の C が常に 5 分割交差検証の最高精度 50% を提供します。それが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  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  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 範囲を増やす必要がありますか? または、別の分類器を使用する必要がありますか?

4

1 に答える 1

1

不均衡なケースでは、偽陽性エラーと偽陰性エラーのコストは同じではないため、陽性クラスと陰性クラスのペナルティは異なるはずです。クラスごとに重み C+ と C- を選択する必要がある場合があります。肯定的なパターンよりも否定的なパターンの方が多い場合は、おそらく C+ を C- よりも大きくしたいと思うでしょう。</p>

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- はそれぞれ陽性クラスと陰性クラスのサンプル数です。

また、正しいオプションを選択していることを確認してください。トレーニング サンプル数が特徴数よりもはるかに大きい場合、投稿で述べたように線形カーネルが最適なオプションです。

于 2013-12-17T14:15:58.103 に答える