machine-learning - libros - weka español
Aprendiendo a Weka en la línea de comando (2)
Una mejor manera de hacer todo lo que quiera con el GUI Explorer. Aquí está cómo hacer todo lo que quieras:
1) Tome dos archivos separados para entrenamiento y prueba.
Use ''Abrir archivo'' en la pestaña Preproceso para elegir su archivo de entrenamiento. Use la radio ''Juego de pruebas suministrado'' en la pestaña Clasificar para elegir su archivo de prueba.
2) Emitir las predicciones para las etiquetas faltantes.
Use ''Más opciones'' y elija ''Predicciones de salida'' en la pestaña Clasificar para ver las predicciones.
3) Usa más de un filtro
Use ''Filtro'' en la pestaña Preproceso para aplicar tantos filtros como desee antes de clasificar.
4) Hacer clase el último atributo
Esto es realmente innecesario. Puedes elegir cualquier atributo para ser tu clase. Una clase es cualquier atributo que desee que el clasificador prediga. Utilice el menú desplegable Nom (Clase) en la pestaña Clasificar para elegir qué atributo es su clase.
Soy bastante nuevo para Weka y aún más nuevo para Weka en la línea de comando. Encuentro que la documentación es pobre y estoy luchando para descubrir algunas cosas que hacer. Por ejemplo, desea tomar dos archivos .arff, uno para capacitación, uno para probar y obtener un resultado de predicciones para las etiquetas faltantes en los datos de prueba.
¿Cómo puedo hacer esto?
Tengo este código como un bloque de inicio
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
Ejecutar ese código me da "Opción ilegal -c último" y no estoy seguro de por qué. Tampoco voy a utilizar MLP ya que NN tiende a ser demasiado lento cuando tengo unas miles de características de los datos de texto. Sé cómo cambiarlo a otro clasificador (como NB o libSVM, así que es bueno).
Pero no estoy seguro de cómo agregar varios filtros en una llamada, ya que también necesito agregar el filtro StringToWordVector (y posiblemente el filtro Reordenar para hacer que la clase sea la última, en lugar del primer atributo).
¿Y cómo lo obtengo en realidad me da las etiquetas de predicción de cada clase? Y luego almacenar así que aquellos en un arff con los datos iniciales.
Weka no es realmente el brillante ejemplo de documentación, pero aún puede encontrar información valiosa sobre ella en sus sitios. Deberías comenzar con el Manual . Entiendo que desea clasificar los archivos de texto, por lo que también debería consultar la categorización de texto con WEKA .
La línea de comando que publicó en su pregunta contiene un error. Lo sé, lo copiaste de mi respuesta a otra pregunta, pero también lo noté. Debe omitir el -- -c last
, porque el filtro ReplaceMissingValue
no le gusta.
En el Manual dice:
weka.filters.supervised
Las clases debajo de weka.filters.supervised en la jerarquía de clases son para filtrado supervisado , es decir, aprovechando la información de la clase. Una clase debe asignarse a través de -c, para el comportamiento predeterminado de WEKA use
-c last
.
pero ReplaceMissingValue
es un filtro no supervisado , como lo es StringToWordVector
.
Múltiples filtros
Agregar un filtro múltiple tampoco es un problema, para eso está el MultiFilter
. Sin embargo, la línea de comandos puede ser un poco desordenada: (Elegí RandomForest
aquí, porque es mucho más rápido que 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 /
Haciendo predicciones
Esto es lo que dice el Manual sobre cómo obtener la predicción:
Sin embargo, si se necesita información más detallada sobre las predicciones del clasificador, -p # genera solo las predicciones para cada instancia de prueba, junto con un rango de identificadores de atributos basados en uno (0 para ninguno).
Es una buena convención colocar aquellas opciones generales como -p 0
directamente después de la clase a la que llamas, por lo que la línea de comando sería
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 /
Estructura de los clasificadores / filtros WEKA
Pero como puede ver, WEKA puede volverse muy complicado cuando lo llama desde la línea de comando. Esto se debe a la estructura en árbol de los clasificadores y filtros WEKA. Aunque puede ejecutar solo un clasificador / filtro por línea de comando, puede estructurarse tan complejo como desee. Para el comando anterior, la estructura se ve así:
El filtro filtrado inicializará un filtro en el conjunto de datos de entrenamiento, filtrará los datos de entrenamiento y prueba, luego entrenará un modelo en los datos de entrenamiento y clasificará los datos de prueba dados.
FilteredClassifier
|
+ Filter
|
+ Classifier
Si queremos múltiples filtros, usamos el MultiFilter, que es solo un filtro, pero llama a otros muchos en el orden en que fueron dados.
FilteredClassifier
|
+ MultiFilter
| |
| + StringToWordVector
| |
| + Standardize
|
+ RandomForest
La parte más difícil de ejecutar algo como esto desde la línea de comandos es asignar las opciones deseadas a las clases correctas, porque a menudo los nombres de las opciones son los mismos. Por ejemplo, la opción -F
se usa para FilteredClassifier
y MultiFilter
, así que tuve que usar comillas para aclarar qué -F pertenece a qué filtro.
En la última línea, verá que la opción -I 100
, que pertenece a RandomForest
, no se puede adjuntar directamente, porque entonces se le asignaría a FilteredClassifier
y obtendrá Illegal options: -I 100
. Por lo tanto, debe agregar --
antes de eso.
Agregar predicciones a los archivos de datos
Agregar la etiqueta de clase predicho también es posible, pero aún más complicado. AFAIK esto no se puede hacer en un solo paso, pero primero hay que entrenar y guardar un modelo, luego utilizarlo para predecir y asignar nuevas etiquetas de clase.
Entrenando y guardando el modelo:
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 /
Esto serializará el modelo del FilteredClassifier
entrenado en el archivo rf.model
. Lo importante aquí es que el filtro inicializado también se serializará; de lo contrario, el conjunto de prueba no sería compatible después de filtrar.
Cargando el modelo, haciendo predicciones y guardándolo:
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
Nota:
Quiero agregar que antes de escribir esta respuesta aquí, no tenía conocimiento acerca de hacer predicciones desde la línea de comando en absoluto. Busqué en Google sus problemas y luego llegué a esta respuesta por prueba y error;)