Java WEKA分类器返回一个分类,与值无关

Java WEKA分类器返回一个分类,与值无关,java,weka,Java,Weka,我正在尝试在Android应用程序中使用/导入WEKA 3.8.3(GUI)中制作的J48分类器,但不管传入值如何,生成的类只返回一个分类结果 原始数据集,所以我能在so上找到的第一个答案是使用SMOTE来补偿这一点。我找不到SMOTE,但从我所看到的情况来看,ClassBalancer过滤器实现了相同的结果。结果数据 是原始数据的结果,也是筛选数据的结果 使用原始数据的J48类只返回2.0的值,这将对应于步行,我猜这是因为步行是训练集中最常见的分类。使用过滤数据的J48类只返回1.0的值,这我

我正在尝试在Android应用程序中使用/导入WEKA 3.8.3(GUI)中制作的J48分类器,但不管传入值如何,生成的类只返回一个分类结果

原始数据集,所以我能在so上找到的第一个答案是使用SMOTE来补偿这一点。我找不到SMOTE,但从我所看到的情况来看,ClassBalancer过滤器实现了相同的结果。结果数据

是原始数据的结果,也是筛选数据的结果

使用原始数据的J48类只返回2.0的值,这将对应于步行,我猜这是因为步行是训练集中最常见的分类。使用过滤数据的J48类只返回1.0的值,这我无法解释

我已经尝试过将一个工作分类器从以前的项目加载到应用程序中;这个(J48)分类器确实返回了不同的值。我还尝试手动删除数据行,直到所有活动都有相同数量的条目,但这并没有解决问题。我还尝试输入一个我知道应该与“坐”对应的值,但这也不起作用

当我将值打印到日志中时,发送到分类器的实例看起来非常好,所以我认为这与输入无关。为了防止我遗漏了一些明显的东西,我将包含以下代码:

    public double createInstances(double x, double y, double z){

    double result = 0;

    Instances dataRaw = new Instances("TestInstances", atts, 3);
    dataRaw.setClassIndex(dataRaw.numAttributes()-1);

    Log.d(TAG,"Rawdata:" + dataRaw);

    Instance inst = new DenseInstance(3);
    inst.setDataset(dataRaw);
    inst.setValue(accel_x,x);
    inst.setValue(accel_y,y);
    inst.setValue(accel_z,z);

    Log.d(TAG,"NEWDATARAW:" + inst);

    try {
        result = weka.classifyInstance(inst);
        Log.d(TAG,"RESULT:" + result);

    }

    catch (Exception e){
        Log.e(TAG,"DID NOT WORK:" + e);
    }

    return result;
}
我还确保属性被添加到属性ArrayList“atts”中

我能想到的唯一剩下的选择是数据格式有问题,但我可以想象,在创建算法时,它已经显示出问题的迹象。是包含数据的ARFF文件的示例

我曾尝试以默认的J48算法输入两个数据集(原始/过滤),以及一个禁用了所有修剪选项的数据集,以防修剪其他活动,但这些分类器都不会返回多个活动


我想这些都是相关信息,但是如果我遗漏了什么,请告诉我,这样我就可以添加它了。我很确定问题出在分类器本身的某个地方,但我不知道它到底是什么。

结果表明,WEKA在classifyInstance方法中放置了以下代码:

// set class value to missing
   s[i.classIndex()] = null;
这导致数组中的最后一个值(在本例中为accel_z值)设置为null,导致分类器始终返回相同的值,因为这是分类器中的第一个检查(注意“if(i[2]==null)”语句):

静态双精度N69cd8e58128(对象[]i){
双p=双NaN;
如果(i[2]==null){
p=1;
}如果(((Double)i[2]).doubleValue()6.43){
p=Wekar.N26ef16ed242(i);
}
返回p;
}

我不确定这行代码通常起什么作用,但删除它似乎解决了问题。

我怀疑您认为数据不平衡的问题是正确的。在Weka GUI中,您可以可视化学习到的树。这可能有助于您进一步调试问题。感谢提示!从我所知,这棵树看起来是正确的。Also即使我手动为活动提供相同数量的条目,问题仍然存在,这一事实使我认为可能存在其他因素,而不仅仅是不平衡的数据。
static double N69cd8e58128(Object []i) {
    double p = Double.NaN;
    if (i[2] == null) {
        p = 1;
    } else if (((Double) i[2]).doubleValue() <= 6.43) {
        p = WekaClassifier.Nad3034129(i);
    } else if (((Double) i[2]).doubleValue() > 6.43) {
        p = WekaClassifier.N26ef16ed242(i);
    }
    return p;
}