2011-11-07 5 views
0

hereからヒントを得てください!私はwekaのRubyから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する:)

+0

"クラシファイア"のクラスを印刷できますか? print classifier.getClass()と同様です。 Javaのオーバーロードが期待通りに機能しないようです。返信ありがとう! –

+0

'p classifier.getClass()#=> # ' は役に立ちますか? – Nat

+1

RJBを使用する必要がある理由があるのか​​どうか分かりませんが、JRubyのWekaを使って大きな効果を得ました。 – michaeltwofish

答えて

1

代わりにRJB ::インポート( 'java.lang.Integerの')を使用してのおかげで。新しい(10) あなたは、メソッドcrossValidateModelを呼び出しているプレーン10

を使用するようにしてください評価クラスから。どちらが過負荷ですか。下記参照。 3番目のパラメータがintであることに注目してください。あなたはjava.lang.Integerを使用しています。 Java intとIntegerでは同じものではありません。興味があれば、Javaのプリミティブ型とラッパー型を探します。通常javaはjavaとintの間で変更することができます。しかし、あなたはRjbから呼び出していますが、私はjava IntegerがRubyの目的のためにいくつかのオブジェクトにラップされていると思います。

weka javadocsより。

crossValidateModel(Classifier, Instances, int) 

インスタンスセットのクラシファイアに対して(クラスが公称の場合は階層化された)クロスバリデーションを実行します。

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

は、インスタンスのセットに分類器(クラスが公称であれば成層)クロスバリデーションを実行します。

+0

それは助けにはならないか、あるいは別の何かが間違っているかもしれません。たぶんJRubyを[ここ](http://rubyforscientificresearch.blogspot.com/2009/08/accessing-weka-from-jruby.html)のように使うべきです – Nat

関連する問題