2010-08-04 3 views
2

странные результаты появляются при использовании дерева J48. Мне нужно классифицировать вектор из 48 функций, который работает очень хорошо, но когда я попытался «оптимизировать», я столкнулся с странными результатами.Странные результаты экземпляра weka

У меня есть метод классификации:

public boolean classify(double feature1, double feature2, double[] featureVec) { 
     Instance toBeClassified = new Instance(2+featureVec.length); 
     toBeClassified.setValue(0, feature1); 
     toBeClassified.setValue(1, feature2); 
     for (int i = 2; i < f.length + 2; ++i) { 
      toBeClassified.setValue(i, featureVec [i - 2]); 
     } 
     toBeClassified.setDataset(dataset); 

     try { 
      double _class = tree.classifyInstance(toBeClassified); 
      return _class > 0; 
     } catch (Exception e1) { 
      if(Logging.active) { 
       logger.error(e1.getMessage(), e1.getCause());} 
      } 
     return false; 
    } 
} 

Она работает довольно хорошо, и я надеюсь, что я делаю все правильно. Но я хотел удалить создание экземпляра, которое выполняется при каждом вызове метода, поэтому я переместил экземпляр toBeClassified = новый экземпляр (48); line в тело класса - поэтому он создается только один раз. Это тоже хорошо работает, несмотря на то, что я получаю несколько разные результаты по сравнению с другими. скажем, из 400 классификаций, каждый отличается (не говоря уже, неверно). Но я не вижу причины для этого ... Надеюсь, что некоторые ребята используют weka, так что я понимаю, что происходит/не так. (Да, 2 + featureVec.length равно 48).

Спасибо и приветствую.

+1

Вы последовательно получаете одну и ту же классификацию по двум методам для одного и того же примера в одном наборе данных? – Brabster

+1

Кроме того, пока мне интересно узнать, почему вы видите несоответствие - документы Weka http://weka.sourceforge.net/doc/ предполагают, что быстрее было бы создать новый экземпляр вместо изменения существующего. Предполагая, что вы ищете лучшую производительность, вы приурочили/профилировали два метода и обнаружили, что быстрее? – Brabster

+0

@Brabster Да, им нужна производительность, но и для «Мне нравится». Я еще не измерил его, но я мог бы завтра, когда вернусь к работе. Да, это постоянно, если я просто изменяю способ создания экземпляра, я получаю разные результаты все время. – InsertNickHere

ответ

3

Очень маловероятно, что с J48 что-то не так. Как создание классификатора, так и его классификация являются детерминированными. Я бы рекомендовал разместить большую часть вашего кода, потому что этот выглядит великолепно (безбалкно).

Что касается теста с контуром 400: это обязательно должно давать одинаковые результаты каждый раз, без исключений. Две мысли:

  • Положите assert, который проверяет, совпадают ли значения экземпляра с образцом. Это исключает любую ошибку в экземпляре.

  • Выполняет ли классификация многопоточность? Существуют ли общие объекты данных?

+0

Извините, но я не могу показать больше кода, так как это нарушит то, что я записал в моем контракте. Хахахаха, твой мой человек. Так же, как я читаю ваш «многопоточность» - да, эта функция вызывается из разных потоков одновременно. Ofc это не проблема, если каждый вызов метода создает свой собственный экземпляр, но если я использую только один, мне нужно синхронизировать, чтобы все было сделано правильно. Я переработаю это завтра, а затем, если это будет успешно, примите свой ответ. – InsertNickHere

+0

Спасибо за быстрый ответ. Исправьте меня, если я ошибаюсь: допустим, у вас есть N потоков, N экземпляров и ... Один экземпляр классификатора? – Rekin

+1

Итак, экземпляр класса делится между потоками. Я не знаю, проблема в этом, но я слышал, что в Java даже чтение должно быть синхронизировано. Попробуйте экземпляр клонирования для каждого потока. Объект 'ThreadLocal' из пакета' java.util.concurrent' может помочь. – Rekin

Смежные вопросы