将“转换”命令行转换为Weka的java代码

时间:2014-11-25 13:57:28

标签: java weka

我正在使用此命令行

java -cp weka.jar weka.classifiers.trees.RandomForest -T tdata.arff -l rndforrest.model -p 0 > data.out

但是我想在没有使用文件的情况下在java中执行它,一切都应该在运行中。模型可以在开头加载一次,tdata.arff应该是我需要预测的一个数据行(分类?)。

像这样:

weka.classifiers.Classifier rndForrest = (weka.classifiers.Classifier)weka.core.SerializationHelper.read("rndforrest.model");
var dataInst = new weka.core.Instance(1, new double[] { 0, 9, -96, 62, 1, 200, 35, 1 });
double pred = rndForrest.classifyInstance(dataInst);

我收到错误

Instance doesn't have access to a dataset!

感谢您的帮助。

编辑:我的代码

Stopwatch sw = new Stopwatch();
sw.Start();

var values = new double[] { 0, 9, -96, 62, 1, 200, 35, 0 };

weka.classifiers.Classifier rndForrest = (weka.classifiers.Classifier)weka.core.SerializationHelper.read("rndforrest.model");
var dataInst = new weka.core.Instance(1, values);

FastVector atts = new FastVector();
for(int i=0; i < values.Length; i++) {
atts.addElement(new weka.core.Attribute("att" + i));
}

weka.core.Instances data = new Instances("MyRelation", atts, 0);
data.add(dataInst);
data.setClassIndex(data.numAttributes() - 1);
double pred = rndForrest.classifyInstance(data.firstInstance());
Console.WriteLine("prediction is " + pred);
Console.WriteLine(sw.ElapsedMilliseconds);

1 个答案:

答案 0 :(得分:2)

嗯,错误说出来了,不是吗?

  

实例无权访问数据集!

您使用的构造函数的Javadoc说:

  

公共实例(double weight,double [] attValues)

     

使用给定值初始化实例变量的构造方法。对数据集的引用设置为null。 (即实例无权访问有关属性类型的信息

每个Instance必须属于一个数据集(Instances),因为在Weka中,每个实例的值都存储为double值。需要其他信息来确定如何解释该双精度值(例如,双精度,字符串,标称值......),并且此信息是通过数据集提供的。

您需要执行以下操作:

FastVector atts = new FastVector();
// assuming all your eight attributes are numeric
for( int i = 1; i <= 8; i++ ) {
  atts.addElement(new Attribute("att" + i));   // - numeric
}
Instances data = new Instances("MyRelation", atts, 0);

data.add(dataInst);

(有关如何创建特定类型属性的其他示例,请参阅Creating an ARFF file