Задание 1:

  1. Установить пакет CARET
  2. выполнить команду names(getModelInfo())
  3. ознакомиться со списком доступных методов выбора признаков.
  4. Выполните графический разведочный анализ данных с использование функции featurePlot() для набора данных из справочного файла пакета CARET:
library(caret)            
models <- names(getModelInfo())
length(models)
## [1] 239
head(models)
## [1] "ada"         "AdaBag"      "AdaBoost.M1" "adaboost"    "amdai"      
## [6] "ANFIS"

Функция getModelInfo() возвращает список реализованных в пакете caret алгоритмов машинного обучения для задач классификации и регрессии.

set.seed(141)
x <- matrix(rnorm(50*5), ncol = 5)
colnames(x) <- paste0("X", 1:5)

y <- factor(rep(c("A", "B"), 25))

Попарные графики

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

jpeg("featurePlot_pairs.jpg", width = 2000, height = 2000)
featurePlot(x = x, y = y, plot = "pairs")
dev.off()
## quartz_off_screen 
##                 2

Плотности распределения

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

jpeg("featurePlot_density.jpg", width = 2000, height = 2000)
featurePlot(x = x, y = y, plot = "density")
dev.off()
## quartz_off_screen 
##                 2

Вывод:

Попарные диаграммы рассеяния признаков показали, что объекты классов A и B существенно перекрываются во всех двумерных проекциях пространства признаков. Чёткой разделимости классов по парам признаков не наблюдается, что указывает на отсутствие выраженной структуры в данных.

Задание 2:

  1. С использование функций из пакета Fselector определить важность признаков для решения задачи классификации.
  2. Использовать набор data(iris).
  3. Сделать выводы.
library(FSelector)
data(iris)
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
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), , drop = FALSE]
weights_sorted
##              attr_importance
## Petal.Width        0.9554360
## Petal.Length       0.9402853
## Sepal.Length       0.4521286
## Sepal.Width        0.2672750

Задание 3:

  1. С использованием функции discretize() из пакета arules выполните преобразование непрерывной переменной в категориальную различными методами:
  1. Используйте набор данных iris.
  2. Сделайте выводы.
library(arules)
## Loading required package: Matrix
## 
## Attaching package: 'arules'
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
data(iris)
x <- iris$Petal.Length

Метод «interval» — равная ширина интервалов

x_interval <- discretize(x, method = "interval", breaks = 3)
table(x_interval)
## x_interval
##    [1,2.97) [2.97,4.93)  [4.93,6.9] 
##          50          54          46
  • Диапазон значений делится на 3 равных по ширине интервала.

Метод «frequency» — равная частота

x_frequency <- discretize(x, method = "frequency", breaks = 3)
table(x_frequency)
## x_frequency
##   [1,2.63) [2.63,4.9)  [4.9,6.9] 
##         50         49         51
  • В каждом интервале примерно одинаковое число объектов.

Метод «cluster» — кластеризация

x_cluster <- discretize(x, method = "cluster", breaks = 3)
table(x_cluster)
## x_cluster
##    [1,2.85) [2.85,4.89)  [4.89,6.9] 
##          50          49          51
  • Границы интервалов подбираются так, чтобы группы были «похожими внутри».

Метод «fixed» — фиксированные границы

x_fixed <- discretize(x, method = "fixed", breaks = c(1, 3, 5, 7))
table(x_fixed)
## x_fixed
## [1,3) [3,5) [5,7] 
##    50    54    46
  • Границы интервалов задаёшь сам.
head(data.frame(
  original = x,
  interval = x_interval,
  frequency = x_frequency,
  cluster = x_cluster,
  fixed = x_fixed
))
##   original interval frequency  cluster fixed
## 1      1.4 [1,2.97)  [1,2.63) [1,2.85) [1,3)
## 2      1.4 [1,2.97)  [1,2.63) [1,2.85) [1,3)
## 3      1.3 [1,2.97)  [1,2.63) [1,2.85) [1,3)
## 4      1.5 [1,2.97)  [1,2.63) [1,2.85) [1,3)
## 5      1.4 [1,2.97)  [1,2.63) [1,2.85) [1,3)
## 6      1.7 [1,2.97)  [1,2.63) [1,2.85) [1,3)

Вывод

В результате дискретизации непрерывного признака Petal.Length различными методами получены различные варианты разбиения диапазона значений на интервалы. Метод равной ширины интервалов формирует интервалы одинакового размера, но с неравным числом объектов в каждом. Метод равной частоты обеспечивает приблизительно одинаковое количество наблюдений в каждом интервале. Метод кластеризации формирует интервалы с учётом структуры данных. Метод фиксированных границ позволяет задавать интервалы на основе предметной области.

Задание 4:

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

Загрузка данных и просмотр структуры:

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 ...
summary(Ozone)
##        V1            V2      V3           V4              V5      
##  1      : 31   1      : 12   1:52   Min.   : 1.00   Min.   :5320  
##  3      : 31   2      : 12   2:52   1st Qu.: 5.00   1st Qu.:5700  
##  5      : 31   3      : 12   3:52   Median : 9.00   Median :5770  
##  7      : 31   4      : 12   4:53   Mean   :11.53   Mean   :5753  
##  8      : 31   5      : 12   5:53   3rd Qu.:16.00   3rd Qu.:5830  
##  10     : 31   6      : 12   6:52   Max.   :38.00   Max.   :5950  
##  (Other):180   (Other):294   7:52   NA's   :5       NA's   :12    
##        V6               V7              V8              V9       
##  Min.   : 0.000   Min.   :19.00   Min.   :25.00   Min.   :27.68  
##  1st Qu.: 3.000   1st Qu.:49.00   1st Qu.:51.00   1st Qu.:49.73  
##  Median : 5.000   Median :65.00   Median :62.00   Median :57.02  
##  Mean   : 4.869   Mean   :58.48   Mean   :61.91   Mean   :56.85  
##  3rd Qu.: 6.000   3rd Qu.:73.00   3rd Qu.:72.00   3rd Qu.:66.11  
##  Max.   :11.000   Max.   :93.00   Max.   :93.00   Max.   :82.58  
##                   NA's   :15      NA's   :2       NA's   :139    
##       V10            V11             V12             V13       
##  Min.   : 111   Min.   :-69.0   Min.   :27.50   Min.   :  0.0  
##  1st Qu.: 890   1st Qu.:-10.0   1st Qu.:51.26   1st Qu.: 70.0  
##  Median :2125   Median : 24.0   Median :62.24   Median :110.0  
##  Mean   :2591   Mean   : 17.8   Mean   :60.93   Mean   :123.3  
##  3rd Qu.:5000   3rd Qu.: 45.0   3rd Qu.:70.52   3rd Qu.:150.0  
##  Max.   :5000   Max.   :107.0   Max.   :91.76   Max.   :500.0  
##  NA's   :15     NA's   :1       NA's   :14

Удаление пропусков:

oz <- na.omit(Ozone)

Запуск boruta:

set.seed(123)
bor <- Boruta(V4 ~ ., data = oz, doTrace = 1)
## After 11 iterations, +0.62 secs:
##  confirmed 9 attributes: V1, V10, V11, V12, V13 and 4 more;
##  rejected 1 attribute: V3;
##  still have 2 attributes left.
## After 15 iterations, +0.84 secs:
##  rejected 1 attribute: V2;
##  still have 1 attribute left.
## After 21 iterations, +1.2 secs:
##  rejected 1 attribute: V6;
##  no more attributes left.

Результат:

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

Извлечение полезных признаков:

getSelectedAttributes(bor, withTentative = TRUE)
## [1] "V1"  "V5"  "V7"  "V8"  "V9"  "V10" "V11" "V12" "V13"

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

plot(bor, las = 2, cex.axis = 0.7)

Вывод

С использованием алгоритма Boruta выполнен отбор признаков для набора данных Ozone. В результате были выделены признаки, обладающие статистически значимой важностью по сравнению с «теневыми» признаками, что позволяет считать их информативными для предсказания уровня озона. Часть признаков была отклонена как неинформативная. Визуализация boxplot подтверждает различия важности реальных признаков относительно уровня шума.