Tutorial. Uso básico del API de WEKA

MRA, 2011/12


Índice General

Introducción

Todas las funcionalidades disponibles en los distintos interfaces gráficos (GUIs) de WEKA pueden ser usadas desde código Java, junto con algunas otras no accesibles directamente desde el GUI (normalmente funciones de bajo nivel).

Listado de paquetes

Referencias

Código de ejemplo (para Weka 3.7.x)

Clases básicas: datasets, atributos e instancias

Para crear y gestionar los conjuntos de entrenamiento o validación en memoria es necesario utilizar las clases Instances, Attribute e Instance del paquete weka.core.

Clase Instances

Representación en memoria de una colección de ejemplos (dataset).

Constructores y métodos de interés:

Clase Attribute

El API de WEKA contempla cinco tipos de atributos.

Métodos:

Clase Instance

Almacena los valores de un ejemplo (instancia).

Internamente los valores de los atributos de cada instancia se representan como un vector de números reales (double[]), independientemente del tipo de los atributos.

Normalmente estará asociado a un dataset (Instances) que determina el formato y el tipo de los atributos cuyos valores almacena la instancia.

Constructor y métodos:

Existe una subclase SparseInstance orientada a almacenar vectores de atributos con muchos valores nulos de forma compacta. En las instancias SparseInstance sólo se almacenan los atributos (numéricos o nominales) distintos de cero.

Uso de filtros

Los filtros proveen un mecanismo para procesar datasets e instancias y realizar transformaciones sobre ellos.

Los filtros tienen dos modos de funcionamiento: modo entrenamiento y modo uso.

Nota: Para realizar la fase de construcción y filtrar un dataset complero se puede utilizar el método estático Instances useFilter(Instances data, Filter filter) de la clase abstracta Filter.

...
public static Instances useFilter(Instances data, Filter filter) {
    for (int i = 0; i < data.numInstances(); i++) {
      filter.input(data.instance(i));
    }
    filter.batchFinished();
    Instances newData = filter.getOutputFormat();
    Instance processed;
    while ((processed = filter.output()) != null) {
      newData.add(processed);
    }
    return newData;
}
...

Normalmente la estructura (múmero y tipo de atributos) de las instancias originales y la de las instancias filtradas no coincidirán.

StringToWordVector

La mayoría de los algoritmos de WEKA no pueden manejar directamente atributos de tipo String.

El filtro StringToWordVector (en el paquete weka.filters.unsupervised.attribute) transforma los atributos de tipo string en vectores numéricos.

La selección de palabras se realiza durante la fase de construcción del filtro al ejecutar batchFinished() (o indirectamente mediante Filter.useFilter()).

Nota:

Métodos:

Algoritmos de clasificación

Todos los algoritmos de clasificación heredan de weka.classifiers.Classifier y deben de implementar los siguientes métodos básicos:

La clase abstracta Classifier también ofrece el método Classifier forName(String classifierName, String[] options) que crea un clasificador de la clase indicada con los parámetros que se le pasan como array de String (el javadoc de cada método de clasificación especifica el formato de las opciones que esperan)

Algoritmos de clustering

Todos los algoritmos de clustering implementan el interfaz weka.clusterers.Clusterer y deben de aportar los siguientes métodos básicos:

Selección de atributos

El proceso de selección de atributos se divide en dos tareas:

El método de búsqueda/selección determina los evaluadores que son admitidos (ver javadoc o comprobar compatibilidad desde el interfaz gráfico de WEKA)

Métodos:

Ejemplo: ordenar atributos por ganancia de formación

 

Instances dataset = new Instances(new FileReader(args[0]));
dataset.setClassIndex(dataset.numAttributes()-1);        

AttributeSelection as = new AttributeSelection();
as.setEvaluator(new InfoGainAttributeEval());
as.setSearch(new Ranker());
// // Para usar crosswalidation
// as.setFolds(10);
// as.setXval(true);
as.SelectAttributes(dataset);

System.out.println("Atributos ordenados:");
for(int i: as.selectedAttributes()) {
    System.out.println(dataset.attribute(i).name());
}



ribadas 2012-02-25