2015-11-23 27 views
1

我使用WEKA Java Api培訓並創建了J48模型。 然後,我使用classifyInstance()來分類我的實例。 但結果是錯誤的。下面 我的代碼編號:WEKA:從classifyInstance中獲得班級,爲什麼這是錯的

Instances train = reader.getDataSet(); 
    Instances test = reader_test.getDataSet(); 

    train.setClassIndex(train.numAttributes() - 1); 
    Classifier cls = new J48(); 
    cls.buildClassifier(train); 

    test.setClassIndex(test.numAttributes() - 1); 

    for(int i = 0; i < test.numInstances(); i++){ 
     Instance inst = test.instance(i); 
     double result = cls.classifyInstance(inst); 
     System.out.println(train.classAttribute().value((int)r)); 
    } 

結果總是等於0.0

最後,我用test.setClassIndex前test.insertAttributeAt()()。 如下:

test.insertAttributeAt(train.attribute(train.numAttributes() - 1), test.numAttributes()); 

結果變得正確。我很驚訝!然而,大多數文件並沒有使用inserAttribute的函數。 我想明白爲什麼結果突然變得正確。

回答

1

它會幫助你。

BufferedReader datafile = readDataFile(TrainingFile); 
Instances train = new Instances(datafile); 
data.setClassIndex(data.numAttributes() - 1); 

Classifier cls = new J48(); 
cls.buildClassifier(train); 

DataSource testDataset = new DataSource(Test); 
Instances test = testDataset.getDataSet(); 
Testdata.setClassIndex(Testdata.numAttributes() - 1); 

for(int i = 0; i < test.numInstances(); i++){ 

    Instance inst = test.instance(i); 

    double actualClassValue = test.instance(i).classValue(); 

    //it will print your class value 
    String actual=test.classAttribute().value((int)actualClassValue); 

    double result = cls.classifyInstance(inst); 

    //will print your predicted value 
    String prediction=test.classAttribute().value((int)result); 


} 

你現在不需要使用insertAttributeAt

文件轉換代碼

// load CSV 
    CSVLoader loader = new CSVLoader(); 
    String InputFilename = "TrainingFileName"; 
    loader.setSource(new File(InputFilename)); 
    Instances data = loader.getDataSet(); 

    // save ARFF 
    ArffSaver saver = new ArffSaver(); 
    saver.setInstances(data); 
    String FileT = Filename+".arff"; 
    saver.setFile(new File(Path+Directory+"\\"+FileT)); 
    saver.writeBatch();  

相應變化。

謝謝

+0

謝謝你的幫助。但結果在我的電腦裏仍然是錯誤的。我忘了告訴你,test.csv沒有class值。如果手動添加類的最後一列,結果將是正確的。我想預測結果,所以我不添加類。 –

+0

根據weka文檔,最後一欄無論你添加與否。嘗試在.arff中轉換文件,並給出** @屬性狀態{PASS,FAIL} **或您期望的值。您還可以複製訓練集中最後一列的類值。並且不要在最後一列中添加任何值。我將在下面添加文件轉換代碼。 – Maxi

+0

我編輯了答案。請添加您的代碼。所以我可以看到最新的錯誤。另外,您也可以從GUI進行轉換 – Maxi