Задание 2. Выполнение классификации k-ближайших соседей с использованием функции knn() из пакета class на наборе данных iris [1]

library(class)
library(gmodels)

data(iris)

set.seed(123)

train_index <- unlist(
  lapply(
    split(seq_len(nrow(iris)), iris$Species),
    function(x) sample(x, floor(0.7 * length(x)))
  )
)

train <- iris[train_index, ]
test <- iris[-train_index, ]

train_x <- train[, 1:4]
test_x <- test[, 1:4]

train_mean <- sapply(train_x, mean)
train_sd <- sapply(train_x, sd)
train_sd[train_sd == 0] <- 1

train_scaled <- scale(
  train_x,
  center = train_mean,
  scale = train_sd
)

test_scaled <- scale(
  test_x,
  center = train_mean,
  scale = train_sd
)

set.seed(123)

knn_pred <- class::knn(
  train = train_scaled,
  test = test_scaled,
  cl = train$Species,
  k = 5
)

conf_matrix <- table(
  Фактический = test$Species,
  Предсказанный = knn_pred
)

conf_matrix
##             Предсказанный
## Фактический setosa versicolor virginica
##   setosa         15          0         0
##   versicolor      0         14         1
##   virginica       0          2        13
accuracy <- sum(diag(conf_matrix)) / sum(conf_matrix)

cat("Точность классификации KNN:",
    round(accuracy * 100, 2), "%\n")
## Точность классификации KNN: 93.33 %
gmodels::CrossTable(
  x = test$Species,
  y = knn_pred,
  prop.chisq = FALSE,
  prop.t = FALSE,
  prop.r = FALSE,
  prop.c = FALSE
)
## 
##  
##    Cell Contents
## |-------------------------|
## |                       N |
## |-------------------------|
## 
##  
## Total Observations in Table:  45 
## 
##  
##              | knn_pred 
## test$Species |     setosa | versicolor |  virginica |  Row Total | 
## -------------|------------|------------|------------|------------|
##       setosa |         15 |          0 |          0 |         15 | 
## -------------|------------|------------|------------|------------|
##   versicolor |          0 |         14 |          1 |         15 | 
## -------------|------------|------------|------------|------------|
##    virginica |          0 |          2 |         13 |         15 | 
## -------------|------------|------------|------------|------------|
## Column Total |         15 |         16 |         14 |         45 | 
## -------------|------------|------------|------------|------------|
## 
## 

Вывод. В ходе выполнения задания была проведена классификация ирисов методом k-ближайших соседей. Данные разделены на обучающую и тестовую выборки, а числовые признаки нормализованы. Для оценки качества модели построена матрица ошибок и рассчитана точность классификации.

Задание 3. Выполнение классификации методом опорных векторов с использованием функции svm() из пакета e1071

library(e1071)

set.seed(123)

svm_model <- e1071::svm(
  Species ~ .,
  data = train,
  kernel = "linear",
  cost = 1,
  scale = TRUE,
  cross = 10
)

cat("Точность перекрёстной проверки SVM:",
    round(svm_model$tot.accuracy, 2), "%\n")
## Точность перекрёстной проверки SVM: 97.14 %
svm_pred <- predict(
  svm_model,
  newdata = test
)


svm_matrix <- table(
  Фактический = test$Species,
  Предсказанный = svm_pred
)

svm_matrix
##             Предсказанный
## Фактический setosa versicolor virginica
##   setosa         15          0         0
##   versicolor      0         15         0
##   virginica       0          1        14
svm_accuracy <- sum(diag(svm_matrix)) / sum(svm_matrix)

cat("Точность SVM на тестовой выборке:",
    round(svm_accuracy * 100, 2), "%\n")
## Точность SVM на тестовой выборке: 97.78 %

Вывод. В ходе задания была построена модель классификации методом опорных векторов с линейным ядром. Для оценки модели использована десятикратная перекрёстная проверка, а также рассчитана точность предсказания на тестовой выборке. Матрица ошибок позволяет определить количество правильных и ошибочных классификаций. Полученные результаты можно сравнить с результатами метода KNN.

Задание 4. Проведение анализа главных компонент с использованием функции rda() из пакета vegan

library(vegan)

iris_x <- iris[, 1:4]

pca_model <- vegan::rda(
  iris_x,
  scale = TRUE
)

eigenvalues <- eigenvals(pca_model)

explained_variance <- eigenvalues / sum(eigenvalues)

pca_results <- data.frame(
  Компонента = paste0("PC", seq_along(eigenvalues)),
  Собственное_значение = as.numeric(eigenvalues),
  Доля_дисперсии = as.numeric(explained_variance),
  Накопленная_доля = cumsum(as.numeric(explained_variance))
)

pca_results
##   Компонента Собственное_значение Доля_дисперсии Накопленная_доля
## 1        PC1           2.91849782    0.729624454        0.7296245
## 2        PC2           0.91403047    0.228507618        0.9581321
## 3        PC3           0.14675688    0.036689219        0.9948213
## 4        PC4           0.02071484    0.005178709        1.0000000
plot(
  pca_model,
  type = "n",
  scaling = 1,
  main = "Анализ главных компонент набора Iris"
)

points(
  pca_model,
  display = "sites",
  choices = 1:2,
  scaling = 1,
  pch = 19,
  col = as.numeric(iris$Species)
)

legend(
  "topright",
  legend = levels(iris$Species),
  col = seq_along(levels(iris$Species)),
  pch = 19,
  title = "Виды ирисов"
)

Вывод. В ходе задания был выполнен анализ главных компонент набора данных iris. Рассчитаны собственные значения компонент, доли объяснённой дисперсии и их накопленные значения. Построенный график позволяет оценить расположение наблюдений в пространстве первых двух главных компонент и визуально исследовать различия между видами ирисов. Метод PCA позволяет уменьшить размерность данных, сохранив наиболее значимую часть информации.