dic. 20, 2022, 18:41 p. m.
Con el objeto de hacer más eficiente el uso de recursos y mejorar la calidad de los datos publicados por el INE, durante los últimos años la institución
ha avanzado en estrategias automatizadas de codificación, principalmente basadas en técnicas de aprendizaje de máquinas (machine learning). Este trabajo
se encuentra a la base de la API de codificación automática que el presente tutorial busca acercar a las personas usuarias.
Esta API para la codificación automática pone a disposición de los usuarios y usuarias modelos para clasificar rama de actividad económica (CAENES) y ocupación (CIUO-08.CL) de las personas, al nivel de desagregación de 1 y 2 dígitos, de acuerdo a como sea parametrizada. Los datos de entrenamiento provienen principalmente de la coyuntura de la Encuesta Nacional de Empleo y las VIII y IX Encuestas de Presupuestos Familiares, de modo que los modelos deberían ser utilizados sobre glosas cuya recolección tenga características similares a las implementadas en el trabajo de campo de dicha encuesta.
El etiquetado de los datos y el entrenamiento de los modelos fueron realizados en el marco del Proyecto Estratégico Servicios Compartidos para la Producción Estadística (actualmente Área de Ciencia de Datos de la Unidad de Gobierno de Datos). Para mayor información acerca del proceso de etiquetado manual y de la arquitectura de los modelos, diríjase al documento “Codificación automática de clasificadores CIUO-08.CL y CAENES a partir de técnicas de machine learning. Creación de sets de entrenamiento y optimización de algoritmos”, disponible en este mismo sitio para su consulta y descarga.
En la presente viñeta se muestra, a partir de algunos ejemplos, la forma de interactuar con la API de codificación automática mediante R y Python. Esta
guía está orientada a usuarios y usuarias con un manejo intermedio de R y/o Python y con conocimientos básicos de machine learning. Para una aproximación
más formal a los métodos de la API, diríjase al siguiente sitio https://rapps.ine.cl:9292/docs
Predecir glosas individuales
El endpoint predict permite obtener el código predicho por el modelo para una glosa. El parámetro más importante es text, donde debe indicarse la glosa para la cual se busca una predicción.
Importante:
Para CIUO el modelo espera un texto que concatene oficio y tareas separados por un espacio.
Para CAENES, espera un texto que concatene actividad principal, oficio y tareas separados por un espacio.
Considerar:
Si no se cuenta con toda esa información, el modelo igualmente entregará predicciones, pero estas pueden ser menos precisas (por ejemplo, si solo entregamos oficio para CIUO o solo actividad económica en CAENES).
Además, se debe precisar el clasificador (ciuo o caenes), así como la cantidad de dígitos (1 o 2). El endpoint no tiene valores por defecto para estos parámetros, pero nos recordará en su respuesta si se ingresó algún valor incorrecto o bien faltó alguno de estos parámetros.
Implementación en R
El paquete httr permite hacer solicitudes a un servidor de manera sencilla y provee algunas herramientas para manipular la respuesta. Mediante la función POST realizamos el request (o solicitud), entregando los parámetros para text, classification y digits.
library(httr)
glosa <- "manipulador de alimentos prepara colaciones"
request <- httr::POST("https://rapps.ine.cl:9292/predict",
encode = "json",
body = list(text = glosa,
classification = "ciuo",
digits = 2))
Para verificar el resultado utilizamos la función status_code, a través de la cual es posible verificar el estatus de la operación (idealmente 200). Finalmente, con la función content se extrae el resultado de la consulta, consistente en un archivo json que indica la categoría predicha y la probabilidad asignada por el modelo a la predicción.
# Revisar el status
httr::status_code(request)
## [1] 200
# Extraer el contenido
response <- httr::content(request, "text")
response
## [[1]]
##
## [[1]]$cod_final
## [1] "51"
##
## [[1]]$prob
## [1] 0.8568
Implementación en Python
Para obtener una predicción para actividad económica, pero ahora mediante Python, es posible utilizar la librería requests. En este caso los parámetros text, classification y digits se entregan a través de un diccionario a la función post. Dado que estamos entregando una glosa de actividad económica, debemos utilizar el argumento “caenes”. Indicaremos, además, que la clasificación debe ser a un dígito.
import requests
glosa = "producción uva exportación"
data = {
"text" : glosa,
"classification" : "caenes",
"digits" : 1
}
response = requests.post("https://rapps.ine.cl:9292/predict", json=data)
Predicción de conjunto de glosas
Para codificar conjuntos de glosas, en lugar de textos individuales, se debe utilizar un procedimiento muy similar al anterior, pero ahora entregando una lista de strings. Para ello, se crea un dataframe que contiene glosas de actividad económica y entregamos esa información en el parámetro text. En este caso, se indica que la clasificación es caenes a un dígito.
Implementación en R
Para implementar la misma consulta anterior en R, utilizamos el siguiente código.
# Crear dataframe con ejemplos
caenes <- data.frame(glosa_caenes = c("extracción de cobre", "producción uva exportación", "Elaboración de Pan",
"Contratación de Personal reponedores", "Cultivo de trigo"))
# Enviar la consulta al servidor
request <- httr::POST("https://rapps.ine.cl:9292/predict",
encode = "json",
body = list(text = caenes$glosa_caenes,
classification = "caenes",
digits = 1)
)
# Extraer el contenido
response <- httr::content(request)
Dado que la respuesta de la API es un archivo json, una forma de ordenar el resultado, es mediante la función fromJSON del paquete jsonlite.
# Ordenar el contenido
library(jsonlite)
response <- httr::content(request, "text")
fromJSON(response) |> as.data.frame()
## # A tibble: 5 × 3
## cod_final prob
## <chr> <dbl>
## 1 B 1
## 2 A 0.999
## 3 C 1.00
## 4 N 0.993
## 5 A 1
Implementación en Python
Para implementar la misma consulta anterior en python, utilizamos el siguiente código.
import requests
import pandas as pd
glosas = ["extracción de cobre", "producción uva exportación",
"Elaboración de Pan", "Contratación de Personal reponedores", "Cultivo de trigo"]
# Parámetros de la consulta
data = {
"text" : glosas,
"classification" : "caenes",
"digits" : 1
}
# Enviar la consulta al servidor
response = requests.post("https://rapps.ine.cl:9292/predict", json=data)
# Extraer el contenido de la consulta
content = response.json()
# Ordenar los resultados en un dataframe
pd.DataFrame(content)
Obtener datos de entrenamiento
La API también permite obtener los datos con los que se entrenó originalmente el modelo,
a través del endpoint get_training_data, utilizando el método GET. Los datos entregados son un diccionario con dos llaves:
train y test. Cada llave contiene todos los datos asociados al entrenamiento y validación del modelo, respectivamente.
A continuación se explica cómo acceder a estos en R y Python y cómo transformarlos a un formato más cómodo, como lo son los DataFrames.
Implementación en R
Para obtener los datos de entrenamiento en R, utilizamos el siguiente código.
# Realizar la consulta GET para obtener datos de entrenamiento
request <- httr::GET("https://rapps.ine.cl:9292/get_training_data?classification=ciuo")
# Extraer el contenido
datos = httr::content(request)
# Convertir a DataFrames
train = datos$train |> dplyr::bind_rows()
test = datos$test |> dplyr::bind_rows()
Implementación en Python
Para obtener los datos de entrenamiento en Python, utilizamos el siguiente código.
import requests
import pandas as pd
# Realizar la consulta GET para obtener datos de entrenamiento
request = requests.get("https://rapps.ine.cl:9292/get_training_data?classification=ciuo")
# Obtener datos
datos = request.json()
# Convertir a DataFrames
train = pd.DataFrame(datos['train'])
test = pd.DataFrame(datos['test'])
Seleccionar modelo a utilizar
Durante la historia de la API, se han desarrollado diversos modelos. Actualmente, esta también permite seleccionar cualquier de estos modelos. El endpoint get_model_metadata utilizando el método GET, permite obtener información respecto a cuándo fueron entrenados estos modelos y qué diferencia tienen con la versión anterior. Ahora, para obtener predicciones o datos de modelos anteriores, existe el parámetro model_version. Esta tiene por defecto el valor "latest", es decir, entrega el último modelo entrenado. En caso de querer otra versión, debe enviarse un valor entero positivo. Al momento de escribir este tutorial, se aceptan los valores 1, 2 y 3 (este último siendo equivalente a "latest").
Nota: la metadata de los modelos entregada en get_model_metadata tiene una llave version que se corresponde con model_version. Esto quiere decir que get_model_metadata debiese guiar a las personas usuarias a seleccionar la versión del modelo de interés, ya sea para predecir u obtener datos de entrenamiento.
Implementación en R
Para obtener la metadata de los modelos, datos de entrenamiento y predicciones de un modelo específico en R, utilizamos el siguiente código.
library(httr)
library(jsonlite)
# Obtener metadata de los modelos
request_modelos <- httr::GET("https://rapps.ine.cl:9292/get_model_metadata")
cat(prettify(content(request_modelos, as = "text", encoding = "UTF-8")))
# Resultado:
# {
# "models": [
# {
# "arquitectura": "GRU",
# "version": 1,
# "fecha_disponiblizacion": "03-2025",
# "modelos_incluidos": [
# "ciuo-1d",
# "ciuo-2d",
# "caenes-1d",
# "caenes-2d"
# ],
# "resumen_cambios": "Modelo inicial"
# },
# {
# "arquitectura": "GRU",
# "version": 2,
# "fecha_disponiblizacion": "07-2025",
# "modelos_incluidos": [
# "ciuo-1d",
# "ciuo-2d"
# ],
# "resumen_cambios": "reentrenamiento ciuo incluyendo datos IX EPF y EPF Aysén"
# },
# {
# "arquitectura": "GRU",
# "version": 3,
# "fecha_disponiblizacion": "09-2025",
# "modelos_incluidos": [
# "ciuo-1d",
# "ciuo-2d",
# "caenes-1d",
# "caenes-2d"
# ],
# "resumen_cambios": "Reentrenamiento todos los modelos con más datos, foco en códigos militares."
# }
# ]
# }
# Obtener datos de entrenamiento de un modelo específico
request_datos <- httr::GET("https://rapps.ine.cl:9292/get_training_data?classification=ciuo&model_version=2")
# Obtener datos
datos <- httr::content(request_datos)
# Convertir a DataFrames
train <- datos$train |> dplyr::bind_rows()
test <- datos$test |> dplyr::bind_rows()
# Obtener predicciones de un modelo específico
glosas <- c(
"extracción de cobre",
"producción uva exportación",
"Elaboración de Pan",
"Contratación de Personal reponedores",
"Cultivo de trigo"
)
# Parámetros de la consulta
data <- list(
text = glosas,
classification = "caenes",
digits = 1,
model_version = 1 # Versión modelo a usar, si no se especifica se usará la última versión disponible
)
# Enviar la consulta al servidor
request_predicciones <- httr::POST(
"https://rapps.ine.cl:9292/predict",
body = data,
encode = "json"
)
content <- httr::content(request_predicciones, "text")
fromJSON(content) |> as.data.frame()
Implementación en Python
Para obtener la metadata de los modelos, datos de entrenamiento y predicciones de un modelo específico en Python, utilizamos el siguiente código.
import requests
import pandas as pd
import json
# Obtener metadata de los modelos
request_modelos = requests.get("https://rapps.ine.cl:9292/get_model_metadata")
print(json.dumps(request_modelos.json(), indent=2))
# Resultado:
# {
# "models": [
# {
# "arquitectura": "GRU",
# "version": 1,
# "fecha_disponiblizacion": "03-2025",
# "modelos_incluidos": [
# "ciuo-1d",
# "ciuo-2d",
# "caenes-1d",
# "caenes-2d"
# ],
# "resumen_cambios": "Modelo inicial"
# },
# {
# "arquitectura": "GRU",
# "version": 2,
# "fecha_disponiblizacion": "07-2025",
# "modelos_incluidos": [
# "ciuo-1d",
# "ciuo-2d"
# ],
# "resumen_cambios": "reentrenamiento ciuo incluyendo datos IX EPF y EPF Aysén"
# },
# {
# "arquitectura": "GRU",
# "version": 3,
# "fecha_disponiblizacion": "09-2025",
# "modelos_incluidos": [
# "ciuo-1d",
# "ciuo-2d",
# "caenes-1d",
# "caenes-2d"
# ],
# "resumen_cambios": "Reentrenamiento todos los modelos con más datos, foco en códigos militares."
# }
# ]
# }
# Obtener datos de entrenamiento de un modelo específico
request_datos = requests.get("https://rapps.ine.cl:9292/get_training_data?classification=ciuo&model_version=2")
# Obtener datos
datos = request_datos.json()
# Convertir a DataFrames
train = pd.DataFrame(datos['train'])
test = pd.DataFrame(datos['test'])
# Obtener predicciones de un modelo específico
glosas = ["extracción de cobre", "producción uva exportación",
"Elaboración de Pan", "Contratación de Personal reponedores", "Cultivo de trigo"]
# Parámetros de la consulta
data = {
"text" : glosas,
"classification" : "caenes",
"digits" : 1,
"model_version" : 1 # Versión modelo a usar, si no se especifica se usará la última versión disponible
}
# Enviar la consulta al servidor
request_predicciones = requests.post("https://rapps.ine.cl:9292/predict", json=data)
content = request_predicciones.json()
content