Задание 1

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

Задание 2

С использование функций из пакета 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
График важности признаков для Iris
График важности признаков для Iris

Выводы по заданию 2: Анализ важности признаков с помощью chi-квадрат показал, что наибольшую важность для классификации видов ириса имеют признаки Petal.Width и Petal.Length. Признак Sepal.Width имеет наименьший вес. Это согласуется с известными свойствами набора данных Iris: размеры лепестков более информативны для разделения видов (Setosa, Versicolor, Virginica), чем размеры чашелистиков.

Задание 3

С использованием функции 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 позволяет учитывать предметную область.

Задание 4

Установите пакет 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
Результаты Boruta
Результаты Boruta

Выводы по заданию 4: Алгоритм Boruta позволяет отличить реально важные признаки от шумовых путем сравнения с тенями (shadow features). На полученном boxplot видно: - Зеленые боксплоты соответствуют признакам, признанным важными (confirmed) - Красные боксплоты — признакам, признанным неважными (rejected) - Желтые боксплоты — сомнительным признакам (tentative)

Анализ показал, какие переменные статистически значимо влияют на целевую переменную. Это позволяет сократить размерность данных и выделить ключевые факторы.

Общие выводы по лабораторной работе

В ходе выполнения лабораторной работы были освоены различные методы выбора признаков и преобразования данных: 1. Пакет CARET предоставляет широкий набор методов для выбора признаков и визуализации данных 2. FSelector позволяет оценить важность признаков с помощью критерия хи-квадрат 3. Дискретизация данных может выполняться различными методами в зависимости от задачи 4. Алгоритм Boruta эффективно отбирает значимые признаки, сравнивая их с случайными тенями ```