Coefficient() によって返される double[][] には、Logistic に渡す Instances オブジェクトとは異なる属性のセットがあります。それに対処する方法を理解するために、 Weka コードを熟読する必要がありました。Logistic のメソッドを介して情報を取得する方法を見つけることができませんでしたが、それが使用する Filter を簡単に複製して、操作する同じ属性のセットを取得できます。
JRuby のライブラリとして Weka を使用しているため、ここのコードは Ruby 構文です。
import 'weka.filters.unsupervised.attribute.RemoveUseless'
logit_filter = RemoveUseless.new
logit_filter.setInputFormat train_filtered
logit_filtered = Filter.useFilter(train_filtered, logit_filter)
logit_filtered 変数は、Logistic によって作成されたものを反映した Instances コレクションですが、最後の問題があります。Logistic の内部では、インターセプトが係数と共に返される double[][] の最初の要素として保持されるため、属性セットを正しくマップするには最初の要素を無視する必要があります...
java_array = logit.coefficients.to_a #converting java array to ruby
coeffs = java_array.map(&:to_a) #converting second level of java array to ruby
coeffs.each_with_index do |arr, index|
next if index == 0 #this is the Intercept
puts "#{logit_filtered.attribute(index-1).name.to_s}: #{coeffs}"
end
これは私のために物事をうまくマッピングします。