Использование Weka NaiveBayes с Matlab - PullRequest
0 голосов
/ 23 июня 2019

Я создал модель NaiveBayes в Weka.Я экспортировал модель на диск.Теперь я хочу внедрить эту модель в MATLAB 2018, чтобы я мог проверить, как она работает с некоторыми данными, которые я получаю.

Я загружаю свою модель в MATLAB, заявив что-то вроде этого:

loadedModel = weka.core.SerializationHelper.read('myweka.model');

Затем я создаю объект Weka Instance, и пусть он содержит эти данные:

instance = infrequent,low,high,medium-high,high,medium,medium,low,low

Если я выполню эти две команды:

loadedModel.distributionForInstance(instance)
loadedModel.classifyInstance(instance)

Я вижу следующий вывод:

0.0001
0.9999
1

Это странно для меня, потому что, если я наблюдаю ту же запись в WEKA ui, я вижу тот же самый случай с вероятностями 0,993 и 0,007, классифицированный как '2'.(Я могу несколько раз загрузить одну и ту же модель с диска в WEKA и воспроизвести это поведение, и это правильно). После дальнейшего изучения я заметил, что независимо от последовательности атрибутов, которые имеет мой объект Instance, я всегда получаю одинаковую выходную вероятность, ита же классификация, вызывая модель через MATLAB.

В сети есть несколько постов, которые разделяют одну и ту же проблему, например:

Всегда получаю один и тот же вывод

Weka - Классификатор возвращает одинаковое распределение для любого ввода

Однако рекомендуемое решение для вызова instance.setClassMissing () не решило мою проблему.Я что-то пропустил или могу попытаться сделать, чтобы устранить проблему?

1 Ответ

0 голосов
/ 24 июня 2019

Имеет ли ваш тестовый экземпляр ту же структуру, что и ваш набор поездов?Если нет, вам нужно предоставить такую ​​же структуру.

Weka индексирует номинальные атрибуты и хранит индексы внутри.Поэтому порядок именных атрибутов в файле поезда важен.Например, если ваш атрибут отображается как низкий => 0, высокий => 1 в обучении, вам необходимо отобразить их таким образом в вашем наборе тестов.Обычно это достигается путем сериализации заголовка поезда с моделью.

Пример кода для создания заголовка поезда:

Instances trainHeader = new Instances(instances, 0);
trainHeader.setClassIndex(instances.classIndex());

При создании нового экземпляра установите его набор данных:

Instance instance = ...
instance.setDataset(trainHeader);
...