Blog de Amazon Web Services (AWS)

Usando SQL con Amazon Redshift ML para crear modelos de cálculo de riesgo crediticio en Amazon Redshift

Por Luisa Vesga, Arquitecta de Soluciones paraStartups de AWS

Amazon Redshift ML facilita a los analistas de datos y desarrolladores, la creación, el entrenamiento y la aplicación de los modelos de Machine Learning usando comandos familiares de SQL en Amazon Redshift. Se pueden aprovechar las capacidades de Amazon Sagemaker (Servicio de Machine Learning completamente administrado) haciendo uso de Amazon Redshift ML, sin necesidad de aprender nuevas herramientas o nuevos lenguajes. Con simples consultas de SQL se puede crear y entrenar un modelo de Machine Learning usando los datos en Redshift y después, usar los modelos para hacer predicciones. Redshift ML disponibiliza el modelo de Machine Learning como una función de SQL dentro del Data Warehouse de Redshift, para poder aplicarlo directamente en las consultas y reportes.

Como funciona el Análisis predictivo en Amazon Redshift con Amazon SageMaker

Con Redshift ML, puede incorporar predicciones como detección de fraude, puntuación de riesgo y predicción de abandono directamente en consultas e informes. La función SQL permite aplicar el modelo de ML a los datos en consultas, informes y reportes. Por ejemplo, puede ejecutar la función SQL de «riesgo crediticio de clientes» en datos de nuevos clientes en su data warehouse de forma regular para predecir los clientes que representan un alto riego y enviar esta información a los equipos de negocio para que tomen las acciones preventivas. Amazon Redshift ML saca provecho de Amazon Sagemaker Autopilot que crea, entrena y ajusta automáticamente los mejores modelos de aprendizaje automático en función de los datos, a la vez que permite mantener el control y la visibilidad completos. También, elimina las arduas tareas de creación de modelos de aprendizaje automático y ayuda a la creación, entrenamiento y ajuste de forma automática del mejor modelo de Machine Learning.

Resumen de la solución

Inicialmente, para esta demostración, entrenaremos un modelo para predecir cuales son los clientes potencialmente con alto riesgo en una entidad financiera. El conjunto de datos utilizado en la demostración fue tomado de este Blog Post y fue publicado e el repositorio de Machine Learning de la UCI (University of california, Irvine). Enlace para descargar el dataset

Según los estándares actuales, el conjunto de datos a utilizar, es bastante pequeño, con solo 1,001 registros, donde cada registro usa 14 atributos para describir el perfil de los clientes de una entidad financiera. Los atributos son:

existingcheking – Estado de la cuenta corriente existente

duration – Duración en meses de actividad con la entidad

    creditamount– Indica el monto del crédito solicitado

    savings– Ahorros actuales del cliente

    employmentsince – Indica si es empleado, la duración del empleo

    sex– Indica el sexo del cliente

    status– Estado civil del cliente

    age – Edad del cliente

    housing – Tipo de vivienda del cliente

existingcredits – Indica el número de créditos que tiene actualmente el cliente

    job – Indica si el cliente esta empleado o no

    jobtype –Tipo de empleo del cliente

    dependents – Cantidad de personas que dependen del cliente

    risk – Indica si el cliente representa un riego alto o no

La variable Risk, es conocida como la variable objetivo, la variable que el modelo va a predecir. Como la variable objetivo es binaria, el modelo hará una predicción Binaria, más conocida como clasificación binaria.

Nota: Esta es una demostración con un dataset relativamente pequeño. En un escenario real probablemente necesitará un conjunto de datos más grande para mejorar la precisión del modelo.

Redshift ML maneja todas las interacciones entre Amazon Redshift, S3 y SageMaker, incluidos todos los pasos involucrados en el entrenamiento y la compilación. Cuando se ha entrenado el modelo, Redshift ML utiliza Amazon SageMaker Neo para optimizar el modelo para la implementación y lo pone a disposición como una función SQL.

Creación de los recursos necesarios (requisitos previos)

1. Para empezar, es necesario crear un rol de IAM con permisos de acceso a Amazon S3.

2. De nuestro conjunto de datos es necesario separarlos en dos subconjuntos, para entrenamiento y para inferencia.

3. Creamos un bucket de S3 y guardamos nuestro dataset de entrenamiento y de inferencia.

4. También, es necesario contar con un clúster de Redshift. Puede crear el clúster a través de la consola o hacerlo a través de una plantilla de Cloud Formation.

Creación del clúster desde la consola

  1. Vaya a la consola de administración de AWS y abra la consola de Amazon Redshift https://console.aws.amazon.com/redshift/

Importante: Si se están usando las credenciales de IAM, asegúrese de tener los permisos necesarios para realizar operaciones en el clúster. Para más información vea controlando el acceso a los usuarios de IAM en la guía de administración de Amazon Redshift.

  1. En la esquina superior derecha, escoja la región de AWS en la cual desea crear el clúster. Para esta demostración usaremos us-west-2 (Oregon).
  2. En el panel de navegación, seleccione “Clúster”, después elija crear un clúster. Aparecerá la página para la creación del clúster.
  3. Escoja dc2.large para el tipo del nodo en la sección de cómputo optimizado. Después defina 2 para el número de nodos.
  4. En la sección de detalles del Clúster, especifique valores para el identificador del clúster, el puerto de la base de datos, el usuario maestro, y la contraseña para el usuario maestro.
  5. En la sección de permisos, escoja un rol de IAM disponible (Este Rol deberá tener acceso a Amazon S3). Después escoja agregar rol de IAM y agréguelo a la lista de roles de IAM para el clúster.
  6. Escoja, crear clúster.

Creación del clúster desde una plantilla de Cloud Formation.

  1. Para crear este clúster y configurar la seguridad y los componentes de red automáticamente usando Cloud Formation, use el siguiente link: Plantilla de Cloud Formation y siga los pasos.

Preparación de los datos

Información del conjunto de datos: El conjunto de datos contiene 1.001 registros, donde cada registro usa 14 variables para describir el perfil de los clientes de una entidad financiera. El objetivo de la clasificación es predecir, con base en las variables, si el cliente representa un alto riesgo para la entidad o no.

Variables de entrada:

  1. existingcheking
  2. duration
  3. creditamount
  4. savings
  5. employmentsince
  6. sex
  7. status
  8. age
  9. housing
  10. existingcredits
  11. job
  12. jobtype
  13. dependents
  14. risk

Objetivo / Variable a predecir:

  1. risk

Definición: El cliente representa un alto riesgo para la entidad? (Binario: “True”, “False”)

Usaremos el editor de consultas de Redshift:

a. Entramos a la consola de Redshift y hacemos clic en “Editor” en el panel izquierdo.

b. Hacemos clic en el botón “conectar base de datos”(Connect to database)->”crear nueva conexión”

Nota: Si esta usando un usuario/rol que tenga privilegios de “redshift:GetClusterCredentials” puede usar la opción de credenciales temporales.

c. Ingresamos el clúster, el nombre de la base de datos y el usuario de la base de datos. Clic en “conectar” (Connect).

d. Una vez tengamos la conexión a la DB, pasamos a crear la tabla y pasamos los datos de entrenamiento. Usaremos el dataset de entrenamiento previamente cargado en S3 “credit_data_training.csv”

CREATE TABLE risk_prediction_training(
   existingchecking varchar,
   duration numeric,
   creditamount numeric,
   savings varchar,
   employmentsince varchar,
   sex varchar,
   status varchar,
   age numeric,
   housing varchar,
   existingcredits numeric,
   job varchar,
   jobtype varchar,
   dependents numeric,
   risk boolean );

COPY risk_prediction_training from '<REEMPLAZAR CON EL URI DEL OBJETO EN S3>' REGION 'us-west-2' IAM_ROLE '<REEMPLAZAR CON EL ARN DEL ROL>' CSV IGNOREHEADER 1 delimiter ',';

e. Creamos la tabla de inferencia y pasamos los datos para probar el modelo. Usaremos el dataset de inferencia previamente cargado en S3 “credit_data_inference.csv”.

Nota: El objetivo es evaluar el desempeño del modelo una vez entrenado, simulando que recibe datos no vistos durante el entrenamiento.

CREATE TABLE risk_prediction_inference(
existingchecking varchar,
duration numeric,
creditamount numeric,
savings varchar,
employmentsince varchar,
sex varchar,
status varchar,
age numeric,
housing varchar,
existingcredits numeric,
job varchar,
jobtype varchar,
dependents numeric,
risk boolean );

COPY risk_prediction_inference from '<REEMPLAZAR CON EL URI DEL OBJETO EN S3>' REGION 'us-west-2' IAM_ROLE '<REEMPLAZAR CON EL ARN DEL ROL>' CSV IGNOREHEADER 1 delimiter ',';

f. Comprobamos que las tablas hayan sido creadas en el panel izquierdo.

Crear el modelo

Amazon Sagemaker autopilot, escogerá el mejor modelo para aplicar a nuestro problema de clasificación binaria con base en los datos de entrada.

1. Ejecutamos los siguientes comandos para crear el modelo. Durante la creación del modelo, se deben definir las variables que harán parte del modelo y que serán usadas por Sagemaker Autopilot para definir cuál es el mejor modelo. Además se creará la función de SQL que será utilizada para hacer inferencias sobre Redshift.

ARN del Rol de IAM: Es usado por el clúster con propósitos de autenticación y autorización. Como mínimo, el rol de IAM debe tener permiso para realizar una operación LIST en el bucket de Amazon S3 que se usa para descargar datos de entrenamiento y como staging para los artefactos de Amazon SageMaker.

Nombre del Bucket de S3: Se debe especificar el Bucket que creó anteriormente y que se utilizó para compartir datos de entrenamiento y artefactos entre Amazon Redshift y SageMaker. Amazon Redshift crea una subcarpeta en este Bucket antes de descargar los datos de entrenamiento. Cuando se completa el entrenamiento, Amazon Redshift elimina la subcarpeta creada y su contenido.

CREATE MODEL risk_prediction_model
FROM (
SELECT   
   existingchecking,
   duration,
   creditamount,
   savings,
   employmentsince,
   sex,
   status,
   age,
   housing,
   existingcredits,
   job,
   jobtype,
   dependents,
   risk
FROM
    risk_prediction_training )
    TARGET risk
FUNCTION func_churn_prediction_model
IAM_ROLE '<REEMPLAZAR CON EL ARN DEL ROL>'
SETTINGS (
  S3_BUCKET '<REEMPLAZAR CON EL NOMBRE DEL BUCKET>',
  MAX_RUNTIME 3600
  )
;

NOTA: Puede salir un error en la ejecución de la creación del modelo porque sagemaker no puede asumir el role. Hay que asegurarse que el role tenga la “relación de confianza” donde permite que la entidad sagemaker.amazonaws.com asuma el role.

2. Si se presentan problemas durante la creación del modelo a causa de un modelo existente nombrado de la misma forma, recomendamos ejecutar este comando para eliminar el modelo previo.

DROP MODEL risk_prediction_model;

Validar el modelo

El modelo puede tomar aproximadamente 60 minutos para ser entrenado (Dependiendo del tiempo de ejecución definido durante la creación del modelo).

1. Ejecutamos el siguiente comando para obtener algunos datos del modelo, donde también encontraremos el estado del modelo, en este caso esta en la etapa de entrenamiento

show model risk_prediction_model;

2. Cuando nuestro modelo esté listo, debe el estatus cambiar a “READY”. Debemos poner atención a la métrica de validación: f1 Score, que puede estar entre 0 y 1 y determina qué tan bueno es el modelo. Mientras más cercano a 1, mejor el modelo.

3. Primero comprobamos la precisión exactitud (Accuracy) del modelo.

--Inferencia/Precisión en datos de prueba

WITH infer_data
 AS (
    SELECT risk as actual,
func_risk_prediction_model(existingchecking,duration,creditamount,savings,employmentsince,sex,status,age,housing,existingcredits,job,jobtype,dependents)AS predicted,
     CASE WHEN actual = predicted THEN 1::INT
         ELSE 0::INT END AS correct
    FROM risk_prediction_inference
    ),
 aggr_data AS (
     SELECT SUM(correct) as num_correct, COUNT(*) as total FROM infer_data
 )
 SELECT (num_correct::float/total::float) AS accuracy FROM aggr_data;




4. Después usaremos la función creada por el modelo escogido por Auto pilot para la inferencia contra el conjunto de datos de la tabla de inferencia risk_prediction_inference

--Predecir cuántos clientes representan un riesgo alto

WITH term_data AS ( SELECT func_risk_prediction_model (existingchecking,duration,creditamount,savings,employmentsince,sex,status,age,housing,existingcredits,job,jobtype,dependents) AS predicted
FROM risk_prediction_inference)
SELECT
CASE WHEN predicted = 'Y'  THEN 'Riesgo alto'
     WHEN predicted = 'N'  THEN 'Riesgo bajo'
     ELSE 'Indeterminado' END as risk_prediction,
COUNT(1) AS count
from term_data GROUP BY 1;

 

Eliminación de los recursos

Durante esta demostración, fueron creados recursos que pueden incurrir en algunos costos. Es importante asegurarse de eliminar el clúster de Redshift creado y los datasets almacenados en S3 si no serán utilizados más adelante, para evitar facturaciones no deseadas.

Si la creación del clúster se hizo a través de una plantilla de CloudFormation, es necesario eliminar el stack para deshacerse de todos los recursos creados.

Conclusión

En esta publicación, analizamos y utilizamos de forma breve, un caso de uso de ML relevante para el sector financiero. Introdujimos Redshift ML y describimos cómo permite a los usuarios de SQL crear, entrenar, implementar y usar ML con comandos SQL simples sin aprender herramientas externas.

Redshift ML también permite a los expertos en ML, como los científicos de datos, crear rápidamente modelos de ML para simplificar su desarrollo, gestión y eliminar la necesidad de exportar datos desde Amazon Redshift.


Sobre la autora

Luisa Vesga es arquitecta de soluciones para el equipo de Startups de Amazon Web Services. En su puesto, ayuda a las startups a superar los desafíos empresariales aprovechando la plataforma de AWS. Tiene más de 10 años de experiencia en el campo de la tecnología.

 

 

 

 

Sobre los revisores

Oscar Mendoza es Arquitecto de Soluciones en AWS.

 

 

 

 

 

 

Edzon Sanchez es Arquitecto de Soluciones especializado en AI/ML en AWS.