QA@IT

【Eclipse】wekaを使って分類したい

3602 PV

こちらのリンクより、Eclipseで以下のプログラムをコピペしたのですが、21行目のeval.evaluateModel(classifier, instances);でエラーになります。

・ビルドパス→ライブラリーでweka.jar追加済。
・weka3.6使用

原因が分かれば教えてくださると助かります。

(追記)
・エラーは一番下の図のような感じです。
・weather.arffではなくweather.nominal.arffでした……訂正します。

import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.classifiers.functions.SMO;
import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;

public class weather {

public static void main(String[] args) {
try {
DataSource source = new DataSource("weather.nominal.arff");
Instances instances = source.getDataSet();
instances.setClassIndex(4);
Classifier classifier = new SMO();
classifier.buildClassifier(instances);

  Evaluation eval = new Evaluation(instances);
  eval.evaluateModel(classifier, instances);    //エラーが出る
  System.out.println(eval.toSummaryString());

  FastVector out = new FastVector(3);
  out.addElement("sunny");
  out.addElement("overcast");
  out.addElement("rainy");
  Attribute outlook = new Attribute("outlook", out, 0);
  Attribute temperature = new Attribute("temperature", 1);
  Attribute humidity = new Attribute("humidity", 2);
  FastVector win = new FastVector(2);
  win.addElement("TRUE");
  win.addElement("FALSE");
  Attribute windy = new Attribute("windy", win, 3);

  Instance instance = new Instance(5);
  instance.setValue(outlook, "sunny");
  instance.setValue(temperature, 100);
  instance.setValue(humidity, 100);
  instance.setValue(windy, "FALSE");
  instance.setDataset(instances);

  double result = classifier.classifyInstance(instance);
  System.out.println(result);
} catch (Exception e) {
  e.printStackTrace();
}

}

}

image01.png

image01.png

image01.png

  • 回答を追記しました。 -
  • flied_onion様
    回答ありがとうございます。21行目を
    eval.evaluateModel(classifier, instances, new java.lang.Object[] {});
    に変更したところ、無事に動きました!
    -

回答

weather.arffは読み込める位置にありますか?
エラーはどういうエラーが出ますか?


追記

evaluateModel(Classifier classifier, Instances data, java.lang.Object... forPredictionsPrinting) ではなく、
evaluateModel(Classifier classifier, java.lang.String[] options)オーバーロードとして解釈されてしまっているようですね。

http://weka.sourceforge.net/doc.stable/weka/classifiers/Evaluation.html#evaluateModel(weka.classifiers.Classifier,%20weka.core.Instances,%20java.lang.Object...)

第三引数の forPredictionsPrinting 可変長引数が指定できるのであればそれが手っ取り早いんでしょうが。

試してはいないですが、以下のいずれかで上手くいきませんか?

eval.evaluateModel(classifier, instances, new java.lang.Object[] {});
eval.evaluateModel(classifier, (Instances)instances);
eval.evaluateModel(classifier, (Instances)instances, new java.lang.Object[] {});

ちなみに、evaluateModel内で if (forPredictionsPrinting.length > 0) { としているようなので、nullを渡すのはまずそうです。

編集 履歴 (2)
ウォッチ

この質問への回答やコメントをメールでお知らせします。