La segunda parte de este trabajo práctico consiste en desarrollar un programa en Scala que:
- Levante los datos cargados en una base de datos usando Doobie.
- Elimine las columnas que no agregan datos.
- Haga un split 70/30 de esos datos en training y test set.
- Entrene un Random Forest Regressor en Spark.
- Guarde el modelo PPML.
Para ejecutar el código debe tenerse instalado SBT.
Por el momento el programa se ejecuta correctamente en IntelliJ idea, pero no en SBT por un problema de dependencias de Spark.
El programa no acepta argumentos y muestra por pantalla la separación entre sets de entrenamiento y testing.
Al ejecutar el pipeline, se escriben dos archivos de salida:
results.txt
: Contiene el RME resultante de aplicar el modelo entrenado al test set.model.pmml
: Archivo que contiene el modelo entrenado para futuras ejecuciones, independiente del lenguaje.
src/
- main/scala/fiuba/fp/
--- models/models.scala # Modelo en Scala de un DataFrameRow
--- Run.scala # Archivo principal de ejecución, con la descripción del pipeline FS2.
--- DB.scala # Archivo con utilidades para leer DataFrameRows de la BDD.
--- WightedCoin # Clase para simular eventos aleatorios booleanos con probabilidad.
--- Splitter # Clase para agregar elementos a una de dos listas al azar.
--- SparkRegressor # Archivo con utilidades para entrenar y testear modelos de machine learning.
--- Persistence # Módulo con métodos para persistir los resultados de train y test.
La obtención y procesamiento de los datos sucede en un pipeline de FS2 con las siguientes etapas:
- Lectura de la base de datos utilizando el objeto DB (wrapper sobre Doobie).
- Fold que va alimentando con cada
DataFrameRow
aSplitters
hasta quedar uno con todas filas leídas. Es decir, el resultado de esta etapa será unStream(Splitter[DataFrameRow])
con un solo elemento. - Se mapea el
Splitter
a sus dos listas, la primera para un training set y la segunda para un test set. - Se mapean los sets al
SparkRegressor
para su procesamiento. - Los resultados del
SparkRegressor
(schema, resultado de test y modelo) se pasan al módulo de persistencia para grabar los resultados a disco.
Dentro del SparkRegressor se toman el train y test set y se siguen los siguientes pasos:
- Se crea un assembler con las features (todas las columnas menos
close
). - Se crea un Indexer con el target/label
close
. - Se crea un regresor con los hiperparámetros.
- Los resultado de tres pasos anteriores son utilizados en un pipeline de spark, con el cual se ajusta un modelo. Con este modelo se hacen dos cosas:
- Se guarda un PMML.
- Se devuelve el resultado obtenido luego de evaluar el modelo con el test set.