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
. Явное смещение или различие ящиков указывает на
потенциальную важность признака.
# Вручную добавим таблицу важности признаков (информация получена ранее)
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
. Это подтверждает,
что они наилучшим образом отделяют виды ирисов и полезны для
классификации.
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)
Вывод: Дискретизация переводит числовые переменные в категориальные. Разные методы формируют разные границы интервалов. Это важно при работе с алгоритмами, чувствительными к типу данных.
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(Temp ~ Ozone, data = df, main = "Температура по уровням Ozone", col = "lightblue")
Вывод: Boruta
определил, что признаки
Temp
, Wind
, Solar.R
,
Day
, Month
являются значимыми. Боксплот
подтверждает, что температура отличается в группах “High” и “Low” по
озону.
Мы рассмотрели различные подходы к выбору признаков: - Визуальный
анализ (featurePlot
) - Математические методы (таблица
Information Gain) - Дискретизация (arules
) -
Алгоритмический отбор (Boruta
)
Комбинация этих методов помогает получить надёжный набор переменных для построения качественных моделей машинного обучения.