【问题标题】:Getting weka to cross-validate a classifier from Ruby让 weka 交叉验证来自 Ruby 的分类器
【发布时间】:2011-11-16 20:52:06
【问题描述】:

得到here的提示!我正在通过 RJB 使用来自 Ruby 的 weka 的分类器库。

我希望能够从 .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;])

我不确定如何解释。

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


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

【问题讨论】:

  • 你能打印出“分类器”的类别吗?就像打印分类器.getClass()。似乎 java 的重载并没有像你预期的那样工作。
  • 感谢您的回复! p classifier.getClass() # => #<Rjb::Weka_classifiers_bayes_NaiveBayes:0x00000101022360> 有帮助吗?
  • 我不知道您是否有理由必须使用 RJB,但值得一提的是,我已经使用 JRuby 中的 Weka,效果非常好。

标签: java ruby weka rjb


【解决方案1】:

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

您正在从评估类调用方法 crossValidateModel。其中有一个过载。见下文。请注意,第三个参数是 int。您正在使用 java.lang.Integer。在 java 中,int 和 Integer 不是一回事。如果您有兴趣,请在 java 中查找原始类型和 Wrapper 类型。通常,自 java 5 以来,java 能够在 int 和 Integer 之间进行更改。但是您是从 Rjb 调用的,我认为 java Integer 被包装在某个对象中以用于 ruby​​ 目的,这令人困惑。

来自 weka javadocs。

 crossValidateModel(Classifier, Instances, int)

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

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

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

【讨论】:

  • 这似乎没有帮助,或者可能还有其他问题。也许我应该像 here 那样使用 JRuby
猜你喜欢
  • 2013-10-10
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2015-10-25
  • 2021-12-10
  • 2013-08-16
相关资源
最近更新 更多