Задание 1:

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

{r} library(caret)

{r} models <- names(getModelInfo()) length(models)

{r} head(models)

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

{r} set.seed(141)

x <- matrix(rnorm(50 * 5), ncol = 5) colnames(x) <- paste0(“X”, 1:5)

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

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

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

Вывод:

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

Графики плотности также показывают значительное пересечение распределений признаков двух классов. Следовательно, отдельно взятые признаки не обеспечивают однозначного разделения объектов на классы.

Задание 2:

  1. С использованием функций выбора признаков определить важность признаков для решения задачи классификации.
  2. Использовать набор данных iris.
  3. Сделать вывод.

Для выполнения задания используется пакет FSelectorRcpp, реализующий методы оценки информативности признаков.

{r} library(FSelectorRcpp)

Загрузим набор данных:

{r} data(iris) str(iris)

Набор данных iris содержит четыре числовых признака и категориальную переменную Species, определяющую класс объекта.

Рассчитаем информационную значимость признаков:

{r} weights <- information_gain( Species ~ ., data = iris )

weights

Отсортируем признаки по убыванию важности:

{r} weights_sorted <- weights[ order(-weights$importance),]

weights_sorted

Вывод:

В результате оценки признаков методом информационного выигрыша наиболее информативными для определения вида ириса являются характеристики лепестка — Petal.Width и Petal.Length.

Признаки чашелистика также содержат полезную информацию, однако их вклад в разделение классов меньше. Следовательно, характеристики лепестков лучше подходят для классификации объектов набора данных iris.

Задание 3:

  1. С использованием функции discretize() из пакета arules выполнить преобразование непрерывной переменной в категориальную различными методами:
  1. Использовать набор данных iris.
  2. Сделать выводы.

{r} library(arules)

{r} data(iris)

x <- iris$Petal.Length

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

{r} x_interval <- discretize( x, method = “interval”, breaks = 3 )

table(x_interval)

Диапазон значений делится на три примерно одинаковых по ширине интервала.

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

{r} x_frequency <- discretize( x, method = “frequency”, breaks = 3 )

table(x_frequency)

При использовании данного способа границы выбираются таким образом, чтобы в каждом интервале находилось примерно одинаковое количество объектов.

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

{r} x_cluster <- discretize( x, method = “cluster”, breaks = 3 )

table(x_cluster)

Границы интервалов определяются с учётом распределения и структуры исходных данных.

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

{r} x_fixed <- discretize( x, method = “fixed”, breaks = c(1, 3, 5, 7) )

table(x_fixed)

При использовании метода fixed границы интервалов задаются вручную.

Сравним результаты различных методов:

{r} head( data.frame( original = x, interval = x_interval, frequency = x_frequency, cluster = x_cluster, fixed = x_fixed ) )

Вывод:

В результате дискретизации непрерывного признака Petal.Length различными методами были получены разные варианты разбиения диапазона значений на интервалы.

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

Метод кластеризации формирует интервалы с учётом структуры исходных данных. Метод фиксированных границ позволяет самостоятельно задавать интервалы в зависимости от условий задачи.

Задание 4:

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

{r} library(mlbench) library(Boruta)

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

{r} data(Ozone) str(Ozone)

Получим краткую статистическую информацию о наборе данных:

{r} summary(Ozone)

Удалим строки, содержащие пропущенные значения:

{r} oz <- na.omit(Ozone)

Запустим алгоритм Boruta:

{r} set.seed(123)

bor <- Boruta( V4 ~ ., data = oz, doTrace = 1 )

Посмотрим полученный результат:

{r} bor

Извлечём признаки, которые алгоритм определил как значимые:

{r} getSelectedAttributes( bor, withTentative = TRUE )

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

Вывод:

С помощью алгоритма Boruta был выполнен отбор признаков для набора данных Ozone. Алгоритм сравнивает реальные признаки с искусственно созданными теневыми признаками и позволяет определить переменные, обладающие статистически значимой важностью.

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