0

ヒントはここから!Ruby から RJB 経由で weka の分類子ライブラリを利用しています。

Weka wiki で説明されているように、.arff ファイルから分類子を作成し、それを使用して 10 倍の交差検証を実行して混同行列を生成できるようにしたいと考えています。

以下は、関連する重要なコードです。

# 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でやり直すことで、私が望んでいたことを達成できたことがわかりました。ヒントをくれた michaeltwofish に感謝します :)

4

1 に答える 1

1

Rjb :: import('java.lang.Integer')。new(10)を使用する代わりに、プレーン10を使用してみてください。

EvaluationクラスからメソッドcrossValidateModelを呼び出しています。過負荷があります。下記参照。3番目のパラメーターがintであることに注意してください。java.lang.Integerを使用しています。Javaでは、intとIntegerは同じものではありません。興味がある場合は、Javaでプリミティブ型とラッパー型を探してください。通常、javaはjava 5以降、intとIntegerの間で変更できます。ただし、Rjbから呼び出している場合、java Integerはrubyの目的でオブジェクトにラップされているため、混乱を招きます。

wekajavadocsから。

 crossValidateModel(Classifier, Instances, int)

インスタンスのセットで分類器の(クラスが名目上の場合は層化された)相互検証を実行します。

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

インスタンスのセットで分類器の(クラスが名目上の場合は層化された)相互検証を実行します。

于 2011-11-13T10:27:54.193 に答える