2014-11-25 64 views
0

我使用此命令行命令行“转换” 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); 
+0

Pleade办始终提供完整的堆栈跟踪。另外,这不是一个“将命令行转换为java代码”的问题,而是您使用实例的方式。看到这个问题和答案:http://stackoverflow.com/questions/12151702/create-an-unlabeled-instance-in-weka – Sentry 2014-11-25 16:02:02

+0

我如何阅读训练有素的模型比我的方式更快? – Kronos 2014-11-26 12:47:43

+0

我不认为有一个更快的方法,但你总是可以问一个关于这个问题的新问题。 – Sentry 2014-11-26 14:35:11

回答

2

那么,错误说了,不是吗?

实例无权访问数据集!

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

公共实例(双重量,双[] attValues)

的构造方法inititalizes实例变量与给定值。对数据集的引用设置为空。 (即实例不具有关于属性类型获取信息)

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

你需要做的是这样的:

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关于如何创建一个特定类型的属性附加的例子)

+0

嗨,感谢工作:)。但它大约需要2700毫秒,这太多了。我需要60毫秒以下的东西 – Kronos 2014-11-26 10:52:07

+0

2700毫米包含什么?是否启动虚拟机?我的意思是,只执行一次预测就执行这个程序有很多开销。我猜测,以这种方式预测100个甚至1000个实例并不会明显延长。也许你应该为速度问题提出一个新问题,并对你的要求非常具体。 – Sentry 2014-11-26 14:34:25