Lineaire discriminantanalyse in r (stap voor stap)
Lineaire discriminantanalyse is een methode die u kunt gebruiken als u over een reeks voorspellende variabelen beschikt en een responsvariabele in twee of meer klassen wilt indelen.
Deze tutorial biedt een stapsgewijs voorbeeld van het uitvoeren van lineaire discriminantanalyse in R.
Stap 1: Laad de benodigde bibliotheken
Eerst laden we de benodigde bibliotheken voor dit voorbeeld:
library (MASS)
library (ggplot2)
Stap 2: Gegevens laden
Voor dit voorbeeld gebruiken we de irisgegevensset die in R is ingebouwd. De volgende code laat zien hoe u deze gegevensset laadt en weergeeft:
#attach iris dataset to make it easy to work with attach(iris) #view structure of dataset str(iris) 'data.frame': 150 obs. of 5 variables: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... $ Sepal.Width: num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... $Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... $Petal.Width: num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... $ Species: Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 ...
We kunnen zien dat de dataset in totaal 5 variabelen en 150 observaties bevat.
Voor dit voorbeeld zullen we een lineair discriminantanalysemodel bouwen om te classificeren tot welke soort een bepaalde bloem behoort.
We zullen de volgende voorspellende variabelen in het model gebruiken:
- Kelkbladlengte
- Kelkbladbreedte
- Bloemblaadje. Lengte
- Bloemblaadje.Breedte
En we zullen ze gebruiken om de responsvariabele Species te voorspellen, die de volgende drie potentiële klassen ondersteunt:
- setosa
- veelkleurig
- Virginia
Stap 3: Schaal de gegevens
Een van de belangrijkste aannames van lineaire discriminantanalyse is dat elk van de voorspellende variabelen dezelfde variantie heeft. Een eenvoudige manier om ervoor te zorgen dat aan deze veronderstelling wordt voldaan, is door elke variabele zo te schalen dat deze een gemiddelde van 0 en een standaarddeviatie van 1 heeft.
We kunnen dit snel doen in R met behulp van de scale() functie:
#scale each predictor variable (ie first 4 columns)
iris[1:4] <- scale(iris[1:4])
We kunnen de functie apply() gebruiken om te verifiëren dat elke voorspellende variabele nu een gemiddelde van 0 en een standaarddeviatie van 1 heeft:
#find mean of each predictor variable apply(iris[1:4], 2, mean) Sepal.Length Sepal.Width Petal.Length Petal.Width -4.484318e-16 2.034094e-16 -2.895326e-17 -3.663049e-17 #find standard deviation of each predictor variable apply(iris[1:4], 2, sd) Sepal.Length Sepal.Width Petal.Length Petal.Width 1 1 1 1
Stap 4: Maak trainings- en testvoorbeelden
Vervolgens splitsen we de dataset op in een trainingsset om het model op te trainen en een testset om het model op te testen:
#make this example reproducible set.seed(1) #Use 70% of dataset as training set and remaining 30% as testing set sample <- sample(c( TRUE , FALSE ), nrow (iris), replace = TRUE , prob =c(0.7,0.3)) train <- iris[sample, ] test <- iris[!sample, ]
Stap 5: Pas het LDA-model aan
Vervolgens zullen we de functie lda() uit het MASS- pakket gebruiken om het LDA-model aan onze gegevens aan te passen:
#fit LDA model model <- lda(Species~., data=train) #view model output model Call: lda(Species ~ ., data = train) Prior probabilities of groups: setosa versicolor virginica 0.3207547 0.3207547 0.3584906 Group means: Sepal.Length Sepal.Width Petal.Length Petal.Width setosa -1.0397484 0.8131654 -1.2891006 -1.2570316 versicolor 0.1820921 -0.6038909 0.3403524 0.2208153 virginica 0.9582674 -0.1919146 1.0389776 1.1229172 Coefficients of linear discriminants: LD1 LD2 Sepal.Length 0.7922820 0.5294210 Sepal.Width 0.5710586 0.7130743 Petal.Length -4.0762061 -2.7305131 Petal.Width -2.0602181 2.6326229 Proportion of traces: LD1 LD2 0.9921 0.0079
Zo interpreteert u de modelresultaten:
Groepsvoorafgaande kansen: deze vertegenwoordigen de verhoudingen van elke soort in de trainingsset. Zo had 35,8% van alle waarnemingen in de trainingsset betrekking op de soort virginica .
Groepsgemiddelden: deze geven de gemiddelde waarden weer van elke voorspellende variabele voor elke soort.
Lineaire discriminantcoëfficiënten: deze geven de lineaire combinatie van voorspellende variabelen weer die worden gebruikt om de beslissingsregel van het LDA-model te trainen. Bijvoorbeeld:
- LD1: 0,792 * kelkbladlengte + 0,571 * kelkbladbreedte – 4,076 * bloembladlengte – 2,06 * bloembladbreedte
- LD2: 0,529 * kelkbladlengte + 0,713 * kelkbladbreedte – 2,731 * bloembladlengte + 2,63 * bloembladbreedte
Traceeraandeel: Deze geven het scheidingspercentage weer dat door elke lineaire discriminantfunctie wordt bereikt.
Stap 6: Gebruik het model om voorspellingen te doen
Zodra we het model hebben aangepast met behulp van onze trainingsgegevens, kunnen we het gebruiken om voorspellingen te doen op basis van onze testgegevens:
#use LDA model to make predictions on test data predicted <- predict (model, test) names(predicted) [1] "class" "posterior" "x"
Dit retourneert een lijst met drie variabelen:
- klasse: de voorspelde klasse
- posterior: De posterieure waarschijnlijkheid dat een waarneming tot elke klasse behoort
- x: lineaire discriminanten
We kunnen elk van deze resultaten snel visualiseren voor de eerste zes waarnemingen in onze testdataset:
#view predicted class for first six observations in test set head(predicted$class) [1] setosa setosa setosa setosa setosa setosa Levels: setosa versicolor virginica #view posterior probabilities for first six observations in test set head(predicted$posterior) setosa versicolor virginica 4 1 2.425563e-17 1.341984e-35 6 1 1.400976e-21 4.482684e-40 7 1 3.345770e-19 1.511748e-37 15 1 6.389105e-31 7.361660e-53 17 1 1.193282e-25 2.238696e-45 18 1 6.445594e-22 4.894053e-41 #view linear discriminants for first six observations in test set head(predicted$x) LD1 LD2 4 7.150360 -0.7177382 6 7.961538 1.4839408 7 7.504033 0.2731178 15 10.170378 1.9859027 17 8.885168 2.1026494 18 8.113443 0.7563902
We kunnen de volgende code gebruiken om te zien voor welk percentage waarnemingen het LDA-model de soort correct voorspelde:
#find accuracy of model
mean(predicted$class==test$Species)
[1] 1
Het blijkt dat het model de soort correct voorspelde voor 100% van de waarnemingen in onze testdataset.
In de echte wereld voorspelt een LDA-model zelden correct de resultaten van elke klasse, maar deze iris-dataset is eenvoudigweg zo opgebouwd dat machine learning-algoritmen de neiging hebben zeer goed te presteren.
Stap 7: Visualiseer de resultaten
Ten slotte kunnen we een LDA-plot maken om de lineaire discriminanten van het model te visualiseren en te visualiseren hoe goed het de drie verschillende soorten in onze dataset van elkaar scheidt:
#define data to plot lda_plot <- cbind(train, predict(model)$x) #createplot ggplot(lda_plot, aes (LD1, LD2)) + geom_point( aes (color=Species))

De volledige R-code die in deze tutorial wordt gebruikt, vindt u hier .