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 — они однозначно
полезны.
Красные — почти всё время около нуля → неинформативны.
Синие (теневые) остаются внизу
Общий вывод
Были изучены и применены различные подходы к выбору и обработке
признаков. Каждый из рассмотренных пакетов вносит уникальный вклад в
решение задач классификации. Полученные навыки могут быть полезны при
построении моделей машинного обучения и оптимизации качества
предсказаний.