WEKA 分类器返回一个分类而不考虑值

我正在尝试在 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;

}

我还确保将属性添加到 Attributes ArrayList“atts”。


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


我尝试在默认的 J48 算法中输入两个数据集(原始/过滤),一个禁用所有修剪选项,以防它修剪其他活动,但这些分类器中没有一个返回超过一个活动。


我认为这是所有相关信息,但如果我遗漏了任何信息,请告诉我,以便我可以添加它。我相当确定问题出在分类器本身的某个地方,但我不知道它到底是什么。


白衣非少年
浏览 142回答 1
1回答

白板的微信

结果 WEKA 将以下代码放在了分类实例方法中:// set class value to missing&nbsp; &nbsp;s[i.classIndex()] = null;这导致数组中的最后一个值(在本例中为 accel_z 值)设置为 null,导致分类器始终返回相同的值,因为这是分类器中的第一次检查(注意“if(i[2 ] == null”语句):static double N69cd8e58128(Object []i) {&nbsp; &nbsp; double p = Double.NaN;&nbsp; &nbsp; if (i[2] == null) {&nbsp; &nbsp; &nbsp; &nbsp; p = 1;&nbsp; &nbsp; } else if (((Double) i[2]).doubleValue() <= 6.43) {&nbsp; &nbsp; &nbsp; &nbsp; p = WekaClassifier.Nad3034129(i);&nbsp; &nbsp; } else if (((Double) i[2]).doubleValue() > 6.43) {&nbsp; &nbsp; &nbsp; &nbsp; p = WekaClassifier.N26ef16ed242(i);&nbsp; &nbsp; }&nbsp; &nbsp; return p;}我不确定这条线通常用于什么目的,但删除它似乎解决了这个问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java