Moindres carrés partiels dans R (étape par étape)
L’un des problèmes les plus courants que vous rencontrerez en apprentissage automatique est la multicolinéarité . Cela se produit lorsque deux variables prédictives ou plus dans un ensemble de données sont fortement corrélées.
Lorsque cela se produit, un modèle peut être capable de bien s’adapter à un ensemble de données d’entraînement, mais il peut avoir des performances médiocres sur un nouvel ensemble de données qu’il n’a jamais vu, car il surajuste l’ensemble d’entraînement.
Une façon de contourner ce problème consiste à utiliser une méthode appelée moindres carrés partiels , qui fonctionne comme suit :
- Standardisez les variables prédictives et de réponse.
- Calculez M combinaisons linéaires (appelées « composantes PLS ») des p variables prédictives d’origine qui expliquent une quantité significative de variation à la fois de la variable de réponse et des variables prédictives.
- Utilisez la méthode des moindres carrés pour ajuster un modèle de régression linéaire en utilisant les composants PLS comme prédicteurs.
- Utilisez la validation croisée k-fold pour trouver le nombre optimal de composants PLS à conserver dans le modèle.
Ce didacticiel fournit un exemple étape par étape de la façon d’effectuer des moindres carrés partiels dans R.
Étape 1 : Charger les packages nécessaires
Le moyen le plus simple d’effectuer des moindres carrés partiels dans R consiste à utiliser les fonctions du package pls .
#install pls package (if not already installed) install.packages("pls") load pls package library(pls)
Étape 2 : Ajuster le modèle des moindres carrés partiels
Pour cet exemple, nous utiliserons l’ensemble de données R intégré appelé mtcars qui contient des données sur différents types de voitures :
#view first six rows of mtcars dataset
head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
Pour cet exemple, nous allons ajuster un modèle des moindres carrés partiels (PLS) en utilisant hp comme variable de réponse et les variables suivantes comme variables prédictives :
- mpg
- afficher
- merde
- poids
- qsec
Le code suivant montre comment adapter le modèle PLS à ces données. Notez les arguments suivants :
- scale=TRUE : Cela indique à R que chacune des variables de l’ensemble de données doit être mise à l’échelle pour avoir une moyenne de 0 et un écart type de 1. Cela garantit qu’aucune variable prédictive n’a trop d’influence dans le modèle si elle est mesurée dans différentes unités.
- validation=”CV” : Cela indique à R d’utiliser la validation croisée k-fold pour évaluer les performances du modèle. Notez que cela utilise k=10 plis par défaut. Notez également que vous pouvez spécifier « LOOCV » à la place pour effectuer une validation croisée Leave-One-Out .
#make this example reproducible set.seed(1) #fit PCR model model <- plsr(hp~mpg+disp+drat+wt+qsec, data=mtcars, scale=TRUE, validation="CV")
Étape 3 : Choisissez le nombre de composants PLS
Une fois que nous avons ajusté le modèle, nous devons déterminer le nombre de composants PLS à conserver.
Pour ce faire, il suffit d’examiner l’erreur quadratique moyenne du test (RMSE de test) calculée par la validation croisée k :
#view summary of model fitting
summary(model)
Data: X dimension: 32 5
Y dimension: 32 1
Fit method: kernelpls
Number of components considered: 5
VALIDATION: RMSEP
Cross-validated using 10 random segments.
(Intercept) 1 comps 2 comps 3 comps 4 comps 5 comps
CV 69.66 40.57 35.48 36.22 36.74 36.67
adjCV 69.66 40.41 35.12 35.80 36.27 36.20
TRAINING: % variance explained
1 comps 2 comps 3 comps 4 comps 5 comps
X 68.66 89.27 95.82 97.94 100.00
hp 71.84 81.74 82.00 82.02 82.03
Il y a deux tableaux intéressants dans le résultat :
1. VALIDATION : RMSEP
Ce tableau nous indique le test RMSE calculé par la validation croisée k-fold. Nous pouvons voir ce qui suit :
- Si nous utilisons uniquement le terme d’origine dans le modèle, le RMSE du test est de 69,66 .
- Si l’on ajoute la première composante PLS, le test RMSE tombe à 40,57.
- Si l’on ajoute la deuxième composante PLS, le test RMSE tombe à 35,48.
Nous pouvons voir que l’ajout de composants PLS supplémentaires entraîne en réalité une augmentation du RMSE du test. Ainsi, il semble qu’il serait optimal de n’utiliser que deux composants PLS dans le modèle final.
2. FORMATION : % d’écart expliqué
Ce tableau nous indique le pourcentage de variance de la variable de réponse expliquée par les composantes PLS. Nous pouvons voir ce qui suit :
- En utilisant uniquement la première composante PLS, nous pouvons expliquer 68,66 % de la variation de la variable de réponse.
- En ajoutant la deuxième composante PLS, nous pouvons expliquer 89,27 % de la variation de la variable de réponse.
Notez que nous serons toujours en mesure d’expliquer plus de variance en utilisant plus de composants PLS, mais nous pouvons voir que l’ajout de plus de deux composants PLS n’augmente pas réellement le pourcentage de variance expliquée de beaucoup.
Nous pouvons également visualiser le test RMSE (avec le test MSE et R-squared) en fonction du nombre de composants PLS en utilisant la fonction validationplot() .
#visualize cross-validation plots validationplot(model) validationplot(model, val.type="MSEP") validationplot(model, val.type="R2")
Dans chaque graphique, nous pouvons voir que l’ajustement du modèle s’améliore en ajoutant deux composants PLS, mais il a tendance à se détériorer lorsque nous ajoutons plus de composants PLS.
Ainsi, le modèle optimal inclut uniquement les deux premières composantes PLS.
Étape 4 : Utiliser le modèle final pour faire des prédictions
Nous pouvons utiliser le modèle final avec deux composants PLS pour faire des prédictions sur de nouvelles observations.
Le code suivant montre comment diviser l’ensemble de données d’origine en un ensemble de formation et de test et utiliser le modèle final avec deux composants PLS pour faire des prédictions sur l’ensemble de test.
#define training and testing sets train <- mtcars[1:25, c("hp", "mpg", "disp", "drat", "wt", "qsec")] y_test <- mtcars[26:nrow(mtcars), c("hp")] test <- mtcars[26:nrow(mtcars), c("mpg", "disp", "drat", "wt", "qsec")] #use model to make predictions on a test set model <- plsr(hp~mpg+disp+drat+wt+qsec, data=train, scale=TRUE, validation="CV") pcr_pred <- predict(model, test, ncomp=2) #calculate RMSE sqrt(mean((pcr_pred - y_test)^2)) [1] 54.89609
On voit que le RMSE du test s’avère être 54.89609 . Il s’agit de l’écart moyen entre la valeur prédite de hp et la valeur observée de hp pour les observations de l’ensemble de tests.
Notez qu’un modèle de régression en composantes principales équivalent avec deux composantes principales a produit un RMSE de test de 56,86549 . Ainsi, le modèle PLS a légèrement surpassé le modèle PCR pour cet ensemble de données.
L’utilisation complète du code R dans cet exemple peut être trouvée ici .