Gedeeltelijke kleinste kwadraten in python (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 Python kunt uitvoeren.
Stap 1: Importeer de benodigde pakketten
Eerst importeren we de pakketten die nodig zijn om gedeeltelijke kleinste kwadraten in Python uit te voeren:
import numpy as np
import pandas as pd
import matplotlib. pyplot as plt
from sklearn. preprocessing import scale
from sklearn import model_selection
from sklearn. model_selection import RepeatedKFold
from sklearn. model_selection import train_test_split
from sklearn. cross_decomposition import PLSRegression
from sklearn . metrics import mean_squared_error
Stap 2: Gegevens laden
Voor dit voorbeeld gebruiken we een dataset met de naam mtcars , die informatie bevat over 33 verschillende auto’s. We zullen hp gebruiken als de responsvariabele en de volgende variabelen als voorspellers:
- mpg
- weergave
- shit
- gewicht
- qsec
De volgende code laat zien hoe u deze gegevensset laadt en weergeeft:
#define URL where data is located
url = "https://raw.githubusercontent.com/Statorials/Python-Guides/main/mtcars.csv"
#read in data
data_full = pd. read_csv (url)
#select subset of data
data = data_full[["mpg", "disp", "drat", "wt", "qsec", "hp"]]
#view first six rows of data
data[0:6]
mpg disp drat wt qsec hp
0 21.0 160.0 3.90 2.620 16.46 110
1 21.0 160.0 3.90 2.875 17.02 110
2 22.8 108.0 3.85 2.320 18.61 93
3 21.4 258.0 3.08 3.215 19.44 110
4 18.7 360.0 3.15 3.440 17.02 175
5 18.1 225.0 2.76 3.460 20.22 105
Stap 3: Pas het gedeeltelijke kleinste kwadratenmodel aan
De volgende code laat zien hoe u het PLS-model aan deze gegevens kunt aanpassen.
Merk op dat cv = RepeatedKFold() Python vertelt om k-voudige kruisvalidatie te gebruiken om de modelprestaties te evalueren. Voor dit voorbeeld kiezen we k = 10 vouwen, 3 keer herhaald.
#define predictor and response variables
X = data[["mpg", "disp", "drat", "wt", "qsec"]]
y = data[["hp"]]
#define cross-validation method
cv = RepeatedKFold(n_splits= 10 , n_repeats= 3 , random_state= 1 )
mse = []
n = len (X)
# Calculate MSE with only the intercept
score = -1*model_selection. cross_val_score (PLSRegression(n_components=1),
n.p. ones ((n,1)), y, cv=cv, scoring=' neg_mean_squared_error '). mean ()
mse. append (score)
# Calculate MSE using cross-validation, adding one component at a time
for i in np. arange (1, 6):
pls = PLSRegression(n_components=i)
score = -1*model_selection. cross_val_score (pls, scale(X), y, cv=cv,
scoring=' neg_mean_squared_error '). mean ()
mse. append (score)
#plot test MSE vs. number of components
plt. plot (mse)
plt. xlabel (' Number of PLS Components ')
plt. ylabel (' MSE ')
plt. title (' hp ')
De grafiek toont het aantal PLS-componenten langs de x-as en de MSE-test (mean square error) langs de y-as.
Uit de grafiek kunnen we zien dat de MSE van de test afneemt door twee PLS-componenten toe te voegen, maar begint te stijgen naarmate we meer dan twee 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 PLS-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 PLS-model met twee PLS-componenten kunt gebruiken om voorspellingen te doen over de testset.
#split the dataset into training (70%) and testing (30%) sets
X_train , _
#calculate RMSE
pls = PLSRegression(n_components=2)
pls. fit (scale(X_train), y_train)
n.p. sqrt (mean_squared_error(y_test, pls. predict (scale(X_test))))
29.9094
We zien dat de RMSE van de test 29,9094 blijkt te zijn. Dit is de gemiddelde afwijking tussen de voorspelde pk- waarde en de waargenomen pk- waarde voor de waarnemingen van de testset.
De volledige Python-code die in dit voorbeeld wordt gebruikt, vindt u hier .
