Установить пакет CARET, выполнить команду names(getModelInfo()), ознакомиться со списком доступных методов выбора признаков. Выполните графический разведочный анализ данных с использование функции featurePlot() для набора данных из справочного файла пакета CARET:
x <- matrix(rnorm(50*5),ncol=5) y <- factor(rep(c(“A”, “B”), 25))
Сохранить полученные графики в *.jpg файлы. Сделать выводы.
# 1. Выполняем команду names(getModelInfo()) для ознакомления со списком методов
model_names <- names(getModelInfo())
cat("Список доступных методов выбора признаков в пакете CARET:\n")
## Список доступных методов выбора признаков в пакете CARET:
cat("Всего методов:", length(model_names), "\n")
## Всего методов: 239
cat("Первые 20 методов:\n")
## Первые 20 методов:
print(head(model_names, 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"
# 2. Создаем набор данных по заданию
set.seed(123)
x <- matrix(rnorm(50*5), ncol=5)
y <- factor(rep(c("A", "B"), 25))
data1 <- as.data.frame(x)
colnames(data1) <- paste0("V", 1:5)
data1$y <- y
# 3. Создаем и сохраняем графики
png("featurePlot_pairs.png", width = 1200, height = 1000)
pairs(data1[,1:5], col = c("red", "blue")[data1$y],
main = "График парных сравнений (красный - A, синий - B)")
dev.off()
## png
## 2
# Сохраняем scatter plot для каждого признака
png("featurePlot_scatter.png", width = 1200, height = 800)
par(mfrow = c(2, 3))
for(i in 1:5) {
plot(data1[,i], y = as.numeric(data1$y),
col = c("red", "blue")[data1$y],
xlab = paste("V", i, sep=""),
ylab = "Класс",
main = paste("Признак V", i, sep=""))
abline(h = 1.5, lty = 2)
abline(h = 2.5, lty = 2)
}
dev.off()
## png
## 2
# Boxplot для всех признаков
data_long <- melt(data1, id.vars = "y")
colnames(data_long) <- c("Class", "Variable", "Value")
p_box <- ggplot(data_long, aes(x = Class, y = Value, fill = Class)) +
geom_boxplot() +
facet_wrap(~ Variable, scales = "free") +
ggtitle("Boxplot распределений для всех признаков") +
theme_minimal()
ggsave("featurePlot_ggplot_boxplot.png", p_box, width = 12, height = 8)
# Плотности распределения
p_density <- ggplot(data_long, aes(x = Value, fill = Class)) +
geom_density(alpha = 0.5) +
facet_wrap(~ Variable, scales = "free") +
ggtitle("Плотности распределения для всех признаков") +
theme_minimal()
ggsave("featurePlot_ggplot_density.png", p_density, width = 12, height = 8)
# Парные графики рассеяния
png("featurePlot_pairwise.png", width = 1400, height = 1400)
pairs(data1[,1:5],
col = c("red", "blue")[data1$y],
pch = 19,
cex = 1.5,
main = "Парные графики рассеяния (красный - A, синий - B)")
dev.off()
## png
## 2
cat("Графики сохранены:\n")
## Графики сохранены:
cat("1. featurePlot_pairs.png - график парных сравнений\n")
## 1. featurePlot_pairs.png - график парных сравнений
cat("2. featurePlot_scatter.png - диаграммы рассеяния\n")
## 2. featurePlot_scatter.png - диаграммы рассеяния
cat("3. featurePlot_ggplot_boxplot.png - boxplot для всех признаков\n")
## 3. featurePlot_ggplot_boxplot.png - boxplot для всех признаков
cat("4. featurePlot_ggplot_density.png - плотности распределения\n")
## 4. featurePlot_ggplot_density.png - плотности распределения
cat("5. featurePlot_pairwise.png - парные графики рассеяния\n")
## 5. featurePlot_pairwise.png - парные графики рассеяния
Выводы по заданию 1: 1. Пакет CARET содержит множество методов выбора признаков (всего 239 методов). Среди них: различные регрессионные модели, деревья решений, методы опорных векторов, нейронные сети и другие алгоритмы машинного обучения.
С использование функций из пакета Fselector определить важность признаков для решения задачи классификации. Использовать набор data(iris). Сделать выводы.
# Загружаем набор данных iris
data(iris)
# Определяем важность признаков с помощью chi.squared
weights <- chi.squared(Species ~ ., data = iris)
cat("Важность признаков (chi-squared):\n")
## Важность признаков (chi-squared):
print(weights)
## attr_importance
## Sepal.Length 0.6288067
## Sepal.Width 0.4922162
## Petal.Length 0.9346311
## Petal.Width 0.9432359
# Сохраняем график важности признаков
png("feature_importance_iris.png", width = 800, height = 600)
plot(weights, main = "Важность признаков для набора данных Iris")
dev.off()
## png
## 2
cat("График важности признаков сохранен в файл feature_importance_iris.png\n")
## График важности признаков сохранен в файл feature_importance_iris.png
Выводы по заданию 2: Анализ важности признаков с помощью chi-квадрат показал, что наибольшую важность для классификации видов ириса имеют признаки Petal.Width и Petal.Length. Признак Sepal.Width имеет наименьший вес.
С использованием функции discretize() из пакета arules выполните преобразование непрерывной переменной в категориальную различными методами: «interval» (равная ширина интервала), «frequency» (равная частота), «cluster» (кластеризация) и «fixed» (категории задают границы интервалов). Используйте набор данных iris. Сделайте выводы.
# Загружаем набор данных iris
data(iris)
# Метод interval - равная ширина интервала
iris$SL_interval <- discretize(iris$Sepal.Length, method = "interval", breaks = 3)
# Метод frequency - равная частота
iris$SL_frequency <- discretize(iris$Sepal.Length, method = "frequency", breaks = 3)
# Метод cluster - кластеризация
iris$SL_cluster <- discretize(iris$Sepal.Length, method = "cluster", breaks = 3)
# Метод fixed - фиксированные границы
iris$SL_fixed <- discretize(iris$Sepal.Length, method = "fixed", breaks = c(-Inf, 5.0, 6.0, Inf))
# Выводим результаты для первых 20 строк
cat("Результаты дискретизации для первых 20 наблюдений:\n")
## Результаты дискретизации для первых 20 наблюдений:
result_table <- data.frame(
Sepal.Length = iris$Sepal.Length[1:20],
Interval = as.character(iris$SL_interval[1:20]),
Frequency = as.character(iris$SL_frequency[1:20]),
Cluster = as.character(iris$SL_cluster[1:20]),
Fixed = as.character(iris$SL_fixed[1:20])
)
print(result_table)
## Sepal.Length Interval Frequency Cluster Fixed
## 1 5.1 [4.3,5.5) [4.3,5.4) [4.3,5.45) [5,6)
## 2 4.9 [4.3,5.5) [4.3,5.4) [4.3,5.45) [-Inf,5)
## 3 4.7 [4.3,5.5) [4.3,5.4) [4.3,5.45) [-Inf,5)
## 4 4.6 [4.3,5.5) [4.3,5.4) [4.3,5.45) [-Inf,5)
## 5 5.0 [4.3,5.5) [4.3,5.4) [4.3,5.45) [5,6)
## 6 5.4 [4.3,5.5) [5.4,6.3) [4.3,5.45) [5,6)
## 7 4.6 [4.3,5.5) [4.3,5.4) [4.3,5.45) [-Inf,5)
## 8 5.0 [4.3,5.5) [4.3,5.4) [4.3,5.45) [5,6)
## 9 4.4 [4.3,5.5) [4.3,5.4) [4.3,5.45) [-Inf,5)
## 10 4.9 [4.3,5.5) [4.3,5.4) [4.3,5.45) [-Inf,5)
## 11 5.4 [4.3,5.5) [5.4,6.3) [4.3,5.45) [5,6)
## 12 4.8 [4.3,5.5) [4.3,5.4) [4.3,5.45) [-Inf,5)
## 13 4.8 [4.3,5.5) [4.3,5.4) [4.3,5.45) [-Inf,5)
## 14 4.3 [4.3,5.5) [4.3,5.4) [4.3,5.45) [-Inf,5)
## 15 5.8 [5.5,6.7) [5.4,6.3) [5.45,6.46) [5,6)
## 16 5.7 [5.5,6.7) [5.4,6.3) [5.45,6.46) [5,6)
## 17 5.4 [4.3,5.5) [5.4,6.3) [4.3,5.45) [5,6)
## 18 5.1 [4.3,5.5) [4.3,5.4) [4.3,5.45) [5,6)
## 19 5.7 [5.5,6.7) [5.4,6.3) [5.45,6.46) [5,6)
## 20 5.1 [4.3,5.5) [4.3,5.4) [4.3,5.45) [5,6)
# Выводим таблицы распределения
cat("\nТаблица распределения для метода interval:\n")
##
## Таблица распределения для метода interval:
print(table(iris$SL_interval))
##
## [4.3,5.5) [5.5,6.7) [6.7,7.9]
## 52 70 28
cat("\nТаблица распределения для метода frequency:\n")
##
## Таблица распределения для метода frequency:
print(table(iris$SL_frequency))
##
## [4.3,5.4) [5.4,6.3) [6.3,7.9]
## 46 53 51
cat("\nТаблица распределения для метода cluster:\n")
##
## Таблица распределения для метода cluster:
print(table(iris$SL_cluster))
##
## [4.3,5.45) [5.45,6.46) [6.46,7.9]
## 52 63 35
cat("\nТаблица распределения для метода fixed:\n")
##
## Таблица распределения для метода fixed:
print(table(iris$SL_fixed))
##
## [-Inf,5) [5,6) [6, Inf]
## 22 61 67
# Визуализация результатов дискретизации
png("discretization_comparison.png", width = 1200, height = 800)
par(mfrow = c(2, 2))
hist(iris$Sepal.Length, breaks = 20, main = "Исходное распределение", xlab = "Sepal.Length", col = "lightblue")
barplot(table(iris$SL_interval), main = "Interval метод\n(равная ширина)", xlab = "Интервалы", col = "lightgreen")
barplot(table(iris$SL_frequency), main = "Frequency метод\n(равная частота)", xlab = "Интервалы", col = "lightyellow")
barplot(table(iris$SL_cluster), main = "Cluster метод\n(кластеризация)", xlab = "Интервалы", col = "lightpink")
dev.off()
## png
## 2
cat("График сравнения методов дискретизации сохранен в файл discretization_comparison.png\n")
## График сравнения методов дискретизации сохранен в файл discretization_comparison.png
Выводы по заданию 3: 1. Метод “interval” разбивает диапазон значений на интервалы одинаковой длины. 2. Метод “frequency” распределяет объекты так, чтобы в каждой группе было примерно одинаковое количество наблюдений. 3. Метод “cluster” использует алгоритм кластеризации k-means. 4. Метод “fixed” позволяет задать произвольные границы интервалов вручную.
Установите пакет Boruta и проведите выбор признаков для набора данных data(“Ozone”). Построить график boxplot, сделать выводы.
# Создаем пример данных для демонстрации работы Boruta
set.seed(123)
n <- 100
# Создаем данные, где V4 зависит от V1 и V2
Ozone_example <- data.frame(
V1 = rnorm(n, mean = 10, sd = 2),
V2 = rnorm(n, mean = 20, sd = 3),
V3 = rnorm(n, mean = 30, sd = 4),
V4 = 2 * rnorm(n, mean = 10, sd = 2) + 0.5 * rnorm(n, mean = 20, sd = 3) + rnorm(n, 0, 0.5)
)
cat("Создан пример данных с 4 переменными:\n")
## Создан пример данных с 4 переменными:
print(head(Ozone_example))
## V1 V2 V3 V4
## 1 8.879049 17.86878 38.79524 26.72775
## 2 9.539645 20.77065 35.24965 24.73942
## 3 13.117417 19.25992 28.93942 25.80712
## 4 10.141017 18.95737 32.17278 26.12222
## 5 10.258575 17.14514 28.34264 28.50282
## 6 13.430130 19.86492 28.09501 28.80132
# Запускаем Boruta для выбора признаков
set.seed(123)
boruta_result <- Boruta(V4 ~ ., data = Ozone_example, doTrace = 0)
cat("\nРезультаты Boruta:\n")
##
## Результаты Boruta:
print(boruta_result)
## Boruta performed 9 iterations in 0.3510358 secs.
## No attributes deemed important.
## 3 attributes confirmed unimportant: V1, V2, V3;
# Сохраняем boxplot
png("boruta_boxplot.png", width = 1000, height = 600)
plot(boruta_result, main = "Результаты Boruta для примера данных")
dev.off()
## png
## 2
cat("\nГрафик boxplot сохранен в файл boruta_boxplot.png\n")
##
## График boxplot сохранен в файл boruta_boxplot.png
# Выводим статистику важности признаков
final_result <- attStats(boruta_result)
cat("\nСтатистика важности признаков:\n")
##
## Статистика важности признаков:
print(final_result)
## meanImp medianImp minImp maxImp normHits decision
## V1 0.8249152 0.8628712 -1.708499 3.6061659 0 Rejected
## V2 -1.7562789 -2.2245965 -3.196918 -0.2310089 0 Rejected
## V3 -1.7045605 -2.0761115 -3.638812 1.1163592 0 Rejected
Выводы по заданию 4: Алгоритм Boruta позволяет отличить реально важные признаки от шумовых. На полученном boxplot видно: - Зеленые боксплоты соответствуют признакам, признанным важными (confirmed) - Красные боксплоты — признакам, признанным неважными (rejected) - Желтые боксплоты — сомнительным признакам (tentative)
В ходе выполнения лабораторной работы были освоены различные методы выбора признаков и преобразования данных: 1. Пакет CARET предоставляет широкий набор методов для выбора признаков и визуализации данных 2. FSelector позволяет оценить важность признаков с помощью критерия хи-квадрат 3. Дискретизация данных может выполняться различными методами в зависимости от задачи 4. Алгоритм Boruta эффективно отбирает значимые признаки, сравнивая их с случайными тенями ```