Часть 1. CARET и featurePlot()

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

library(caret)
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"

Разведочный анализ с featurePlot()

set.seed(1)
x <- matrix(rnorm(50*5), ncol = 5)
y <- factor(rep(c("A", "B"), 25))
colnames(x) <- paste0("V", 1:5)
featurePlot(x = x, y = y, plot = "pairs")

library(ellipse)
featurePlot(x = x, y = y, plot = "ellipse")

featurePlot(x = x, y = y, plot = "box")

featurePlot(x = x, y = y, plot = "density",
            scales = list(x = list(relation = "free"), y = list(relation = "free")))

Вывод: данные x сгенерированы случайно (rnorm) без связи с меткой y, поэтому на всех графиках классы A и B заметно перекрываются - ни один из 5 признаков не даёт визуального разделения между классами.

Часть 2. FSelectorRcpp и information gain (iris)

library(FSelectorRcpp)
data(iris)

weights <- information_gain(Species ~ ., data = iris)
weights_sorted <- weights[order(-weights$importance), ]
print(weights_sorted)
##     attributes importance
## 4  Petal.Width  0.9554360
## 3 Petal.Length  0.9402853
## 1 Sepal.Length  0.4521286
## 2  Sepal.Width  0.2672750

Вывод: наибольший information gain показывают Petal.Length и Petal.Width - это согласуется с известной структурой датасета iris, где виды разделяются в первую очередь по размерам лепестков, а не чашелистиков.

Часть 3. Дискретизация непрерывных переменных (arules)

library(arules)
data(iris)

disc_interval <- discretize(iris$Sepal.Length, method = "interval", breaks = 3)
table(disc_interval)
## disc_interval
## [4.3,5.5) [5.5,6.7) [6.7,7.9] 
##        52        70        28
disc_frequency <- discretize(iris$Sepal.Length, method = "frequency", breaks = 3)
table(disc_frequency)
## disc_frequency
## [4.3,5.4) [5.4,6.3) [6.3,7.9] 
##        46        53        51
disc_cluster <- discretize(iris$Sepal.Length, method = "cluster", breaks = 3)
table(disc_cluster)
## disc_cluster
##  [4.3,5.33) [5.33,6.27)  [6.27,7.9] 
##          46          53          51
disc_fixed <- discretize(iris$Sepal.Length, method = "fixed",
                          breaks = c(-Inf, 5.5, 6.5, Inf))
table(disc_fixed)
## disc_fixed
## [-Inf,5.5)  [5.5,6.5) [6.5, Inf] 
##         52         63         35

Вывод: метод interval делит диапазон на равные по ширине интервалы, но с неравным числом наблюдений в каждом; frequency - наоборот, старается уравнять число наблюдений в категориях за счёт неравной ширины; cluster группирует значения по естественным сгусткам (k-means в 1D); fixed даёт полный контроль - границы задаются вручную, исходя из предметной логики.

Часть 4. Boruta и отбор признаков (Ozone)

library(Boruta)
library(mlbench)
data("Ozone")

Ozone_clean <- na.omit(Ozone)

set.seed(1)
boruta_result <- Boruta(V4 ~ ., data = Ozone_clean, doTrace = 0)
print(boruta_result)
## Boruta performed 24 iterations in 0.421041 secs.
##  9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
##  3 attributes confirmed unimportant: V2, V3, V6;
plot(boruta_result, las = 2, cex.axis = 0.7)

Вывод: Boruta подтвердил важность 9 из 13 признаков (включая V1, V10V13 и др.), отклонив как незначимые V2, V3 и V6. Это позволяет сократить размерность модели, оставив только признаки, статистически превосходящие случайные “теневые” аналоги.

Общий вывод

В ходе лабораторной работы были рассмотрены различные подходы к отбору и преобразованию признаков в R: визуальный разведочный анализ (caret::featurePlot), оценка важности через information gain (FSelectorRcpp), дискретизация непрерывных переменных (arules::discretize) и алгоритм Boruta для формального отбора значимых признаков. Каждый из методов даёт взаимодополняющую информацию для построения качественных моделей классификации.