我正在尝试在 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 算法中输入两个数据集(原始/过滤),一个禁用所有修剪选项,以防它修剪其他活动,但这些分类器中没有一个返回超过一个活动。
我认为这是所有相关信息,但如果我遗漏了任何信息,请告诉我,以便我可以添加它。我相当确定问题出在分类器本身的某个地方,但我不知道它到底是什么。
白板的微信
相关分类