library(tidyverse)
library(tidymodels)Se decidió usar R en lugar de Python. Para este trabajo solo se necesitan dos librerías. tidyverse para la lectura, limpieza, y análisis de data, y tidymodels para la definición y ejecución de modelos de machine learning.
Al leer los datos, se aprovecha para hacer la limpieza respectiva. En este caso solo se necesita convertir las variables de tipo texto en “factor” (categóricas).
Las funciones de R suelen soportar el operador pipe (|>), que permite pasar el output de una función como primer parámetro de la siguiente.
Se puede ver las dimensiones de cada conjunto de datos.
Dividimos suscripcion en un conjunto de entrenamiento (75%) y uno de test (25%).
Alternativamente, preparamos un conjunto para validación cruzada de 10 sub-grupos. Estratificamos según la variable dependiente para evitar demasiado *inbalance*. Esto se utilizará más adelante.
Para el pre procesamiento empezamos definiendo la fórmula del modelo. El punto hace referencia a todo el resto de variables.
Esta plantilla se va a utilizar también para otros modelos.
Para el primer ejemplo, usamos la regresión logística. set_engine() y set_mode() permiten personalizar la implementación del modelo.
Para poder combinar ambas plantillas, las agregamos a un mismo workflow.
Para entrenar el modelo, tomamos el workflow como punto de partida, y le hacemos fit() usando la data de entrenamiento.
El siguiente gráfico muestra las 12 variables con mayores coeficientes.
Para esto, mostramos el cálculo del AUC y su gráfico correspondiente. Esto se obtiene a partir de hacer predicciones con el modelo entrenado, usando la data de test.
Se mantiene la plantilla de pre-procesamiento, pero creamos un listado de plantillas de modelos. Para poder, comparar, incluímos la plantilla de regresión logística.
nuevo_workflow <- workflow_set(
preproc = list(
recipe = my_recipe
),
models = list(
logistica = logistic_reg(mode = "classification"),
arbol_decision = decision_tree(mode = "classification"),
random_forest = rand_forest(mode = "classification"),
boosted_tree = boost_tree(mode = "classification")
)
)Para el entrenamiento, se usa el workflow múltiple y el split hecho para cross validation.
Con ello, se obtuvieron 10 resultados para evaluar cada modelo.
El siguiente gráfico muestra el desempeño según tres indicadores.
suscripcion_fit_multiple |>
select(wflow_id, result) |>
unnest(result) |>
select(wflow_id, id, .metrics) |>
unnest(.metrics) |>
mutate(wflow_id = str_remove(wflow_id, "recipe_")) |>
ggplot(aes(id, .estimate, color = wflow_id, group = wflow_id)) +
geom_line() +
geom_point() +
facet_wrap(~.metric, ncol = 1, scales = "free_y") +
theme_light() También es posible mirar a los promedios (con barra de error) de los tres indicadores. En general, los cuatro están bastante cercanos entre sí, y en varios casos sus errores se superponen.
Nos podemos concentrar en el promedio del indicador AUC para elegir el modelo. En este caso, boosted_tree ocupa el primer lugar.
| modelo | roc_auc | rank |
|---|---|---|
| boosted_tree | 0.7975378 | 1 |
| logistica | 0.7858089 | 2 |
| random_forest | 0.7840145 | 3 |
| arbol_decision | 0.7029308 | 4 |
Ahora que sabemos que boosted_tree tuvo mejor desempeño. Entrenamos el 100% de los datos con este algoritmo.
Para predecir, usamos la función `augment()`, que añade las predicciones al como nuevas columnas en el conjunto de datos
# A tibble: 12,769 × 24
.pred_class .pred_no .pred_si Id Edad Trabajo `Estado Civil` Educacion
<fct> <dbl> <dbl> <dbl> <dbl> <fct> <fct> <fct>
1 no 0.914 0.0859 0 30 trabajado… casado primaria…
2 no 0.952 0.0482 1 39 servicios soltero secundar…
3 no 0.931 0.0692 2 25 servicios casado secundar…
4 no 0.940 0.0596 3 38 servicios casado primaria…
5 no 0.958 0.0419 4 47 administr… casado grado_un…
6 no 0.739 0.261 5 32 servicios soltero grado_un…
7 no 0.652 0.348 6 32 administr… soltero grado_un…
8 no 0.958 0.0424 7 41 emprended… casado grado_un…
9 no 0.952 0.0479 8 31 servicios divorciado curso_pr…
10 no 0.972 0.0280 9 35 trabajado… casado primaria…
# ℹ 12,759 more rows
# ℹ 16 more variables: `Credito por Defecto` <fct>, `Prestamo Vivienda` <fct>,
# `Prestamo Personal` <fct>, Contacto <fct>, Mes <fct>, `Dia Semana` <fct>,
# Duracion <dbl>, `Cantidad Contactos Realizados` <dbl>,
# `Cantidad Dias desde Ultimo Contacto` <dbl>,
# `Cantidad Contactos Previos Realizados` <dbl>,
# `Resultado Campaña Anterior` <fct>, `Tasa Variacion Empleo` <dbl>, …
Guardamos los resultados en un nuevo archivo para ser subidos a Kaggle.
Tunear los parámetros del modelo
Selección de características post comparación de modelos
Limpieza/imputación de datos

INF648-PUCP-2024-01 - Aprendizaje Automático