Изучение Weka в командной строке - программирование
Подтвердить что ты не робот

Изучение Weka в командной строке

Я довольно новый для Weka и еще более новый для Weka в командной строке. Я считаю, что документация плохая, и я изо всех сил пытаюсь понять, что нужно сделать. Например, вы хотите взять два файла .arff, один для обучения, один для тестирования и получить вывод прогнозов для отсутствующих меток в тестовых данных.

Как я могу это сделать?

У меня этот код как начальный блок

java -classpath weka.jar weka.classifiers.meta.FilteredClassifier
-t "training_file_with_missing_values.arff"
-T "test_file_with_missing_values.arff"
-F weka.filters.unsupervised.attribute.ReplaceMissingValues -- -c last
-W weka.classifiers.functions.MultilayerPerceptron -- -L 0.3 -M 0.2 -H a

Запуск этого кода дает мне "Незаконный вариант -c последний", и я не уверен, почему. Я также не собираюсь использовать MLP, поскольку NN имеет тенденцию быть слишком медленным, когда у меня есть несколько тысяч функций из текстовых данных. Я знаю, как изменить его на другой классификатор (например, NB или libSVM, так что это хорошо).

Но я не уверен, как добавить несколько фильтров в один вызов, так как мне также нужно добавить фильтр StringToWordVector (и, возможно, фильтр Reorder, чтобы сделать класс последним, а не первым атрибутом).

А потом, как мне получить его, на самом деле выводят мне метки прогноза для каждого класса? А затем сохраните так, что в arff с исходными данными.

4b9b3361

Ответ 1

Weka - не самый яркий пример документации, но вы все равно можете найти ценную информацию об этом на своих сайтах. Вы должны начать с Primer. Я понимаю, что вы хотите классифицировать текстовые файлы, поэтому вы также должны взглянуть на Категоризацию текста с помощью WEKA.

В командной строке, опубликованной в вашем вопросе, содержится ошибка. Я знаю, вы скопировали это из моего ответа на другой вопрос, но я тоже это заметил. Вы должны опустить -- -c last, потому что фильтр ReplaceMissingValue ему не нравится.

В Primer говорится:

weka.filters.supervised

Классы ниже weka.filters.supervised в иерархии классов предназначены для фильтрации контролируемого, то есть использования информации о классе. Класс должен быть назначен через -c, для поведения по умолчанию WEKA используйте -c last.

но ReplaceMissingValue - это неконтролируемый фильтр, как и StringToWordVector.

Несколько фильтров

Добавление нескольких фильтров также не является проблемой, для чего предназначен MultiFilter. Командная строка может немного запутаться: (я выбрал RandomForest здесь, потому что это намного быстрее, чем NN).

java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \
  -t ~/weka-3-7-9/data/ReutersCorn-train.arff \
  -T ~/weka-3-7-9/data/ReutersCorn-test.arff \
 -F "weka.filters.MultiFilter \
     -F weka.filters.unsupervised.attribute.StringToWordVector \
     -F weka.filters.unsupervised.attribute.Standardize" \
 -W weka.classifiers.trees.RandomForest -- -I 100 \

Выполнение прогнозов

Вот что говорит Primer о получении предсказания:

Однако, если необходима более подробная информация о предсказаниях классификатора, -p # выводит только предсказания для каждого тестового экземпляра, а также диапазон идентификаторов атрибутов на основе одного (0 для none).

Хорошим соглашением можно поставить те общие параметры, как -p 0, непосредственно после класса, который вы вызываете, поэтому в командной строке будет

java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \
  -t ~/weka-3-7-9/data/ReutersCorn-train.arff \
  -T ~/weka-3-7-9/data/ReutersCorn-test.arff \
  -p 0 \
 -F "weka.filters.MultiFilter \
     -F weka.filters.unsupervised.attribute.StringToWordVector \
     -F weka.filters.unsupervised.attribute.Standardize" \
 -W weka.classifiers.trees.RandomForest -- -I 100 \

Структура классификаторов/фильтров WEKA

Но, как вы можете видеть, WEKA может стать очень сложным при вызове из командной строки. Это связано с древовидной структурой классификаторов и фильтров WEKA. Хотя вы можете запускать только один классификатор/фильтр для командной строки, он может быть структурирован как сложный, как вам нравится. Для вышеуказанной команды структура выглядит следующим образом:

FilteredClassifier инициализирует фильтр в наборе учебных данных, фильтрует как учебные, так и тестовые данные, затем обучает модель данных обучения и классифицирует данные теста.

FilteredClassifier
 |
 + Filter
 |
 + Classifier

Если мы хотим использовать несколько фильтров, мы используем MultiFilter, который является только одним фильтром, но он вызывает несколько других в том порядке, в котором они были указаны.

FilteredClassifier
 |
 + MultiFilter
 |  |
 |  + StringToWordVector
 |  |
 |  + Standardize
 |
 + RandomForest

Жесткая часть запуска чего-то подобного из командной строки назначает нужные параметры для правильных классов, потому что часто имена опций одинаковы. Например, параметр -F используется для FilteredClassifier и MultiFilter, поэтому мне пришлось использовать кавычки, чтобы понять, какой -F принадлежит к тому фильтру.

В последней строке вы видите, что опция -I 100, принадлежащая RandomForest, не может быть добавлена ​​напрямую, потому что тогда она будет назначена FilteredClassifier, и вы получите Illegal options: -I 100. Следовательно, перед этим нужно добавить --.

Добавление прогнозов к файлам данных

Добавление предсказанной метки класса также возможно, но еще сложнее. AFAIK это невозможно сделать за один шаг, но сначала вы должны обучить и сохранить модель, а затем использовать ее для прогнозирования и назначения новых ярлыков классов.

Обучение и сохранение модели:

java -classpath weka.jar weka.classifiers.meta.FilteredClassifier \
  -t ~/weka-3-7-9/data/ReutersCorn-train.arff \
  -d rf.model \
  -F "weka.filters.MultiFilter \
      -F weka.filters.unsupervised.attribute.StringToWordVector \
      -F weka.filters.unsupervised.attribute.Standardize" \
  -W weka.classifiers.trees.RandomForest -- -I 100 \

Это приведет к сериализации модели обученного FilteredClassifier к файлу rf.model. Важно то, что инициализированный фильтр также будет сериализован, иначе тестовый набор не будет совместим после фильтрации.

Загрузка модели, создание прогнозов и ее сохранение:

java -classpath weka.jar weka.filters.supervised.attribute.AddClassification \
  -serialized rf.model \
  -classification \
  -remove-old-class \
  -i ~/weka-3-7-9/data/ReutersCorn-test.arff \
  -o pred.arff \
  -c last

Примечание:

Я хочу добавить, что прежде чем писать этот ответ здесь, я не знал о том, чтобы делать прогнозы из командной строки. Я googled ваши проблемы, а затем пришел к этому ответу проб и ошибок;)

Ответ 2

Лучший способ сделать все, что вы хотите использовать в GUI Explorer. Вот как сделать все, что вы хотите:

1) Возьмите два отдельных файла для обучения и тестирования.

Используйте "Открыть файл" на вкладке "Preprocess", чтобы выбрать файл тренировки. Используйте радиостанцию ​​ "Комплект поставки" на вкладке "Классификация", чтобы выбрать тестовый файл.

2) Выведите предсказания для отсутствующих меток.

Используйте "Дополнительные параметры" и выберите "Выходные предсказания" на вкладке "Классификация", чтобы просмотреть прогнозы.

3) Используйте несколько фильтров

Используйте "Фильтр" на вкладке "Препроцесс", чтобы применить столько фильтров, сколько хотите, прежде чем классифицировать.

4) Сделайте класс последним атрибутом

Это фактически не нужно. Вы можете выбрать любой атрибут, который будет вашим классом. Класс - это любой атрибут, который вы хотите предсказать классификатору. Используйте раскрывающийся список Nom (Class) на вкладке Classify, чтобы выбрать, какой атрибут является вашим классом.