1 Introducción

El problema es que el modelo se ajusta muy bien a los datos que hemos utilizado para estimarlo, luego es razonable pensar que va a predecir bien dichos datos. Pero en la práctica, queremos el modelo para predecir datos que no conocemos. El objetivo es analizar la predicción del modelo frente a datos no conocidos.

2 El método del subconjunto de validación (validation set approach)

  • Dividimos en dos partes los datos (50%-50%, 40%-60%,…).
  • En el training set estimamos el modelo.
  • En el test set (validation set) predecimos la respuesta y calculamos el Mean Squared Error (MSE) entre la variable respuesta observada y la predicha.

\[ MSE = \frac{1}{n}\sum _{i=1}^{n}{(y_i - \hat y_i)^2} \]

## 'data.frame':    200 obs. of  5 variables:
##  $ X        : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ TV       : num  230.1 44.5 17.2 151.5 180.8 ...
##  $ radio    : num  37.8 39.3 45.9 41.3 10.8 48.9 32.8 19.6 2.1 2.6 ...
##  $ newspaper: num  69.2 45.1 69.3 58.5 58.4 75 23.5 11.6 1 21.2 ...
##  $ sales    : num  22.1 10.4 9.3 18.5 12.9 7.2 11.8 13.2 4.8 10.6 ...
  • Dividimos los datos en training set y test set. En general, el training test ha de ser mayor o igual que el test set:

  • En el training set estimamos el modelo:
  • Para calcular el MSE se puede utilizar la función (descargar):
## function (y, yp) 
## {
##     y = as.numeric(y)
##     yp = as.numeric(yp)
##     n = length(y)
##     d = (y - yp)^2
##     suma = sum(d)
##     MSE = 1/n * suma
##     return(MSE)
## }
## [1] 10.62459
  • Error en el test set:
## [1] 10.38168

Problemas:

  • El MSE cambia en función de como se elija el training set y el validation set.

  • Sólo se incluye una parte de los datos para estimar el modelo, por lo que la estimación es peor que incluyéndolos a todos.

3 Validación cruzada ( k-fold Cross-Validation)

Se divide aleatoriamente los datos en k partes (o folds). Cada parte tiene n1 = n/k datos.

  • Para i = 1:k
    • la parte i constituye el test set.
    • las otras partes constituyen el train set.
    • se calcula el MSE(i)
  • El error total es:

\[ MSE_{TOTAL} = \frac{1}{k} \sum _{i=1}^k MSE_i \]

  • Se ha programado una funcion que calcula las posiciones de train y test dado el numero de folds (descargar):
## function (num_datos, num_folds) 
## {
##     n1 = trunc(num_datos/num_folds)
##     v = sample(1:num_datos, num_datos, replace = F)
##     train = list()
##     test = list()
##     for (k in 1:(num_folds - 1)) {
##         pos_test = ((k - 1) * n1 + 1):(k * n1)
##         test[[k]] = v[pos_test]
##         train[[k]] = v[-pos_test]
##     }
##     pos_test = ((num_folds - 1) * n1 + 1):num_datos
##     test[[num_folds]] = v[pos_test]
##     train[[num_folds]] = v[-pos_test]
##     return(list(train = train, test = test))
## }

Por ejemplo, supongamos que tenemos 10 datos y definimos 3 folds:

## $train
## $train[[1]]
## [1] 7 4 1 9 8 6 3
## 
## $train[[2]]
## [1] 10  5  2  9  8  6  3
## 
## $train[[3]]
## [1] 10  5  2  7  4  1
## 
## 
## $test
## $test[[1]]
## [1] 10  5  2
## 
## $test[[2]]
## [1] 7 4 1
## 
## $test[[3]]
## [1] 9 8 6 3

Con los dados del ejemplo:

## [1] 11.03013