2014-01-22 62 views
-1

我想在我的程序中使用SVM(支持向量機),但我無法得到真正的結果。如何使用libsvm正確訓練數據?

我想知道,我們必須如何訓練SVM的數據。

我在做什麼:

認爲我們有5個文件(該數字只是一個例子),其中3個是在第一類和其他人(其中2)在第二類中,我合併類別彼此(這意味着3文檔是在第一類將一個文檔中合併),之後,我提出的列車陣列是這樣的:

double[][] train = new double[cat1.getDocument().getAttributes().size() + cat2.getDocument().getAttributes().size()][]; 

和我將填補這樣的陣列:

int i = 0; 
    Iterator<String> iteraitor = cat1.getDocument().getAttributes().keySet().iterator(); 
    Iterator<String> iteraitor2 = cat2.getDocument().getAttributes().keySet().iterator(); 
    while (i < train.length) { 
     if (i < cat2.getDocument().getAttributes().size()) { 
      while (iteraitor2.hasNext()) { 
       String key = (String) iteraitor2.next(); 
       Long value = cat2.getDocument().getAttributes().get(key); 
       double[] vals = { 0, value }; 
       train[i] = vals; 
       i++; 
       System.out.println(vals[0] + "," + vals[1]); 
      } 
     } else { 
      while (iteraitor.hasNext()) { 
       String key = (String) iteraitor.next(); 
       Long value = cat1.getDocument().getAttributes().get(key); 
       double[] vals = { 1, value }; 
       train[i] = vals; 
       i++; 
       System.out.println(vals[0] + "," + vals[1]); 
      } 
      i++; 
     } 

所以我會繼續這樣得到的模型:

svm_problem prob = new svm_problem(); 
    int dataCount = train.length; 
    prob.y = new double[dataCount]; 
    prob.l = dataCount; 
    prob.x = new svm_node[dataCount][]; 

    for (int k = 0; k < dataCount; k++) { 
     double[] features = train[k]; 
     prob.x[k] = new svm_node[features.length - 1]; 
     for (int j = 1; j < features.length; j++) { 
      svm_node node = new svm_node(); 
      node.index = j; 
      node.value = features[j]; 
      prob.x[k][j - 1] = node; 
     } 
     prob.y[k] = features[0]; 
    } 
    svm_parameter param = new svm_parameter(); 
    param.probability = 1; 
    param.gamma = 0.5; 
    param.nu = 0.5; 
    param.C = 1; 
    param.svm_type = svm_parameter.C_SVC; 
    param.kernel_type = svm_parameter.LINEAR; 
    param.cache_size = 20000; 
    param.eps = 0.001; 
    svm_model model = svm.svm_train(prob, param); 

是這種方式是否正確?如果不是,請幫助我做到這一點。


這兩個答案都是正確的:answer oneanswer two

回答

2

即使沒有檢查代碼,可以發現觀念上的誤區:

認爲我們有5個文件,其中有3對第一類別和其他類別(其中2個)屬於第二類別,我將類別彼此合併(這意味着第一類中的3個文檔將合併到一個文檔中),之後,我製作了一個像這樣的列車數組

所以:

  • 在5號文件的訓練不會給任何合理的效果,與任何機器學習模型......這些都是統計車型,有作爲R 5點沒有合理的統計數據^ n,其中n〜10,000
  • 不要合併任何東西。這種方法可以用於樸素貝葉斯,樸素貝葉斯並不真正把文檔當作「整體」,而是作爲特徵和類之間的概率依賴關係。在SVM中,每個文檔應該是單獨的指向R^n空間,其中n可以是不同單詞的數量(用於單詞包/單詞表示的集合)。
+0

謝謝@lejlot,數字只是爲了描述,實際數字超過了這些數字,這意味着我應該將每個文檔分別放在我的列車陣列中?如果你可以請示例給我 –

+0

是的每個文檔都是一個單獨的元素。網上有**千萬個**例子,要求爲這樣的事情編寫代碼表明完全沒有參與。使用SVM與文檔以及任何其他類型的數據沒有區別。使用矢量化,可將每個文檔轉換爲**矢量**。完成後,**任何** SVM示例都可以使用。 – lejlot

2

的問題可能是你不終止每組特徵在訓練例如,您對此應該根據我讀的-1指數...

即如果你有一個例子,我認爲你應該這樣做:

Index[0]: 0 
Value[0]: 22 
Index[1]: 1 
Value[1]: 53 
Index[2]: -1 

祝你好運!

+0

終止「-1」是不需要的(如果你看一下在線示例數據集)... – rzo

2

使用SVM對文本進行分類是一項常見任務。您可以查看Joachims [1]關於SVM文本分類的研究論文。

基本上,你必須:

  1. 記號化文檔
  2. 停用詞刪除
  3. 應用詞幹技術
  4. 應用特徵選擇技術(見[2])
  5. 變換使用功能,您的文檔)(簡單的將是二進制的(0:特徵不存在,1:特徵存在)或其他措施,如TFC)
  6. 訓練你的支持向量機,並開心:)

T.約阿希姆斯:支持向量機的文本分類:學習與許多相關的特徵; Springer:德國海德堡,1998,doi:10.1007/BFb0026683。

[2] Y.Yang,J.O.Pedersen:A Comparison Study on Feature Selection in Text Categorization。國際機器學習會議,1997,412-420。