Spaces:
Sleeping
Sleeping
quita archivos obsoletos
Browse files
xepelin_challenge_answers/Caso 1 Diseño de Sistemas 839256bb6649407d9dc58bf1f8cde3ee.md
DELETED
@@ -1,165 +0,0 @@
|
|
1 |
-
# Caso 1: Diseño de Sistemas
|
2 |
-
|
3 |
-
## El problema de negocio y del problema de ingeniería
|
4 |
-
|
5 |
-
## El problema de negocio:
|
6 |
-
|
7 |
-
Cada vez que recibe una operación de financiamiento (compuesta por una o más facturas que el cliente busca financiar), Xepelin debe ser capaz de producir una métrica de riesgo de crédito para cada una de las facturas que componen la operación de financiamiento.
|
8 |
-
|
9 |
-
Al momento de recibir una solicitud de operación de financiamiento, recibiremos información sobre payerid, businessid, y monto de la factura, y deberemos obtener todos los datos sobre estos id, incluyendo la relación entre ambos, para realizar nuestra predicción. El modelo emitirá una recomendación sobre si es conveniente o no financiar la factura.
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
## **El problema de ingeniería:**
|
14 |
-
|
15 |
-
Desde un punto de vista de Machine Learning debemos desarrollar un producto de datos que permita :
|
16 |
-
|
17 |
-
- Producir respuestas near real time para que sean usadas de input para tomar decisiones.
|
18 |
-
- Monitoreo de la calidad de predicciones de nuestro modelo y de la estabilidad de nuestro sistema.
|
19 |
-
- Un workflow CI / CD en el que nuestros desarrolladores puedan seguir desarrollando y poniendo en producción versiones mejoradas de nuestro modelo y de nuestro producto de datos.
|
20 |
-
|
21 |
-
(Asumo que hay un dato con el que no contábamos previamente al momento de la solicitud que es el monto de la factura, lo que nos impide calcular en batch y nos obliga a calcular “al vuelo”.)
|
22 |
-
|
23 |
-

|
24 |
-
|
25 |
-
Se propone desarrollar el sistema en los servicios de AWS integrados en una lógica de Infrastructure as a Service (IaaS) a travé de Gitlab Actions y orquestado a través de Airflow.
|
26 |
-
|
27 |
-
Los principales servicios a utilizar serán:
|
28 |
-
|
29 |
-
- **Step functions + Glue** para desarrollar el Pipeline de Procesamiento diario de datos en Batch y el Pipeline de Reentrenamiento del Modelo
|
30 |
-
- Lambda para
|
31 |
-
- **PostgreSQL** para guardar las predicciones de nuestro modelo
|
32 |
-
- **MongoDB** para obtener los datos sobre business y payer al momento de realizar las predicciones.
|
33 |
-
- **S3** para guardar datos sobre facturas, el pkl del modelo de ML
|
34 |
-
- **EMR** para guardar las versiones de los modelos
|
35 |
-
- **Gitlab + Cloudformation:** Para administrar el CI CD y deployear los servicios en ambientes de dev, stage y prod, de modo que los desarrolladores puedan seguir trabajando en nuevos desarrollos y que haya una forma de integración fluida de nuevos procesos.
|
36 |
-
- **Airflow:** para orquestar y monitorear de manera general nuestro sistema, en particular asegurarse que no fallen los procesos que tienen que correr en batch.
|
37 |
-
|
38 |
-
A continuación, se explican en detalle cuatro ejes fundamentales de este sistema:
|
39 |
-
|
40 |
-
1. La Lambda que recibe solicitudes de operación de financiamiento y devuelve predicciones
|
41 |
-
2. El procesamiento de diario de datos que actualiza en batch:
|
42 |
-
1. datos business+payer
|
43 |
-
2. métricas de monitoreo
|
44 |
-
3. El modelo y el reentrenamiento del modelo
|
45 |
-
4. CI/CD y versionado
|
46 |
-
5. Monitoreo general del sistema
|
47 |
-
|
48 |
-
## 1. Lambda: **Solicitud de operación de financiamiento**
|
49 |
-
|
50 |
-
Al momento de recibir una operación de financiamiento a través de un llamado POST a nuestra API:
|
51 |
-
|
52 |
-
- El front end (del sitio web de xepelin) raeliza una llamada a la Lambda.
|
53 |
-
- se recibe una lista de facturas. (Asumo que para cada factura, se recibe datos del businessid y del pagador, así como monto de la factura, con el cual no se contaba previamente )
|
54 |
-
- Se hace la búsqueda correspondiente con el id business+pagador en la base MongoDb (optimizada para buscar por índices), lo que nos provee de todos los datos relevantes que han sido procesados en batch previamente (ver el punto siguiente).
|
55 |
-
- se realiza la predicción para cada factura
|
56 |
-
- se devuelve los datos predichos al front
|
57 |
-
- Se escriben las predicciones realizadas por nuestro modelo en una base de datos, para monitoreo futuro.
|
58 |
-
|
59 |
-
Comentario: Lambda tiene un límite de concurrencia de 1000 peticiones simultáneas por region (de AWS). En caso de que se quisiera aumentar, se podría distribuir lambdas en distintas regiones. Esta cuestión es el punto más sensible vinculado a la escalabilidad de nuestro sistema.
|
60 |
-
|
61 |
-
## 2. **Procesamiento diario de datos**
|
62 |
-
|
63 |
-
Procesos diario que corre en batch cada medianoche con pipelines desarrollados en StepFunctions y Glue.
|
64 |
-
|
65 |
-
Se necesita procesar, cada noche, dos procesamientos:
|
66 |
-
|
67 |
-
- **Datos para predicción:** Datos actualizados de cada businessid en su relación con cada uno de los payer id.
|
68 |
-
- **Datos para monitoreo y reentrenamiento:** Datos de cada factura existente, con todas las variables del modelo y la cantidad de días que se tardó en pagar, así como con la predicción previa que había realizado el modelo. Esto permite generar métricas de monitoreo y tener listas los datos para el momento de reentrenamiento.
|
69 |
-
|
70 |
-
### 2.a. Procesamiento diario business+payer
|
71 |
-
|
72 |
-
Un Pipeline diario, que puede correr a medianoche, precalcula y actualiza todas las variables que se necesitarán al momento de realizar una predicción a excepción del monto de la factura. Este pipeline puede escribirse en python o Spark dependiendo del volumen de datos.
|
73 |
-
|
74 |
-
Los datos quedarán guardados en S3 y en MongoDb.
|
75 |
-
|
76 |
-
- La tabla MongoDb permite una búsqueda optimizada por índice. El índice de la tabla será *un índice compuesto businessid + payer id*. De este modo, nuestra base tendría precalculada una línea por cada relación entre business id con cada payer id (para el que exista una relación previa), y dado que estaría optimizada para la búsqueda, solo debemos buscar una línea por cada factura, teniendo todos los datos disponibles para que el modelo genere la predicción (a excepción del monto de cada factura, que recibiremos en la solicitud de financiamiento).
|
77 |
-
- En S3 se guardarán los datos en una estructura de carpetas de año, mes, día, donde el día será el día de recálculo (ya que algunos datos varían diariamente). Esto no será utilizado para el modelo pero permite tener un registro por cuestiones de gobernanza de datos.
|
78 |
-
|
79 |
-
Datos precalculados al inicio de cada día:
|
80 |
-
|
81 |
-
los datos vinculados al businessId;
|
82 |
-
|
83 |
-
- **businessId**: Identificador del emisor (business).
|
84 |
-
- **issuerInvoicesAmount**: Monto total de facturas emitidas por businessId.
|
85 |
-
- **clients12Months**: Cantidad de clientes del emisor businessId (últimos 12 meses).
|
86 |
-
|
87 |
-
los datos vinculados a la relación entre businessId y payerId,
|
88 |
-
|
89 |
-
- **relationDays**: Días desde el inicio de la relación business-payer.
|
90 |
-
- **relationRecurrence**: Días recurrencia promedio de la interacción (últimos 12 meses).
|
91 |
-
- **issuerCancelledInvoices**: Ratio de facturas canceladas del businessId.
|
92 |
-
|
93 |
-
y los datos vinculados a payerId
|
94 |
-
|
95 |
-
- **payerId**: Identificador del pagador de la factura.
|
96 |
-
- **activityDaysPayer**: Días transcurridos desde el inicio de actividades del pagador
|
97 |
-
|
98 |
-
(payerId).
|
99 |
-
|
100 |
-
|
101 |
-
Datos recibidos en la llamada a la API:
|
102 |
-
|
103 |
-
los datos específicos de una factura:
|
104 |
-
|
105 |
-
- **receiptAmount**: Monto de la factura de la operación.
|
106 |
-
|
107 |
-
Comentarios:
|
108 |
-
|
109 |
-
- Este sistema no sería correcto si hay casos en que un mismo cliente envía una cantidad muy alta de solicitudes de financiamiento en un mismo día, y queremos que cada solicitud tome en cuenta las respuestas a las solicitudes anteriores.
|
110 |
-
- A su vez, para evitar el crecimiento indefinido de esta tabla se puede
|
111 |
-
- Es necesario gestionar los recibimientos de nuevas relaciones business+payer que no existieran previamente, así como el ingreso de nuevos clientes. Probablemente estos casos deben ser derivados a un agente especializado de Xepelin, ya que el modelo no contaría con información suficiente para hacer predicciones confiables en estos casos.
|
112 |
-
|
113 |
-
Descripción del pipeline de procesamiento de datos:
|
114 |
-
|
115 |
-

|
116 |
-
|
117 |
-
**inbound:** ingesta datos del data lake de BI de Xepelin (relacionados a las facturas financiadas así como a los businessid y payerid),
|
118 |
-
|
119 |
-
**Validations:** realiza validaciones a los datos (medias de columnas, nulos esperados, valores atípicos, etc.)
|
120 |
-
|
121 |
-
**Prod**: procesa los datos de modo que estén listos para ser tomados por nuestro modelo para realizar predicciones y los guarda en una base de datos MongoDb y en S3.
|
122 |
-
|
123 |
-
**Notification:** A su vez, envía un reporte a slack en caso de encontrar algo extraño en los datos.
|
124 |
-
|
125 |
-
### 2.b. **Monitoreo del modelo. (esto debería ir junto a la parte de extracción) …**
|
126 |
-
|
127 |
-
El Pipeline de monitoreo de modelo tiene una estructura similar al anterior (inbound, validations, prod, notifications) y corre cada día a medianoche:
|
128 |
-
|
129 |
-
- fuente de datos:
|
130 |
-
- BI sobre pagos reales de facturas (qué facturas se pagaron y cuales no y en cuanto tiempo)
|
131 |
-
- predicciones que originalmente hizo el modelo y que se guardan al final del llamado de cada Lambda.
|
132 |
-
- procesamiento de datos:
|
133 |
-
- Transformación de variables de tiempo sin pagar en niveles de riesgo crediticio (alto, medio, bajo), etc.
|
134 |
-
- Almacenamiento de datos para reentrenamiento de modelo
|
135 |
-
- métricas:
|
136 |
-
- métricas para modelos de clasificación, como precisión, recall, y matriz de confusión, con particular énfasis en los casos de detección de casos impagos
|
137 |
-
- La métrica debe hacerse en una (o varias) ventana(s) de tiempo de datos recientes, por ejemplo, una semana, un mes, tres meses, para detectar de manera temprana una caída de rendimiento del modelo.
|
138 |
-
- Notificaciones en slack con reporte de métricas: solo una vez por semana o en caso de detectar métricas atípicas.
|
139 |
-
|
140 |
-
## 3. El modelo y el **Reentrenamiento del modelo**
|
141 |
-
|
142 |
-
Utilizaremos un modelo de ML tipo LightGBM Classifier, que permita resolver un problema de clasificación.
|
143 |
-
|
144 |
-
- El modelo clasificará cualquier pedido de factura con un nivel de riesgo alto, medio o bajo, dependiendo la cantidad de días de mora estimados y el valor de la factura.
|
145 |
-
- Métricas: ver monitoreo del mondelo (arriba)
|
146 |
-
|
147 |
-
El reentrenamiento del modelo:
|
148 |
-
|
149 |
-
- Se dará de forma semanal (por ejemplo, los domingo a medianoche)
|
150 |
-
- Tendrá una y de manera automática en una lógica *challenger-defender*. Esto significa que se entrenará un nuevo modelo y se comparará las métricas del nuevo modelo con las métricas del modelo actualmente en producción con datos para una misma ventana de tiempo. Si el nuevo modelo es mejor, reemplazará automáticamente al anterior.
|
151 |
-
- El reentrenamiento semanal con datos de una ventana de tiempo reciente permite ir captando cambios lentos en el mercado o en comportamiento de los agentes, que pudieran estar afectando las predicciones.
|
152 |
-
|
153 |
-
### 4. **CI / CD y versionado de modelos**
|
154 |
-
|
155 |
-
Nuestro producto de datos requerirá un mejoramiento constante. Más allá de los reentrenamientos semanales del modelo, un equipo de desarrolladores buscará modelos superadores que serán el corazón de Xepelin. Para ello necesitamos un sistema de CI CD con las siguientes caractéristicas:
|
156 |
-
|
157 |
-
- Una forma de deployear nuestros servicios con una lógica Infrastracture as a service (Iaas) a través de la integración de Gitlab y CloudFormation.
|
158 |
-
- tres ambientes de desarrollo dev, stage y prod, y un sistema fluido para ir pasando de un sistema a otro
|
159 |
-
- Un sistema de versionado de modelos (se considera una nueva versión cuando un desarrollador pone en producción y no el reentrenamiento automático) a través de Model Registry, y en el que se guarde información sobre código (Git), ambiente (versiones de imágenes de Docker), especificaciones técnicas, métricas, etc.
|
160 |
-
|
161 |
-
### 5. Monitoreo general del sistema
|
162 |
-
|
163 |
-
- El sistema general será orquestado a través de Airflow, lo que permitirá:
|
164 |
-
- una UI centralizada de monitoreo del sistema
|
165 |
-
- resiliencia general del sistema, permitiendo retrys específicos en caso de fallo
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xepelin_challenge_answers/Caso 2 Prueba Técnica f149617afd8941158f81c47c0e59c9ce.md
DELETED
@@ -1,36 +0,0 @@
|
|
1 |
-
# Caso 2: Prueba Técnica
|
2 |
-
|
3 |
-
##
|
4 |
-
|
5 |
-
## La API
|
6 |
-
|
7 |
-
Se deployeó una api en hugging face. Este es el Endpoint al que se realliza un llamado POST:
|
8 |
-
|
9 |
-
[`https://sanbatte-finance-api.hf.space/predict/`](https://sanbatte-finance-api.hf.space/predict/)
|
10 |
-
|
11 |
-
Ejemplo de payload:
|
12 |
-
|
13 |
-
```
|
14 |
-
{
|
15 |
-
"invoiceId": [18314, 16632, 15639 ],
|
16 |
-
"country": "CL"
|
17 |
-
}
|
18 |
-
```
|
19 |
-
|
20 |
-
La API recibe la llamada, calcula la predicción del modelo en el momento y devuelve la predicción para cada invoiceId
|
21 |
-
|
22 |
-
La API solo acepta los códigos de país CL y MX. En caso de recibir otro código, devuelve errror.
|
23 |
-
|
24 |
-
La API solo acepta que los invoice sean números enteros que estén en el csv y que vengan en una lista.
|
25 |
-
|
26 |
-
El código de la API se puede ver acá:
|
27 |
-
|
28 |
-
[sanbatte/finance_api at main](https://huggingface.co/spaces/sanbatte/finance_api/tree/main)
|
29 |
-
|
30 |
-
## El Modelo
|
31 |
-
|
32 |
-
Se entreno un modelo LightGBM, un modelo de gradient boosting optimizado para su rápido rendimiento y velocidad de respuesta al momento de la producción (ideal para ambientes de producción).
|
33 |
-
|
34 |
-
El entrenamiento del modelo y justificación de las decisiones tomadas se puede ver acá:
|
35 |
-
|
36 |
-
AGREGAR NOTEBOOK
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|