ML1/ML1_04_validation_croisee.R

26 lines
1.3 KiB
R

# Séparer le jeu de données en un jeu d'entraînement et un jeu de validation.
# INPUT : jeu de données initial et proportion des données conservées pour
# l'entraînement.
xvalpart <- function(data,p) {
n <- nrow(data$X)
nentr <- round(p*n)
entridx <- sample(1:n, nentr, replace=FALSE)
list(entr = list(X = data$X[entridx,,drop=FALSE], Y = data$Y[entridx]),
valid = list(X = data$X[-entridx,,drop=FALSE], Y = data$Y[-entridx]))
}
# Découper le jeu de données initial en entraînement et validation.
# Pour chaque valeur proposée de l'hyperparamètre alpha d'une régression ridge,
# apprendre un modèle sur le jeu d'entraînement.
# Retourner les coefficients du meilleur modèle avec la moyenne de la valeur
# absolue des erreurs commises par ce modèle sur le jeu de validation.
# La fonction ridge est défini dans le code source de la partie 3.
xvalridge <- function(alphas, data, degre, p) {
tmp <- xvalpart(data,p)
lcoef <- sapply(alphas, ridge, tmp$entr, degre)
pred <- sapply(split(lcoef,col(lcoef)), polyeval, tmp$valid$X)
meanabserrs <- colMeans(abs(pred - tmp$valid$Y))
minmeanabserr <- min(meanabserrs)
minidx <- which(meanabserrs == minmeanabserr)
list(meanabserr = minmeanabserr, coef = lcoef[,minidx], alpha = alphas[minidx])
}