PCA et validation croisée en k dans le package caret en R

16

Je viens de revoir une conférence du cours Machine Learning sur Coursera. Dans la section où le professeur discute de l'ACP pour le prétraitement des données dans les applications d'apprentissage supervisé, il dit que l'ACP ne devrait être effectuée que sur les données de formation, puis la cartographie est utilisée pour transformer la validation croisée et les ensembles de tests. Voir aussi PCA et la division train / test .

Cependant, dans le caretpackage R, les données de formation que vous transmettez à la train()fonction sont déjà traitées par PCA. Ainsi , lorsque les préformes de l' algorithme k fois la validation croisée, le jeu de validation croisée a déjà été traitée avec APC via preProcess()et predict()et est en fait utilisé dans le PCA « raccord ».

Ma compréhension de la situation est-elle correcte? C'est-à-dire que la procédure de Caret pour la validation croisée avec l'ACP (ou en fait, avec toute méthode de redimensionnement / centrage) est "incorrecte" car le prétraitement des données est effectué sur l'ensemble de validation croisée ainsi que sur l'ensemble de formation? Et si oui, quel impact cela aurait-il sur les résultats?

mchangun
la source
1
Question interessante. Le professeur Ng explique-t-il pourquoi "l'ACP ne devrait être effectuée que sur les données de formation, puis la cartographie est utilisée pour transformer la validation croisée et les ensembles de tests"? Mon intuition est que l'impact devrait être minimal, car les données de train / cv / test sont supposées provenir de la même distribution, et PCA n'implique pas la ou les variables de sortie / dépendantes.
miura
1
@miura Oui, il le fait. Lors de l'exécution de l'ACP, nous devons résoudre le nombre minimal de dimensions k dans les vecteurs de sortie nécessaires pour obtenir la "variance retenue" souhaitée. Ce paramètre k est maintenant en vigueur (à ma connaissance) un paramètre supplémentaire de notre algorithme que nous devons ajuster. Si nous effectuons également l'ACP sur l'ensemble de validation croisée, nous formons en fait une partie de notre algorithme sur l'ensemble de CV, diminuant ainsi la valeur de la validation croisée.
mchangun
Je pense que vous confondez PCA et MDS, mais dans les deux méthodes, vous ne définissez pas la variance souhaitée. Mais vous pouvez le calculer à partir des ajustements qu'ils apportent pour réduire à k dimensions. Vous n'avez pas besoin de l'adapter car la première dimension réduira toujours plus de variance que la seconde, et la seconde plus que la troisième ...
llrs

Réponses:

18

Je n'ai pas vu la conférence, je ne peux donc pas commenter ce qui a été dit.

Mon 0,02 $: Si vous souhaitez obtenir de bonnes estimations des performances à l'aide du rééchantillonnage, vous devez vraiment effectuer toutes les opérations pendant le rééchantillonnage au lieu de la précédente. Cela est vraiment vrai pour la sélection des fonctionnalités [1] ainsi que pour les opérations non triviales comme PCA. S'il ajoute de l'incertitude aux résultats, incluez-le dans le rééchantillonnage.

Pensez à la régression des principaux composants: l'ACP suivie d'une régression linéaire sur certains des composants. L'ACP estime les paramètres (avec bruit) et le nombre de composants doit également être choisi (des valeurs différentes donneront des résultats différents => plus de bruit).

Disons que nous avons utilisé un CV 10 fois avec le schéma 1:

conduct PCA
pick the number of components
for each fold:
   split data
   fit linear regression on the 90% used for training
   predict the 10% held out
end:

ou schéma 2:

for each fold:
   split data
   conduct PCA on the 90% used for training
   pick the number of components
   fit linear regression
   predict the 10% held out
end:

Il devrait être clair que la deuxième approche devrait produire des estimations d'erreur qui reflètent l'incertitude causée par l'ACP, la sélection du nombre de composants et la régression linéaire. En effet, le CV du premier schéma n'a aucune idée de ce qui l'a précédé.

Je suis coupable de ne pas toujours faire toutes les opérations avec rééchantillonnage, mais uniquement lorsque je ne me soucie pas vraiment des estimations de performances (ce qui est inhabituel).

Y a-t-il beaucoup de différence entre les deux régimes? Cela dépend des données et du prétraitement. Si vous ne faites que centrer et mettre à l'échelle, probablement pas. Si vous avez une tonne de données, probablement pas. À mesure que la taille de l'ensemble de formation diminue, le risque d'obtenir de mauvaises estimations augmente, surtout si n est proche de p.

Je peux affirmer avec certitude par expérience que le fait de ne pas inclure la sélection de fonctionnalités supervisée dans le rééchantillonnage est une très mauvaise idée (sans grands ensembles de formation). Je ne vois pas pourquoi le prétraitement serait immunisé contre cela (dans une certaine mesure).

@mchangun: Je pense que le nombre de composants est un paramètre de réglage et vous voudrez probablement le choisir à l'aide d'estimations de performances généralisables. Vous pouvez choisir automatiquement K de telle sorte qu'au moins X% de la variance soit expliquée et inclure ce processus dans le rééchantillonnage afin que nous tenions compte du bruit dans ce processus.

Max

[1] Ambroise, C. et McLachlan, G. (2002). Biais de sélection dans l'extraction de gènes sur la base de données d'expression génique de puces à ADN. Actes de l'Académie nationale des sciences, 99 (10), 6562–6566.

topepo
la source
21

Ne prétraitez pas les données avant d'exécuter la trainfonction! Utilisez l' preProcess argument de la fonction train et le prétraitement sera appliqué à chaque itération de rééchantillonnage.

par exemple, ne faites pas ceci:

library(caret)
dat <- iris
pp <- preProcess(dat[,-5], method="pca")
dat[,-5] <- predict(pp, dat[,-5])
knnFit1 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

fais ça!

dat <- iris
knnFit2 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))
Zach
la source
1
Si je fais le prétraitement comme vous le suggérez, dois-je prétraiter de nouvelles données lorsque je veux utiliser le modèle pour les prédictions? Pour le moment, je ne fais que: pred <- predict(knnFit2, newdata)newdatan'est pas mis à l'échelle. Caret est-il suffisamment intelligent pour savoir qu'il doit effectuer un prétraitement newdataavant de l'utiliser pour des prévisions?
mchangun
7
@mchangun no. caret enregistre les paramètres de prétraitement et pré-traitera les nouvelles données dans l'appel de prédire.caret. c'est assez lisse!
Zach