最近在做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)