Taller: Creando un Artefacto de Inferencia

Encapsulando la Lógica del Modelo en un Componente Reutilizable.

Más Allá del Archivo: La Función de Inferencia

En la lección anterior, establecimos que el modelo (`.rds`) es nuestro artefacto principal. Sin embargo, en la práctica, simplemente cargar el archivo no es suficiente. El proceso de tomar nuevos datos, formatearlos correctamente, pasarlos al modelo y procesar la salida es una lógica que se repetirá.

Para adherirnos al principio de "No Repetirte a Ti Mismo" (DRY), vamos a crear un segundo tipo de artefacto: un script de inferencia. Este script contendrá una función limpia y reutilizable que se encargará de todo el proceso de predicción. Nuestra aplicación Shiny no sabrá cómo funciona el modelo por dentro; simplemente llamará a esta función, pasándole los datos y esperando un resultado. Esto se llama abstracción y es fundamental para un código limpio.

Guía Práctica: De un `.rds` a una Función `predict_score()`

Vamos a construir y versionar nuestro script de inferencia, preparándolo para ser consumido por el simulador.

Paso 1: Crear el Script de Inferencia

Siguiendo nuestra arquitectura de proyecto, toda la lógica de R debe vivir en la carpeta `/R`. Aquí es donde crearemos nuestro nuevo artefacto.

  • mi-proyecto/
    • R/
      • data_processing.R
      • model_training.R
      • inference.R   <-- NUEVO
    • ...

Acción: En tu proyecto, dentro de la carpeta `/R`, crea un nuevo archivo llamado `inference.R`.

Paso 2: Desarrollar la Función de Predicción

Ahora, escribimos la función que encapsulará la lógica. Esta función cargará el modelo, tomará los datos nuevos, y devolverá la predicción.

Acción: Abre `R/inference.R` y añade el siguiente código.

# Contenido del artefacto: R/inference.R

# Cargamos el modelo una sola vez fuera de la función para eficiencia
modelo_matematicas <- readRDS("models/modelo_puntaje_mat.rds")
message("==> Artefacto de modelo 'modelo_puntaje_mat.rds' cargado en memoria.")

predict_math_score <- function(new_data) {
  
  message("-> Ejecutando función de inferencia: predict_math_score()")
  
  # Asegurarse de que los nombres de las columnas coincidan
  # con los que el modelo espera.
  required_cols <- c("punt_lectura_critica", "punt_sociales_ciudadanas", "punt_c_naturales")
  if (!all(required_cols %in% names(new_data))) {
    stop("El dataframe de entrada no contiene las columnas requeridas.")
  }
  
  # Usar la función predict() con el modelo cargado
  prediction <- predict(modelo_matematicas, newdata = new_data)
  
  # Devolver el resultado redondeado
  return(round(prediction))
}

Nota de Eficiencia

Observa que cargamos el modelo (`readRDS`) fuera de la función. Si lo pusiéramos dentro, el modelo se cargaría desde el disco cada vez que se llamara a la función, lo cual sería muy ineficiente. Al cargarlo una sola vez cuando el script es "sourced", el objeto del modelo permanece en memoria, listo para ser usado rápidamente por la función.

Paso 3: Integrar el Nuevo Artefacto en `global.R`

Para que nuestra aplicación pueda usar la nueva función `predict_math_score()`, necesitamos que el `global.R` la "conozca". Lo hacemos usando `source()`, igual que con el script de procesamiento de datos.

Acción: Modifica tu archivo `global.R`.

# En global.R

# ... (código de carga de librerías y datos_processing.R) ...

# 5. Cargar el artefacto de inferencia
# Esto cargará el modelo en memoria y hará la función predict_math_score() disponible
source("R/inference.R")

message("==> Entorno global cargado exitosamente.")

Nota que ya no necesitamos la línea `modelo_matematicas <- readRDS(...)` en `global.R`, porque el nuevo script `inference.R` se encarga de eso.

Paso 4: Versionar el Artefacto de Inferencia

Has creado otro componente de software modular y reutilizable. Este es un paso fundamental para hacer tu sistema más robusto y fácil de mantener.

# Añade el nuevo script de inferencia y los cambios en global.R
git add R/inference.R global.R

# Un commit que describe la nueva capacidad del sistema
git commit -m "feat(ml): Crea artefacto de inferencia para predicción de puntajes"

git push