Этот отчет показывает ход и результаты выполнения лабораторной работы №2 по дисциплине «Анализ данных».
В работе используются пакеты caret,
FSelector, arules, Boruta и
mlbench.
Установить пакет 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
В ходе выполнения задания был установлен и подключен пакет
caret. Команда names(getModelInfo()) позволяет
вывести список доступных моделей машинного обучения, которые
поддерживаются данным пакетом.
С помощью функции featurePlot() были построены графики
для визуального анализа признаков. График pairs показывает
попарные зависимости между признаками. График density
позволяет сравнить распределение значений признаков для классов
A и B. График box показывает
распределение значений признаков по классам.
Так как данные были сгенерированы случайным образом, четкого разделения между классами не наблюдается.
С использованием функций из пакета 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
Функция information.gain() из пакета
FSelector позволяет оценить важность признаков для решения
задачи классификации.
По результатам анализа видно, что наиболее важными признаками для
классификации видов ирисов являются Petal.Width и
Petal.Length. Эти признаки имеют наибольшие значения
информативности. Наименьшую важность имеет признак
Sepal.Width.
Это означает, что характеристики лепестков лучше разделяют классы в
наборе данных iris, чем характеристики чашелистиков.
С использованием функции 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
Метод interval разбивает значения на интервалы
одинаковой ширины. Этот метод простой, но он не учитывает фактическое
распределение значений.
Метод frequency формирует интервалы так, чтобы в них
было примерно одинаковое количество наблюдений. Такой способ полезен,
если важно получить более равномерное распределение объектов по
группам.
Метод cluster использует кластеризацию и подбирает
интервалы с учетом структуры данных. Этот метод является более гибким,
так как учитывает особенности распределения значений.
Метод fixed использует заранее заданные границы
интервалов. Он удобен в тех случаях, когда исследователь заранее знает,
какие значения нужно считать низкими, средними или высокими.
В результате непрерывная переменная Sepal.Length была
преобразована в категориальную разными способами.
Установить пакет 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"
)
Пакет Boruta используется для отбора значимых признаков.
Он помогает определить, какие переменные оказывают существенное влияние
на целевой признак.
В результате работы алгоритма Boruta часть признаков была подтверждена как важная, а часть признаков была признана неважной. Это позволяет сократить количество переменных и оставить только те признаки, которые действительно полезны для анализа.
График Boruta показывает распределение важности признаков. Чем выше
расположена переменная на графике, тем больше ее вклад. График
boxplot позволяет визуально оценить распределение значений
целевой переменной V4 в зависимости от признака
V1.
Всю представленную работу собрать в единый файл RMarkdown. Опубликовать его на RPubs. В качестве отчета о лабораторной работе представить ссылку на полученный файл.
Работа была оформлена в виде единого файла RMarkdown. После
выполнения команды Knit был получен HTML-документ, который
можно опубликовать на RPubs.
Для публикации необходимо нажать кнопку Publish, выбрать
сервис RPubs, указать название и описание публикации, после
чего скопировать полученную ссылку.
В результате выполнения лабораторной работы были изучены базовые
возможности пакетов caret, FSelector,
arules и Boruta.
С помощью пакета caret был выполнен графический
разведочный анализ данных. С помощью пакета FSelector была
определена важность признаков для набора данных iris. С
помощью пакета arules была выполнена дискретизация
непрерывной переменной различными методами. С помощью пакета
Boruta был проведен отбор признаков для набора данных
Ozone.
Лабораторная работа позволила получить практические навыки работы с методами анализа данных и отбора признаков в языке R.