我正在使用此命令行
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);
答案 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)