Ответ 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 ваши проблемы, а затем пришел к этому ответу проб и ошибок;)