1. Разведочный анализ данных с использованием caret

library(caret)
## Warning: пакет 'caret' был собран под R версии 4.4.3
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
set.seed(123)

x <- matrix(rnorm(50*5), ncol = 5)
y <- factor(rep(c("A", "B"), each = 25))

График: пары признаков

featurePlot(x, y, plot = "pairs")

Объяснение: Этот график показывает взаимосвязи между всеми парами признаков. Он помогает выявить кластеры, линейные зависимости и возможное разделение классов A и B на плоскостях пар переменных.

График: плотность распределения признаков

featurePlot(x, y, plot = "density")

Объяснение: Плотностные графики отображают, как распределены значения каждого признака для классов A и B. Если кривые распределения сильно различаются, это указывает на то, что признак информативен для классификации.

График: ящики с усами

featurePlot(x, y, plot = "box")

Объяснение: Boxplot показывает медиану, разброс и выбросы значений по каждому признаку для классов A и B. Явное смещение или различие ящиков указывает на потенциальную важность признака.


2. Важность признаков (вручную, без FSelector)

# Вручную добавим таблицу важности признаков (информация получена ранее)
importance <- data.frame(
  Feature = c("Petal.Width", "Petal.Length", "Sepal.Length", "Sepal.Width"),
  Importance = c(0.9554360, 0.9402853, 0.4521286, 0.2672750)
)

# Сортировка и визуализация
importance <- importance[order(-importance$Importance), ]

barplot(importance$Importance,
        names.arg = importance$Feature,
        main = "Важность признаков (Information Gain)",
        col = "skyblue")

Вывод: Наиболее важными признаками оказались Petal.Length и Petal.Width. Это подтверждает, что они наилучшим образом отделяют виды ирисов и полезны для классификации.


3. Дискретизация признаков с помощью arules

library(arules)
## Warning: пакет 'arules' был собран под R версии 4.4.3
## Загрузка требуемого пакета: Matrix
## 
## Присоединяю пакет: 'arules'
## Следующие объекты скрыты от 'package:base':
## 
##     abbreviate, write
data(iris)

# Равные интервалы
iris_interval <- lapply(iris[, 1:4], function(x) discretize(x, method = "interval", breaks = 3))
iris_interval <- as.data.frame(iris_interval)

# Равная частота
iris_frequency <- lapply(iris[, 1:4], function(x) discretize(x, method = "frequency", breaks = 3))
iris_frequency <- as.data.frame(iris_frequency)

# Кластеризация
iris_cluster <- lapply(iris[, 1:4], function(x) discretize(x, method = "cluster", breaks = 3))
iris_cluster <- as.data.frame(iris_cluster)

# Фиксированные интервалы
breaks <- list(
  Sepal.Length = c(-Inf, 5, 6, Inf),
  Sepal.Width = c(-Inf, 3, 4, Inf),
  Petal.Length = c(-Inf, 1.5, 5, Inf),
  Petal.Width = c(-Inf, 0.5, 1.5, Inf)
)

iris_fixed <- lapply(names(breaks), function(col_name) {
  discretize(iris[[col_name]], method = "fixed", breaks = breaks[[col_name]])
})
iris_fixed <- as.data.frame(iris_fixed)
names(iris_fixed) <- names(breaks)

Вывод: Дискретизация переводит числовые переменные в категориальные. Разные методы формируют разные границы интервалов. Это важно при работе с алгоритмами, чувствительными к типу данных.


4. Отбор признаков с помощью Boruta

library(Boruta)
## Warning: пакет 'Boruta' был собран под R версии 4.4.3
library(mlbench)
## Warning: пакет 'mlbench' был собран под R версии 4.4.3
data("airquality")
df <- na.omit(airquality)
df$Ozone <- as.factor(ifelse(df$Ozone > median(df$Ozone, na.rm = TRUE), "High", "Low"))

set.seed(123)
boruta_result <- Boruta(Ozone ~ ., data = df, doTrace = 2)
##  1. run of importance source...
##  2. run of importance source...
##  3. run of importance source...
##  4. run of importance source...
##  5. run of importance source...
##  6. run of importance source...
##  7. run of importance source...
##  8. run of importance source...
##  9. run of importance source...
## After 9 iterations, +0.29 secs:
##  confirmed 5 attributes: Day, Month, Solar.R, Temp, Wind;
##  no more attributes left.
print(boruta_result)
## Boruta performed 9 iterations in 0.289593 secs.
##  5 attributes confirmed important: Day, Month, Solar.R, Temp, Wind;
##  No attributes deemed unimportant.
plot(boruta_result, las = 2)

Boxplot: температура по уровням Ozone

boxplot(Temp ~ Ozone, data = df, main = "Температура по уровням Ozone", col = "lightblue")

Вывод: Boruta определил, что признаки Temp, Wind, Solar.R, Day, Month являются значимыми. Боксплот подтверждает, что температура отличается в группах “High” и “Low” по озону.


💡 Общий вывод

Мы рассмотрели различные подходы к выбору признаков: - Визуальный анализ (featurePlot) - Математические методы (таблица Information Gain) - Дискретизация (arules) - Алгоритмический отбор (Boruta)

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