让weka从Ruby交叉验证分类器

时间:2011-11-07 18:34:14

标签: java ruby weka rjb

here获取提示!我正在通过RJB使用weka的Ruby分类器库。

我希望能够从.arff文件创建一个分类器,并使用它运行10倍交叉验证,以产生一个混淆矩阵,如in the Weka wiki所述。

以下是所涉及的基本代码。

# creating the classifier
Rjb::load("./weka.jar", jvmargs=["-Xmx2000M"])
classifier = Rjb::import("weka.classifiers.bayes.NaiveBayes").new

# importing the data
data_src = Rjb::import("java.io.FileReader").new("./the_data.arff")
data = Rjb::import("weka.core.Instances").new(data_src)

evaluation = Rjb::import("weka.classifiers.Evaluation").new(data)

folds = Rjb::import('java.lang.Integer').new(10)
rand = Rjb::import("java.util.Random").new(1)

evaluation.crossValidateModel(classifier, 
                              data, 
                              folds, 
                              rand )

print evaluation.toMatrixString()

从上面的weka wiki链接我可以看出:这应该有效。 但是......

Fail: unknown method name `crossValidateModel' (RuntimeError)

根据我的理解通常意味着有问题的方法没有提供正确的参数,但我看不出这是怎么回事。

evaluation.java_methods 的输出包括crossValidateModel([Ljava.lang.String;Lweka.core.Instances;I[Ljava.lang.String;Ljava.util.Random;, Lweka.classifiers.Classifier;Lweka.core.Instances;ILjava.util.Random;[Ljava.lang.Object;])

我不确定如何解释。

有没有人知道我需要做什么?


编辑:虽然我无法解决这里提出的问题,但事实证明我能够通过JRuby重新开始实现我想要的here。感谢michaeltwofish提示:)

1 个答案:

答案 0 :(得分:1)

而不是使用Rjb :: import('java.lang.Integer')。new(10) 尝试使用普通的10。

您正在从Evaluation类调用方法crossValidateModel。哪个有超负荷。见下文。请注意,第三个参数是int。您正在使用java.lang.Integer。在java int和Integer中都不是一回事。如果您感兴趣,请在java中查找原始类型和Wrapper类型。通常java可以在java和Integer之间进行更改,因为java 5.但是你是从Rjb调用的,我认为java Integer被包装在一些对象中以用于ruby目的,这是令人困惑的事情。

来自weka javadocs。

 crossValidateModel(Classifier, Instances, int)

对一组实例上的分类器执行a(分层,如果类是名义上的)交叉验证。

crossValidateModel(String, Instances, int, String[])

对一组实例上的分类器执行a(分层,如果类是名义上的)交叉验证。