viernes, 12 de julio de 2013

Apuntes: Cómo ejecutar un proceso completo con la API de RapidMiner

¿Qué es RapidMiner?

RapidMiner (anteriormente, YALE, Yet Another Learning Environment) es un programa informático para el análisis y minería de datos. Permite el desarrollo de procesos de análisis de datos mediante el encadenamiento de operadores a través de un entorno gráfico. Se usa en investigación educación, capacitación, creación rápida de prototipos y en aplicaciones empresariales. En una encuesta realizada por KDnuggets, un periódico de minería de datos, RapidMiner ocupó el segundo lugar en herramientas de analítica y de minería de datos utilizadas para proyectos reales en 20091 y fue el primero en 2010.2
La versión inicial fue desarrollada por el departamento de inteligencia artificial de la Universidad de Dortmund en 2001. Se distribuye bajo licencia AGPL y está hospedado en SourceForge desde el 2004. (Fuente)

Ahora a la acción:

Cómo crear un proceso completo con la API de Java?

import com.rapidminer.RapidMiner;
import com.rapidminer.example.Attribute;
import com.rapidminer.example.ExampleReader;
import com.rapidminer.example.ExampleSet;
import com.rapidminer.operator.IOContainer;
import com.rapidminer.operator.Model;
import com.rapidminer.operator.ModelApplier;
import com.rapidminer.operator.Operator;
import com.rapidminer.operator.OperatorCreationException;
import com.rapidminer.operator.OperatorException;
import com.rapidminer.operator.io.ExampleSource;
import com.rapidminer.operator.learner.Learner;
import com.rapidminer.tools.OperatorService;
import com.rapidminer.Process;
import java.io.File;

public class SingleOperator {

    private static Process process1;
    private static String trainPath = "/your_user/train_path/";
    private static String testPath = "/your_user/test_path/";

    public static void main(String[] args) {
        try {
            RapidMiner.init();

            // create process
            process1 = new Process(new File("/your_user/file_path/file.rmp"));

            // learn
            Operator exampleSource = OperatorService.createOperator(ExampleSource.class);

            exampleSource.setParameter("attributes",
                    trainPath + "/training_data.xml");
            IOContainer container = exampleSource.apply(new IOContainer());
            ExampleSet exampleSet = container.get(ExampleSet.class);

            // here the string based creation must be used since the J48 operator
            // do not have an own class (derived from the Weka library).
            Learner learner = (Learner) OperatorService.createOperator("J48");
            Model model = learner.learn(exampleSet);

            // loading the test set (plus adding the model to result container)
            Operator testSource =
                    OperatorService.createOperator(ExampleSource.class);
            testSource.setParameter("attributes", testPath + "/test_data.xml");
            container = testSource.apply(new IOContainer());
            container = container.append(model);

            // applying the model
            Operator modelApp = OperatorService.createOperator(ModelApplier.class);
            container = modelApp.apply(container);

            // print results
            ExampleSet resultSet = container.get(ExampleSet.class);
            Attribute predictedLabel = (Attribute) resultSet.getAttributes().getPredictedLabel();
            for (ExampleReader reader = resultSet.getExampleReader(); reader.hasNext();) {
                System.out.println(reader.next().getValueAsString(predictedLabel));
            }
        } catch (OperatorCreationException e) {
            System.err.println("Cannot create operator:" + e.getMessage());
        } catch (OperatorException e) {
            System.err.println("Cannot create model: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("Cannot initialize RapidMiner:" + e.getMessage());
        }
    }
}