miércoles, 11 de mayo de 2011

Weka with Data Mining done in java

Utilizando la libreria de weka.jar, la pueden descargar en Pagina Oficial Weka



Weka es un software programado en Java que está orientado a la extracción de conocimientos desde bases de datos con grandes cantidades de información, se tiene mucho algoritmos echos para Redes Neuronales, Minería de Datos, Problemas de Clasificación, Redes Bayesianas, entre otras...

En este caso voy a poner el código de un ejemplo donde utilizo la librería weka.jar llamada desde JAVA

En este caso utilizo 5 algoritmos que son usados para clasificación: Ridor, ZeroR, PART, NNge, M5Rules

CODIGO:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wekadatamining;
/**
 *
 * @a{
            DataSource ar = new DataSource(ruta);
            coleccion = ar.getDataSet();
            coleccion.setClassIndex(coleccion.numAttributes() - 1);
            //presentar la coleccion s.Evaluation;
import weka.classifiers.rules.M5Rules;
import weka.classifiers.rules.NNge;
import weka.classifiers.rules.PART;
import weka.classifiers.rules.Ridor;
import weka.classifiers.rules.ZeroR;
import weka.core.Debug.Random;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;

public class Algoritmos {
    //variable de resultados
    String resultado = "\n";
    //variable de datos del archivo xxxx.arff
    String datosarchivo = "\n";
    //variable de la ruta del archivo
    String ruta;
    //variable de las Instances del archivo
    Instances coleccion;
    //variable del fold del cross-validation
    int crossValidation;
    //variable de tipo de evaluacion
    int tipo;
    public int getTipo() {
        return tipo;
    }
    public void setTipo(int tipo) {
        this.tipo = tipo;
    }
    public int getCrossValidation() {
        return crossValidation;
    }
    public void setCrossValidation(int crossValidation) {
        this.crossValidation = crossValidation;
    }
    public Algoritmos(String ruta) {
        this.ruta = ruta;
    }
    //Conjunto de datos del archivo .arrf
    public String datos() {
        try ;
        } catch (Exception exception) {
            resultado = exception.toString();
            mostrarMsj();
        }
        return resultado;
    }
//algoritmo Part
    public String ejede entrenamiento
            datosarchivo = datosarchivo + "\nColeccion de entrenamiento:\n";
            datosarchivo = datosarchivo + coleccion.toString();
        } catch (Exception ex) {
            datosarchivo = ex.toString();
        }
        return datosarchivo;
    }
//algoritmo RIDOR
    public String ejecutarRidor() {
        resultado = "\n";
        Ridor ridor = new Ridor();
        try {
            //Construyendo el clasificador
            ridor.buildClassifier(coleccion);
            //llama al metodo para obtener la matrixConfusion
            String matrix = matrixConfusion(ridor);
            resultado = resultado + ridor.toString();
            resultado = resultado + matrix;
        } catch (Exception exception) {
            resultado = exception.toString();
            mostrarMsj();
        }
        return resultado;
    }
//algoritmo ZeroR
    public String ejecutarZeroR() {
        resultado = "\n";
        ZeroR zeror = new ZeroR();
        try {
            zeror.buildClassifier(coleccion);
            String matrix = matrixConfusion(zeror);
            resultado = resultado + zeror.toString();
            resultado = resultado + matrixm5rules.toString();
            resultado = resultado + matrix;
        } catch (Exception exception) {
            resultado = exception.toString();
            mostrarMsj();
        }
        recutarPart() {
        resultado = "\n";
        PART part = new PART();
        try {
            part.buildClassifier(coleccion);
            String matrix = matrixConfusion(part);
            resultado = resultado + part.toString();
            resultado = resultado + matrix;
        } catch (Exception exception) {
            resultado = exception.toString();
            mostrarMsj();
        }
        return resultado;
    }
//algoritmo NNge
    public String ejecutarNNge() {
        resultado = "\n";
        NNge nnge = new NNge();
        try {
            nnge.buildClassifier(coleccion);
            String matrix = matrixConfusion(nnge);
            resultado = resultado + nnge.toString();
            resultado = resultado + matrix;
        } catch (Exception exception) {

            resultado = exception.toString();
            mostrarMsj();
        }
        return resultado;
    }
//algoritmo M5Rules
    public String ejecutarM5Rules() {
        resultado = "\n";
        M5Rules m5rules = new M5Rules();
        try {
            m5rules.buildClassifier(coleccion);
            String matrix = matrixConfusion(m5rules);
            resultado = resultado + m5rules.toString();
            resultado = resultado + matrix;
        } catch (Exception exception) {
            resultado = exception.toString();
            mostrarMsj();
        }
        return resultado;
    }
    public void mostrarMsj() {
        JOptionPane.showMessageDialog(null, "Trate de ejecutar con otro algoritmo", "Error", JOptionPane.ERROR_MESSAGE);
    }
//Metodo para matrixConfusion
    public String matrixConfusion(Classifier classifier) {
        String matrix = "\n";
        //Modelo de Test
        Evaluation eTest;
        try {
            eTest = new Evaluation(coleccion);
            // es 1 si utiliza cross validation caso contrario utiliza todo
            // el conjungo de datos para evaluar el modelo
            if (tipo != 1) {
                Random rand = new Random(1);
                //los FOLDS para cross-validation
                int folds = getCrossValidation();
                //llamando al metodo cross-validation
                eTest.crossValidateModel(classifier, coleccion, folds, rand);
            } else {
                eTest.evaluateModel(classifier, coleccion);
            }
            //Muestra el resumen de la evaluacion
            String strSummary = eTest.toSummaryString();
            matrix = matrix + " ===== SUMARY =====\n" + strSummary;
            // obtener confusion matrix
            matrix = matrix + eTest.toMatrixString();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.toString(), "ERROR", JOptionPane.ERROR_MESSAGE);
        }
        return matrix;
    }
}

En uno de los métodos se está obteniendo la matriz de Confusión (CONFUSION MATRIX), una de las partes muy importantes al momento de clasificar.

Y también algo importante es la obtención de las reglas de decisión (el conocimiento extraído de la BD para tomar decisiones).

Tendrán que ejecutarlo para que puedan ver los resultados, son diferentes algoritmos para que se pueda utilizar el mejor.

La aplicación que hice fue muy pequeña, pero lo importante es que funciona y se pueden ver los resultados del clasificador.



A los que les interesa el tema y si quieres todo el sistema completo esta aquí DataMining pesa 5.6MB subido en MediaFire

Fuentes:

http://www.cs.waikato.ac.nz/ml/weka/

http://rp-www.cs.usyd.edu.au/~sakshib/Weka/

17 comentarios:

  1. hola.
    Disculpa mi gran ignorancia pero ya llevo dos dias y no puedo instalar correctamente la libreria para utilizar todas las clases que aqui presentas, te agradeceria muchisimo tu ayuda, mi problema no es tanto con la programacion si no donde coloco mis librerias para poder importarlas a mi proyecto ya que estoy trabajando en netbeans

    ResponderEliminar
  2. veras tu libreria weka.jar la pones en la carpeta libraries de tu proyecto, en la parte izquierda la das click derecho a la carpeta y le pones agregar .jar, ai la buscas y tu weka.jar y la agregas, y asi se importan las librerias. si no t sale m avisas para enviarte una imagen de como debe quedarte la libreria. saludos

    ResponderEliminar
  3. Muchas gracias me has salvado, si funciono lo que me dijiste, ahora a programar!!!
    Gracias nuevamente

    ResponderEliminar
  4. De nada, aqui estoy para ayudar

    ResponderEliminar
  5. oye tengo otro proiblema disculpa las molestia pero mi archivo .jar de weka creo que no trae todos los metodos que me aparecen aqui http://weka.sourceforge.net/doc/ será que no es el adecuado

    ResponderEliminar
  6. mi problematica es que quiero introducir un algoritmo de clasificacion y necesito cargar un archivo arff leer las instancias procesarlas y arrojar los resultados correspondientes, agradeceria cualquier ayuda

    ResponderEliminar
  7. haber para tu archivo weka.jar , la encuentras en 2 partes:
    1.- En el enlace de mi programa esta completo y ai puedes encontrar la libreria.
    2.- O la puedes encontrar al momento donde tu instalas el weka, en la ruta donde se instalo lo encuentras a la libreria weka.jar.

    Si no la encuentras m envias tu correo para enviartela.
    saludos

    ResponderEliminar
  8. Juan, para cargar el archivo arff en mi proyecto que muestro esta completo, allí estan los metodos que necesitas, y las instancias que tu quieres hacer las encuentras en la libreria weka.jar solo debes hacer uso de ellas, yo de mi parte en este proyecto que hice uso algunos métodos del weka para mineria de datos obiamente, puedes descargarlo y revisas el codigo, esta con comentarios.

    espero te sirva

    saludos

    ResponderEliminar
  9. este es mi correo ojala pudieras agregarme al msn y regalarme unos minutos de tu tiempo para poder ser un porquito mas especifico mc__jonhy@hotmail.com (es doble guion bajo), del link que te mande quiero accesar al metodo attributeToDoubleArray() pero en el weka.jar creo que no viene :( o estara mal la info??? o lo mas probable es que este mal yo, el problema es que no se donde!!!! :(

    ResponderEliminar
  10. hola, que buen programa.

    una pregunta, si quisiera la información de "Detailed Accuracy By Class"
    que aparece después de la info del === Summary ===, de casualidad sabes que método debo ejecutar?

    ResponderEliminar
  11. //Muestra el resumen de la evaluacion
    String strSummary = eTest.toSummaryString();
    matrix = matrix + " ===== SUMARY =====\n" + strSummary;
    // obtener confusion matrix
    matrix = matrix + eTest.toMatrixString()
    en matrix se va construyecto la matris y en eTest estan los datos

    ResponderEliminar
  12. hola que tal una pregunta como podría optener los modelos de predicción de una red neuronal entrenada en weka, para utilizar dichos modelos en un lenguaje como visual?

    ResponderEliminar
  13. mira si quieres utilizar el weka obiamente es mas facil desde java, los modelos de prediccion depende mucho de que tipo de red vas a utilizar, si es con retroalimentacion o no, numero de neuronas numero de capas, para que es la red pues a las redes lo que se hace es sintonizar y actualizar sus pesos para que puedan aprender, pues no se especificamente que quieres hacer.
    saludos

    ResponderEliminar
  14. Hola, gracias por el aporte, que tan dificil seria que subieras el codigo fuente completo con el applet que has creado??

    ResponderEliminar
  15. o si por mi ignorancia el codigo y el .jar que dejaste en mediafire hacen que se genere la app a traves de un IDE ruego me expliquen el procedimiento de como hacerlo si no es mucha molestia... y de nuevo gracias

    ResponderEliminar
  16. Buenos dias

    Estoy mirando el archivo que esta en mediafire pero me da error te agradeceria si pudieras compartir esa información conmigo sobre la interface de weka

    ResponderEliminar
  17. Hola buenas noches o dias

    me intereso mucho tu proyecto ya que no hay mucha información sobre como utilizar los métodos de weka en java y me gustaría poder utilizar tus métodos en una base de datos que tengo en mysql . he logrado generar clusters con k-means ,pero quiero que mis registros nuevos sean clasificados en los clusters ya creados por ello me interesan tus métodos o que método de clasificación supervisada me recomiendas y seria de mucha ayuda si proporcionaras algo de informacion (documentacion que pueda consultar de preferencia en español) sobre como clasifican .

    de antemano muchas gracias por valiosa ayuda y tiempo
    espero tu respuesta

    mi correo electrónico

    egar17mich@gmail.com
    mi-c-hs@hotmail.com

    ResponderEliminar