2011-08-30 36 views
2

我們試圖從Java程序內實現WEKA分類器。到目前爲止,一切都很順利,但是當從Weka GUI的訓練集中構建分類器時,我們使用了StringToWordVector IDF變換來幫助提高分類準確性。WEKA - 分類來自Java的新數據 - IDF變換

對於新實例,從Java內部如何計算IDF變換,以在將實例傳遞給分類器之前爲新實例中的每個標記值設置?

基本的代碼如下所示:

Instances ins = vectorize(msg); 
Instances unlabeled = new Instances(train,1); 
Instance inst = new Instance(unlabeled.numAttributes()); 

String tmp = ""; 

for(int i=0; i < ins.numAttributes(); i++) { 
    tmp = ins.attribute(i).name(); 
    if(unlabeled.attribute(tmp)!=null) 
     inst.setValue(unlabeled.attribute(tmp), 1.0); //TODO: Need to figure out the IDF transformed value to put here NOT 1!! 
} 

unlabeled.add(inst); 

unlabeled.setClassIndex(classIdx); 

.....cl.distributionForInstance(unlabeled.instance(i)); 

那麼,如何去了解編碼,這樣我在新的情況下我想分類把正確的價值?

只是要清楚inst.setValue(unlabeled.attribute(tmp), 1.0);需要從1.0以色列國防軍轉化數改了行......

任何幫助將不勝感激!

回答

1

您需要爲此使用FilteredClassifier。代碼段是:

 

    StringToWordVector strWVector = new StringToWordVector(); 
    filteredClassifier fcls = new FilteredClassifier(); 
    fcls.setFilter(strWVector); 
    fcls.setClassifier(new SMO()); 
    fcls.buildClassifier(yourdata) 
    //rest of your code 

 

這是因爲你可以通過你的情況都在once.FilteredClassifier需要的所有其他細節問題要容易得多。代碼沒有經過測試,但它會讓你開始。

編輯:你也可以用下面的方法做。這是秧雞教程的代碼片段見http://weka.wikispaces.com/Use+WEKA+in+your+Java+code#Filter-Filtering%20on-the-fly批處理模式的詳細信息

 

Instances train = ... // from somewhere 
Instances test = ... // from somewhere 
Standardize filter = new Standardize(); 
filter.setInputFormat(train); // initializing the filter once with training set 
Instances newTrain = Filter.useFilter(train, filter); // configures the Filter based on train instances and returns filtered instances 
Instances newTest = Filter.useFilter(test, filter); // create new test se 
 

HTH

+0

感謝您的意見。我不認爲這是我所追求的。我們有一個預先存在的分類器,我們想要加載,我嘗試這樣做,並使用FilteredClassifer的set方法,但它抱怨沒有輸出格式集。我猜它希望訓練數據作爲輸入...但是似乎沒有接口可以使用StringToWordVector – NightWolf

+0

執行此操作,請參閱edits ..而不是對每個實例應用過濾器,以批處理模式應用過濾器。 – iinception