Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Regularización o Shrinkage
Ejercicio práctico
Referencias
Uso de APIs para extraer
información de internet
Lucas Antonio II, Valentina e Ignacio.
Universidad de los Andes
Los servidores se utilizan para todo tipo de cosas. Algunos almacenan datos,
otros envían correos electrónicos. El tipo de servidor con el que más
interactúa la gente es el servidor web. Estos son los servidores que le envían a
tu PC el contenido de una página web cuando visitas internet.
Las páginas web de las aerolíneas son un buen ejemplo de páginas server-side
porque cuando deseas comprar algun tiquete, debes seleccionar una fecha, un
origen y un destino, y a partir de esa información el ordenador realiza lo que se
le conoce como request al servidor donde está alojada la página. Gracias a este
request el servidor produce una response que envía de vuelta a tu ordenador y
en esta se encuentra la data con los precios de los vuelos disponibles para las
fechas y rutas seleccionadas.
Un punto clave en todo esto es que, en el caso de las APIs web, podemos
acceder a la información directamente desde la base de datos de la API si
podemos especificar la(s) URL(s) correcta(s). Estas URL se conocen como API
endpoints.
Los API endpoints son, en muchos sentidos, similares a las URL normales de los
sitios web que todos estamos acostumbrados a visitar. Para empezar, puede
navegar hasta ellos en su navegador web. Sin embargo, mientras que los sitios
web normales muestran la información en contenido HTML enriquecido -
imágenes, vídeos de gatos, buen formato, etc.-, un API endpoint es mucho
menos atractivo visualmente. Si navega por el navegador hasta un punto final
de la API, sólo verá un montón de texto aparentemente sin formato. En
realidad, lo que está viendo es (probablemente) JSON (JavaScript Object
Notation) o XML (Extensible Markup Language).
Regularización o Shrinkage
API Datos Abiertos
Ejercicio práctico
Para este clase vamos a visitar la página web de Datos Abiertos del Gobierno
Referencias Nacional (https://www.datos.gov.co/) la cual tiene más de 6,000 bases de
datos sobre diversos sectores como agricultura, ciencia, minería, economía,
educación, vivienda, transporte, entre otros.
Para la clase vamos a utilizar la API del sitio para obtener los casos de
desnutrición en Bucaramanga desde el 2019 hasta la actualidad. El url con la
información general de la base es este (https://www.datos.gov.co/Salud-y-
Protecci-n-Social/51-Casos-de-Desnutrici-n-Aguda-en-menores-de-5-A-
o/epsv-yhtj).
No obstante, la API de Datos Abiertos tiene ciertos endpoints que nos permite
descargar los datos directamente desde unas urls. Para esta clase tomaremos
este camino el cual es más directo y rápido.
Regularización o Shrinkage
Ejercicio práctico
Referencias
df <- read_csv("https://www.datos.gov.co/resource/epsv-yhtj.cs
v")
Regularización o Shrinkage
Ejercicio práctico
# Una de las variables con NAs es cod_ase_ la cual corresponde
Referencias # al identificador de la aseguradora. Esta variable parece no
# relevante. La vamos a dropear
df <- select(df, -cod_ase_)
## .
## 1 2 3 4 6 <NA>
## 47.7 36.1 8.7 2.3 0.6 4.6
# No obstante los NAs representan menos del 5% de las entradada
Qué son las APIs? s
# Vamos a imputarla con el valor más frecuente
API Datos Abiertos df$estrato[is.na(df$estrato)] <- 1
Regularización o Shrinkage
# Seleccionamos las variables relevantes
Ejercicio práctico df <- df %>%
Referencias select(orden, edad_, uni_med_, grupo_etario, sexo, area_,
num_comuna, tipo_de_seguridad_social, estrato, edema,
delgadez, oiel_reseca, hiperpigm, cambios_cabello,
palidez, zscorept_aprox, interpretaci_n_zscore_pt)
# Construimos la edad
# uni_med_ se refiere a la unidad de medida de la edad:
# 1. Años 2. Meses 3. Dias 4. Horas 5. Minutos 0. No aplica
table(df$uni_med_)
##
## 1 2 3
## 233 109 4
# Vamos a pasar todas las edades a dias
Qué son las APIs? df$edad_[df$uni_med_ == 1] = df$edad_[df$uni_med_ == 1] * 365
df$edad_[df$uni_med_ == 2] = df$edad_[df$uni_med_ == 2] * 30
API Datos Abiertos
for (v in variables_categoricas) {
df[, v] <- as.factor(df[, v, drop = T])
}
Ejercicio práctico
Referencias
# Ahora procedemos a dummyficar la base
Qué son las APIs? df2 <- model.matrix(~ zscorept_aprox + edad_ + uni_med_ +
grupo_etario + sexo + area_ + num_comuna
API Datos Abiertos +
Regularización o Shrinkage tipo_de_seguridad_social + estrato +
edema + delgadez + oiel_reseca +
Ejercicio práctico hiperpigm + cambios_cabello + palidez, d
f) %>%
Referencias
as.data.frame()
Regularización o Shrinkage
Ejercicio práctico
Referencias
Ahora que tenemos nuestros datos limpios vamos a estudiar los modelos de
regularización. Nuestro objetivo será predecir el puntaje de desnutrición
usando nuestros datos. Note que solo tenemos 343 observaciones y 42
regresores.
Regularización o Shrinkage
Esta metodología consiste en ajustar el modelo incluyendo todos los
predictores pero aplicando una penalización que fuerce a que las estimaciones
de los coeficientes de regresión tiendan a cero. Con esto se intenta evitar
overfitting, reducir varianza, atenuar el efecto de la correlación entre
predictores y minimizar la influencia en el modelo de los predictores menos
Qué son las APIs?
relevantes. Por lo general, aplicando regularización se consigue modelos con
API Datos Abiertos mayor poder predictivo (generalización). Tres de los métodos de
Regularización o Shrinkage regularización más empleados son Ridge, Lasso y Elastic net.
Ejercicio práctico Dado que estos métodos de regularización actúan sobre la magnitud de los
coeficientes del modelo, todos deben de estár en la misma escala, por esta
Referencias
razón es necesario estandarizar o normalizar los predictores antes de
entrenar el modelo. Los métodos están especialmente indicados para
situaciones en las que hay un mayor número de predictores que de
observaciones.
Ridge
La regularización Ridge penaliza la suma de los coeficientes elevados al
cuadrado (||β||2 ). A esta penalización se le conoce como l2 y
2 p 2
= ∑ β
j=1 j
n p p p
2 2
∑(y i − β0 − ∑ βj xij ) + λ∑β = suma residuos cuadrados + λ ∑ β
j
La desventaja del método Ridge es que, el modelo final, incluye todos los
predictores. Esto es así porque, si bien la penalización fuerza a que los
coeficientes tiendan a cero, nunca llegan a ser exactamente cero (solo si
λ = ∞ ). Este método consigue minimizar la influencia sobre el modelo de los
Lasso
La regularización Lasso penaliza la suma del valor absolutos de los coeficientes
de regresión (||β||1 = ∑ j=1 |βj |). A esta penalización se le conoce como l1 y
p
2
∑(y i − β0 − ∑ βj xij ) + λ ∑ |βj | = suma residuos cuadrados + λ ∑
Qué son las APIs? i=1 j=1 j=1 j=1
Regularización o Shrinkage
Comparación de Ridge y Lasso
La principal diferencia práctica entre Lasso y Ridge es que el primero consigue
Ejercicio práctico
que algunos coeficientes sean exactamente cero, por lo que realiza selección
Referencias de predictores, mientras que el segundo no llega a excluir ninguno. Esto
supone una ventaja notable de Lasso en escenarios donde no todos los
predictores son importantes para el modelo y se desea que los menos
influyentes queden excluidos.
Elastic Net
Elastic net incluye una regularización que combina la penalización l1 y l2 (
). El grado en que influye cada una de las
1 2
αλ||β|| + (1 − α)||β||
1 2 2
Referencias
λ óptimo
Encontrar el mejor modelo implica identificar el valor óptimo del
hiperparámetro de regularización lambda (λ). Al tratarse de un
hiperparámetro, no hay forma de saber de antemano qué valor es el adecuado.
Una forma de lograrlo es emplear validación cruzada o generalized cross
validation (CV), esta última es una adaptación eficiente de leave-one-out cross
validation disponible para la regulación Ridge.
Ejercicio práctico La función glmnet() empleada para entrenar los modelos no permite utilizar
formulas, necesita una matriz x con el valor de los predictores y un vector y
Referencias
con la variable respuesta.
Ejercicio práctico
Ahora vamos a dividir nuestra base en entrenamiento y prueba. En
entrenamiento vamos a estimar los modelos de regresión lineal, ridge y lasso y
vamos a evaluar su capacidad de predicción en la base de prueba.
Regresión lineal
# Analicemos regresión lineal
train2 <- cbind(y_train, X_train)
modelo_reg <- lm("y_train ~ -1 + .", data = train2)
summary(modelo_reg)
##
Qué son las APIs? ## Call:
## lm(formula = "y_train ~ -1 + .", data = train2)
API Datos Abiertos
##
Regularización o Shrinkage ## Residuals:
## Min 1Q Median 3Q Max
Ejercicio práctico
## -0.38100 -0.15723 -0.04124 0.11666 0.59671
Referencias ##
## Coefficients: (4 not defined because of singularities)
## Estimate Std. Error t v
alue Pr(>|t|)
## `(Intercept)` 1.016200 0.106838
9.512 < 2e-16 ***
## edad_ -0.020495 0.020764 -
0.987 0.324800
## uni_med_2 0.029104 0.045880
0.634 0.526569
## uni_med_3 0.640917 0.169082
3.791 0.000198 ***
## `grupo_etario2 a 5 Años` 0.015076 0.042564
0.354 0.723553
## sexoM -0.064496 0.031640 -
2.038 0.042812 *
## area_2 -0.231864 0.227013 -
1.021 0.308300
## area_3 -0.008087 0.163333 -
0.050 0.960560
## `num_comuna10 PROVENZA` -0.015297 0.083815 -
0.183 0.855364
## `num_comuna11 SUR` -0.044836 0.073241 -
0.612 0.541113
## `num_comuna12 CABECERA DEL LLANO` -0.051014 0.170317 -
0.300 0.764849
## `num_comuna13 ORIENTAL` -0.014859 0.077738 -
Qué son las APIs? 0.191 0.848602
API Datos Abiertos ## `num_comuna14 MORRORICO` -0.057693 0.056899 -
1.014 0.311819
Regularización o Shrinkage ## `num_comuna14 MORRORRICO` 0.619655 0.227885
Ejercicio práctico 2.719 0.007115 **
## `num_comuna15 CENTRO` -0.014270 0.119685 -
Referencias 0.119 0.905212
## `num_comuna16 LAGOS DEL CACIQUE` NA NA
NA NA
## `num_comuna17 MUTIS` -0.019882 0.087103 -
0.228 0.819677
## `num_comuna2 NORORIENTAL` -0.051563 0.072423 -
0.712 0.477308
## `num_comuna28. LA CUMBRE - CARMEN` NA NA
NA NA
## `num_comuna3 SAN FRANCISCO` -0.055229 0.050474 -
1.094 0.275167
## `num_comuna4 OCCIDENTAL` -0.035135 0.052389 -
0.671 0.503210
## `num_comuna5 GARCIA ROVIRA` -0.003317 0.072803 -
0.046 0.963709
## `num_comuna6 LA CONCORDIA` -0.035929 0.142733 -
0.252 0.801512
## `num_comuna7 LA CIUDADELA` -0.005451 0.177883 -
0.031 0.975583
## `num_comuna8 SUR OCCIDENTE` -0.044350 0.117961 -
0.376 0.707333
## `num_comuna9 LA PEDREGOSA` 0.289470 0.165116
1.753 0.081097 .
## `num_comunaCORREG. 2` -0.162221 0.225569 -
0.719 0.472871
## `num_comunaCORREG. 3` NA NA
Qué son las APIs? NA NA
API Datos Abiertos ## `num_comunaSIN INFORMACION` -0.118840 0.109526 -
1.085 0.279200
Regularización o Shrinkage ## tipo_de_seguridad_socialE -0.163849 0.241718 -
Ejercicio práctico 0.678 0.498642
## tipo_de_seguridad_socialI -0.142367 0.256666 -
Referencias 0.555 0.579728
## tipo_de_seguridad_socialN 0.015432 0.064948
0.238 0.812427
## tipo_de_seguridad_socialP 0.187952 0.150478
1.249 0.213098
## tipo_de_seguridad_socialS 0.040062 0.045658
0.877 0.381290
## estrato2 0.017050 0.033790
0.505 0.614400
## estrato3 0.020471 0.071726
0.285 0.775625
## estrato4 -0.057827 0.123005 -
0.470 0.638776
## estrato6 -0.176119 0.238856 -
0.737 0.461769
## edema1 NA NA
NA NA
## delgadez1 -0.026612 0.032334 -
0.823 0.411459
## oiel_reseca1 -0.117787 0.059018 -
1.996 0.047300 *
## hiperpigm1 0.295638 0.075165
3.933 0.000115 ***
## cambios_cabello1 -0.021939 0.067897 -
0.323 0.746940
## palidez1 -0.133293 0.060977 -
Qué son las APIs? 2.186 0.029970 *
API Datos Abiertos ## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' '
Regularización o Shrinkage 1
Ejercicio práctico ##
## Residual standard error: 0.2226 on 202 degrees of freedom
Referencias ## Multiple R-squared: 0.9625, Adjusted R-squared: 0.9551
## F-statistic: 129.7 on 40 and 202 DF, p-value: < 2.2e-16
df_coeficientes_reg %>%
filter(predictor != "`(Intercept)`") %>%
ggplot(aes(x = reorder(predictor, abs(coeficiente)),
y = coeficiente)) +
geom_col(fill = "darkblue") +
coord_flip() +
labs(title = "Coeficientes del modelo de regresión",
x = "Variables",
y = "Coeficientes") +
theme_bw()
Qué son las APIs?
Regularización o Shrinkage
Ejercicio práctico
Referencias
# Evaluamos el modelo de regresión lineal
Qué son las APIs? y_hat_in1 <- predict(modelo_reg, newdata = X_train)
y_hat_out1 <- predict(modelo_reg, newdata = X_test)
API Datos Abiertos
API Datos Abiertos # Para obtener un ajuste con regularización Lasso se indica arg
umento alpha = 1.
Regularización o Shrinkage # Si no se especifica valor de lambda, se selecciona un rango a
utomático.
Ejercicio práctico
modelo_lasso <- glmnet(
Referencias x = X_train,
y = y_train,
alpha = 1,
nlambda = 300,
standardize = FALSE
)
regularizacion %>%
ggplot(aes(x = lambda, y = coeficientes, color = predictor))
+
geom_line() +
scale_x_log10(
Qué son las APIs? breaks = scales::trans_breaks("log10", function(x) 10^x),
API Datos Abiertos labels = scales::trans_format("log10",
scales::math_format(10^.x))
Regularización o Shrinkage ) +
Ejercicio práctico labs(title = "Coeficientes del modelo en función de la regula
rización (Lasso)", x = "Lambda", y = "Coeficientes") +
Referencias theme_bw() +
theme(legend.position="bottom")
# ¿Cómo escoger el mejor lambda?
Qué son las APIs? # Veamos cuál es el mejor prediciendo (fuera de muestra)
# En este caso vamos a crear la predicción para cada uno de los
API Datos Abiertos
# 300 lambdas seleccionados
Regularización o Shrinkage predicciones_lasso <- predict(modelo_lasso,
newx = as.matrix(X_test))
Ejercicio práctico
lambdas_lasso <- modelo_lasso$lambda
Referencias
# Cada predicción se va a evaluar
resultados_lasso <- data.frame()
for (i in 1:length(lambdas_lasso)) {
l <- lambdas_lasso[i]
y_hat_out2 <- predicciones_lasso[, i]
r22 <- R2_Score(y_pred = y_hat_out2, y_true = y_test)
rmse2 <- RMSE(y_pred = y_hat_out2, y_true = y_test)
resultado <- data.frame(Modelo = "Lasso",
Muestra = "Fuera",
Lambda = l,
R2_Score = r22,
RMSE = rmse2)
resultados_lasso <- bind_rows(resultados_lasso, resultado)
}
Regularización o Shrinkage
Ejercicio práctico
Referencias
Regularización o Shrinkage
Ejercicio práctico
Referencias
filtro <- resultados_lasso$RMSE == min(resultados_lasso$RMSE)
Qué son las APIs? mejor_lambda_lasso <- resultados_lasso[filtro, "Lambda"]
# Guardamos el desempeño
resultados2 <- data.frame(Modelo = "Lasso",
Muestra = "Dentro",
R2_Score = r2_in2, RMSE = rmse_in2) %
>%
rbind(data.frame(Modelo = "Lasso",
Muestra = "Fuera",
R2_Score = r2_out2, RMSE = rmse_out2))
# Juntamos resultados con regresión lineal
resultados <- rbind(resultados, resultados2)
Qué son las APIs?
Regularización o Shrinkage
Ejercicio práctico
Referencias
Ridge
Qué son las APIs?
regularizacion2 %>%
ggplot(aes(x = lambda, y = coeficientes, color = predictor))
+
geom_line() +
scale_x_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x),
labels = scales::trans_format("log10",
scales::math_format(10^.x))
Qué son las APIs? ) +
API Datos Abiertos labs(title = "Coeficientes del modelo en función de la regula
rización (Ridge)", x = "Lambda", y = "Coeficientes") +
Regularización o Shrinkage theme_bw() +
Ejercicio práctico theme(legend.position="bottom")
Referencias
# ¿Cómo escoger el mejor lambda?
Qué son las APIs? # Veamos cuál es el mejor prediciendo (fuera de muestra)
# En este caso vamos a crear la predicción para cada uno de los
API Datos Abiertos
# 300 lambdas seleccionados
Regularización o Shrinkage predicciones_ridge <- predict(modelo_ridge,
newx = as.matrix(X_test))
Ejercicio práctico
lambdas_ridge <- modelo_ridge$lambda
Referencias
# Cada predicción se va a evaluar
resultados_ridge <- data.frame()
for (i in 1:length(lambdas_ridge)) {
l <- lambdas_ridge[i]
y_hat_out3 <- predicciones_ridge[, i]
r23 <- R2_Score(y_pred = y_hat_out3, y_true = y_test)
rmse3 <- RMSE(y_pred = y_hat_out3, y_true = y_test)
resultado <- data.frame(Modelo = "Ridge",
Muestra = "Fuera",
Lambda = l,
R2_Score = r23,
RMSE = rmse3)
resultados_ridge <- bind_rows(resultados_ridge, resultado)
}
Regularización o Shrinkage
Ejercicio práctico
Referencias
Regularización o Shrinkage
Ejercicio práctico
Referencias
filtro <- resultados_ridge$RMSE == min(resultados_ridge$RMSE)
Qué son las APIs? mejor_lambda_ridge <- resultados_ridge[filtro, "Lambda"]
# Guardamos el desempeño
resultados3 <- data.frame(Modelo = "Ridge",
Muestra = "Dentro",
R2_Score = r2_in3, RMSE = rmse_in3) %
>%
rbind(data.frame(Modelo = "Ridge",
Muestra = "Fuera",
R2_Score = r2_out3, RMSE = rmse_out3))
Ejercicio práctico
Modelo Muestra R2_Score RMSE
Referencias
Regresión lineal Dentro 0.30 0.67
Regularización o Shrinkage
Ejercicio práctico
Referencias
Referencias
McDermott, G. (2020). Lecture 7: Webscraping: (2) Client-side and
APIs. Data science for economists. https://github.com/uo-
ec607/lectures (https://github.com/uo-ec607/lectures)
Cooksey, B. (2014). An introduction to APIs.
https://zapier.com/learn/apis/ (https://zapier.com/learn/apis/)