使用J48树时会出现奇怪的结果。我需要对48个特征的矢量进行分类,这些特征非常有效,但是当我试图“优化”时,我会遇到奇怪的结果。
我有一个方法分类:
public boolean classify(double feature1, double feature2, double[] featureVec ) {
Instance toBeClassified = new Instance(2+featureVec.length);
toBeClassified.setValue(0, feature1);
toBeClassified.setValue(1, feature2);
for (int i = 2; i < f.length + 2; ++i) {
toBeClassified.setValue(i, featureVec [i - 2]);
}
toBeClassified.setDataset(dataset);
try {
double _class = tree.classifyInstance(toBeClassified);
return _class > 0;
} catch (Exception e1) {
if(Logging.active) {
logger.error(e1.getMessage(), e1.getCause());}
}
return false;
}
}
效果很好,我希望我做得对。但我想删除在每次方法调用时完成的实例创建,因此我将Instance toBeClassified = new Instance(48);进入类体 - 所以它只创建一次。这也很有效,尽管事实上,我得到的结果与其他结果略有不同。比方说,从400个分类中,一个是不同的(不是说,不正确)。但是我没有看到这个的原因...我希望这里有一些人使用weka,所以我理解发生了什么/错了。 (是的,2 + featureVec.length是48)。
谢谢和问候。
答案 0 :(得分:3)
J48出现问题的可能性很小。分类器创建和分类本身都是确定性的。我建议发布你的代码的更大部分,因为这个看起来很棒(unbuggy)。
至于你的400循环测试:这个肯定应该每次产生相同的结果,没有例外。两个想法:
设置assert,检查实例的值是否与模型1相同。这将排除实例中的任何错误。
分类是否以多线程方式运行?是否有共享数据对象?