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-ближайших соседей. Данные разделены на обучающую и тестовую выборки, а числовые признаки нормализованы. Для оценки качества модели построена матрица ошибок и рассчитана точность классификации.
svm() из пакета
e1071library(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.
rda() из пакета veganlibrary(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 позволяет уменьшить размерность
данных, сохранив наиболее значимую часть информации.