weka Logistic分类器中的系数映射

时间:2013-06-22 08:33:51

标签: weka

为了解释Weka中Logistic classifier使用的系数,可以使用系数方法在这里作为axplained: Can one inspect the weights learned by a logistic regression classifier in weka?

然而,并非所有数据集中给出的属性(即Instances对象)都在分类器中使用。

所以我的问题是 - 如何创建toString()方法中出现的属性名称\对应系数的映射?

例如,使用toString示例我得到以下系数:

enter image description here

我想有一个映射如下:

{avgP = -9.6225,BysP = 5.3931,Degree = 0.0016 ...}

1 个答案:

答案 0 :(得分:1)

coefficient()返回的double [] []与您传递给Logistic的Instances对象具有不同的属性集。我不得不仔细阅读Weka code以了解如何应对这一点。我无法通过Logistic上的方法找到获取信息的方法,但您可以轻松复制它使用的过滤器并获得相同的属性集来操作。

我使用Weka作为JRuby中的库,因此这里的代码是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变量是一个Instances集合,它反映了Logistic创建的内容,但最后有一个皱纹。 Logistic的内部结构将Intercept保持为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

这很适合我的事情。