Задание 1: Анализ с пакетом CARET

Установка CARET и список методов

if(!require(caret)) {
  install.packages("caret")
  library(caret)
}
## Загрузка требуемого пакета: caret
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
cat("Доступные методы в CARET:\n")
## Доступные методы в CARET:
methods <- names(getModelInfo())
cat("Всего методов:", length(methods), "\n")
## Всего методов: 239
cat("Примеры методов для выбора признаков:\n")
## Примеры методов для выбора признаков:
print(methods[grep("rf|svm|rpart", methods)][1:10])
##  [1] "lssvmLinear" "lssvmPoly"   "lssvmRadial" "ORFsvm"      "qrf"        
##  [6] "rf"          "rfRules"     "rpart"       "rpart1SE"    "rpart2"

Графический анализ и сохранение в JPG

set.seed(123)
x <- matrix(rnorm(50*5), ncol=5)
y <- factor(rep(c("A", "B"), 25))
data <- data.frame(x, y)
colnames(data) <- c("Var1", "Var2", "Var3", "Var4", "Var5", "Class")

# Сохраняем графики в JPG
jpeg("feature_pairs.jpg", width = 800, height = 600)
featurePlot(x = data[,1:5], y = data$Class, plot = "pairs", main = "Pairs Plot")
dev.off()
## png 
##   2
jpeg("feature_box.jpg", width = 800, height = 600)
featurePlot(x = data[,1:5], y = data$Class, plot = "box", main = "Box Plot")
dev.off()
## png 
##   2
jpeg("feature_density.jpg", width = 800, height = 600)
featurePlot(x = data[,1:5], y = data$Class, plot = "density", main = "Density Plot")
dev.off()
## png 
##   2
cat("Графики сохранены в JPG файлы\n")
## Графики сохранены в JPG файлы

Выводы по заданию 1

cat("ВЫВОДЫ по заданию 1:\n")
## ВЫВОДЫ по заданию 1:
cat("1. CARET содержит", length(methods), "методов машинного обучения\n")
## 1. CARET содержит 239 методов машинного обучения
cat("2. Созданы 3 графика: pairs, box и density plot\n") 
## 2. Созданы 3 графика: pairs, box и density plot
cat("3. Графики сохранены в формате JPG\n")
## 3. Графики сохранены в формате JPG
cat("4. Данные содержат 5 нормально распределенных признаков\n")
## 4. Данные содержат 5 нормально распределенных признаков
cat("5. Классы A и B сбалансированы (по 25 наблюдений)\n")
## 5. Классы A и B сбалансированы (по 25 наблюдений)

Задание 2: Важность признаков с FSelector

# Пробуем установить FSelector
tryCatch({
  if(!require(FSelector)) {
    install.packages("FSelector")
    library(FSelector)
  }
  
  data(iris)
  importance <- information.gain(Species ~ ., iris)
  cat("Важность признаков для Iris:\n")
  print(importance)
  
}, error = function(e) {
  cat("FSelector не установился. Используем альтернативный метод:\n")
  
  # Альтернатива: важность через случайный лес
  data(iris)
  if(require(caret)) {
    model <- train(Species ~ ., data = iris, method = "rf")
    imp <- varImp(model)
    print(imp)
  }
})
## Загрузка требуемого пакета: FSelector
## Error: не удалась загрузка пакета или пространства имен для 'FSelector':
## .onLoad не удалось в loadNamespace() для 'rJava', подробности:
##   вызов: fun(libname, pkgname)
##   ошибка: JAVA_HOME cannot be determined from the Registry
## пакет 'FSelector' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\User\AppData\Local\Temp\RtmpOQotel\downloaded_packages
## FSelector не установился. Используем альтернативный метод:
## rf variable importance
## 
##               Overall
## Petal.Width  100.0000
## Petal.Length  91.3547
## Sepal.Width    0.2468
## Sepal.Length   0.0000

Выводы по заданию 2

cat("ВЫВОДЫ по заданию 2:\n")
## ВЫВОДЫ по заданию 2:
cat("1. Для Iris наиболее важны признаки связанные с лепестками (Petal)\n")
## 1. Для Iris наиболее важны признаки связанные с лепестками (Petal)
cat("2. FSelector использует information gain для оценки важности\n")
## 2. FSelector использует information gain для оценки важности
cat("3. При невозможности установки FSelector можно использовать caret\n")
## 3. При невозможности установки FSelector можно использовать caret

Задание 3: Дискретизация с arules

tryCatch({
  if(!require(arules)) {
    install.packages("arules")
    library(arules)
  }
  
  data(iris)
  sl <- iris$Sepal.Length
  
  cat("Метод 'interval' (равная ширина):\n")
  disc1 <- discretize(sl, method = "interval", categories = 4)
  print(table(disc1))
  
  cat("\nМетод 'frequency' (равная частота):\n")
  disc2 <- discretize(sl, method = "frequency", categories = 4) 
  print(table(disc2))
  
  cat("\nМетод 'cluster' (кластеризация):\n")
  disc3 <- discretize(sl, method = "cluster", categories = 4)
  print(table(disc3))
  
  cat("\nМетод 'fixed' (заданные границы):\n")
  disc4 <- discretize(sl, method = "fixed", breaks = c(4, 5.5, 6.5, 7, 8))
  print(table(disc4))
  
}, error = function(e) {
  cat("Arules не установился. Используем базовые функции:\n")
  
  data(iris)
  sl <- iris$Sepal.Length
  
  cat("cut() с равными интервалами:\n")
  print(table(cut(sl, breaks = 4)))
  
  cat("\ncut() с квантилями:\n")
  print(table(cut(sl, breaks = quantile(sl, probs = seq(0,1,0.25)))))
})
## Загрузка требуемого пакета: arules
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : нет пакета под названием 'arules'
## пакет 'arules' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\User\AppData\Local\Temp\RtmpOQotel\downloaded_packages
## Загрузка требуемого пакета: Matrix
## 
## Присоединяю пакет: 'arules'
## Следующие объекты скрыты от 'package:base':
## 
##     abbreviate, write
## Метод 'interval' (равная ширина):
## Warning in discretize(sl, method = "interval", categories = 4): Parameter
## categories is deprecated. Use breaks instead! Also, the default method is now
## frequency!
## disc1
## [4.3,5.2) [5.2,6.1)   [6.1,7)   [7,7.9] 
##        41        48        48        13 
## 
## Метод 'frequency' (равная частота):
## Warning in discretize(sl, method = "frequency", categories = 4): Parameter
## categories is deprecated. Use breaks instead! Also, the default method is now
## frequency!
## disc2
## [4.3,5.1) [5.1,5.8) [5.8,6.4) [6.4,7.9] 
##        32        41        35        42 
## 
## Метод 'cluster' (кластеризация):
## Warning in discretize(sl, method = "cluster", categories = 4): Parameter
## categories is deprecated. Use breaks instead! Also, the default method is now
## frequency!
## disc3
##  [4.3,5.32) [5.32,6.12) [6.12,6.98)  [6.98,7.9] 
##          46          49          42          13 
## 
## Метод 'fixed' (заданные границы):
## disc4
##   [4,5.5) [5.5,6.5)   [6.5,7)     [7,8] 
##        52        63        22        13

Выводы по заданию 3

cat("ВЫВОДЫ по заданию 3:\n")
## ВЫВОДЫ по заданию 3:
cat("1. 'interval' - равная ширина интервалов\n")
## 1. 'interval' - равная ширина интервалов
cat("2. 'frequency' - равное количество наблюдений\n") 
## 2. 'frequency' - равное количество наблюдений
cat("3. 'cluster' - группировка на основе кластеров\n")
## 3. 'cluster' - группировка на основе кластеров
cat("4. 'fixed' - ручное задание границ\n")
## 4. 'fixed' - ручное задание границ
cat("5. Выбор метода зависит от распределения данных\n")
## 5. Выбор метода зависит от распределения данных

Задание 4: Boruta для выбора признаков

tryCatch({
  if(!require(Boruta)) {
    install.packages("Boruta")
    library(Boruta)
  }
  
  data(iris)
  boruta_result <- Boruta(Species ~ ., data = iris, doTrace = 0)
  cat("Результат Boruta для Iris:\n")
  print(boruta_result)
  
  # Boxplot
  jpeg("boruta_plot.jpg", width = 800, height = 600)
  plot(boruta_result, las = 2, main = "Boruta - Важность признаков")
  dev.off()
  
}, error = function(e) {
  cat("Boruta не установился. Используем альтернативный анализ:\n")
  
  data(iris)
  # Простой boxplot для визуализации
  jpeg("iris_boxplot.jpg", width = 800, height = 600)
  par(mfrow = c(2,2))
  for(i in 1:4) {
    boxplot(iris[,i] ~ iris$Species, main = names(iris)[i])
  }
  dev.off()
  cat("Boxplot сохранен в iris_boxplot.jpg\n")
})
## Загрузка требуемого пакета: Boruta
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : нет пакета под названием 'Boruta'
## устанавливаю также зависимости 'RcppEigen', 'ranger'
## пакет 'RcppEigen' успешно распакован, MD5-суммы проверены
## пакет 'ranger' успешно распакован, MD5-суммы проверены
## пакет 'Boruta' успешно распакован, MD5-суммы проверены
## 
## Скачанные бинарные пакеты находятся в
##  C:\Users\User\AppData\Local\Temp\RtmpOQotel\downloaded_packages
## Результат Boruta для Iris:
## Boruta performed 9 iterations in 0.926569 secs.
##  4 attributes confirmed important: Petal.Length, Petal.Width,
## Sepal.Length, Sepal.Width;
##  No attributes deemed unimportant.
## png 
##   2

Выводы по заданию 4

cat("ВЫВОДЫ по заданию 4:\n")
## ВЫВОДЫ по заданию 4:
cat("1. Boruta автоматически определяет значимые признаки\n")
## 1. Boruta автоматически определяет значимые признаки
cat("2. Метод сравниет важность реальных и случайных признаков\n")
## 2. Метод сравниет важность реальных и случайных признаков
cat("3. Boxplot помогает визуализировать различия между классами\n")
## 3. Boxplot помогает визуализировать различия между классами
cat("4. Для Iris все признаки являются значимыми\n")
## 4. Для Iris все признаки являются значимыми

Общие выводы

cat("ОБЩИЕ ВЫВОДЫ:\n")
## ОБЩИЕ ВЫВОДЫ:
cat("1. Освоены методы выбора и анализа признаков\n")
## 1. Освоены методы выбора и анализа признаков
cat("2. Изучены различные подходы к дискретизации\n")
## 2. Изучены различные подходы к дискретизации
cat("3. Получены навыки визуализации и анализа данных\n")
## 3. Получены навыки визуализации и анализа данных
cat("4. Изучены пакеты: caret, FSelector, arules, Boruta\n")
## 4. Изучены пакеты: caret, FSelector, arules, Boruta

Лабораторная работа выполнена с использованием R