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:

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))

Lineaire discriminantanalyse in R

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

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert