Получение weka для перекрестной проверки классификатора из Ruby - PullRequest
0 голосов
/ 07 ноября 2011

Подсказка от здесь ! Я использую библиотеку классификаторов weka из Ruby через RJB.

Я хочу иметь возможность создать классификатор из файла .arff и выполнить 10-кратную перекрестную проверку с ним, чтобы получить матрицу путаницы, как описано в вики Weka .

Ниже приведен необходимый код.

# 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 выше: это должно работать. Но ...

Fail: unknown method name `crossValidateModel' (RuntimeError)

Что из того, что я понимаю, обычно означает, что рассматриваемый метод не был предоставлен с правильными аргументами, но я не могу понять, как это было бы.

Вывод valuation.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, как описано здесь . Спасибо michaeltwofish за отзыв:)

1 Ответ

1 голос
/ 13 ноября 2011

Вместо использования Rjb :: import ('java.lang.Integer'). New (10) попробуйте использовать обычный 10.

Вы вызываете метод crossValidateModel из класса Evaluation.Который имеет перегрузку.увидеть ниже.Обратите внимание, что третий параметр - int.Вы используете java.lang.Integer.В Java и Integer не одно и то же.Ищите примитивные типы и типы Wrapper в Java, если вы заинтересованы.Обычно java может переключаться между int и Integer начиная с java 5. Но вы звоните из Rjb, я думаю, что java Integer обернут в некоторый объект для целей ruby, и это сбивает с толку.

Из weka javadocs.

 crossValidateModel(Classifier, Instances, int)

Выполняет перекрестную проверку (стратифицированную, если класс номинальный) для классификатора на множестве экземпляров.

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

Выполняется(стратифицировано, если класс является номинальным) перекрестная проверка для классификатора на множестве экземпляров.

...