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"
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 признаков не
даёт визуального разделения между классами.
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, где виды разделяются в первую
очередь по размерам лепестков, а не чашелистиков.
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
даёт полный контроль - границы задаются вручную, исходя из предметной
логики.
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, V10–V13 и др.),
отклонив как незначимые V2, V3 и
V6. Это позволяет сократить размерность модели, оставив
только признаки, статистически превосходящие случайные “теневые”
аналоги.
В ходе лабораторной работы были рассмотрены различные подходы к
отбору и преобразованию признаков в R: визуальный разведочный анализ
(caret::featurePlot), оценка важности через information
gain (FSelectorRcpp), дискретизация непрерывных переменных
(arules::discretize) и алгоритм Boruta для формального
отбора значимых признаков. Каждый из методов даёт взаимодополняющую
информацию для построения качественных моделей классификации.