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