Tema 05 - Modelización y Aprendizaje Estadístico

Extraer patrones y relaciones de los datos

Pedro Albarrán

Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante

Alberto Pérez

Métodos Estadísticos

Métodos Estadísticos

  • La modelización mediante métodos estadísticos permite

    • Encontrar patrones

    • Interpretar datos

  • Los datos (casos observados) son una muestra de una población mayor (casos potenciales)
# Población: ventas diarias ~ Uniforme(0, 20), media = 10
set.seed(9915)
tibble(x = runif(n=1e9, min=0, max=20)) |> pull(x) |> mean()

# Muestra de solo 25 días
set.seed(9915)
tibble(x = runif(n=25, min=0, max=20)) |> pull(x) |> mean()
  • El estadístico varía entre muestras.

  • ¿Cómo de fiable es este estadístico en una muestra?

Variabilidad muestral

  • Con todas las muestras potenciales de tamaño \(\small n\) conoceríamos la distribución muestral de un estadístico (información calculada en una muestra)

    • Aproximación de “todas” las muestras potenciales con 1000 muestras
set.seed(101)
nsim <- 1000
ybar <- numeric(nsim)
for (j in 1:nsim) {
  muestra <- runif(n=25, 0, 20)
  ybar[j] <- mean(muestra)
}

as_tibble(ybar) |> ggplot(aes(x=value)) + geom_density() +
  geom_vline(xintercept=10)
  • Tenemos una ÚNICA MUESTRA: ¿cómo cuantificar la incertidumbre?
  1. Suponiendo que los datos son normales, la media tiene una distribución normal

  2. Teorema Central del Límite: para datos de cualquier distribución, \(\overline{Y} \overset{a}{\sim} N(\mu, \sigma^2/n)\) cuando \(n \to \infty\)

Procedimiento Bootstrap

Idea: Usar la ÚNICA muestra como si fuera la población → generar variación “similar” a la muestral

set.seed(101)
UNICAmuestra <- tibble(x=runif(n=25, 0, 20))
  1. Tomar muchas remuestras con reemplazamiento de la muestra original
library(rsample)
remuestras <- bootstraps(UNICAmuestra, times = 1000)
  1. Calcular el estadístico en cada remuestra
distrib <- list()
for (r in 1:1000) {
  remuestra <- remuestras$splits[[r]] |> as_tibble()
  media  <- remuestra |> pull(x) |> mean()
  sd    <-  remuestra |> pull(x) |> sd()
  distrib[[r]] <- list(medias = media, sds =sd )
}
distribDF <- distrib |> bind_rows()
  • La distribución de remuestras es “similar” a la distribución muestral sin supuestos (normalidad, TCL)
distribDF |> ggplot(aes(x=medias)) + geom_density()               # distribución
mediaSE <- distribDF |> pull(medias) |> sd()                      # ES de la media
mediaIC <- distribDF |> pull(medias) |> quantile(c(0.025, 0.975)) # IC de la media

Aprendizaje Estadístico

¿Qué es el aprendizaje estadístico?

  • Aprendizaje automático (machine learning, ML) o estadístico (statiscal learning): conjunto de técnicas algorítmicas para extraer información de los datos

  • Tipos principales

  1. Aprendizaje supervisado: para cada medida de \(X\) hay una respuesta asociada \(Y\)

    • Aprendemos la respuesta \(Y\) de casos nuevos a partir de casos previos
  2. Aprendizaje no supervisado: no hay una respuesta asociada, aprendemos rasgos no medidos

    • ej., observaciones similares organizadas en grupos distintos

Aprendizaje supervisado

\[ \small Y = f(X) + \varepsilon \]

  • Modelo para la variable dependiente en función de

    • factores observados (predictores/características)

    • factores no observados (\(\small \varepsilon\))

    • \(f\) representa la relación sistemática que \(X\) (género, educación, etc.) ofrece sobre \(Y\) (ej. renta)

  • Objetivos:

    1. Predecir el valor esperado de \(\small Y\) para casos nuevos

    2. Comprender cómo afectan al resultado esperado de \(\small Y\) cambios en los valores de las características

      • p.e., tiene la experiencia un efecto positivo o nula sobre la renta esperada

      • ¡cuidado con afirmaciones de causalidad!

  • En ambos casos, tenemos que estimar (“aprender”) la \(f\) desconocida

Aprendizaje supervisado (cont.)

  • Según la naturaleza de \(Y\) tenemos:

    • Problemas de Regresión: \(Y\) cuantitativa (salario, ventas, precio)

    • Problemas de Clasificación: \(Y\) cualitativa (compra/no compra, categoría producto)

  • Dos enfoques para especificar la relación \(f\):

    1. Modelo Paramétrico: supone un forma de \(f\) que depende de parámetros desconocidos, p.e., lineal \(f(x) =\beta_0 + \beta_1 x_1 + \dots + \beta_k x_k\)

      • Más fácil de estimar e interpretar
      • Menos flexible
    2. Modelo No paramétrico: Ajustar sin supuestos funcionales

      • Más flexible, mejor ajuste
      • Más difícil de interpretar
    • La capacidad predictiva de un modelo mejora si incluimos más variables explicativas (modelo más flexible)

Regresión Lineal

Modelo de regresión lineal

  • Modelo paramétrico para problemas de regresión que supone una relación lineal:

\[\quad \small \color{blue}{ventas = \beta_0 + \beta_1 renta + \beta_2 descuento + u}\]

  1. Constante \(\small \color{blue}{\beta_0= E(ventas|renta=0, descuento=0)}\)

    • valor esperado de \(\small Y\), ventas, cuando todas las variables explicativas son cero
  2. Pendiente de una variable continua \(\small \color{blue}{\beta_1 = \frac{\delta E(ventas|renta,descuento)}{\delta{renta}}}\)

    • cambio esperado de \(\small Y\), ventas, cuando la variable explicativa, renta, aumenta en una unidad, manteniendo el resto de variables constantes (en este caso, un valor dado para descuento)

    • también \(\small \beta_1 = E(ventas|renta=x+1,descuento=d)-E(ventas|renta=x,descuento=d)\)

  3. Para variables discretas binarias \(\small \color{blue}{\beta_2 = E(ventas|renta=x,descuento=1)-E(ventas|renta=x,descuento=0)}\)

    • diferencia del valor esperado de \(\small Y\), ventas, para el grupo indicado por la variable (tienen descuento) respecto al grupo de referencia (no tienen descuento), manteniendo el resto de variables (en este caso, renta) constante

Regresión Lineal: Estimación

  • Objetivo: estimar los coeficientes poblacionales desconocidos a partir de una muestra

  • Los coeficientes estimados minimizan la Suma Cuadrática de Residuos, \(\small \hat{e}\) (errores de estimación): es decir , las distancias entre

    • los datos observados: \(\small y_i\)

    • y los datos predichos por el modelo estimado \(\small \hat{y}_i=\hat{\beta}_0+\hat{\beta}_1 X_1+ \dots + \hat{\beta}_k X_p\)

\[ \small SCR=\sum_{i=1}^{n} \hat{e}_i^2= \sum_{i=1}^{n} ( y_i - \hat{y}_i)^2 \]

  • Esto equivale a las condiciones derivadas de suponer \(\small E(\varepsilon|X)=0\)

Regresión Lineal: Estimación (cont.)

  • Los parámetros del modelo \(f(.)\) estimado, los \(\small \beta_j\), son estadísticos con variabilidad muestral, medida por su error estándar \(\small se(\widehat{\beta}_j)\)

    • Usados para construir intervalos de confianza y para contrastar hipótesis sobre los parámetros poblacionales, p.e., significatividad (\(\small \beta_1=0\)) y signo.
  • La función lm() con la notación de fórmula crea un objeto lista con resultados
descuento <- read.csv("data/descuento.csv") |>
        mutate(zona = parse_factor(zona), mujer = as.factor(mujer))
modelo <- lm(data = descuento, ventas ~ renta + descuento)
(sum.modelo <- summary(modelo))
nobs(modelo)
  • La predicción \(\widehat{y}\) también está sujeta a incertidumbre por la estimación: se puede calcular su error estándar e intervalos de confianzas
pred <- predict(modelo, type = "response",
                se.fit = T, interval = "confidence")
cbind(descuento$ventas, pred$fit, pred$se.fit) |> head()

Ampliando el Modelo de Regresión Lineal

  • Incorporar información cualitativa: incluimos una variable binaria (dummy) para cada categoría, excepto una (grupo de referencia)

    • Cada coeficiente es el efecto diferencial de ese grupo respecto al grupo de referencia

    • Las dummies se crean automáticamente con factores (sin orden)

      • también se pueden usar la biblioteca fastDummies
lm(data = descuento, ventas ~ renta + descuento + zona) |> summary()
  • Modelizar relaciones no lineales entre la variable dependiente y las explicativas

  • El modelo lineal asume efecto constante \(\frac{\partial Y}{\partial X_j} = \beta_j\), PERO en la realidad observamos

    • Rendimientos decrecientes (productividad, utilidad)
    • Elasticidades variables
    • Umbrales y efectos discretos
    • Efectos heterogéneos entre grupos
  • Solución: Transformar variables para capturar estas no linealidades

Superando la linealidad

  1. Usando logaritmos, modelizamos elasticiades (cambios porcentuales) y rendimientos decrecientes
# Y ~ log(X): semi-elasticidad / rendimientos decrecientes
lm(data = descuento, ventas ~ log(renta) + descuento)
# log(Y) ~ log(X): elasticidad constante
lm(data = descuento, log(ventas) ~ log(renta) + descuento)
# log(Y) ~ X: semi-elasticidad / crecimiento exponencial
lm(data = descuento, log(ventas) ~ renta + descuento)
  1. Usando polinomios (y otras funciones no lineales), modelizamos efectos que varían con el nivel de la variable
lm(data=descuento, ventas ~ edad + I(edad^2) ) |> summary()
ggplot(descuento, aes(x=edad, y=ventas)) + geom_point() +
  geom_smooth(method = "lm", formula = y ~ x + I(x^2))
  • El efecto marginal de \(edad\) sobre \(ventas\), \(\small{\frac{\partial ventas}{\partial edad} = \beta_1 + 2\beta_2 edad}\) depende de la \(edad\)

Superando la linealidad (cont.)

  1. Discretizando variables también capturamos efectos no lineales: permite efectos “escalón” diferentes para distintos valores
lm(data=descuento, ventas ~
     cut(edad, seq(20, 60, 5), include.lowest = TRUE)) |> summary()
ggplot(descuento, aes(x=edad, y=ventas)) + geom_point() +
  geom_smooth(method = "lm",
              formula = y ~ cut(x, seq(20, 60, 5), include.lowest = T))
  1. Usando interacciones entre variables, el efecto de un regresor dependerá de otro regresor
  • La “pendiente” cambia con el valor de la otra variable: \(\small{\frac{\partial ventas}{\partial mujer} = \beta_1 + \beta_3 mujer}\)

  • Deben incluirse siempre los factores principales (NO sólo edad:renta)

lm(data = descuento, ventas ~ edad*renta)  |> summary()
lm(data = descuento, ventas ~ renta*mujer) |> summary()

ggplot(descuento, aes(x=renta, y=ventas, color = mujer)) +
  geom_point() + geom_smooth(method = "lm", formula = y ~ x,
                               se = FALSE)

Regresión Lineal: comentarios finales

  • Los resultados de (todos) estos modelos informan de la relación entre los regresores y la variables dependiente

  • “Correlación no implica causalidad”, salvo en ensayos científicos aleatorios controlados, también llamados pruebas A/B

  • La selección de variables es importante: evita sesgos o aumenta la variabilidad
lm(data = descuento, ventas ~ descuento) |> summary()
lm(data = descuento, ventas ~ descuento + renta) |> summary()
lm(data = descuento, ventas ~ renta) |> summary()
lm(data = descuento, ventas ~ renta + educ) |> summary()
  • Algunos sugieren “pruebas” para los problemas en el modelo lineal; eso es erróneo:

    • No linealidad: hemos visto que modeliza relaciones no lineales

    • No normalidad: innecesaria, con TCL o bootstrap.

    • Colinearidad: simplemente elimina la variable colineal.

    • Heterocedasticidad y autocorrelación: solo necesitamos errores estándar robustos

Regresión Logística

  • Un modelo de regresión lineal para respuestas binarias no es adecuado porque genera predicciones fuera del rango \(\small [0,1]\)
  • Solución: aplicar al índice lineal una transformación, la función logística \(\small \Lambda (z)=\frac{e^z}{1+e^z}\):

  • De manera que \(\small \Pr(Y=1|X)= f(x)= \color{blue}{\Lambda( \beta_0 + \beta_1 x_1 + \ldots + \beta_k x_k)} \in [0,1]\)
  • Como el modelo siempre es no lineal, el coeficiente NO coincide con la magnitud del efecto de un cambio en los regresores sobre la probabilidad. PERO sí coinciden en su signo (y significatividad)
  • NO se puede minimizar la SCR; el objetivo es maximizar la probabilidad (verosimilitud) de observar los unos y ceros en los datos

Regresión Logística (cont.)

  • La regresión logística se puede estimar en R con la función glm() (similar a lm()); podemos incluir variables explicativas tanto cuantitativas como cualitativas, interacciones, etc.
censo <- read_csv("data/census.csv") |>
  mutate(across(where(is.character), ~parse_factor(.x)))

logit <- glm(data = censo, income ~  race + age + I(age^2) +
               log(hours_per_week)*sex +  education_1  +
               capital_gain + capital_loss, family = "binomial")
logit |>  summary()
  • Como en el modelo lineal, podemos calcular predicciones de la probabilidad tanto en los mismos datos como en unos nuevos
predict(logit, type="response")

logit2 <- logit <- glm(data = censo, income ~  age + education_1,
         family = "binomial")
summary(logit2)
predict(logit2, type="response",
        newdata = tibble(age=c(20,60), education_1=c(9,16)))

Regresión Logística con más de dos clases

  • La regresión logística se puede generalizar a situaciones con múltiples clases (modelos multinomiales) con un índice lineal para cada clase \[ \small \Pr(Y=c|X)=\frac{e^{\beta_{0c}+\beta_{1c}X_1+\dots+\beta_{kc}X_k}}{\sum_{l=1}^{C}e^{\beta_{0l}+\beta_{1l}X_1+\dots+\beta_{kl}X_k}} \]

  • La librería glmnet() permite la estimación de estos modelos

health <- read_csv("data/health_insurance.csv") |>
  mutate(across(where(is.character), ~parse_factor(.x)))

library(glmnet)
x <- model.matrix(product ~ age + gender, data = health)
mod.glmnet <- glmnet(x = x, y = health$product, family = "multinomial",
                     lambda = 0, type.multinomial = "grouped")
coef(mod.glmnet)
predict(mod.glmnet, newx=x, type = "response")  # probabilidad de cada clase
predict(mod.glmnet, newx=x, type = "class")     # clase

Evaluación de modelos (por su capacidad predictiva)

Métricas de Error de Predicción (cuantitativa)

  • Un modelo es mejor cuanto mejor se ajusten sus predicciones a las observaciones

  • El error de predicción es \(y - \widehat{y} = f(X) - \widehat{f}(X) + \varepsilon\)

    • \(f - \widehat{f}\) = error reducible (eligiendo modelo)

    • \(\varepsilon\) = error irreducible (variables no observadas)

  • Una función de pérdida (o coste) evalúa cómo valoramos las desviaciones

    1. Mean Square Error (Error Cuadrático Medio): \(\small \color{blue}{MSE(y,\widehat{y})={\frac{1}{n}\sum_{i=1}^{n}\left(y-\widehat{y}\right)^2}}\)

      • penaliza grandes desviaciones

      • \(\small \color{blue}{R^2}\) y \(\small \color{blue}{R^2-ajustado}\): variantes solo para comparar modelos con la misma variable dependiente.

    2. Root Mean Square Error: \(\small \color{blue}{RMSE(y,\widehat{y})=\sqrt{\frac{1}{n}\sum_{i=1}^{n}\left(y-\widehat{y}\right)^2}}\)

      • mismas unidades que \(\small y\)
    3. Mean Absolute Error: \(\small \color{blue}{MAE(y,\widehat{y})=\frac{1}{n}\sum_{i=1}^{n}\left|y-\widehat{y}\right|}\)

    • Otras medidas basadas en distintas funciones de pérdida: verosimilitud del modelo, \(\small \color{blue}{AIC}\), \(\small \color{blue}{BIC}\), etc

Seleccionar el mejor modelo. “Overfitting”

  • ¿Cuál es el mejor modelo para predecir el número de visitantes en función de la temperatura?
library(mosaicData)
RailTrail |> ggplot(aes(x = hightemp, y = volume)) +
  geom_point() +  geom_smooth()

\[ \scriptsize \begin{align*} volume &= \beta_0 + \beta_1 \, \mathrm{hightemp} + \varepsilon \\ volume &= \beta_0 + \beta_1 \, \mathrm{hightemp} + \beta_2 \, \mathrm{hightemp}^2 + \varepsilon \\ &\vdots \\ volume &= \beta_0 + \beta_1 \, \mathrm{hightemp} + \dots + \beta_{22} \, \mathrm{hightemp}^{22} + \varepsilon \end{align*} \]

  • El objetivo de un modelo es predecir casos nuevos (no reproducir los datos vistos)

  • Las métricas (\(\small MSE\), \(R^2\)) calculadas en los mismos datos usados para estimar NO informan de esto: miden in-sample prediction, no out-sample prediction

  • Un modelo demasiado flexible puede aprender el ruido (características de la muestra concreta) → sobreajuste (overfitting): error casi nulo en los datos que estimamos, pero grande con casos nuevos
RailTrail |> ggplot(aes(x = hightemp, y = volume)) +
  geom_point() + geom_smooth(method = 'lm', formula = y ~ poly(x,22) ) +
  coord_cartesian(ylim = c(100,750))

Muestras de entrenamiento y de prueba

  • Dividimos la muestra para usar datos diferentes para estimar y para calcular las métricas

    1. Muestra de entrenamiento (train) donde se ajusta el modelo

    2. Muestra de prueba (test) donde se calculan métricas con observaciones NO vistas antes por el modelo → evaluamos el mejor modelo para predecir casos nuevos

  • Un buen modelo tiene equilibrio entre capacidad predictiva y complejidad: ni ajuste insuficiente (underfitting) ni overfitting
  • Siempre que aumenta la flexibilidad, el MSE

    • disminuye en la muestra de entrenamiento

    • tiene forma de U en la muestra de prueba

  • Nota: el MSE en entrenamiento es siempre menor que en prueba

  • Evitar modelos con sobre-ajuste: un modelo menos flexible podría tener menor error de predicción con casos nuevos

“Trade-off” Varianza–Sesgo

\[ \small \text{Error Total} = \text{Sesgo}^2 + \text{Varianza} + \text{Error Irreducible} \]

  • Sesgo: diferencia entre predicción promedio y valor real por especificar mal \(f\)

    • modelos simples (underfit) que pierden relaciones relevantes (omitir variables, forma funcional incorrecta)
  • Varianza: cuánto cambian las predicciones con diferentes datos

    • modelos complejos, sobreajustados a características de cada muestra de entrenamiento
  • Al aumentar la complejidad ↓ sesgo pero ↑ varianza ⇒ encontrar una flexibilidad intermedia

  • No pueden minimizarse simultáneamente ambas fuentes de error: memorización (en entrenamiento) vs. generalización de resultados

Métricas de Error en la Clasificación

  • El modelo predice la probabilidad de que una observación pertenezca a cada categoría ⇒ se asigna como clase predicha aquella con mayor probabilidad

    • en el caso binario, implica superar el umbral de 0.5 (pero deben probarse varios valores)
censo <- read_csv("data/census.csv") |> 
  mutate(income = parse_factor(income))
logit <- glm(data = censo, income ~ capital_gain, 
             family = "binomial")
prob_predict <- predict(logit, type = "response")

umbral <- 0.5
cat_predict  <- if_else(prob_predict > umbral, 1, 0)
cbind(censo$income, cat_predict, prob_predict) |> head(10)
  • NO tiene sentido diferencia de clases ⇒ no se puede calcular MSE y similares

  • Matriz de Confusión: tabular categorías observadas frente a las categorías predichas

table(cat_predict, censo$income)

Métricas basadas en la matriz de confusión

CLASE OBSERVADA
CLASE PREDICHA ↓ POSITIVO (1) NEGATIVO (0)
POSITIVO (1) Verdadero Positivo [VP] Falso Positivo [FP]
(Error Tipo I)
NEGATIVO (0) Falso Negativo [FN]
(Error Tipo II)
Verdadero Negativo [VN]
  • Tasa de observaciones correctamente clasificadas (exactitud o accuracy)

\[ \scriptsize \color{blue}{ACCUR=\frac{VP+VN}{VP+FP+VN+FN}} \]

  • No es informativo con clases infrecuentes (datos desequilibrados): con solo 1% de fraude, predecir que nunca hay fraude implica \(\scriptsize ACCUR=99\%\), PERO NO detecta fraude
  • El estadístico Kappa (\(\small \kappa\)) es una medida similar, pero ajusta por el desequilibrio entre clases

Métricas basadas en la matriz de confusión (cont.)

  • Tasa de verdaderos positivos o sensibilidad (recall) \[ \scriptsize \color{blue}{TVP=SENSIT=\frac{VP}{VP+FN}} \]

  • Tasa de verdaderos negativos o especificidad \[ \scriptsize \color{blue}{TVN=ESPECIF=\frac{VN}{VN+FP}} \]

    • Tasa de falsos positivos: \(\scriptsize \color{blue}{TFP = 1 - TVN = 1 - ESPECIF}\)
  • Exactitud equilibrada: (Balanced Accuracy) media de la sensibilidad y de la especificidad

  • Precisión: \(\scriptsize PREC=\frac{VP}{VP+FP}\)

  • La familia de medidas \(\small F_{\beta}\): ratio de la importancia ponderada de la sensibilidad y de la precisión

Curva ROC (“Receiver Operating Characteristic”)

  • Representa TVP (eje y) frente a TFP (eje x) en diferentes umbrales : reducir el umbral clasifica más elementos como positivos (verdaderos y falsos)

  • La curva ROC informa del grado de separabilidad: dado un nivel de TFP, el clasificador es mejor cuanto mayor sea TVP

AUC (“area under the curve”)

  • La AUC es el área bajo la curva ROC: ofrece una medida agregada de rendimiento entre 0 (todas las clasificaciones incorrectas) y 1 (todas correctas)

  • Resume la curva ROC y permite comparar curvas que se cruzan

Extensiones. Métricas adicionales

  • Con más de dos clases, se realiza un análisis AUC-ROC para cada categoría (frente a las demás) y se promedian (ej., ponderando por casos en cada clase)
  • Con clases desequilibradas, se puede preferir en lugar de la ROC un gráfico de precisión frente sensibilidad (precision-recall) y su correspondiente AUC (PR-AUC)

  • Existen múltiples funciones de pérdida (o coste de clasificación) posibles.

    • Las relacionadas con la curva de ganancia consideran el coste de alcanzar un cierto nivel de sensibilidad

    • Otras se basan en la función de verosimilud o la entropía como medidas de pérdida (ej. mean log loss)

Evaluación de Modelos: entrenamiento y prueba

  • Para minimizar problemas de underfit y, sobre todo, de overfit, DEBEMOS dividir aleatoriamente el conjunto de datos en dos partes:

  • Entrenamiento (80-90%): datos sobre los que se construye/estima el modelo

  • Prueba(20-10%): se usa el modelo construido para predecir y se evalúa con datos no vistos antes

  • ¿Por qué renunciar a parte de los datos si sabemos que un tamaño muestral grande es importante? Evaluar correctamente un modelo lo es mucho más

  • La estimación del error en prueba puede ser volátil dependiendo de las observaciones incluidas en cada grupo

Evaluación de Modelos: Validación cruzada

  • La validación cruzada (cross-validation o rotation estimation) repite varias veces y de forma ordenada el proceso de partición en grupos de entrenamiento y prueba (similar a bootstrap)

  • Este método de evaluación de modelos:

    1. Evita que los resultados sean sensibles a una partición concreta de los datos

    2. Permite utilizar todas las observaciones de la muestra, tanto para estimar como para evaluar el modelo (aunque no a la vez)

  • Algunas variantes de Validación Cruzada (VC) son:

    • VC de K iteraciones (K-fold cross-validation o K-fold CV) (el más habitual)

    • VC aleatoria (Random cross-validation, RCV)

    • VC dejando uno fuera (Leave-one-out cross-validation, LOOCV)

    • VC dejando p fuera (Leave-p-out cross-validation, LpOCV)

Validación cruzada de K bloques

  • Se divide, aleatoriamente y ex-ante, la muestra en K subconjuntos (normalmente, 5 o 10)

  • Un subconjunto se usa como prueba y el K-1 restantes como entrenamiento

  • Se repite el proceso durante k iteraciones, con cada posible subconjunto de datos de prueba.

  • Se obtiene una métrica de error en cada iteración

  • Se promedian para obtener un único resultado de evaluación