Kwadratische discriminantanalyse in r (stap voor stap)
Kwadratische discriminantanalyse is een methode die u kunt gebruiken als u over een reeks voorspellende variabelen beschikt en u een responsvariabele in twee of meer klassen wilt indelen. Het wordt beschouwd als het niet-lineaire equivalent van lineaire discriminantanalyse .
Deze tutorial biedt een stapsgewijs voorbeeld van het uitvoeren van kwadratische 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 kwadratisch discriminantanalysemodel bouwen om de soort te classificeren waartoe 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: 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 4: Pas het QDA-model aan
Vervolgens zullen we de functie qda() uit het MASS- pakket gebruiken om het QDA-model aan onze gegevens aan te passen:
#fit QDA model model <- qda(Species~., data=train) #view model output model Call: qda(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 4.982353 3.411765 1.482353 0.2411765 versicolor 5.994118 2.794118 4.358824 1.3676471 virginica 6.636842 2.973684 5.592105 2.0552632
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.
Stap 5: 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 QDA model to make predictions on test data predicted <- predict (model, test) names(predicted) [1] "class" "posterior" "x"
Dit retourneert een lijst met twee variabelen:
- klasse: de voorspelde klasse
- posterior: De posterieure waarschijnlijkheid dat een waarneming tot elke klasse behoort
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 7.224770e-20 1.642236e-29 6 1 6.209196e-26 8.550911e-38 7 1 1.248337e-21 8.132700e-32 15 1 2.319705e-35 5.094803e-50 17 1 1.396840e-29 9.586504e-43 18 1 7.581165e-25 8.611321e-37
Stap 6: Evalueer het model
We kunnen de volgende code gebruiken om te zien voor welk percentage waarnemingen het QDA-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 QDA-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.
De volledige R-code die in deze tutorial wordt gebruikt, vindt u hier .