Gedeeltelijke kleinste kwadraten in r (stap voor stap)
Een van de meest voorkomende problemen die u tegenkomt bij machinaal leren is multicollineariteit . Dit gebeurt wanneer twee of meer voorspellende variabelen in een dataset sterk gecorreleerd zijn.
Wanneer dit gebeurt, kan een model mogelijk goed in een trainingsdataset passen, maar kan het slecht presteren op een nieuwe dataset die het nog nooit heeft gezien, omdat het de trainingsdataset te veel aanpast . trainingsset.
Eén manier om dit probleem te omzeilen is door een methode te gebruiken die partiële kleinste kwadraten wordt genoemd en die als volgt werkt:
- Standaardiseer voorspellende en responsvariabelen.
- Bereken M lineaire combinaties („PLS-componenten“ genoemd) van de p oorspronkelijke voorspellende variabelen die een aanzienlijke hoeveelheid variatie in zowel de responsvariabele als de voorspellende variabelen verklaren.
- Gebruik de kleinste kwadratenmethode om een lineair regressiemodel te fitten met behulp van de PLS-componenten als voorspellers.
- Gebruik k-voudige kruisvalidatie om het optimale aantal PLS-componenten te vinden dat u in het model kunt behouden.
Deze tutorial biedt een stapsgewijs voorbeeld van hoe u gedeeltelijke kleinste kwadraten in R kunt uitvoeren.
Stap 1: Laad de benodigde pakketten
De eenvoudigste manier om gedeeltelijke kleinste kwadraten in R uit te voeren, is door functies in het pls- pakket te gebruiken.
#install pls package (if not already installed) install.packages(" pls ") load pls package library(pls)
Stap 2: Pas het gedeeltelijke kleinste kwadratenmodel aan
Voor dit voorbeeld gebruiken we de ingebouwde R-dataset genaamd mtcars , die gegevens over verschillende soorten auto’s bevat:
#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
Voor dit voorbeeld passen we een Partial Least Squares (PLS)-model toe, waarbij hp als responsvariabele wordt gebruikt en de volgende variabelen als voorspellende variabelen:
- mpg
- weergave
- shit
- gewicht
- qsec
De volgende code laat zien hoe u het PLS-model aan deze gegevens kunt aanpassen. Let op de volgende argumenten:
- scale=TRUE : Dit vertelt R dat elk van de variabelen in de dataset moet worden geschaald om een gemiddelde van 0 en een standaarddeviatie van 1 te hebben. Dit zorgt ervoor dat geen enkele voorspellende variabele teveel invloed heeft in het model als deze in verschillende eenheden wordt gemeten.
- validation=”CV” : Dit vertelt R om k-voudige kruisvalidatie te gebruiken om de modelprestaties te evalueren. Merk op dat hierbij standaard k=10 vouwen worden gebruikt. Houd er ook rekening mee dat u in plaats daarvan „LOOCV“ kunt opgeven om Leave-One-Out-kruisvalidatie uit te voeren.
#make this example reproducible set.seed(1) #fit PCR model model <- plsr(hp~mpg+disp+drat+wt+qsec, data=mtcars, scale= TRUE , validation=" CV ")
Stap 3: Kies het aantal PLS-componenten
Nadat we het model hebben gemonteerd, moeten we bepalen hoeveel PLS-componenten we moeten behouden.
Om dit te doen, hoeft u alleen maar naar de testroot mean square error (test RMSE) te kijken, berekend door k-cross-validatie:
#view summary of model fitting
summary(model)
Data:
Y dimension: 32 1
Fit method: kernelpls
Number of components considered: 5
VALIDATION: RMSEP
Cross-validated using 10 random segments.
(Intercept) 1 comp 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 comp 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
Er zijn twee interessante tabellen in het resultaat:
1. VALIDATIE: RMSEP
Deze tabel vertelt ons de RMSE-test berekend door k-voudige kruisvalidatie. We kunnen het volgende zien:
- Als we alleen de originele term in het model gebruiken, is de RMSE van de test 69.66 .
- Als we de eerste PLS-component toevoegen, daalt de RMSE-test naar 40,57.
- Als we de tweede PLS-component toevoegen, daalt de RMSE-test naar 35,48.
We kunnen zien dat het toevoegen van extra PLS-componenten daadwerkelijk resulteert in een toename van de RMSE van de test. Het lijkt er dus op dat het optimaal zou zijn om slechts twee PLS-componenten in het uiteindelijke model te gebruiken.
2. TRAINING: % variantie uitgelegd
Deze tabel vertelt ons het percentage variantie in de responsvariabele, verklaard door de PLS-componenten. We kunnen het volgende zien:
- Met alleen de eerste PLS-component kunnen we 68,66% van de variatie in de responsvariabele verklaren.
- Door de tweede PLS-component toe te voegen, kunnen we 89,27% van de variatie in de responsvariabele verklaren.
Merk op dat we nog steeds meer variantie kunnen verklaren door meer PLS-componenten te gebruiken, maar we kunnen zien dat het toevoegen van meer dan twee PLS-componenten het verklaarde percentage variantie niet veel verhoogt.
We kunnen de RMSE-test (samen met de MSE- en R-kwadraattest) ook visualiseren als een functie van het aantal PLS-componenten met behulp van de validatieplot()- functie.
#visualize cross-validation plots validationplot(model) validationplot(model, val.type=" MSEP ") validationplot(model, val.type=" R2 ")



In elke grafiek kunnen we zien dat de pasvorm van het model verbetert door twee PLS-componenten toe te voegen, maar dat deze de neiging heeft te verslechteren wanneer we meer PLS-componenten toevoegen.
Het optimale model omvat dus alleen de eerste twee PLS-componenten.
Stap 4: Gebruik het definitieve model om voorspellingen te doen
We kunnen het uiteindelijke model met twee PLS-componenten gebruiken om voorspellingen te doen over nieuwe waarnemingen.
De volgende code laat zien hoe u de oorspronkelijke gegevensset kunt opsplitsen in een trainings- en testset en hoe u het uiteindelijke model met twee PLS-componenten kunt gebruiken om voorspellingen te doen over de testset.
#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
We zien dat de RMSE van de test 54.89609 blijkt te zijn. Dit is de gemiddelde afwijking tussen de voorspelde pk- waarde en de waargenomen pk- waarde voor de waarnemingen van de testset.
Merk op dat een equivalent regressiemodel voor hoofdcomponenten met twee hoofdcomponenten een test-RMSE van 56,86549 opleverde. Het PLS-model presteerde dus iets beter dan het PCR-model voor deze dataset.
Het volledige gebruik van de R-code in dit voorbeeld vindt u hier .