R Markdown

Первое задание: Установить пакет CARET, выполнить команду names(getModelInfo()), ознакомиться со списком доступных методов выбора признаков. Выполните графический разведочный анализ данных с использование функции featurePlot() для набора данных из справочного файла пакета CARET

set.seed(123)
library(caret)
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
x <- matrix(rnorm(50 * 5), ncol = 5)
colnames(x) <- paste0("Var", 1:5)
y <- factor(rep(c("A", "B"), 25))

data_df <- data.frame(x, Class = y)

featurePlot(x = data_df[, 1:5], y = data_df$Class,
            plot = "density",
            scales = list(x = list(relation = "free"), y = list(relation = "free")))

Вывод

Разные признаки показывают различную степень разделимости между классами A и B. Признаки с меньшим перекрытием распределений более информативны для классификации.

Var2 является наиболее перспективной переменной для различения классов A и B. Можно рассмотреть её как один из основных признаков при построении модели.

Var1 и Var4 также демонстрируют некоторое различие между классами и могут быть полезны.

Var3 и Var5 имеют высокую степень перекрытия, что может снизить их значимость при обучении модели, но полностью исключать их не стоит — возможно, они имеют совместный эффект с другими признаками.

Второе задание. С использованием функций из пакета Fselector [2] определить важность признаков для решения задачи классификации. Использовать набор data(iris). Сделать выводы.

library(FSelector)

data(iris)

weights <- information.gain(Species ~ ., iris)
print(weights)
##              attr_importance
## Sepal.Length       0.4521286
## Sepal.Width        0.2672750
## Petal.Length       0.9402853
## Petal.Width        0.9554360

Вывод

Petal.Width и Petal.Length — наиболее важные признаки для классификации видов ирисов. Они дают наибольшую информацию о классе (Species).

Sepal.Width и Sepal.Length — менее информативны и могут быть отброшены при упрощении модели.

Третье задание. С использованием функции discretize() из пакета arules выполните преобразование непрерывной переменной в категориальную [3] различными методами: «interval» (равная ширина интервала), «frequency» (равная частота), «cluster» (кластеризация) и «fixed» (категории задают границы интервалов). Используйте набор данных iris. Сделайте выводы

# Подключение пакета
library(arules)

sep_len <- iris$Sepal.Length

iris$Sepal_Interval <- discretize(sep_len, method = "interval", breaks = 3)
iris$Sepal_Frequency <- discretize(sep_len, method = "frequency", breaks = 3)

iris$Sepal_Cluster <- discretize(sep_len, method = "cluster", breaks = 3)

iris$Sepal_Fixed <- discretize(sep_len, method = "fixed", breaks = c(4, 5.5, 6.5, 8))

print(table(iris$Sepal_Interval))
## 
## [4.3,5.5) [5.5,6.7) [6.7,7.9] 
##        52        70        28
print(table(iris$Sepal_Frequency))
## 
## [4.3,5.4) [5.4,6.3) [6.3,7.9] 
##        46        53        51
print(table(iris$Sepal_Cluster))
## 
##  [4.3,5.42) [5.42,6.39)  [6.39,7.9] 
##          52          56          42
print(table(iris$Sepal_Fixed))
## 
##   [4,5.5) [5.5,6.5)   [6.5,8] 
##        52        63        35

Я заменил categories на breaks потому что она устарела и выдавала предупреждение

Вывод

interval может создавать группы с разным количеством наблюдений, если данные распределены неравномерно.

frequency гарантирует равное число наблюдений в каждой категории.

cluster адаптируется к структуре данных.

fixed — ручной контроль, полезен при известной доменной логике.

Четвертое задание. Установите пакет Boruta и проведите выбор признаков для набора данных data(“Ozone”) [4, 5, 6]. Построить график boxplot, сделать выводы.

library(Boruta)
library(mlbench)


data(Ozone)
ozone_data <- na.omit(Ozone)


set.seed(123)
boruta_result <- Boruta(V4 ~ ., data = ozone_data, doTrace = 2)


print(boruta_result)
## Boruta performed 24 iterations in 1.555506 secs.
##  9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
##  3 attributes confirmed unimportant: V2, V3, V6;
# График отбора признаков
plot(boruta_result)

# История важности признаков
plotImpHistory(boruta_result)

Вывод

Первый график

Признаки V5, V13, V1, V10, V7, V11, V8, V9 — важны .

V2 и V6 — неважны.

Второй график

Зелёные признаки стабильно держат важность выше 10 — они однозначно полезны.

Красные — почти всё время около нуля → неинформативны.

Синие (теневые) остаются внизу

Общий вывод

Были изучены и применены различные подходы к выбору и обработке признаков. Каждый из рассмотренных пакетов вносит уникальный вклад в решение задач классификации. Полученные навыки могут быть полезны при построении моделей машинного обучения и оптимизации качества предсказаний.