Квадратичный дискриминантный анализ — это метод, который вы можете использовать, когда у вас есть набор переменных-предикторов, и вы хотите классифицировать переменную ответа по двум или более классам. Он считается нелинейным эквивалентом линейного дискриминантного анализа .
В этом руководстве представлен пошаговый пример выполнения квадратичного дискриминантного анализа в R.
Шаг 1: Загрузите необходимые библиотеки
Во-первых, мы загрузим необходимые библиотеки для этого примера:
library (MASS)
library (ggplot2)
Шаг 2: Загрузите данные
В этом примере мы будем использовать встроенный набор данных iris в R. Следующий код показывает, как загрузить и просмотреть этот набор данных:
#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 ...
Мы видим, что набор данных содержит 5 переменных и 150 общих наблюдений.
В этом примере мы построим модель квадратичного дискриминантного анализа, чтобы классифицировать, к какому виду принадлежит данный цветок.
Мы будем использовать следующие переменные-предикторы в модели:
- Длина чашелистика
- Сепал.Ширина
- Лепесток.Длина
- Лепесток.Ширина
И мы будем использовать их для прогнозирования переменной отклика Species , которая принимает следующие три потенциальных класса:
- сетоза
- лишай
- виргиния
Шаг 3. Создайте обучающую и тестовую выборки
Затем мы разделим набор данных на обучающий набор для обучения модели и тестовый набор для проверки модели:
#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, ]
Шаг 4: Соответствуйте модели QDA
Далее мы воспользуемся функцией qda() из пакета MASS , чтобы подогнать модель QDA к нашим данным:
#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
Вот как интерпретировать вывод модели:
Априорные вероятности группы: они представляют пропорции каждого вида в обучающей выборке. Например, 35,8% всех наблюдений в обучающей выборке относились к видам virginica .
Групповые средние: они отображают средние значения для каждой предикторной переменной для каждого вида.
Шаг 5: Используйте модель для прогнозирования
После того, как мы подогнали модель, используя наши обучающие данные, мы можем использовать ее для прогнозирования наших тестовых данных:
#use QDA model to make predictions on test data
predicted <- predict (model, test)
names(predicted)
[1] "class" "posterior" "x"
Это возвращает список с двумя переменными:
- класс: предсказанный класс
- апостериорная: апостериорная вероятность того, что наблюдение принадлежит каждому классу
Мы можем быстро просмотреть каждый из этих результатов для первых шести наблюдений в нашем тестовом наборе данных:
#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
Шаг 6: Оцените модель
Мы можем использовать следующий код, чтобы увидеть, для какого процента наблюдений модель QDA правильно предсказала виды:
#find accuracy of model
mean(predicted$class==test$Species)
[1] 1
Оказывается, модель правильно предсказала виды для 100% наблюдений в нашем тестовом наборе данных.
В реальном мире модель QDA редко будет правильно предсказывать результат каждого класса, но этот набор данных радужной оболочки просто построен таким образом, что алгоритмы машинного обучения, как правило, работают с ним очень хорошо.
Вы можете найти полный код R, использованный в этом руководстве , здесь .