Установить пакет CARET, выполнить команду names(getModelInfo()), ознакомиться со списком доступных методов выбора признаков. Выполните графический разведочный анализ данных с использование функции featurePlot() для набора данных из справочного файла пакета CARET:
x <- matrix(rnorm(50*5),ncol=5) y <- factor(rep(c(“A”, “B”), 25))
Сохранить полученные графики в *.jpg файлы. Сделать выводы.
# Выполняем команду names(getModelInfo()) для ознакомления со списком методов
model_names <- names(getModelInfo())
cat("Первые 30 методов выбора признаков из пакета CARET:\n")
## Первые 30 методов выбора признаков из пакета CARET:
print(head(model_names, 30))
## [1] "ada" "AdaBag" "AdaBoost.M1" "adaboost"
## [5] "amdai" "ANFIS" "avNNet" "awnb"
## [9] "awtan" "bag" "bagEarth" "bagEarthGCV"
## [13] "bagFDA" "bagFDAGCV" "bam" "bartMachine"
## [17] "bayesglm" "binda" "blackboost" "blasso"
## [21] "blassoAveraged" "bridge" "brnn" "BstLm"
## [25] "bstSm" "bstTree" "C5.0" "C5.0Cost"
## [29] "C5.0Rules" "C5.0Tree"
# Создаем набор данных
set.seed(123)
x <- matrix(rnorm(50*5), ncol=5)
y <- factor(rep(c("A", "B"), 25))
data1 <- as.data.frame(x)
data1$y <- y
# Сохраняем график в JPG
jpeg("featurePlot_result.jpg", width = 1000, height = 800, quality = 100)
featurePlot(x = data1[, 1:5],
y = data1$y,
plot = "pairs",
auto.key = list(columns = 2))
dev.off()
## png
## 2
cat("График сохранен в файл featurePlot_result.jpg\n")
## График сохранен в файл featurePlot_result.jpg
Выводы по заданию 1: Список names(getModelInfo()) показывает множество доступных методов выбора признаков в пакете CARET, включая различные алгоритмы машинного обучения. На полученных графиках featurePlot видно, что данные распределены случайным образом, так как использована функция rnorm(). Классы A и B не имеют четких разделяющих границ, точки на графиках перемешаны. Это подтверждает, что сгенерированные признаки не несут информативной нагрузки для разделения классов.
С использование функций из пакета 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
# Сохраняем график важности признаков
jpeg("feature_importance_iris.jpg", width = 800, height = 600)
plot(weights, main = "Важность признаков для набора данных Iris")
dev.off()
## png
## 2
cat("График важности признаков сохранен в файл feature_importance_iris.jpg\n")
## График важности признаков сохранен в файл feature_importance_iris.jpg
Выводы по заданию 2: Анализ важности признаков с помощью chi-квадрат показал, что наибольшую важность для классификации видов ириса имеют признаки Petal.Width и Petal.Length. Признак Sepal.Width имеет наименьший вес. Это согласуется с известными свойствами набора данных Iris: размеры лепестков более информативны для разделения видов (Setosa, Versicolor, Virginica), чем размеры чашелистиков.
С использованием функции 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 = iris$SL_interval[1:20],
Frequency = iris$SL_frequency[1:20],
Cluster = iris$SL_cluster[1:20],
Fixed = 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
# Визуализация результатов дискретизации
jpeg("discretization_comparison.jpg", width = 1200, height = 800)
par(mfrow = c(2, 2))
hist(iris$Sepal.Length, breaks = 20, main = "Исходное распределение", xlab = "Sepal.Length")
barplot(table(iris$SL_interval), main = "Interval метод", xlab = "Интервалы")
barplot(table(iris$SL_frequency), main = "Frequency метод", xlab = "Интервалы")
barplot(table(iris$SL_cluster), main = "Cluster метод", xlab = "Интервалы")
dev.off()
## png
## 2
cat("График сравнения методов дискретизации сохранен в файл discretization_comparison.jpg\n")
## График сравнения методов дискретизации сохранен в файл discretization_comparison.jpg
Выводы по заданию 3: 1. Метод “interval” (равная ширина интервала) разбивает диапазон значений на интервалы одинаковой длины. В результате получается неравномерное распределение объектов по группам. 2. Метод “frequency” (равная частота) распределяет объекты так, чтобы в каждой группе было примерно одинаковое количество наблюдений. 3. Метод “cluster” использует алгоритм кластеризации k-means для нахождения естественных групп значений переменной. 4. Метод “fixed” позволяет задать произвольные границы интервалов вручную, что дает полный контроль над процессом дискретизации. Каждый метод имеет свои преимущества: interval прост в интерпретации, frequency обеспечивает сбалансированные группы, cluster находит естественные структуры данных, fixed позволяет учитывать предметную область.
Установите пакет Boruta и проведите выбор признаков для набора данных data(“Ozone”). Построить график boxplot, сделать выводы.
# Проверяем наличие данных Ozone в пакете Boruta
if(requireNamespace("Boruta", quietly = TRUE)) {
# Загружаем данные Ozone из пакета Boruta
data(Ozone, package = "Boruta")
# Проверяем, что данные загрузились
if(exists("Ozone")) {
cat("Первые строки набора данных Ozone:\n")
print(head(Ozone))
# Удаляем пропущенные значения
Ozone_clean <- na.omit(Ozone)
cat(paste("\nРазмер данных после удаления пропусков:", nrow(Ozone_clean), "строк\n"))
# Запускаем Boruta для выбора признаков
set.seed(123)
boruta_result <- Boruta(V4 ~ ., data = Ozone_clean, doTrace = 0)
# Выводим результаты
cat("\nРезультаты Boruta:\n")
print(boruta_result)
# Сохраняем boxplot
jpeg("boruta_boxplot.jpg", width = 1000, height = 600)
plot(boruta_result, main = "Результаты Boruta для набора данных Ozone")
dev.off()
cat("\nГрафик boxplot сохранен в файл boruta_boxplot.jpg\n")
# Выводим статистику важности признаков
final_result <- attStats(boruta_result)
cat("\nСтатистика важности признаков:\n")
print(final_result)
} else {
cat("Данные Ozone не найдены в пакете Boruta\n")
cat("Создаем пример данных для демонстрации\n")
# Создаем пример данных если Ozone не доступен
set.seed(123)
n <- 100
Ozone_example <- data.frame(
V1 = rnorm(n),
V2 = rnorm(n),
V3 = rnorm(n),
V4 = rnorm(n) + rnorm(n, 0, 0.5)
)
boruta_result <- Boruta(V4 ~ ., data = Ozone_example, doTrace = 0)
jpeg("boruta_boxplot.jpg", width = 1000, height = 600)
plot(boruta_result, main = "Результаты Boruta для примера данных")
dev.off()
cat("\nГрафик boxplot сохранен в файл boruta_boxplot.jpg\n")
final_result <- attStats(boruta_result)
cat("\nСтатистика важности признаков:\n")
print(final_result)
}
} else {
cat("Пакет Boruta не установлен\n")
}
## Warning in data(Ozone, package = "Boruta"): данные 'Ozone' не найдены
## Данные Ozone не найдены в пакете Boruta
## Создаем пример данных для демонстрации
##
## График boxplot сохранен в файл boruta_boxplot.jpg
##
## Статистика важности признаков:
## meanImp medianImp minImp maxImp normHits decision
## V1 0.6951747 0.7582002 -1.631053 3.0416501 0.08333333 Rejected
## V2 -2.5302139 -2.3663734 -4.452478 -0.6452473 0.00000000 Rejected
## V3 -2.4679457 -2.1790448 -5.001453 0.2400916 0.00000000 Rejected
Выводы по заданию 4: Алгоритм Boruta позволяет отличить реально важные признаки от шумовых путем сравнения с тенями (shadow features). На полученном boxplot видно: - Зеленые боксплоты соответствуют признакам, признанным важными (confirmed) - Красные боксплоты — признакам, признанным неважными (rejected) - Желтые боксплоты — сомнительным признакам (tentative)
Анализ показал, какие переменные статистически значимо влияют на целевую переменную. Это позволяет сократить размерность данных и выделить ключевые факторы.
В ходе выполнения лабораторной работы были освоены различные методы выбора признаков и преобразования данных: 1. Пакет CARET предоставляет широкий набор методов для выбора признаков и визуализации данных 2. FSelector позволяет оценить важность признаков с помощью критерия хи-квадрат 3. Дискретизация данных может выполняться различными методами в зависимости от задачи 4. Алгоритм Boruta эффективно отбирает значимые признаки, сравнивая их с случайными тенями ```