Введение

Этот отчет показывает ход и результаты выполнения лабораторной работы №2 по дисциплине «Анализ данных».

В работе используются пакеты caret, FSelector, arules, Boruta и mlbench.

Задание №1

Условие

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

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

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

Выполнение задания

# Если пакет не установлен, один раз выполнить в консоли:
# install.packages("caret")

library(caret)

models <- names(getModelInfo())
head(models)
## [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))

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

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

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

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

Вывод по заданию №1

В ходе выполнения задания был установлен и подключен пакет caret. Команда names(getModelInfo()) позволяет вывести список доступных моделей машинного обучения, которые поддерживаются данным пакетом.

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

Так как данные были сгенерированы случайным образом, четкого разделения между классами не наблюдается.

Задание №2

Условие

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

Выполнение задания

# Если пакет не установлен, один раз выполнить в консоли:
# install.packages("FSelector")

library(FSelector)

data(iris)

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

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

Вывод по заданию №2

Функция information.gain() из пакета FSelector позволяет оценить важность признаков для решения задачи классификации.

По результатам анализа видно, что наиболее важными признаками для классификации видов ирисов являются Petal.Width и Petal.Length. Эти признаки имеют наибольшие значения информативности. Наименьшую важность имеет признак Sepal.Width.

Это означает, что характеристики лепестков лучше разделяют классы в наборе данных iris, чем характеристики чашелистиков.

Задание №3

Условие

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

  • interval — равная ширина интервала;
  • frequency — равная частота;
  • cluster — кластеризация;
  • fixed — категории задают границы интервалов.

Использовать набор данных iris. Сделать выводы.

Выполнение задания

# Если пакет не установлен, один раз выполнить в консоли:
# install.packages("arules")

library(arules)

data(iris)

iris_discretized <- iris

iris_discretized$Sepal.Length_interval <- 
  discretize(iris_discretized$Sepal.Length, method = "interval", breaks = 3)

iris_discretized$Sepal.Length_frequency <- 
  discretize(iris_discretized$Sepal.Length, method = "frequency", breaks = 3)

iris_discretized$Sepal.Length_cluster <- 
  discretize(iris_discretized$Sepal.Length, method = "cluster", breaks = 3)

iris_discretized$Sepal.Length_fixed <- 
  discretize(iris_discretized$Sepal.Length, method = "fixed", breaks = c(-Inf, 5, 6, Inf))

head(iris_discretized)
##   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
##   Sepal.Length_interval Sepal.Length_frequency Sepal.Length_cluster
## 1             [4.3,5.5)              [4.3,5.4)           [4.3,5.33)
## 2             [4.3,5.5)              [4.3,5.4)           [4.3,5.33)
## 3             [4.3,5.5)              [4.3,5.4)           [4.3,5.33)
## 4             [4.3,5.5)              [4.3,5.4)           [4.3,5.33)
## 5             [4.3,5.5)              [4.3,5.4)           [4.3,5.33)
## 6             [4.3,5.5)              [5.4,6.3)          [5.33,6.27)
##   Sepal.Length_fixed
## 1              [5,6)
## 2           [-Inf,5)
## 3           [-Inf,5)
## 4           [-Inf,5)
## 5              [5,6)
## 6              [5,6)
table(iris_discretized$Sepal.Length_interval)
## 
## [4.3,5.5) [5.5,6.7) [6.7,7.9] 
##        52        70        28
table(iris_discretized$Sepal.Length_frequency)
## 
## [4.3,5.4) [5.4,6.3) [6.3,7.9] 
##        46        53        51
table(iris_discretized$Sepal.Length_cluster)
## 
##  [4.3,5.33) [5.33,6.27)  [6.27,7.9] 
##          46          53          51
table(iris_discretized$Sepal.Length_fixed)
## 
## [-Inf,5)    [5,6) [6, Inf] 
##       22       61       67

Вывод по заданию №3

Метод interval разбивает значения на интервалы одинаковой ширины. Этот метод простой, но он не учитывает фактическое распределение значений.

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

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

Метод fixed использует заранее заданные границы интервалов. Он удобен в тех случаях, когда исследователь заранее знает, какие значения нужно считать низкими, средними или высокими.

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

Задание №4

Условие

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

Выполнение задания

# Если пакеты не установлены, один раз выполнить в консоли:
# install.packages("Boruta")
# install.packages("mlbench")

library(Boruta)
library(mlbench)

data("Ozone")

Ozone_clean <- na.omit(Ozone)

str(Ozone_clean)
## 'data.frame':    203 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",..: 5 6 7 8 9 12 13 14 15 16 ...
##  $ V3 : Factor w/ 7 levels "1","2","3","4",..: 1 2 3 4 5 1 2 3 4 5 ...
##  $ V4 : num  5 6 4 4 6 6 5 4 4 7 ...
##  $ V5 : num  5760 5720 5790 5790 5700 5720 5760 5780 5830 5870 ...
##  $ V6 : num  3 4 6 3 3 3 6 6 3 2 ...
##  $ V7 : num  51 69 19 25 73 44 33 19 19 19 ...
##  $ V8 : num  54 35 45 55 41 51 51 54 58 61 ...
##  $ V9 : num  45.3 49.6 46.4 52.7 48 ...
##  $ V10: num  1450 1568 2631 554 2083 ...
##  $ V11: num  25 15 -33 -28 23 9 -44 -44 -53 -67 ...
##  $ V12: num  57 53.8 54.1 64.8 52.5 ...
##  $ V13: num  60 60 100 250 120 150 40 200 250 200 ...
##  - attr(*, "na.action")= 'omit' Named int [1:163] 1 2 3 4 10 11 17 18 20 24 ...
##   ..- attr(*, "names")= chr [1:163] "1" "2" "3" "4" ...
set.seed(123)

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

boruta_output
## Boruta performed 18 iterations in 1.338963 secs.
##  9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
##  3 attributes confirmed unimportant: V2, V3, V6;
plot(boruta_output, las = 2, cex.axis = 0.7, main = "Boruta feature importance")

boxplot(
  Ozone_clean$V4 ~ Ozone_clean$V1,
  main = "Boxplot of Ozone levels by V1",
  xlab = "V1",
  ylab = "Ozone"
)

Вывод по заданию №4

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

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

График Boruta показывает распределение важности признаков. Чем выше расположена переменная на графике, тем больше ее вклад. График boxplot позволяет визуально оценить распределение значений целевой переменной V4 в зависимости от признака V1.

Задание №5

Условие

Всю представленную работу собрать в единый файл RMarkdown. Опубликовать его на RPubs. В качестве отчета о лабораторной работе представить ссылку на полученный файл.

Выполнение задания

Работа была оформлена в виде единого файла RMarkdown. После выполнения команды Knit был получен HTML-документ, который можно опубликовать на RPubs.

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

Общий вывод по лабораторной работе

В результате выполнения лабораторной работы были изучены базовые возможности пакетов caret, FSelector, arules и Boruta.

С помощью пакета caret был выполнен графический разведочный анализ данных. С помощью пакета FSelector была определена важность признаков для набора данных iris. С помощью пакета arules была выполнена дискретизация непрерывной переменной различными методами. С помощью пакета Boruta был проведен отбор признаков для набора данных Ozone.

Лабораторная работа позволила получить практические навыки работы с методами анализа данных и отбора признаков в языке R.