Я пытаюсь использовать / импортировать классификатор J48, созданный в WEKA 3.8.3 (с графическим интерфейсом) в приложении для Android, но результирующий класс возвращает только один результат классификации независимо от входящих значений.
Набор необработанных данных выглядит следующим образом , поэтому первым ответом, который я смог найти на 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 по умолчанию и один, в котором все параметры сокращения были отключены вВ случае, если это сокращало другие действия, но ни один из этих классификаторов не возвращал больше одного действия.
Я думаю, что это вся необходимая информация, но если я что-то пропустил, пожалуйста, сообщите мне, чтобы я мог добавить ее.Я вполне уверен, что проблема где-то в самом классификаторе, но я понятия не имею, что это такое.