1. Установка пакетов и разведочный анализ

library(caret)
library(FSelectorRcpp)
library(arules)
library(Boruta)
library(mlbench)

set.seed(123)

x <- matrix(rnorm(50*5), ncol = 5)
colnames(x) <- paste0("X", 1:5)

y <- factor(rep(c("A", "B"), 25))

str(x)
##  num [1:50, 1:5] -0.5605 -0.2302 1.5587 0.0705 0.1293 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:5] "X1" "X2" "X3" "X4" ...
str(y)
##  Factor w/ 2 levels "A","B": 1 2 1 2 1 2 1 2 1 2 ...

График плотности

jpeg("feature_plot_density.jpg", width = 800, height = 600)
featurePlot(x, y, plot = "density", auto.key = list(columns = 2))
dev.off()
## png 
##   2
featurePlot(x, y, plot = "density", main = "График плотности")

Ящик с усами

jpeg("feature_plot_box.jpg", width = 800, height = 600)
featurePlot(x, y, plot = "box", auto.key = list(columns = 2))
dev.off()
## png 
##   2
featurePlot(x, y, plot = "box", main = "Ящик с усами")

Матрица рассеяния

jpeg("feature_plot_pairs.jpg", width = 800, height = 800)
featurePlot(x, y, plot = "pairs", auto.key = list(columns = 2))
dev.off()
## png 
##   2
featurePlot(x, y, plot = "pairs", main = "Матрица рассеяния")

Вывод: Разведочный анализ показал, что признаки X1–X5 слабо разделяют классы A и B, что ожидаемо для случайных нормальных данных. На графике «ящик с усами» видны отдельные выбросы.

2. Оценка важности признаков на iris (FSelector)

data(iris)

info_gain <- information_gain(Species ~ ., iris)
relief <- relief(Species ~ ., iris, neighboursCount = 5)

comparison <- data.frame(
  Feature = info_gain$attributes,
  InfoGain = info_gain$importance,
  Relief = relief$importance
)

comparison
##        Feature  InfoGain    Relief
## 1 Sepal.Length 0.4521286 0.1600000
## 2  Sepal.Width 0.2672750 0.1954167
## 3 Petal.Length 0.9402853 0.3806780
## 4  Petal.Width 0.9554360 0.3675000
barplot(info_gain$importance,
        names.arg = info_gain$attributes,
        main = "Information Gain для признаков iris",
        col = "steelblue",
        ylab = "Важность",
        xlab = "Признаки")

Вывод: 1. Наиболее значимые признаки — Petal.Width (IG=0.955, Relief=0.349) и Petal.Length (IG=0.940, Relief=0.346). 2. Sepal.Length обладает средней информативностью (IG=0.452, Relief=0.168). 3. Sepal.Width — наименее важный признак (IG=0.267, Relief=0.147), может быть исключён. 4. Оба метода дали согласованные результаты.

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

data(iris)
x_disc <- iris$Sepal.Length

disc_interval <- discretize(x_disc, method = "interval", breaks = 5)
disc_frequency <- discretize(x_disc, method = "frequency", breaks = 5)

print("Метод interval (равная ширина):")
## [1] "Метод interval (равная ширина):"
table(disc_interval)
## disc_interval
##  [4.3,5.02) [5.02,5.74) [5.74,6.46) [6.46,7.18)  [7.18,7.9] 
##          32          41          42          24          11
print("Метод frequency (равная частота):")
## [1] "Метод frequency (равная частота):"
table(disc_frequency)
## disc_frequency
##    [4.3,5)    [5,5.6)  [5.6,6.1) [6.1,6.52) [6.52,7.9] 
##         22         37         30         31         30

4. Отбор признаков методом Boruta на датасете Ozone

data("Ozone")

ozone_clean <- na.omit(Ozone)

set.seed(123)
boruta_result <- Boruta(V4 ~ ., data = ozone_clean, doTrace = 0)

boruta_result
## Boruta performed 18 iterations in 0.176029 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,
     main = "Boruta - Важность признаков для Ozone")

attStats(boruta_result)
##         meanImp   medianImp      minImp     maxImp   normHits  decision
## V1   0.40660229  0.39874710  0.37208192 0.50361585 1.00000000 Confirmed
## V2   0.04391890  0.03169822 -0.02604472 0.13137821 0.11111111  Rejected
## V3  -0.03235907 -0.04528594 -0.08039941 0.03178173 0.00000000  Rejected
## V5   0.37961385  0.37663333  0.33809868 0.42147363 1.00000000 Confirmed
## V6   0.04740489  0.05979747 -0.01572443 0.12718160 0.05555556  Rejected
## V7   0.51883205  0.50588169  0.46725744 0.59114026 1.00000000 Confirmed
## V8   0.77086858  0.76889989  0.73251688 0.81327051 1.00000000 Confirmed
## V9   0.86915268  0.86432645  0.84273725 0.92413075 1.00000000 Confirmed
## V10  0.42389058  0.41739463  0.38164901 0.49245967 1.00000000 Confirmed
## V11  0.55143690  0.54721914  0.49482770 0.61161304 1.00000000 Confirmed
## V12  0.66051279  0.65832222  0.60234621 0.73958611 1.00000000 Confirmed
## V13  0.42761454  0.42057856  0.38618408 0.46920282 1.00000000 Confirmed
getSelectedAttributes(boruta_result)
## [1] "V1"  "V5"  "V7"  "V8"  "V9"  "V10" "V11" "V12" "V13"

Вывод: 1. Подтверждено 9 важных признаков: V1, V5, V7, V8, V9, V10, V11, V12, V13. Наибольшая важность — у V9 (19.23), V8 (17.16), V12 (14.63). 2. Отвергнуто 3 неинформативных признака: V2, V3, V6. 3. Алгоритм выполнил 24 итерации и стабильно отделил значимые признаки от шума. 4. Для прогноза V4 рекомендуется использовать только подтверждённые признаки.