Weka预测分类节点

时间:2013-10-09 17:06:32

标签: java machine-learning weka

我已经创建了一个巨大的j48树,大小约为7000,有很多树枝和树叶。我正在获得测试图像的分类结果。我想知道哪个节点正在对每个结果进行分类。换句话说,有没有办法让weka看到做出决定的叶子节点的id或者什么。

1 个答案:

答案 0 :(得分:0)

据我所知,您将无法通过Weka GUI执行此操作。但是,如果您使用Weka API,则有一些希望。我不是Java专家,因此以下步骤可能不遵循最佳实践,但它确实适用于我编写的小例子。

  1. 在Weka GUI中构建j48树,在“更多选项”选项卡中选择“输出源代码”

  2. 将源代码复制到Java代码中的新类

  3. classifyInstance 方法中增加返回变量以包含叶号

  4. 修改类,使其不再扩展“Classifier”(这需要在您刚刚创建的类中删除一些其他方法)

  5. 下面是一个将使用决策树桩分类器对Weka实例进行分类的类。输出将包括叶号。这是根据Weka示例数据集中包含的分类天气数据构建的,遵循上述步骤。对于您拥有的巨大决策树,可能需要进行一些字符串替换以有效地增加返回变量。

    import weka.core.Instance;
    
    public class WekaWrapper {
    
      /**
       * Classifies the given instance.
       *
       * @param i the instance to classify
       * @return the classification result
       */
      public double[] classifyInstance(Instance i) throws Exception {
        Object[] s = new Object[i.numAttributes()];
    
        for (int j = 0; j < s.length; j++) {
          if (!i.isMissing(j)) {
            if (i.attribute(j).isNominal())
              s[j] = new String(i.stringValue(j));
            else if (i.attribute(j).isNumeric())
              s[j] = new Double(i.value(j));
          }
        }
    
        // set class value to missing
        s[i.classIndex()] = null;
    
        return WekaClassifier.classify(s);
      }
    }
    class WekaClassifier {
      public static double[] classify(Object[] i) {
        /* outlook */
          double[][] here=new double[3][2];
          here[0][0]=0; //leaf value
          here[0][1]=1; //leaf ID
          here[1][0]=0; //leaf value
          here[1][1]=2; //leaf ID
          here[2][0]=0; //leaf value
          here[2][1]=3; //leaf ID
        if (i[0] == null) { return here[0]; } else if (((String)i[0]).equals("overcast")) { return here[1]; } else { return here[2]; }
      }
    }