我原来的树更大了,但是由于我在这个问题上困扰了很长时间,所以我决定尝试简化我的树。我结束了这样的事情:

java - Weka J48分类不跟随树-LMLPHP

如您所见,我只有一个名为“LarguraBandaRede”的属性,带有3个可能的标称值“Congestionado”,“Livre”和“Merda”。

之后,我从weka导出了j48.model以便在我的Java代码中使用。

通过这段代码,我导入了模型以用作分类器:

ObjectInputStream objectInputStream = new ObjectInputStream(in);
classifier = (J48) objectInputStream.readObject();

之后,我开始创建一个包含属性和实例文件的数组列表
for (int i = 0; i <features.length; i++) {
        String feature = features[i];
        Attribute attribute;
        if (feature.equals("TamanhoDados(Kb)")) {
            attribute = new Attribute(feature);
        } else {
            String[] strings = null;
            if(i==0) strings = populateAttributes(7);
            if(i==1) strings = populateAttributes(10);
            ArrayList<String> attValues = new ArrayList<String>(Arrays.asList(strings));
            attribute = new Attribute(feature,attValues);
        }
        atts.add(attribute);
    }

其中populateAttributes给出每个属性的可能值,在这种情况下为“Livre,Merda,Congestionado”;代表LarguraBandaRede,“Sim,Nao”代表Resultado,这是我的 class 属性。
Instances instances = new Instances("header",atts,atts.size());
instances.setClassIndex(instances.numAttributes()-1);

创建实例后,是时候创建实例文件了,即我要分类的实例
Instance instanceLivre = new DenseInstance(features.length);
Instance instanceMediano = new DenseInstance(features.length);
Instance instanceCongestionado = new DenseInstance(features.length);
instanceLivre.setDataset(instances);
instanceMediano.setDataset(instances);
instanceCongestionado.setDataset(instances);

然后为每个实例设置“LarguraBandaRede”的3种可能值。 “instanceLivre”(带“Livre”),“instanceMediano”(带“Merda”)和“instanceCongestionado”(带“Congestionado”)。

之后,我仅使用classifyInstance方法对这3个实例进行分类
System.out.println(instance.toString());
double resp = classifier.classifyInstance(instance);
System.out.println("valor: "+resp);

这是我的结果:

java - Weka J48分类不跟随树-LMLPHP

如您所见,具有Merda作为“LarguraBandaRede”的实例被分类为与Congestionado相同的类,即“Nao”类。但这没有任何意义,因为上面的树清楚地表明,当“LarguraBandaRede”是“Merda”或“Livre”时,类应该是相同的。

这就是我的问题。这是怎么发生的以及如何解决?

提前致谢。

编辑

我不知道这:

java - Weka J48分类不跟随树-LMLPHP

对模型的工作方式没有任何影响。但是,当向标称属性提供可能的值时,我们必须遵循此顺序。

最佳答案

您是否已检查weka标称属性索引是否等于populateAttributes方法?

10-06 03:34