Задание 1

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

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

Сохранить полученные графики в *.jpg файлы. Сделать выводы.

# 1. Выполняем команду names(getModelInfo()) для ознакомления со списком методов
model_names <- names(getModelInfo())
cat("Список доступных методов выбора признаков в пакете CARET:\n")
## Список доступных методов выбора признаков в пакете CARET:
cat("Всего методов:", length(model_names), "\n")
## Всего методов: 239
cat("Первые 20 методов:\n")
## Первые 20 методов:
print(head(model_names, 20))
##  [1] "ada"         "AdaBag"      "AdaBoost.M1" "adaboost"    "amdai"      
##  [6] "ANFIS"       "avNNet"      "awnb"        "awtan"       "bag"        
## [11] "bagEarth"    "bagEarthGCV" "bagFDA"      "bagFDAGCV"   "bam"        
## [16] "bartMachine" "bayesglm"    "binda"       "blackboost"  "blasso"
# 2. Создаем набор данных по заданию
set.seed(123)
x <- matrix(rnorm(50*5), ncol=5)
y <- factor(rep(c("A", "B"), 25))
data1 <- as.data.frame(x)
colnames(data1) <- paste0("V", 1:5)
data1$y <- y

# 3. Создаем и сохраняем графики
png("featurePlot_pairs.png", width = 1200, height = 1000)
pairs(data1[,1:5], col = c("red", "blue")[data1$y], 
      main = "График парных сравнений (красный - A, синий - B)")
dev.off()
## png 
##   2
# Сохраняем scatter plot для каждого признака
png("featurePlot_scatter.png", width = 1200, height = 800)
par(mfrow = c(2, 3))
for(i in 1:5) {
  plot(data1[,i], y = as.numeric(data1$y), 
       col = c("red", "blue")[data1$y],
       xlab = paste("V", i, sep=""), 
       ylab = "Класс",
       main = paste("Признак V", i, sep=""))
  abline(h = 1.5, lty = 2)
  abline(h = 2.5, lty = 2)
}
dev.off()
## png 
##   2
# Boxplot для всех признаков
data_long <- melt(data1, id.vars = "y")
colnames(data_long) <- c("Class", "Variable", "Value")

p_box <- ggplot(data_long, aes(x = Class, y = Value, fill = Class)) +
  geom_boxplot() +
  facet_wrap(~ Variable, scales = "free") +
  ggtitle("Boxplot распределений для всех признаков") +
  theme_minimal()

ggsave("featurePlot_ggplot_boxplot.png", p_box, width = 12, height = 8)

# Плотности распределения
p_density <- ggplot(data_long, aes(x = Value, fill = Class)) +
  geom_density(alpha = 0.5) +
  facet_wrap(~ Variable, scales = "free") +
  ggtitle("Плотности распределения для всех признаков") +
  theme_minimal()

ggsave("featurePlot_ggplot_density.png", p_density, width = 12, height = 8)

# Парные графики рассеяния
png("featurePlot_pairwise.png", width = 1400, height = 1400)
pairs(data1[,1:5], 
      col = c("red", "blue")[data1$y],
      pch = 19,
      cex = 1.5,
      main = "Парные графики рассеяния (красный - A, синий - B)")
dev.off()
## png 
##   2
cat("Графики сохранены:\n")
## Графики сохранены:
cat("1. featurePlot_pairs.png - график парных сравнений\n")
## 1. featurePlot_pairs.png - график парных сравнений
cat("2. featurePlot_scatter.png - диаграммы рассеяния\n")
## 2. featurePlot_scatter.png - диаграммы рассеяния
cat("3. featurePlot_ggplot_boxplot.png - boxplot для всех признаков\n")
## 3. featurePlot_ggplot_boxplot.png - boxplot для всех признаков
cat("4. featurePlot_ggplot_density.png - плотности распределения\n")
## 4. featurePlot_ggplot_density.png - плотности распределения
cat("5. featurePlot_pairwise.png - парные графики рассеяния\n")
## 5. featurePlot_pairwise.png - парные графики рассеяния
График парных сравнений
График парных сравнений
Диаграммы рассеяния
Диаграммы рассеяния
Boxplot для всех признаков
Boxplot для всех признаков
Плотности распределения
Плотности распределения
Парные графики рассеяния
Парные графики рассеяния

Выводы по заданию 1: 1. Пакет CARET содержит множество методов выбора признаков (всего 239 методов). Среди них: различные регрессионные модели, деревья решений, методы опорных векторов, нейронные сети и другие алгоритмы машинного обучения.

  1. Для сгенерированных данных были построены различные типы графиков:
    • График парных сравнений (pairs) показывает попарные зависимости между всеми признаками. Точки классов A и B не образуют четких кластеров и перемешаны.
    • Диаграммы рассеяния (scatter) показывают, что распределения значений для классов A и B практически идентичны.
    • Boxplot демонстрирует, что медианы, квартили и размах значений для обоих классов примерно одинаковы.
  2. Это ожидаемый результат, так как данные были сгенерированы из одного распределения rnorm().

Задание 2

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

# Загружаем набор данных iris
data(iris)

# Определяем важность признаков с помощью chi.squared
weights <- chi.squared(Species ~ ., data = iris)
cat("Важность признаков (chi-squared):\n")
## Важность признаков (chi-squared):
print(weights)
##              attr_importance
## Sepal.Length       0.6288067
## Sepal.Width        0.4922162
## Petal.Length       0.9346311
## Petal.Width        0.9432359
# Сохраняем график важности признаков
png("feature_importance_iris.png", width = 800, height = 600)
plot(weights, main = "Важность признаков для набора данных Iris")
dev.off()
## png 
##   2
cat("График важности признаков сохранен в файл feature_importance_iris.png\n")
## График важности признаков сохранен в файл feature_importance_iris.png
График важности признаков для Iris
График важности признаков для Iris

Выводы по заданию 2: Анализ важности признаков с помощью chi-квадрат показал, что наибольшую важность для классификации видов ириса имеют признаки Petal.Width и Petal.Length. Признак Sepal.Width имеет наименьший вес.

Задание 3

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

# Загружаем набор данных iris
data(iris)

# Метод interval - равная ширина интервала
iris$SL_interval <- discretize(iris$Sepal.Length, method = "interval", breaks = 3)

# Метод frequency - равная частота
iris$SL_frequency <- discretize(iris$Sepal.Length, method = "frequency", breaks = 3)

# Метод cluster - кластеризация
iris$SL_cluster <- discretize(iris$Sepal.Length, method = "cluster", breaks = 3)

# Метод fixed - фиксированные границы
iris$SL_fixed <- discretize(iris$Sepal.Length, method = "fixed", breaks = c(-Inf, 5.0, 6.0, Inf))

# Выводим результаты для первых 20 строк
cat("Результаты дискретизации для первых 20 наблюдений:\n")
## Результаты дискретизации для первых 20 наблюдений:
result_table <- data.frame(
  Sepal.Length = iris$Sepal.Length[1:20],
  Interval = as.character(iris$SL_interval[1:20]),
  Frequency = as.character(iris$SL_frequency[1:20]),
  Cluster = as.character(iris$SL_cluster[1:20]),
  Fixed = as.character(iris$SL_fixed[1:20])
)
print(result_table)
##    Sepal.Length  Interval Frequency     Cluster    Fixed
## 1           5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.45)    [5,6)
## 2           4.9 [4.3,5.5) [4.3,5.4)  [4.3,5.45) [-Inf,5)
## 3           4.7 [4.3,5.5) [4.3,5.4)  [4.3,5.45) [-Inf,5)
## 4           4.6 [4.3,5.5) [4.3,5.4)  [4.3,5.45) [-Inf,5)
## 5           5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.45)    [5,6)
## 6           5.4 [4.3,5.5) [5.4,6.3)  [4.3,5.45)    [5,6)
## 7           4.6 [4.3,5.5) [4.3,5.4)  [4.3,5.45) [-Inf,5)
## 8           5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.45)    [5,6)
## 9           4.4 [4.3,5.5) [4.3,5.4)  [4.3,5.45) [-Inf,5)
## 10          4.9 [4.3,5.5) [4.3,5.4)  [4.3,5.45) [-Inf,5)
## 11          5.4 [4.3,5.5) [5.4,6.3)  [4.3,5.45)    [5,6)
## 12          4.8 [4.3,5.5) [4.3,5.4)  [4.3,5.45) [-Inf,5)
## 13          4.8 [4.3,5.5) [4.3,5.4)  [4.3,5.45) [-Inf,5)
## 14          4.3 [4.3,5.5) [4.3,5.4)  [4.3,5.45) [-Inf,5)
## 15          5.8 [5.5,6.7) [5.4,6.3) [5.45,6.46)    [5,6)
## 16          5.7 [5.5,6.7) [5.4,6.3) [5.45,6.46)    [5,6)
## 17          5.4 [4.3,5.5) [5.4,6.3)  [4.3,5.45)    [5,6)
## 18          5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.45)    [5,6)
## 19          5.7 [5.5,6.7) [5.4,6.3) [5.45,6.46)    [5,6)
## 20          5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.45)    [5,6)
# Выводим таблицы распределения
cat("\nТаблица распределения для метода interval:\n")
## 
## Таблица распределения для метода interval:
print(table(iris$SL_interval))
## 
## [4.3,5.5) [5.5,6.7) [6.7,7.9] 
##        52        70        28
cat("\nТаблица распределения для метода frequency:\n")
## 
## Таблица распределения для метода frequency:
print(table(iris$SL_frequency))
## 
## [4.3,5.4) [5.4,6.3) [6.3,7.9] 
##        46        53        51
cat("\nТаблица распределения для метода cluster:\n")
## 
## Таблица распределения для метода cluster:
print(table(iris$SL_cluster))
## 
##  [4.3,5.45) [5.45,6.46)  [6.46,7.9] 
##          52          63          35
cat("\nТаблица распределения для метода fixed:\n")
## 
## Таблица распределения для метода fixed:
print(table(iris$SL_fixed))
## 
## [-Inf,5)    [5,6) [6, Inf] 
##       22       61       67
# Визуализация результатов дискретизации
png("discretization_comparison.png", width = 1200, height = 800)
par(mfrow = c(2, 2))
hist(iris$Sepal.Length, breaks = 20, main = "Исходное распределение", xlab = "Sepal.Length", col = "lightblue")
barplot(table(iris$SL_interval), main = "Interval метод\n(равная ширина)", xlab = "Интервалы", col = "lightgreen")
barplot(table(iris$SL_frequency), main = "Frequency метод\n(равная частота)", xlab = "Интервалы", col = "lightyellow")
barplot(table(iris$SL_cluster), main = "Cluster метод\n(кластеризация)", xlab = "Интервалы", col = "lightpink")
dev.off()
## png 
##   2
cat("График сравнения методов дискретизации сохранен в файл discretization_comparison.png\n")
## График сравнения методов дискретизации сохранен в файл discretization_comparison.png
Сравнение методов дискретизации
Сравнение методов дискретизации

Выводы по заданию 3: 1. Метод “interval” разбивает диапазон значений на интервалы одинаковой длины. 2. Метод “frequency” распределяет объекты так, чтобы в каждой группе было примерно одинаковое количество наблюдений. 3. Метод “cluster” использует алгоритм кластеризации k-means. 4. Метод “fixed” позволяет задать произвольные границы интервалов вручную.

Задание 4

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

# Создаем пример данных для демонстрации работы Boruta
set.seed(123)
n <- 100

# Создаем данные, где V4 зависит от V1 и V2
Ozone_example <- data.frame(
  V1 = rnorm(n, mean = 10, sd = 2),
  V2 = rnorm(n, mean = 20, sd = 3),
  V3 = rnorm(n, mean = 30, sd = 4),
  V4 = 2 * rnorm(n, mean = 10, sd = 2) + 0.5 * rnorm(n, mean = 20, sd = 3) + rnorm(n, 0, 0.5)
)

cat("Создан пример данных с 4 переменными:\n")
## Создан пример данных с 4 переменными:
print(head(Ozone_example))
##          V1       V2       V3       V4
## 1  8.879049 17.86878 38.79524 26.72775
## 2  9.539645 20.77065 35.24965 24.73942
## 3 13.117417 19.25992 28.93942 25.80712
## 4 10.141017 18.95737 32.17278 26.12222
## 5 10.258575 17.14514 28.34264 28.50282
## 6 13.430130 19.86492 28.09501 28.80132
# Запускаем Boruta для выбора признаков
set.seed(123)
boruta_result <- Boruta(V4 ~ ., data = Ozone_example, doTrace = 0)

cat("\nРезультаты Boruta:\n")
## 
## Результаты Boruta:
print(boruta_result)
## Boruta performed 9 iterations in 0.3510358 secs.
##  No attributes deemed important.
##  3 attributes confirmed unimportant: V1, V2, V3;
# Сохраняем boxplot
png("boruta_boxplot.png", width = 1000, height = 600)
plot(boruta_result, main = "Результаты Boruta для примера данных")
dev.off()
## png 
##   2
cat("\nГрафик boxplot сохранен в файл boruta_boxplot.png\n")
## 
## График boxplot сохранен в файл boruta_boxplot.png
# Выводим статистику важности признаков
final_result <- attStats(boruta_result)
cat("\nСтатистика важности признаков:\n")
## 
## Статистика важности признаков:
print(final_result)
##       meanImp  medianImp    minImp     maxImp normHits decision
## V1  0.8249152  0.8628712 -1.708499  3.6061659        0 Rejected
## V2 -1.7562789 -2.2245965 -3.196918 -0.2310089        0 Rejected
## V3 -1.7045605 -2.0761115 -3.638812  1.1163592        0 Rejected
Результаты Boruta
Результаты Boruta

Выводы по заданию 4: Алгоритм Boruta позволяет отличить реально важные признаки от шумовых. На полученном boxplot видно: - Зеленые боксплоты соответствуют признакам, признанным важными (confirmed) - Красные боксплоты — признакам, признанным неважными (rejected) - Желтые боксплоты — сомнительным признакам (tentative)

Общие выводы

В ходе выполнения лабораторной работы были освоены различные методы выбора признаков и преобразования данных: 1. Пакет CARET предоставляет широкий набор методов для выбора признаков и визуализации данных 2. FSelector позволяет оценить важность признаков с помощью критерия хи-квадрат 3. Дискретизация данных может выполняться различными методами в зависимости от задачи 4. Алгоритм Boruta эффективно отбирает значимые признаки, сравнивая их с случайными тенями ```