1

最近在做WEKA,输出随机森林的详细规则。
我正在处理的类具有以下层次关系:

public class RandomForest extends Classifier {
       public Bagging m_bagger;
       public String toString(){
              return "other"+m_bagger.toString(); 
       }
}
public class Bagging extends RandomizableIteratedSingleClassifierEnhancer{
       // no relative declaration
       public String toString(){
              return "other"+m_Classifiers[i].toString(); //changes I made
       }
}
public abstract class RandomizableIteratedSingleClassifierEnhancer extends IteratedSingleClassifierEnhancer {
       // no relative declaration 
       // no toString()
}
public abstract class IteratedSingleClassifierEnhancer extends SingleClassifierEnhancer{
       public Classifier[] m_Classifiers;
       // no toString()
}
public abstract class SingleClassifierEnhancer extends Classifier{
       protected Classifier m_Classifier = new ZeroR();
       // no toString()
}
public abstract class Classifier{
       // no toString()
}

在我更改它之前,代码运行良好。
改完之后,如果我读入数据,自己训练一个WEKA模型,效果也很好。
但是,如果我加载教授给我的模型,然后运行 ​​toString(),它会报告以下行:

java.lang.NullPointerException
    at weka.classifiers.trees.RandomTree.leafString(RandomTree.java:656)
    at weka.classifiers.trees.RandomTree.toString(RandomTree.java:678)
    at weka.classifiers.trees.RandomTree.toString(RandomTree.java:707)
    at weka.classifiers.trees.RandomTree.toString(RandomTree.java:700)

它无限地重复这些行,直到我内存不足。

我已经调试并发现错误在

m_Classifiers[i].toString()   

相关代码是(在 RandomForest 类中):

if (m_classifier.m_bagger.m_Classifiers == null) {
        System.out.println("Bagging: No model built yet.");
    } 
else {
        StringBuffer text = new StringBuffer();
        text.append("All the base classifiers: \n\n");
        for (int i = 0; i < m_classifier.m_bagger.m_Classifiers.length; i++)
              text.append(m_classifier.m_bagger.m_Classifiers[i].toString()+"\n\n");  //It goes wrong here

        if (m_classifier.m_bagger.m_CalcOutOfBag) {
            text.append("Out of bag error: "
                    + Utils.doubleToString(
                    m_classifier.m_bagger.m_OutOfBagError, 4)
                    + "\n\n");
    }
System.out.println(text.toString());

如果我调用方法(而不是使用公共变量),它的行为是一样的。

一个有趣的事实是我根本找不到这个 toString() 的定义。当我在这个特定的 toString() (不是其他人)上按 F3 (在 Eclipse 中意味着转到定义)时,它会报告“找不到源”我
不知道哪里出了问题,有人可以帮我吗?

谢谢你一百万。

只是为了澄清:
这不应该是索引i的问题,因为我已经尝试过其他功能,比如

m_Classifiers[i].debugTipText()

它工作完美。
出于同样的原因,我不认为 m_Classifiers 可以为 null
我将一些“受保护”更改为“公共”,但在我进行此更改之前它不起作用。

为了回应 Jim 的评论,这里是RandomTree.java
https://github.com/HaohanWang/WekaRandomForest/blob/master/src/weka/classifiers/trees/RandomTree.java
的 githup 代码 对不起,我没有在这里粘贴代码,因为那里大约有100行相关代码,从第626行到第715
行eclipse错误中实际上有更多行,与第656行、第678行、第700行、第707行和第642行有关。所有这些行都在调用leafString()或者toString(int)
现在我我猜我的问题是我没有合适的 inttoString(int)

4

1 回答 1

0

第 656 行是

int maxIndex = Utils.maxIndex(m_Distribution[0]);

因此m_Distribution为空。如果m_Distribution[0]为空,则错误将发生在内部Utils.maxIndex,我假设这是一个静态方法。

于 2013-09-27T03:04:30.670 回答