1. CARET

library(caret)
## Warning: пакет 'caret' был собран под R версии 4.5.3
## Загрузка требуемого пакета: ggplot2
## Warning: пакет 'ggplot2' был собран под R версии 4.5.3
## Загрузка требуемого пакета: lattice
models <- names(getModelInfo())
head(models)
## [1] "ada"         "AdaBag"      "AdaBoost.M1" "adaboost"    "amdai"      
## [6] "ANFIS"
length(models)
## [1] 239
set.seed(123)
x <- matrix(rnorm(50*5), ncol=5)
y <- factor(rep(c("A", "B"), 25))

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

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

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

## Вывод

Признаки сгенерированы случайно, четкого разделения классов нет.
Графики показывают сильное перекрытие распределений.
Данные плохо подходят для классификации.

2. Важность признаков

library(FSelector)
## Warning: пакет 'FSelector' был собран под R версии 4.5.3
data(iris)

ig <- information.gain(Species ~ ., iris)
gr <- gain.ratio(Species ~ ., iris)
chi <- chi.squared(Species ~ ., iris)
rel <- relief(Species ~ ., iris)

ig
##              attr_importance
## Sepal.Length       0.4521286
## Sepal.Width        0.2672750
## Petal.Length       0.9402853
## Petal.Width        0.9554360
gr
##              attr_importance
## Sepal.Length       0.4196464
## Sepal.Width        0.2472972
## Petal.Length       0.8584937
## Petal.Width        0.8713692
chi
##              attr_importance
## Sepal.Length       0.6288067
## Sepal.Width        0.4922162
## Petal.Length       0.9346311
## Petal.Width        0.9432359
rel
##              attr_importance
## Sepal.Length       0.1683333
## Sepal.Width        0.1466667
## Petal.Length       0.3457627
## Petal.Width        0.3491667

Вывод

Все методы единогласно указывают, что признаки Sepal.Length и Sepal.Width имеют значительно меньшую важность для классификации видов ирисов.

Это соответствует биологическим особенностям: длина и ширина лепестков являются основными различительными признаками между видами ирисов.
Лепестки лучше разделяют виды ирисов, чем чашелистики.

3. Дискретизация

library(arules)
## Warning: пакет 'arules' был собран под R версии 4.5.3
## Загрузка требуемого пакета: Matrix
## 
## Присоединяю пакет: 'arules'
## Следующие объекты скрыты от 'package:base':
## 
##     abbreviate, write
data(iris)

interval <- discretize(iris$Sepal.Length, method="interval", breaks=3)
frequency <- discretize(iris$Sepal.Length, method="frequency", breaks=3)
cluster <- discretize(iris$Sepal.Length, method="cluster", breaks=3)
fixed <- discretize(iris$Sepal.Length, method="fixed", breaks=c(4,5,6,8))

table(interval)
## interval
## [4.3,5.5) [5.5,6.7) [6.7,7.9] 
##        52        70        28
table(frequency)
## frequency
## [4.3,5.4) [5.4,6.3) [6.3,7.9] 
##        46        53        51
table(cluster)
## cluster
##  [4.3,5.63) [5.63,6.71)  [6.71,7.9] 
##          65          65          20
table(fixed)
## fixed
## [4,5) [5,6) [6,8] 
##    22    61    67

Вывод

interval — одинаковая ширина, но разное число объектов, наблюдается неравномерное распределение данных по интервалам

frequency — интервалы имеют разную ширину, но сбалансированы по количеству данных

cluster — группирует по структуре данных

fixed — задаётся вручную, позволяет учитывать предметные знания о данных

4. Boruta

library(Boruta)
## Warning: пакет 'Boruta' был собран под R версии 4.5.3
data(airquality)
ozone <- na.omit(airquality)

boruta_result <- Boruta(Ozone ~ ., data=ozone, doTrace=2)
##  1. run of importance source...
##  2. run of importance source...
##  3. run of importance source...
##  4. run of importance source...
##  5. run of importance source...
##  6. run of importance source...
##  7. run of importance source...
##  8. run of importance source...
##  9. run of importance source...
## After 9 iterations, +0.31 secs:
##  confirmed 4 attributes: Month, Solar.R, Temp, Wind;
##  still have 1 attribute left.
##  10. run of importance source...
##  11. run of importance source...
##  12. run of importance source...
##  13. run of importance source...
##  14. run of importance source...
##  15. run of importance source...
##  16. run of importance source...
##  17. run of importance source...
##  18. run of importance source...
##  19. run of importance source...
##  20. run of importance source...
##  21. run of importance source...
##  22. run of importance source...
##  23. run of importance source...
##  24. run of importance source...
##  25. run of importance source...
##  26. run of importance source...
##  27. run of importance source...
##  28. run of importance source...
##  29. run of importance source...
##  30. run of importance source...
##  31. run of importance source...
##  32. run of importance source...
##  33. run of importance source...
##  34. run of importance source...
##  35. run of importance source...
##  36. run of importance source...
##  37. run of importance source...
##  38. run of importance source...
##  39. run of importance source...
##  40. run of importance source...
##  41. run of importance source...
##  42. run of importance source...
##  43. run of importance source...
##  44. run of importance source...
##  45. run of importance source...
##  46. run of importance source...
##  47. run of importance source...
##  48. run of importance source...
##  49. run of importance source...
##  50. run of importance source...
##  51. run of importance source...
##  52. run of importance source...
## After 52 iterations, +1.7 secs:
##  confirmed 1 attribute: Day;
##  no more attributes left.
print(boruta_result)
## Boruta performed 52 iterations in 1.695357 secs.
##  5 attributes confirmed important: Day, Month, Solar.R, Temp, Wind;
##  No attributes deemed unimportant.
plot(boruta_result)

attStats(boruta_result)
##           meanImp medianImp     minImp    maxImp  normHits  decision
## Solar.R 11.864789 11.882775  9.2166613 13.835677 1.0000000 Confirmed
## Wind    19.145354 18.995937 17.2974169 21.118555 1.0000000 Confirmed
## Temp    31.071712 30.880879 27.8576303 33.615336 1.0000000 Confirmed
## Month    5.362898  5.356375  2.6327519  7.567484 1.0000000 Confirmed
## Day      2.796913  2.862969  0.4463957  5.435293 0.7115385 Confirmed

Вывод

Boruta делит признаки на: Confirmed (важные), Rejected (неважные), Tentative (сомнительные).

Метод основан на Random Forest, устойчив к шуму и позволяет надежно отбирать признаки.

Все признаки были признаны важными. Наибольшее влияние оказывают Temp и Wind.