Giter Site home page Giter Site logo

dguipla / tfm-semisup Goto Github PK

View Code? Open in Web Editor NEW
0.0 3.0 0.0 11.7 MB

Semisupervised classification methods (SSC) with Spark-ML, study and implementation

License: Apache License 2.0

Scala 18.20% Jupyter Notebook 81.80%
spark sparkml sparkmllib scala pyhton semisupervised-learning co-training self-training powerbi

tfm-semisup's Introduction

Semisupervised classification methods (SSC) with Spark-ML, study and implementation

Master thesis, Master (MSc) Business Intelligence and Big Data in Cyber-Secure Environments from the universities of Burgos, León and Valladolid

Author: David Guinart Platero

Supervisors: Dr. Álvar Arnaiz González and Dr. Juan José Rodríguez Diez

  • Status : Completed
  • Semisupervised algorithms implemented: Self-Training and Co-Training
  • Design Tools : DataBricks - Spark (Scala).
  • Visualization tools: PowerBI and Python (matplotlib, Seaborn, and Plotly).


Abstract

This master thesis studies different classification algorithms within the frame of semi-supervised learning (inductive) working with base classifiers (Decision tree, Naive Bayes...) using Spark ML.

The main goal of this study is to design, implement, verify and build a library on Spark ML in order to make it easy to reuse on the any Spark environment.
On the other hand, this project do an experimentation with different datasets where the main idea is to compare empirically the results between supervised algorithms /base classifiers (working with the samples labeled) and the semi-supervised algorithms working with semi-supervised (samples labeled and unlabeled). In order to analyze in more details, the outcomes and manage the huge number of data, this project has created a dashboard.

Finally, this project presents the conclusions and new lines of research working with the new library built (for Spark) in this research project as it has been described previously.

References (Self-Training and Co-Training algorithms):

[1] Yarowsky, David (1995). Unsupervised word sense disambiguation rivaling supervised methods. 3rd annual meeting of the association for computational linguistics, 189-196.

[2] Iosifidis, Vasileios and Ntoutsi, Eirini (2017). Large scale sentiment learning with limited labels Proceedings of the 23rd ACM SIGKDD international conference on knowledge discovery and data mining, 1823-1832.

[3] Blum, Avrim and Mitchell, Tom (1998). Combining labeled and unlabeled data with co-training Proceedings of the eleventh annual conference on Computational learning theory, 92-100

[4] Triguero, Isaac and Garcia, Salvador and Herrera, Francisco (2015). Self-labeled techniques for semi-supervised learning: taxonomy, software and empirical study Knowledge and Information systems (Springer), volume 42, number 2, 245-284.

tfm-semisup's People

Contributors

dguipla avatar

Watchers

 avatar  avatar  avatar

tfm-semisup's Issues

Crear la clase del "desetiquetador"

Para crear la clase que "desetiquete" un porcentaje de las instancias/ejemplos que tenga un conjunto de datos deberás coger de modelo algún transformador de los que trae Spark.

Creo que el más sencillo puede ser https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/feature/Normalizer.scala

Es importante que vayas ya creándote un diagrama de carpetas/paquetes que deje cada clase en su sitio. En este caso los trasnformadores en la carpeta src/main/scala/org/apache/spark/ml/feature

Puedes copiar y pegar el código en tu IDE (el que vayas a utilizar) y empezar a entender esa clase. Verás que hay muchos @SInCE (todo eso lo quitas). Algo importante que verás es que hereda de la clase Transformer, esta clase abstracta define la interfaz que deben cumplir los Transformadores de Spark ML: básicamente que tengan un método transform. Hereda de Transformer y no de UnaryTransformer, que en tu caso no es unario (creo).

Luego podrás ver en Normalizer cómo crea el parámetro "p" y su get y set. Tu deberás crear un parámetro que sea el porcentaje de instancias a desetiquetar.

En tu caso el esquema del DataFrame de salida será igual que el DataFrame de entrada, puesto que no añades ni quitas columnas, solo modificas instancias.

En tu caso el código que realiza el desetiquetado irá en la función

def transform(dataset: Dataset[_]): DataFrame

Cuando te pongas con ello me preguntas, que así de primeras parece difícil pero seguro que no te cuesta :)

Duda ClasificadoresBase Resultado (con los datos BCW y ADULT)

Duda respecto a los resultados conseguidos hasta ahora con los datos BCW y ADULT con los clasificadores Base (supervisado)

Para discutirlo a la vuelta de vacaciones:

Resultados (accuracy) : (https://github.com/Dguipla/TFM-SemiSup/blob/main/notebooks/ClasificadoresSupervisado/resultsClasificadoresBase.csv)

PD: añadiré el resultado de los otros conjunto de datos en cuanto tenga hecho el pipeline de featurization de cada uno para acloplarlo con el pipeline general

Documentación/Papers (Estado del arte) 1

SelfTrainning - Calculos de probabilidades por los clasificadores base

Añado otro Issue de Dudas para separar los dos temas, En este caso, SelfTraining:

Implementando el SefTrainning, para los casos de muy pocos datos etiquetados la probabilidad que me da los clasificadores base ya en la primera iteración es muy alta es decir casi siempre da valores de probabilidad >0.98 (por la simplicidad del modelo entiendo) excepto para RF. Con lo que en la primera iteración añadiría prácticamente todos los datos NoEtiquetados como validos juntamente con sus predicciones. Lo hablamos en la próxima reunión

Muchas gracias !

Duda - Paper Triguero-Garcia-Herrera (Keel) y sus implementaciones para poder comparar con Spark y Self/CoTraining

@alvarag @jjrodriguez He estado mirando los métodos del paper de Triguero concretamente para SelfTraining y no puede identificar los parametros que utiliza.

En el paper solo me sale las iteraciones (max iter), pero no dice nada del threshold (y según el algoritmo de self training que utiliza trabaja con un threshold, ya que está basado en este paper :(https://www.aclweb.org/anthology/P95-1026.pdf] he mirado en el Github de Keel pero no he visto nada de ningún threshold quizá se me escapa porque está en java y no es muy intuitivo el código para mi... No se, si os suena con que threshold pueden estar trabajando ¿?

Crear Class para los datos de SemiSupervisado

Class para poder trabajar con los datos de los resultados (labeled initial, labeled final, unlabeled initial...) de Semisupervisado sin necesidad de tabajar con la clase del clasificador semisupervisado en concreto

Parte 5 (Resultados y Memoria Final)

1,. Comparativa con Keel (paper Triguero) y los modelos implementados de SSC
2. Comparativa con datasets mas grandes focalizasdos en Big data entre Supervisado y Self+Co Training
3,. Resumen de los mejores resultados y caracteristicas para llegar a ellos

Documentacion/Papers (Estado del arte) 2

  • Recoger las ideas principales y plasmarlas en la memoria, también recopilar ideas nuevas

  • Documentar tambien las partes e ideas recogidas en la parte de research de este Epic Parte 1

Crear una biblioteca de Spark

Las instrucciones para crear una biblioteca de Spark con el código que tienes en los notebooks sería algo como lo que puedes ver en este repositorio, cortesía de Mario Juez (predoctoral del área).

Para poder crear el paquete, vas a necesitar instalarte sbt en tu máquina.

Luego los pasos serían:

  • Crear un directorio src, dentro uno main... así hasta tener algo del estilo a src/main/scala/org/apache/spark/ml/semisupervised
  • Sacar el código de las clases a ficheros independientes y dejarlos en al ruta anterior. Por ejemplo: src/main/scala/org/apache/spark/ml/semisupervised/SelfLearning.scala
  • Crear un fichero build.sbt, donde cambiarás el nombre (como se llamará el paquete), la organización (en tu caso ubu, por ejemplo), el resto son versiones que no deberías necesitar cambiar.
  • Crear una carpeta project
  • En dicha carpeta crear dos ficheros:
    • build.properties En su interior pones la versión de sbt que hayas instalado en tu equipo.
    • plugins.sbt No hace falta que cambies nada, copias el que hay en el repositorio indicado arriba.

Una vez tengas todo en su sitio, debería ser tan sencillo como ejecutar en tu consola sbt package, creará un directorio target/scala... donde aparecerá el "xxx.jar" con tu biblioteca.

Ejemplo:

➜  sbt_scala_spark_hello_world git:(main) git clone https://github.com/mjuez/sbt_scala_spark_hello_world.git
...
➜  sbt_scala_spark_hello_world git:(main) sbt package
...
[info]   Compilation completed in 19.006s.
[success] Total time: 42 s, completed 09-mar-2021 15:49:54
➜  sbt_scala_spark_hello_world git:(main) ls target/scala-2.12/
classes  spark_hw_2.12-1.0.0.jar  update  zinc

Familiarizarse con Spark y ML (vision general)

Documentar en la memoria:

  • Que es Spark
    -Porque Spark
  • Arch Spark
    -Componentes Spark
    -....

Posteriormente profundizar en la capa ML y en concreto sobre los clasificadores base que vamos a utilizar

Parte1(Estudio y Documentacion)

Esta parte seria:

  • Aprender el conceptor de pipeline, transformer, estimator ... para Spark
  • Familiarizarme con los classificadores base de spark
  • Estructurar los papers leidos cogiendo las ideas principales
    -Entender en mas profundidad los dos algoritmos de aprendizaje con los que se quiere trabajar:
    Self-Trainning
    Co-Training

Exploracion de Datos y Featurization Pipeline (BCW)

Una tarea (Issue) por conjunto de datos ya que la featurization sera diferente para cada conjunto
hacer una exploracion y procesado (limpieza ) de los datos
Crear un pipeline stage de featurization para despues utilizarlo juntamente con el pipeline stage de los clasificadores

Nueva Clase para SelfTraining

Donde definiresmo los metodos necesarios para implementar la el algoritmo y poder utilizarla dentro del contexto de Pipeline de ML Spark

Scatter - Duda (Keel vs Spark)

Sobre la figura para comparar keel y Spark, aqui tengo un ejemplo de como quedaria lo que no se si esta correcto del todo ¿? No me queda claro ...
image.png

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.