2017-01-30 7 views
2

私はJavaコードでナイーブなベイベイweka libararyをしようとするが、私は分類の結果が正しいとは思わない、私は何が問題なのか分からない。入力にはarffファイルを使用します。単純なテキスト分類Javaで純粋なbayes(weka)を使用して

これは私のトレーニングデータである:

@relation hamspam 

@attribute text string 
@attribute class {spam,ham} 

@data 
'good',ham 
'good',ham 
'very good',ham 
'bad',spam 
'very bad',spam 
'very bad, very bad',spam 
'good good bad',ham 

は、これが私のtesting_dataです:

@relation test 

@attribute text string 
@attribute class {spam,ham} 

@data 
'good bad very bad',? 
'good bad very bad',? 
'good',? 
'good very good',? 
'bad',? 
'very good',? 
'very very good',? 

、これは私のコードです:

public static void NaiveBayes(String training_file, String testing_file) throws FileNotFoundException, IOException, Exception{ 
     //filter 
     StringToWordVector filter = new StringToWordVector(); 

     Classifier naive = new NaiveBayes(); 

     //training data 
     Instances train = new Instances(new BufferedReader(new FileReader(training_file))); 
     int lastIndex = train.numAttributes() - 1; 
     train.setClassIndex(lastIndex); 
     filter.setInputFormat(train); 
     train = Filter.useFilter(train, filter); 

     //testing data 
     Instances test = new Instances(new BufferedReader(new FileReader(testing_file))); 
     test.setClassIndex(lastIndex); 
     filter.setInputFormat(test); 
     Instances test2 = Filter.useFilter(test, filter); 

     naive.buildClassifier(train); 

     for(int i=0; i<test2.numInstances(); i++) { 
      System.out.println(test.instance(i)); 
      double index = naive.classifyInstance(test2.instance(i)); 
      String className = train.attribute(0).value((int)index); 
      System.out.println(className); 
     } 
    } 

結果は、データがその必要があることを示しますクラスハムに分類されたクラススパムと、クラスハムに分類されていたはずのデータハムはクラスのスパムに分類されます。何が問題なの?、助けてください..

答えて

0

あなたのコードはうまくいきますが、2つのコメントがあります。

  • まず、あなたはので、このフィルタを使用してテストや電車のデータに互換性を持たせるには、このコマンドfilter.setInputFormat(train);とフィルタの形式を設定します。 でない場合このコマンドでフォーマットを再度変更する:filter.setInputFormat(test);これは互換性の問題を引き起こす可能性があります。
  • また、代わりに最初の属性取得の:train.attribute(0).value((int)index);を(私には思われているが、クラス属性に対応していない)、このコマンドをtrain.classAttribute().value((int)index);

P.S.を使用してみてください完全なワークフローと分類例の説明については、Load naïve Bayes model in Java code using weka jarを確認してください(この資料は、SOドキュメンテーションに1度入っています)。この例ではLibLinearクラシファイアを使用していますが、ロジックは同じです。

関連する問題