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

时间:2018-10-22 08:52:23

标签: java weka

我正在尝试在Android应用中使用/导入WEKA 3.8.3(GUI之一)中制作的J48分类器,但是无论传入值如何,生成的类仅返回一个分类结果。

原始数据集looks like this,因此我可以在SO上找到的第一个答案是使用SMOTE对此进行补偿。我找不到SMOTE,但是从中我可以看到ClassBalancer过滤器实现了相同的结果。结果数据looks like this

These是原始数据的结果,而these是过滤后的数据的结果。

使用原始数据的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”。

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

我尝试使用默认的J48算法输入这两个数据集(原始/过滤后的数据集),并且在修剪其他活动的情况下禁用了所有修剪选项,但是这些分类器都没有返回一个以上的活动。

我认为这是所有相关的信息,但是如果我错过了任何事情,请告诉我,以便我添加。我相当确定问题出在分类器本身中,但是我不知道它到底是什么。

1 个答案:

答案 0 :(得分:1)

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

show tags values

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

select name,last(some_value) from test  where time > NOW() - 12h group by "name".

我不确定此行通常用于什么目的,但是删除它似乎已解决了该问题。