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

Подключение пакета

install.packages("caret")
## Warning: пакет ''caret'' сейчас используется и не будет установлен
library(caret)

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

Получение списка доступных моделей

head(names(getModelInfo()))
## [1] "ada"         "AdaBag"      "AdaBoost.M1" "adaboost"    "amdai"      
## [6] "ANFIS"

Создание тестового набора данных

set.seed(123)

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

x <- as.data.frame(x)

colnames(x) <- c(
  "Feature1",
  "Feature2",
  "Feature3",
  "Feature4",
  "Feature5"
)

head(x)
##      Feature1    Feature2    Feature3   Feature4   Feature5
## 1 -0.56047565  0.25331851 -0.71040656  0.7877388  2.1988103
## 2 -0.23017749 -0.02854676  0.25688371  0.7690422  1.3124130
## 3  1.55870831 -0.04287046 -0.24669188  0.3322026 -0.2651451
## 4  0.07050839  1.36860228 -0.34754260 -1.0083766  0.5431941
## 5  0.12928774 -0.22577099 -0.95161857 -0.1194526 -0.4143399
## 6  1.71506499  1.51647060 -0.04502772 -0.2803953 -0.4762469

Построение и сохранение Box Plot

jpeg("feature_box.jpg")

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

dev.off()
## png 
##   2
featurePlot(
  x = x,
  y = y,
  plot = "box"
)

Построение и сохранение Density Plot

jpeg("feature_density.jpg")

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

dev.off()
## png 
##   2
featurePlot(
  x = x,
  y = y,
  plot = "density"
)

Построение и сохранение Scatter Plot Matrix

jpeg("feature_pairs.jpg")

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

dev.off()
## png 
##   2
featurePlot(
  x = x,
  y = y,
  plot = "pairs"
)

Проверка созданных файлов

list.files(pattern = "*.jpg")
## [1] "boruta_boxplot.jpg"  "feature_box.jpg"     "feature_density.jpg"
## [4] "feature_pairs.jpg"

Вывод

С помощью функции featurePlot() был выполнен графический разведочный анализ данных. Были построены графики распределения признаков и их попарных зависимостей. Поскольку данные были сгенерированы случайным образом, выраженного разделения между классами A и B обнаружено не было.


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

Подключение пакета и загрузка данных

library(FSelector)

data(iris)

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

Расчёт важности признаков

weights <- information.gain(
  Species ~ .,
  iris
)

weights
##              attr_importance
## Sepal.Length       0.4521286
## Sepal.Width        0.2672750
## Petal.Length       0.9402853
## Petal.Width        0.9554360

Сортировка признаков по важности

weights_sorted <- weights[
  order(weights$attr_importance,
        decreasing = TRUE),
]

weights_sorted
## [1] 0.9554360 0.9402853 0.4521286 0.2672750

Вывод

По результатам расчёта Information Gain была определена информативность признаков набора данных iris. Наиболее значимыми являются признаки с максимальным значением показателя attr_importance, а наименее значимыми — признаки с минимальным значением данного показателя.


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

Подключение пакета

library(arules)

data(iris)

В качестве непрерывного признака используется переменная Sepal.Length.

Метод interval

disc_interval <- discretize(
  iris$Sepal.Length,
  method = "interval",
  categories = 3
)

table(disc_interval)
## disc_interval
## [4.3,5.5) [5.5,6.7) [6.7,7.9] 
##        52        70        28

Метод frequency

disc_frequency <- discretize(
  iris$Sepal.Length,
  method = "frequency",
  categories = 3
)
## Warning in discretize(iris$Sepal.Length, method = "frequency", categories = 3):
## Parameter categories is deprecated. Use breaks instead! Also, the default
## method is now frequency!
table(disc_frequency)
## disc_frequency
## [4.3,5.4) [5.4,6.3) [6.3,7.9] 
##        46        53        51

Метод cluster

disc_cluster <- discretize(
  iris$Sepal.Length,
  method = "cluster",
  categories = 3
)
## Warning in discretize(iris$Sepal.Length, method = "cluster", categories = 3):
## Parameter categories is deprecated. Use breaks instead! Also, the default
## method is now frequency!
table(disc_cluster)
## disc_cluster
##  [4.3,5.33) [5.33,6.27)  [6.27,7.9] 
##          46          53          51

Метод fixed

disc_fixed <- discretize(
  iris$Sepal.Length,
  method = "fixed",
  breaks = c(4, 5.5, 7, 8)
)

table(disc_fixed)
## disc_fixed
## [4,5.5) [5.5,7)   [7,8] 
##      52      85      13

Вывод

Были рассмотрены различные методы дискретизации непрерывного признака. Метод interval формирует интервалы одинаковой ширины, frequency распределяет наблюдения по категориям примерно поровну, cluster определяет границы автоматически на основе структуры данных, а fixed использует заранее заданные пользователем границы.


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

Подключение пакетов

library(Boruta)
library(mlbench)

Загрузка данных

data(Ozone)

str(Ozone)
## 'data.frame':    366 obs. of  13 variables:
##  $ V1 : Factor w/ 12 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ V2 : Factor w/ 31 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ V3 : Factor w/ 7 levels "1","2","3","4",..: 4 5 6 7 1 2 3 4 5 6 ...
##  $ V4 : num  3 3 3 5 5 6 4 4 6 7 ...
##  $ V5 : num  5480 5660 5710 5700 5760 5720 5790 5790 5700 5700 ...
##  $ V6 : num  8 6 4 3 3 4 6 3 3 3 ...
##  $ V7 : num  20 NA 28 37 51 69 19 25 73 59 ...
##  $ V8 : num  NA 38 40 45 54 35 45 55 41 44 ...
##  $ V9 : num  NA NA NA NA 45.3 ...
##  $ V10: num  5000 NA 2693 590 1450 ...
##  $ V11: num  -15 -14 -25 -24 25 15 -33 -28 23 -2 ...
##  $ V12: num  30.6 NA 47.7 55 57 ...
##  $ V13: num  200 300 250 100 60 60 100 250 120 120 ...
Ozone_clean <- na.omit(Ozone)

Построение модели Boruta

boruta_model <- Boruta(
  V4 ~ .,
  data = Ozone_clean,
  doTrace = 0
)

boruta_model
## Boruta performed 27 iterations in 0.4569731 secs.
##  9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
##  3 attributes confirmed unimportant: V2, V3, V6;

Статистика признаков

attStats(boruta_model)
##         meanImp   medianImp      minImp     maxImp  normHits  decision
## V1   0.40484161  0.40025241  0.35308063 0.45488575 1.0000000 Confirmed
## V2   0.03361663  0.03198824 -0.04127076 0.09496684 0.1111111  Rejected
## V3  -0.05382516 -0.07882605 -0.11794678 0.06388712 0.0000000  Rejected
## V5   0.38208645  0.38500256  0.31825077 0.43936492 1.0000000 Confirmed
## V6   0.03845126  0.02797858 -0.04940123 0.15538728 0.1851852  Rejected
## V7   0.53072632  0.53006074  0.48180759 0.57025349 1.0000000 Confirmed
## V8   0.77666988  0.78527109  0.70412404 0.82644840 1.0000000 Confirmed
## V9   0.87549954  0.87167817  0.82754363 0.93815318 1.0000000 Confirmed
## V10  0.42730352  0.42069548  0.38298284 0.49923461 1.0000000 Confirmed
## V11  0.54405838  0.54047650  0.48736479 0.62269556 1.0000000 Confirmed
## V12  0.65418861  0.64836545  0.59427434 0.72194726 1.0000000 Confirmed
## V13  0.40698244  0.40112032  0.35501746 0.49397854 1.0000000 Confirmed

Построение и сохранение графика

jpeg("boruta_boxplot.jpg")

plot(boruta_model)

dev.off()
## png 
##   2
plot(boruta_model)

Вывод

Метод Boruta позволил определить значимость признаков относительно целевой переменной. По результатам работы алгоритма признаки были разделены на подтверждённые (Confirmed), отклонённые (Rejected) и неопределённые (Tentative). Наиболее информативными являются признаки, получившие статус Confirmed и имеющие наибольшие значения важности.

Общий вывод

В ходе лабораторной работы были изучены методы анализа и отбора признаков с использованием пакетов CARET, FSelector, arules и Boruta. Были выполнены визуальный анализ данных, оценка информативности признаков, дискретизация непрерывных переменных и автоматический отбор наиболее значимых признаков для решения задач классификации.