Задание 1. Разведочный анализ с помощью пакета CARET

Цель: Установить пакет CARET, ознакомиться со списком моделей и выполнить графический разведочный анализ данных.

# Загрузка пакета
library(caret)

# Просмотр списка доступных моделей (первые 20 для примера)
head(names(getModelInfo()), 20)
##  [1] "ada"         "AdaBag"      "AdaBoost.M1" "adaboost"    "amdai"      
##  [6] "ANFIS"       "avNNet"      "awnb"        "awtan"       "bag"        
## [11] "bagEarth"    "bagEarthGCV" "bagFDA"      "bagFDAGCV"   "bam"        
## [16] "bartMachine" "bayesglm"    "binda"       "blackboost"  "blasso"
# Генерация данных, как указано в задании
set.seed(123) # для воспроизводимости
x <- matrix(rnorm(50*5), ncol = 5)
y <- factor(rep(c("A", "B"), 25))

# Присвоим имена столбцам для наглядности
colnames(x) <- paste0("X", 1:5)
df <- as.data.frame(x)
df$Class <- y
# Создание и сохранение графиков в формате .jpg
# 1. График пар (scatterplot matrix)
p1 <- featurePlot(x = df[, 1:5], y = df$Class, plot = "pairs")
jpeg("featurePlot_pairs.jpg", width = 800, height = 800)
print(p1)
dev.off()
## png 
##   2
# 2. График эллипсов разброса
p2 <- featurePlot(x = df[, 1:5], y = df$Class, plot = "ellipse")
jpeg("featurePlot_ellipse.jpg", width = 800, height = 600)
print(p2)
dev.off()
## png 
##   2
# 3. Диаграммы "ящик с усами" (boxplot)
p3 <- featurePlot(x = df[, 1:5], y = df$Class, plot = "box")
jpeg("featurePlot_box.jpg", width = 800, height = 600)
print(p3)
dev.off()
## png 
##   2
# 4. Графики плотности распределения
p4 <- featurePlot(x = df[, 1:5], y = df$Class, plot = "density")
jpeg("featurePlot_density.jpg", width = 800, height = 600)
print(p4)
dev.off()
## png 
##   2
# Отобразим один из графиков для наглядности в отчете
print(p3)

Выводы по заданию 1: Данные были сгенерированы случайным образом. На графиках, таких как “ящик с усами” и графиках плотности, видно, что распределения признаков для классов “A” и “B” сильно перекрываются. Четкого разделения между классами не наблюдается, что говорит о том, что сгенерированные признаки не обладают предсказательной силой для данной задачи классификации.

Задание 2. Оценка важности признаков с помощью пакета FSelector

Цель: Определить важность признаков для набора данных iris с помощью пакета FSelector.

# Загрузка пакета и данных
library(FSelector)
data(iris)
# Расчет важности признаков с помощью Information Gain
weights_info_gain <- information.gain(Species ~ ., data = iris)
print(weights_info_gain)
##              attr_importance
## Sepal.Length       0.4521286
## Sepal.Width        0.2672750
## Petal.Length       0.9402853
## Petal.Width        0.9554360
# Отбор двух наиболее важных признаков
subset <- cutoff.k(weights_info_gain, 2)
f <- as.simple.formula(subset, "Species")
print(f)
## Species ~ Petal.Width + Petal.Length
## <environment: 0x000002184ab16bd8>

Выводы по заданию 2: Анализ важности признаков для набора данных iris показал, что наиболее информативными признаками являются Petal.Width и Petal.Length. Они имеют наибольшие значения Information Gain. Это означает, что ширина и длина лепестка вносят наибольший вклад в различение видов ирисов.

Задание 3. Дискретизация непрерывной переменной с помощью пакета arules

Цель: Преобразовать непрерывную переменную Sepal.Length из набора iris в категориальную разными методами.

# Загрузка пакета и данных
library(arules)
data(iris)
# Выберем непрерывную переменную для дискретизации
sl <- iris$Sepal.Length

# Применим различные методы
# 1. Метод "interval" (равная ширина интервала)
d_int <- discretize(sl, method = "interval", breaks = 3)
print("Равная ширина интервала (interval):")
## [1] "Равная ширина интервала (interval):"
table(d_int)
## d_int
## [4.3,5.5) [5.5,6.7) [6.7,7.9] 
##        52        70        28
# 2. Метод "frequency" (равная частота)
d_freq <- discretize(sl, method = "frequency", breaks = 3)
print("Равная частота (frequency):")
## [1] "Равная частота (frequency):"
table(d_freq)
## d_freq
## [4.3,5.4) [5.4,6.3) [6.3,7.9] 
##        46        53        51
# 3. Метод "cluster" (кластеризация k-means)
d_clust <- discretize(sl, method = "cluster", breaks = 3)
print("Кластеризация (cluster):")
## [1] "Кластеризация (cluster):"
table(d_clust)
## d_clust
##  [4.3,5.42) [5.42,6.39)  [6.39,7.9] 
##          52          56          42
# 4. Метод "fixed" (заданные границы)
d_fixed <- discretize(sl, method = "fixed", breaks = c(4, 5.5, 7, 8))
print("Заданные границы (fixed):")
## [1] "Заданные границы (fixed):"
table(d_fixed)
## d_fixed
## [4,5.5) [5.5,7)   [7,8] 
##      52      85      13

Выводы по заданию 3: Функция discretize() позволяет гибко преобразовывать непрерывные признаки в категориальные. Метод "interval" создает интервалы одинаковой ширины, но в них может попадать разное количество наблюдений. Метод "frequency" стремится создать интервалы с одинаковым количеством наблюдений. Метод "cluster" использует кластеризацию для определения границ. Метод "fixed" позволяет вручную задать границы интервалов, что может быть полезно при наличии экспертных знаний о данных.

Задание 4. Выбор признаков с помощью пакета Boruta

Цель: Провести отбор признаков для набора данных Ozone с помощью алгоритма Boruta.

# Загрузка пакетов и данных
library(Boruta)
library(mlbench)
data("Ozone")

# Удалим пропущенные значения, так как Boruta не работает с ними
ozone_clean <- na.omit(Ozone)
# Запуск алгоритма Boruta
set.seed(123) # для воспроизводимости
boruta_output <- Boruta(V4 ~ ., data = ozone_clean, doTrace = 0)
print(boruta_output)
## Boruta performed 18 iterations in 0.269707 secs.
##  9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
##  3 attributes confirmed unimportant: V2, V3, V6;
# Построение графика boxplot с результатами
plot(boruta_output, cex.axis = 0.7, las = 2, xlab = "", main = "Boruta Feature Selection")

# Получение окончательного решения
final_decision <- attStats(boruta_output)
print(final_decision)
##         meanImp   medianImp      minImp     maxImp   normHits  decision
## V1   0.40660229  0.39874710  0.37208192 0.50361585 1.00000000 Confirmed
## V2   0.04391890  0.03169822 -0.02604472 0.13137821 0.11111111  Rejected
## V3  -0.03235907 -0.04528594 -0.08039941 0.03178173 0.00000000  Rejected
## V5   0.37961385  0.37663333  0.33809868 0.42147363 1.00000000 Confirmed
## V6   0.04740489  0.05979747 -0.01572443 0.12718160 0.05555556  Rejected
## V7   0.51883205  0.50588169  0.46725744 0.59114026 1.00000000 Confirmed
## V8   0.77086858  0.76889989  0.73251688 0.81327051 1.00000000 Confirmed
## V9   0.86915268  0.86432645  0.84273725 0.92413075 1.00000000 Confirmed
## V10  0.42389058  0.41739463  0.38164901 0.49245967 1.00000000 Confirmed
## V11  0.55143690  0.54721914  0.49482770 0.61161304 1.00000000 Confirmed
## V12  0.66051279  0.65832222  0.60234621 0.73958611 1.00000000 Confirmed
## V13  0.42761454  0.42057856  0.38618408 0.46920282 1.00000000 Confirmed

Выводы по заданию 4: Алгоритм Boruta определил, какие признаки в наборе данных Ozone являются действительно важными для предсказания переменной V4. На графике boxplot зеленым цветом показаны важные признаки, красным — неважные, а синим — теневые (используемые для сравнения). Результаты attStats показывают окончательное решение по каждому признаку (Confirmed, Rejected или Tentative). Эти признаки можно использовать для построения более простой и интерпретируемой модели.

Общие выводы

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