Jeanpierre Nuñez
Senior Data Engineer
¿Sabías que los árboles de decisión pueden ayudarte a resolver problemas complejos?
En este artículo, te revelaremos cómo en Bluetab utilizamos esta poderosa herramienta de análisis de datos con el fin de impulsar a las decisiones de nuestros clientes en diversas industrias usando AWS.
Árboles de decisión: herramientas poderosas para la toma de decisiones
Los árboles de decisión son diagramas que representan las posibles opciones, resultados y consecuencias de una decisión. Se construyen a partir de nodos que contienen preguntas o condiciones, y ramas que conectan las respuestas o acciones. De esta forma, se puede visualizar el flujo lógico de la decisión y elegir la mejor alternativa.
En Bluetab, creemos en la toma de decisiones inteligentes basadas en datos. Para lograrlo, utilizamos herramientas poderosas como los árboles de decisión, que son valiosos en una variedad de sectores. A continuación, exploraremos cómo aplicamos los árboles de decisión y los beneficios que ofrecen a nuestros clientes en diferentes industrias.
Clasificación y regresión con árboles de decisión
Clasificación: los árboles de decisión de clasificación son excelentes para segmentar y categorizar datos. En el contexto empresarial, se utilizan para tomar decisiones sobre la asignación de recursos, la identificación de oportunidades de mercado y la personalización de ofertas. En el sector de la salud, los árboles de clasificación ayudan a diagnosticar enfermedades en función de síntomas y pruebas.
Regresión: los árboles de regresión se centran en predecir valores numéricos. Se utilizan para proyectar rendimientos financieros, tasas de crecimiento y otros valores cuantitativos. En el sector financiero, son esenciales para predecir el rendimiento de inversiones y carteras.
Caso práctico: Árboles de decisión en el sector de la salud
Sector de la salud: En el sector de la salud, utilizamos los árboles de decisión para diagnosticar enfermedades en función de síntomas y pruebas. Por ejemplo, si un paciente tiene fiebre, dolor de garganta y tos, el árbol de decisión nos indica que lo más probable es que tenga una infección respiratoria y nos recomienda el tratamiento adecuado.
Beneficios de los árboles de decisión en diferentes sectores
- Toma de decisiones personalizadas: los árboles de decisión permiten decisiones precisas y personalizadas en función de los datos y las necesidades de cada sector.
- Eficiencia operativa: al automatizar procesos repetitivos y mejorar la toma de decisiones, las empresas pueden optimizar sus operaciones.
Caso práctico: árboles de decisión en el sector bancario
Sector bancario: En el sector bancario, los árboles de decisión son vitales para la gestión de riesgos y la personalización de servicios. Los bancos utilizan estos árboles para segmentar a los clientes en grupos según su comportamiento financiero, lo que les permite ofrecer productos y servicios financieros a medida. También son esenciales en la evaluación crediticia, donde garantizan préstamos más seguros y tasas de interés adecuadas. Además, los árboles de decisión se aplican en la prevención de fraudes, donde detectan patrones sospechosos y protegen los activos de los clientes.
Beneficios en banca:
- Gestión de riesgos: los árboles de decisión ayudan a evaluar y gestionar los riesgos crediticios, lo que es esencial en la industria bancaria.
- Personalización de servicios: los clientes bancarios reciben ofertas personalizadas que se ajustan a sus necesidades financieras, lo que mejora su satisfacción y lealtad.
- Prevención de fraudes: la detección temprana de transacciones fraudulentas protege a los clientes y a los bancos.
Decisiones Inteligentes en AWS: implementación de árboles de decisión y migración de datos
Introducción:
En un mundo empresarial en constante evolución, la toma de decisiones informadas es clave para el éxito. Exploraremos ahora cómo la implementación de árboles de decisión en AWS y la migración de datos desde SQL Server pueden empoderar a las organizaciones en diferentes sectores. Analizaremos la arquitectura de soluciones en AWS que permite esta implementación y migración, detallando cada paso del proceso.
Arquitectura en AWS para Implementar árboles de decisión:
- Ingesta de datos: comenzamos considerando la ingesta de datos desde diversas fuentes. AWS Glue se destaca como una solución versátil que puede conectarse a una amplia variedad de fuentes de datos.
- Almacenamiento de datos: una vez que los datos se han ingestado, se almacenan de manera centralizada en Amazon S3. Esto proporciona un lugar único para la administración y acceso eficiente a los datos.
- Procesamiento de datos y generación de árboles de decisión: utilizamos AWS Glue para transformar y preparar los datos para su análisis. En esta etapa, AWS Lambda y AWS SageMaker entran en juego para implementar algoritmos de árboles de decisión, brindando un enfoque avanzado de aprendizaje automático.
- Análisis y consultas: una vez que se han generado los árboles de decisión, AWS Athena permite realizar consultas SQL interactivas en los datos almacenados en S3. Esto facilita la exploración de datos y la toma de decisiones basadas en los resultados de los árboles.
Migración de datos desde SQL Server a AWS:
- Ingesta de datos: cuando se trata de la migración de datos desde SQL Server de Microsoft, AWS Database Migration Service (DMS) es una herramienta valiosa. Facilita la migración de bases de datos completas o datos específicos de SQL Server a bases de datos compatibles con AWS, como Amazon RDS o Amazon Redshift.
Arquitectura de solución en AWS utilizando AWS S3, Glue, Lambda, SageMaker, S3 y Athena:
- Ingesta de datos: utilizamos AWS Database Migration Service (DMS) para transferir datos desde la fuente de datos SQL Server a una base de datos compatible con AWS.
- Transformación de datos: AWS Glue se encarga de transformar y preparar los datos recién migrados para su análisis.
- Generación de árboles de decisión: implementamos algoritmos de árboles de decisión utilizando AWS Lambda o AWS SageMaker para llevar a cabo análisis avanzados.
- Almacenamiento de datos: los datos procesados y los resultados de los árboles de decisión se almacenan en Amazon S3.
- Consultas y análisis: utilizamos AWS Athena para realizar consultas SQL interactivas en los datos almacenados en S3 y tomar decisiones basadas en los resultados.
Para la implementación de un arbol de clasificación vamos a utilizar los siguientes servicios: Amazon S3, Aws Glue Crawler, Aws Glue Job, IAM , Cloud Watch.
Se seleccionan como mínimo estos servicios para poder mostrar los beneficios de este modelo.
Creacion del bucket en Amazon S3
Buscaremos ‘S3’ en la barra de busqueda y seleccionaremos el nombre del servicio para visualizar lo siguiente:
Daremos clic en ‘Crear Bucket’ y visualizaremos la siguiente pantalla:
Debemos colocar un nombre que se asocie a nuestro flujo de trabajo y seleccionar tambien la región como minimo.
Colocaran siguiente y podran observan una vista previa del bucket, luego dar en clic en crear bucket:
Para nuestro ejemplo práctico estamos seleccionando un csv publico llamado Iris.
El conjunto de datos Iris contiene medidas de 150 flores (setosa, versicolor, virginica) con 4 características, usado comúnmente para clasificación.
Lógicamente para un modelo de ML deberiamos brindar una data ya transformada y trabajada con el propósito de tener las caracteristias y hacer las predicciones necesarias.
Daras clic en cargar y seleccionaras el csv:
Finalmente visualizaremos la carga con éxito y ya seremos capaces de obtener esta información desde otro servicios en AWS.
Creación del servicio AWS Glue Crawler
AWS Glue Crawler es una herramienta que descubre y cataloga automáticamente datos almacenados en diversos formatos y ubicaciones, facilitando la preparación y análisis de datos en AWS.
Buscaremos el servicio AWS Glue en la barra de busqueda, nos desplazaremos en la sección lateral izquierdo y daremos clic en Crawlers:
Daremos un nombre a nuestro Crawler y una descripción a elección personal, luego daremos clic en Next:
En el dropdown list de data source elegiremos el servicio de S3.
Luego colocaras Browse S3 y podras seleccionar el bucket creado previamente, deberías ser capaz de visualizar lo siguiente:
En la siguiente seccion podrás seleccionar algun rol si tienes configurado previamente, para este ejemplo crearemos un nuevol, le pondremos un nombre asociado a nuestro proceso.
Luego veremos la selección de nuestra base de datos Catalogo , sin embargo tendremos que crearlo de la siguiente manera dando clic en Add Database:
Ingresamores el nombre de la base de datos asociada a nuestro ejemplo:
Luego podremos agregar un prefijo de forma opcional cuando disponibilice los datos en el catalogo de AWS Glue, podría estar vacio también si no lo necesita. Seleccionaremos ejecución a demanda para nuestro caso.
Finalmente en la siguiente pestaña podremos visualizar creado nuestro crawler y le daremos clic en ‘Run crawler’. Deberiamos ver lo siguiente:
Creacion del Job en AWS Glue
Luego en la misma seccion lateral izquierda de AWS Glue buscaremos la seccion de ETL Job y crearemos un flujo con la interfaz grafica, haciendolo de esta manera podremos tener facilmente el código generado para tener acceso a nuestra fuente.
Luego de agregas nuestro objeto de catálogo y seleccionar lo que hemos creado previamente. Deberiamos visualizar el job de la siguiente manera:
Hasta aquí ya procederemos a colocar un nombre al job y agregar nuestro código. Haremos uso de las siguientes librerias:
`DecisionTreeClassifier` construye un modelo de árbol de decisión para clasificación.
`MulticlassClassificationEvaluator` evalúa su rendimiento multiclase. `CrossValidator` realiza validación cruzada, ajustando hiperparámetros con `ParamGridBuilder`.
Juntos, permiten la construcción, evaluación y ajuste eficaz de modelos de árboles de clasificación en PySpark MLlib.
A continuación, se muestra el código utilizado:
import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job from pyspark.ml.feature import StringIndexer, VectorAssembler from pyspark.ml.evaluation import MulticlassClassificationEvaluator from pyspark.ml.tuning import CrossValidator, ParamGridBuilder from pyspark.ml.classification import DecisionTreeClassifier from pyspark.ml import Pipeline from pyspark.sql.functions import col,udf from pyspark.sql.window import Window from pyspark.sql import functions as F from awsglue.dynamicframe import DynamicFrame from pyspark.sql.types import ArrayType, DoubleType # Inicializar contexto de Spark y Glue args = getResolvedOptions(sys.argv, ["JOB_NAME"]) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args["JOB_NAME"], args) # Nombre de la base de datos y tabla en el catálogo de AWS Glue database_name = "db-decision-tree-iris" input_table_name = "mliris_csv" output_table_name = "mliris_results" # Crear DynamicFrame desde el catálogo de Glue input_dyf = glueContext.create_dynamic_frame.from_catalog( database=database_name, table_name=input_table_name, ) # Convertir DynamicFrame a DataFrame df = input_dyf.toDF() # Añadir una columna de índice df = df.withColumn("row_index", F.monotonically_increasing_id()) # Preprocessing: StringIndexer for categorical labels stringIndexer = StringIndexer(inputCol="species", outputCol="label") # Preprocessing: VectorAssembler for feature columns assembler = VectorAssembler(inputCols=["sepal_length", "sepal_width", "petal_length", "petal_width"], outputCol="features") #data = assembler.transform(data) # Split data into training and testing sets train_data, test_data = df.randomSplit([0.8, 0.2], seed=42) # Create a Decision Tree Classifier instance dt = DecisionTreeClassifier(labelCol='label', featuresCol='features') # Assemble all the steps (indexing, assembling, and model building) into a pipeline. pipeline = Pipeline(stages=[stringIndexer, assembler, dt]) paramGrid = ParamGridBuilder() \ .addGrid(dt.maxDepth,[3, 5, 7]) \ .addGrid(dt.minInstancesPerNode, [1,3,5]) \ .build() crossval = CrossValidator(estimator=pipeline, estimatorParamMaps=paramGrid, evaluator=MulticlassClassificationEvaluator( labelCol='label', predictionCol='prediction', metricName='accuracy'), numFolds=5) cvModel = crossval.fit(train_data) best_model = cvModel.bestModel predictions = best_model.transform(test_data) predictions.show(100,truncate=False) # Evaluate the model performance evaluator = MulticlassClassificationEvaluator(labelCol="label", predictionCol="prediction", metricName="accuracy") accuracy = evaluator.evaluate(predictions) print(f"Test Accuracy: {accuracy:.2f}") precision = evaluator.evaluate(predictions, {evaluator.metricName: "weightedPrecision"}) print(f"Weighted Precision: {precision:.2f}") recall = evaluator.evaluate(predictions, {evaluator.metricName: "weightedRecall"}) print(f"Weighted Recall: {recall:.2f}") f1_score = evaluator.evaluate(predictions, {evaluator.metricName: "f1"}) print(f"F1 Score: {f1_score:.2f}") # Acceder al modelo de árbol de decisión dentro del pipeline tree_model = best_model.stages[-1] # Suponiendo que el clasificador de árbol de decisión es el último paso en tu pipeline # Obtener el resumen del modelo print(tree_model._java_obj.toDebugString()) output_path = "s3://bucket-training-tree-decision/output/parquet_data/" # Función UDF para convertir VectorUDT a lista vector_to_list_udf = udf(lambda v: v.toArray().tolist(), returnType=ArrayType(DoubleType())) # Convertir la columna probability a lista df = predictions.withColumn("probability", vector_to_list_udf(col("probability"))) df = df.withColumn("rawPrediction", vector_to_list_udf(col("rawPrediction"))) df = df.withColumn("features", vector_to_list_udf(col("features"))) df_subset = df.select(*["sepal_length", "sepal_width", "petal_length", "petal_width", "species", "row_index", "label", "features", "prediction", "probability"]) # Escribir el DataFrame en formato Parquet en S3 df_subset.write.parquet(output_path, mode="overwrite") # Finalizar trabajo job.commit()
Como se visualiza el estado del job se encuentra en ‘Succeeded’:
Configuración de políticas mediante S3 y IAM
A continuación, debemos también configurar las políticas de IAM para el acceso desde Glue hacia S3. Iremos a la sección de permisos en nuestro bucket:
Editaremos la política de la siguiente manera:
Luego en IAM a nuestro rol de machine que creamos en la sección de AWS Grawler, añadiremos el rol de s3Full Access. Seleccionamos nuestro rol:
Verificamos que tengamos nuestra relacion de confianza de la siguiente manera:
Luego añadiremos el permiso de AmazonS3FullAccess.
Finalmente al agregar el permiso deberiamos de ver nuestros permisos de la siguiente manera:
Ahora mediante CloudWatch podremos visualizar el log de nuestro job, verificar si se guardo correctamente nuestro modelo y tambien poder ver una previsualización de las reglas y predicciones.
Aquí podemos visualizar nuestros resultados e incluso la regla de clasificación:
Aquí se puede visualizar los valores de Accuracy , weighted precision y recall, y el F1 Score. A continuación, se explica el significado de cada métrica.
- Test Accuracy (Exactitud de Prueba):
- Significado: proporción de predicciones correctas respecto al total de predicciones en el conjunto de prueba.
- Utilidad: mide la precisión general del modelo y es especialmente útil cuando las clases están balanceadas.
- Weighted Recall (Recuperación Ponderada):
- Significado: promedio ponderado de las tasas de verdaderos positivos para cada clase.
- Utilidad: evalúa la capacidad del modelo para recuperar instancias de cada clase, considerando el desequilibrio en la distribución de las clases.
- Weighted Precision (Precisión Ponderada):
- Significado: promedio ponderado de las precisiones para cada clase.
- Utilidad: indica la proporción de instancias correctamente clasificadas entre las que el modelo predijo como positivas, considerando el desequilibrio de clases
- F1 Score:
- Significado: media armónica de precisión y recuperación. Cuantifica la relación equilibrada entre la precisión y la capacidad de recuperación del modelo.
- Utilidad: útil en problemas de clasificación desbalanceados, ya que considera tanto los falsos positivos como los falsos negativos, proporcionando una métrica global de rendimiento del modelo. Un F1 Score alto indica un equilibrio entre precisión y recuperación.
Finalmente se guardaron los resultados de nuestro modelo en nuestro bucket en un folder llamado output, deberia verse de la siguiente manera:
Conclusión
Esta arquitectura de solución en AWS permite a las organizaciones no solo implementar árboles de decisión eficaces sino también migrar datos desde sistemas heredados como SQL Server. Ambos procesos se combinan para empoderar a las organizaciones en la toma de decisiones informadas, mejorando la eficiencia operativa y maximizando las oportunidades de mercado. Como puedes ver, los árboles de decisión son una herramienta muy útil para tomar decisiones inteligentes basadas en datos.
En Bluetab, te ayudamos a implementarlos en tu organización para que puedas mejorar tu eficiencia operativa, personalizar tus ofertas y aprovechar las oportunidades de mercado. Si quieres saber más sobre cómo podemos ayudarte, no dudes en contactarnos.