Цель: Установить пакет 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” сильно перекрываются. Четкого разделения между классами не наблюдается, что говорит о том, что сгенерированные признаки не обладают предсказательной силой для данной задачи классификации.
Цель: Определить важность признаков для набора
данных 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. Это означает, что ширина и длина лепестка вносят наибольший вклад
в различение видов ирисов.
Цель: Преобразовать непрерывную переменную
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" позволяет вручную задать границы интервалов, что
может быть полезно при наличии экспертных знаний о данных.
Цель: Провести отбор признаков для набора данных
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.