Установка и загрузка пакета caret

Список доступных методов выбора признаков

models_info <- names(getModelInfo())
models_info
##   [1] "ada"                 "AdaBag"              "AdaBoost.M1"        
##   [4] "adaboost"            "amdai"               "ANFIS"              
##   [7] "avNNet"              "awnb"                "awtan"              
##  [10] "bag"                 "bagEarth"            "bagEarthGCV"        
##  [13] "bagFDA"              "bagFDAGCV"           "bam"                
##  [16] "bartMachine"         "bayesglm"            "binda"              
##  [19] "blackboost"          "blasso"              "blassoAveraged"     
##  [22] "bridge"              "brnn"                "BstLm"              
##  [25] "bstSm"               "bstTree"             "C5.0"               
##  [28] "C5.0Cost"            "C5.0Rules"           "C5.0Tree"           
##  [31] "cforest"             "chaid"               "CSimca"             
##  [34] "ctree"               "ctree2"              "cubist"             
##  [37] "dda"                 "deepboost"           "DENFIS"             
##  [40] "dnn"                 "dwdLinear"           "dwdPoly"            
##  [43] "dwdRadial"           "earth"               "elm"                
##  [46] "enet"                "evtree"              "extraTrees"         
##  [49] "fda"                 "FH.GBML"             "FIR.DM"             
##  [52] "foba"                "FRBCS.CHI"           "FRBCS.W"            
##  [55] "FS.HGD"              "gam"                 "gamboost"           
##  [58] "gamLoess"            "gamSpline"           "gaussprLinear"      
##  [61] "gaussprPoly"         "gaussprRadial"       "gbm_h2o"            
##  [64] "gbm"                 "gcvEarth"            "GFS.FR.MOGUL"       
##  [67] "GFS.LT.RS"           "GFS.THRIFT"          "glm.nb"             
##  [70] "glm"                 "glmboost"            "glmnet_h2o"         
##  [73] "glmnet"              "glmStepAIC"          "gpls"               
##  [76] "hda"                 "hdda"                "hdrda"              
##  [79] "HYFIS"               "icr"                 "J48"                
##  [82] "JRip"                "kernelpls"           "kknn"               
##  [85] "knn"                 "krlsPoly"            "krlsRadial"         
##  [88] "lars"                "lars2"               "lasso"              
##  [91] "lda"                 "lda2"                "leapBackward"       
##  [94] "leapForward"         "leapSeq"             "Linda"              
##  [97] "lm"                  "lmStepAIC"           "LMT"                
## [100] "loclda"              "logicBag"            "LogitBoost"         
## [103] "logreg"              "lssvmLinear"         "lssvmPoly"          
## [106] "lssvmRadial"         "lvq"                 "M5"                 
## [109] "M5Rules"             "manb"                "mda"                
## [112] "Mlda"                "mlp"                 "mlpKerasDecay"      
## [115] "mlpKerasDecayCost"   "mlpKerasDropout"     "mlpKerasDropoutCost"
## [118] "mlpML"               "mlpSGD"              "mlpWeightDecay"     
## [121] "mlpWeightDecayML"    "monmlp"              "msaenet"            
## [124] "multinom"            "mxnet"               "mxnetAdam"          
## [127] "naive_bayes"         "nb"                  "nbDiscrete"         
## [130] "nbSearch"            "neuralnet"           "nnet"               
## [133] "nnls"                "nodeHarvest"         "null"               
## [136] "OneR"                "ordinalNet"          "ordinalRF"          
## [139] "ORFlog"              "ORFpls"              "ORFridge"           
## [142] "ORFsvm"              "ownn"                "pam"                
## [145] "parRF"               "PART"                "partDSA"            
## [148] "pcaNNet"             "pcr"                 "pda"                
## [151] "pda2"                "penalized"           "PenalizedLDA"       
## [154] "plr"                 "pls"                 "plsRglm"            
## [157] "polr"                "ppr"                 "pre"                
## [160] "PRIM"                "protoclass"          "qda"                
## [163] "QdaCov"              "qrf"                 "qrnn"               
## [166] "randomGLM"           "ranger"              "rbf"                
## [169] "rbfDDA"              "Rborist"             "rda"                
## [172] "regLogistic"         "relaxo"              "rf"                 
## [175] "rFerns"              "RFlda"               "rfRules"            
## [178] "ridge"               "rlda"                "rlm"                
## [181] "rmda"                "rocc"                "rotationForest"     
## [184] "rotationForestCp"    "rpart"               "rpart1SE"           
## [187] "rpart2"              "rpartCost"           "rpartScore"         
## [190] "rqlasso"             "rqnc"                "RRF"                
## [193] "RRFglobal"           "rrlda"               "RSimca"             
## [196] "rvmLinear"           "rvmPoly"             "rvmRadial"          
## [199] "SBC"                 "sda"                 "sdwd"               
## [202] "simpls"              "SLAVE"               "slda"               
## [205] "smda"                "snn"                 "sparseLDA"          
## [208] "spikeslab"           "spls"                "stepLDA"            
## [211] "stepQDA"             "superpc"             "svmBoundrangeString"
## [214] "svmExpoString"       "svmLinear"           "svmLinear2"         
## [217] "svmLinear3"          "svmLinearWeights"    "svmLinearWeights2"  
## [220] "svmPoly"             "svmRadial"           "svmRadialCost"      
## [223] "svmRadialSigma"      "svmRadialWeights"    "svmSpectrumString"  
## [226] "tan"                 "tanSearch"           "treebag"            
## [229] "vbmpRadial"          "vglmAdjCat"          "vglmContRatio"      
## [232] "vglmCumulative"      "widekernelpls"       "WM"                 
## [235] "wsrf"                "xgbDART"             "xgbLinear"          
## [238] "xgbTree"             "xyf"

Создаем искусственные данные

set.seed(42)
x <- matrix(rnorm(50*5), ncol=5)
y <- factor(rep(c("A", "B"), 25))

Объединяем в data.frame

data <- data.frame(x, y)

Графический разведочный анализ

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

# Сохраняем графики в jpg файлы

jpeg("feature_plot.jpg")
featurePlot(x = x, y = y, plot = "pairs")
dev.off()
## png 
##   2

Выводы

В результате графического разведочного анализа видно, что данные между классами ‘A’ и ‘B’ имеют некоторое различие. По диаграммам рассеяния можно заметить, что переменные имеют некоторое разделение, но для окончательных выводов следует выполнить дополнительные методы анализа. В этом задании был выполнен графический разведочный анализ данных с использованием функции featurePlot() из пакета caret. Мы также сохранили график в файл и ознакомились с доступными методами моделей выбора признаков.

Fselector

С использование функций из пакета Fselector [2] определить важность признаков для решения задачи классификации. Использовать набор data(iris). Сделать выводы.

# Загружаем стандартные данные iris
data(iris)

# Просмотр первых строк данных
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
# Применение метода gain.ratio для оценки важности признаков
importance_gain_ratio <- gain.ratio(Species ~ ., data = iris)

# Выводим результаты
importance_gain_ratio
##              attr_importance
## Sepal.Length       0.4196464
## Sepal.Width        0.2472972
## Petal.Length       0.8584937
## Petal.Width        0.8713692
# Построение графиков для визуализации важности признаков
barplot(importance_gain_ratio$attr_importance, names.arg = rownames(importance_gain_ratio), 
        col = "lightcoral", main = "Gain Ratio", xlab = "Признаки", ylab = "Важность")

Выводы

Из результатов анализа важности признаков видно, что для всех использованных методов (Information Gain, Chi Squared, Gain Ratio) признаки ‘Petal.Length’ и ‘Petal.Width’ имеют наибольшую важность для классификации. Эти признаки помогают лучше различать классы в наборе данных iris. В то время как признаки ‘Sepal.Length’ и ‘Sepal.Width’ имеют меньшую важность в этой задаче.

Задание 3

С использованием функции discretize() из пакета arules выполните преобразование непрерывной переменной в категориальную [3] различными методами: «interval» (равная ширина интервала), «frequency» (равная частота), «cluster» (кластеризация) и «fixed» (категории задают границы интервалов). Используйте набор данных iris. Сделайте выводы

Преобразование переменной в категориальную с использованием различных методов

# Преобразование с использованием метода "interval" (равная ширина интервала)
discretize_interval <- discretize(iris$Sepal.Length, method = "interval", categories = 3)
## Warning in discretize(iris$Sepal.Length, method = "interval", categories = 3):
## Parameter categories is deprecated. Use breaks instead! Also, the default
## method is now frequency!
# Преобразование с использованием метода "frequency" (равная частота)
discretize_frequency <- discretize(iris$Sepal.Length, method = "frequency", categories = 3)
## Warning in discretize(iris$Sepal.Length, method = "frequency", categories = 3):
## Parameter categories is deprecated. Use breaks instead! Also, the default
## method is now frequency!
# Преобразование с использованием метода "cluster" (кластеризация)
discretize_cluster <- discretize(iris$Sepal.Length, method = "cluster", categories = 3)
## Warning in discretize(iris$Sepal.Length, method = "cluster", categories = 3):
## Parameter categories is deprecated. Use breaks instead! Also, the default
## method is now frequency!
# Преобразование с использованием метода "fixed" (категории с заданными границами)
fixed_breaks <- c(4, 5, 6, 7)
discretize_fixed <- discretize(iris$Sepal.Length, method = "fixed", breaks = fixed_breaks)

# Выводим результаты
discretize_interval
##   [1] [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5)
##   [8] [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5)
##  [15] [5.5,6.7) [5.5,6.7) [4.3,5.5) [4.3,5.5) [5.5,6.7) [4.3,5.5) [4.3,5.5)
##  [22] [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5)
##  [29] [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [5.5,6.7) [4.3,5.5)
##  [36] [4.3,5.5) [5.5,6.7) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5)
##  [43] [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5) [4.3,5.5)
##  [50] [4.3,5.5) [6.7,7.9] [5.5,6.7) [6.7,7.9] [5.5,6.7) [5.5,6.7) [5.5,6.7)
##  [57] [5.5,6.7) [4.3,5.5) [5.5,6.7) [4.3,5.5) [4.3,5.5) [5.5,6.7) [5.5,6.7)
##  [64] [5.5,6.7) [5.5,6.7) [6.7,7.9] [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7)
##  [71] [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [6.7,7.9]
##  [78] [6.7,7.9] [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7)
##  [85] [4.3,5.5) [5.5,6.7) [6.7,7.9] [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7)
##  [92] [5.5,6.7) [5.5,6.7) [4.3,5.5) [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7)
##  [99] [4.3,5.5) [5.5,6.7) [5.5,6.7) [5.5,6.7) [6.7,7.9] [5.5,6.7) [5.5,6.7)
## [106] [6.7,7.9] [4.3,5.5) [6.7,7.9] [6.7,7.9] [6.7,7.9] [5.5,6.7) [5.5,6.7)
## [113] [6.7,7.9] [5.5,6.7) [5.5,6.7) [5.5,6.7) [5.5,6.7) [6.7,7.9] [6.7,7.9]
## [120] [5.5,6.7) [6.7,7.9] [5.5,6.7) [6.7,7.9] [5.5,6.7) [6.7,7.9] [6.7,7.9]
## [127] [5.5,6.7) [5.5,6.7) [5.5,6.7) [6.7,7.9] [6.7,7.9] [6.7,7.9] [5.5,6.7)
## [134] [5.5,6.7) [5.5,6.7) [6.7,7.9] [5.5,6.7) [5.5,6.7) [5.5,6.7) [6.7,7.9]
## [141] [6.7,7.9] [6.7,7.9] [5.5,6.7) [6.7,7.9] [6.7,7.9] [6.7,7.9] [5.5,6.7)
## [148] [5.5,6.7) [5.5,6.7) [5.5,6.7)
## attr(,"discretized:breaks")
## [1] 4.3 5.5 6.7 7.9
## attr(,"discretized:method")
## [1] interval
## Levels: [4.3,5.5) [5.5,6.7) [6.7,7.9]
discretize_frequency
##   [1] [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [5.4,6.3) [4.3,5.4)
##   [8] [4.3,5.4) [4.3,5.4) [4.3,5.4) [5.4,6.3) [4.3,5.4) [4.3,5.4) [4.3,5.4)
##  [15] [5.4,6.3) [5.4,6.3) [5.4,6.3) [4.3,5.4) [5.4,6.3) [4.3,5.4) [5.4,6.3)
##  [22] [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4)
##  [29] [4.3,5.4) [4.3,5.4) [4.3,5.4) [5.4,6.3) [4.3,5.4) [5.4,6.3) [4.3,5.4)
##  [36] [4.3,5.4) [5.4,6.3) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4)
##  [43] [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4) [4.3,5.4)
##  [50] [4.3,5.4) [6.3,7.9] [6.3,7.9] [6.3,7.9] [5.4,6.3) [6.3,7.9] [5.4,6.3)
##  [57] [6.3,7.9] [4.3,5.4) [6.3,7.9] [4.3,5.4) [4.3,5.4) [5.4,6.3) [5.4,6.3)
##  [64] [5.4,6.3) [5.4,6.3) [6.3,7.9] [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3)
##  [71] [5.4,6.3) [5.4,6.3) [6.3,7.9] [5.4,6.3) [6.3,7.9] [6.3,7.9] [6.3,7.9]
##  [78] [6.3,7.9] [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3)
##  [85] [5.4,6.3) [5.4,6.3) [6.3,7.9] [6.3,7.9] [5.4,6.3) [5.4,6.3) [5.4,6.3)
##  [92] [5.4,6.3) [5.4,6.3) [4.3,5.4) [5.4,6.3) [5.4,6.3) [5.4,6.3) [5.4,6.3)
##  [99] [4.3,5.4) [5.4,6.3) [6.3,7.9] [5.4,6.3) [6.3,7.9] [6.3,7.9] [6.3,7.9]
## [106] [6.3,7.9] [4.3,5.4) [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9]
## [113] [6.3,7.9] [5.4,6.3) [5.4,6.3) [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9]
## [120] [5.4,6.3) [6.3,7.9] [5.4,6.3) [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9]
## [127] [5.4,6.3) [5.4,6.3) [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9]
## [134] [6.3,7.9] [5.4,6.3) [6.3,7.9] [6.3,7.9] [6.3,7.9] [5.4,6.3) [6.3,7.9]
## [141] [6.3,7.9] [6.3,7.9] [5.4,6.3) [6.3,7.9] [6.3,7.9] [6.3,7.9] [6.3,7.9]
## [148] [6.3,7.9] [5.4,6.3) [5.4,6.3)
## attr(,"discretized:breaks")
## [1] 4.3 5.4 6.3 7.9
## attr(,"discretized:method")
## [1] frequency
## Levels: [4.3,5.4) [5.4,6.3) [6.3,7.9]
discretize_cluster
##   [1] [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [5.33,6.27)
##   [7] [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [5.33,6.27) [4.3,5.33) 
##  [13] [4.3,5.33)  [4.3,5.33)  [5.33,6.27) [5.33,6.27) [5.33,6.27) [4.3,5.33) 
##  [19] [5.33,6.27) [4.3,5.33)  [5.33,6.27) [4.3,5.33)  [4.3,5.33)  [4.3,5.33) 
##  [25] [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [4.3,5.33) 
##  [31] [4.3,5.33)  [5.33,6.27) [4.3,5.33)  [5.33,6.27) [4.3,5.33)  [4.3,5.33) 
##  [37] [5.33,6.27) [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [4.3,5.33) 
##  [43] [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [4.3,5.33)  [4.3,5.33) 
##  [49] [4.3,5.33)  [4.3,5.33)  [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [5.33,6.27)
##  [55] [6.27,7.9]  [5.33,6.27) [6.27,7.9]  [4.3,5.33)  [6.27,7.9]  [4.3,5.33) 
##  [61] [4.3,5.33)  [5.33,6.27) [5.33,6.27) [5.33,6.27) [5.33,6.27) [6.27,7.9] 
##  [67] [5.33,6.27) [5.33,6.27) [5.33,6.27) [5.33,6.27) [5.33,6.27) [5.33,6.27)
##  [73] [6.27,7.9]  [5.33,6.27) [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [6.27,7.9] 
##  [79] [5.33,6.27) [5.33,6.27) [5.33,6.27) [5.33,6.27) [5.33,6.27) [5.33,6.27)
##  [85] [5.33,6.27) [5.33,6.27) [6.27,7.9]  [6.27,7.9]  [5.33,6.27) [5.33,6.27)
##  [91] [5.33,6.27) [5.33,6.27) [5.33,6.27) [4.3,5.33)  [5.33,6.27) [5.33,6.27)
##  [97] [5.33,6.27) [5.33,6.27) [4.3,5.33)  [5.33,6.27) [6.27,7.9]  [5.33,6.27)
## [103] [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [4.3,5.33)  [6.27,7.9] 
## [109] [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [5.33,6.27)
## [115] [5.33,6.27) [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [5.33,6.27)
## [121] [6.27,7.9]  [5.33,6.27) [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [6.27,7.9] 
## [127] [5.33,6.27) [5.33,6.27) [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [6.27,7.9] 
## [133] [6.27,7.9]  [6.27,7.9]  [5.33,6.27) [6.27,7.9]  [6.27,7.9]  [6.27,7.9] 
## [139] [5.33,6.27) [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [5.33,6.27) [6.27,7.9] 
## [145] [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [6.27,7.9]  [5.33,6.27) [5.33,6.27)
## attr(,"discretized:breaks")
## [1] 4.300000 5.332732 6.272161 7.900000
## attr(,"discretized:method")
## [1] cluster
## Levels: [4.3,5.33) [5.33,6.27) [6.27,7.9]
discretize_fixed
##   [1] [5,6) [4,5) [4,5) [4,5) [5,6) [5,6) [4,5) [5,6) [4,5) [4,5) [5,6) [4,5)
##  [13] [4,5) [4,5) [5,6) [5,6) [5,6) [5,6) [5,6) [5,6) [5,6) [5,6) [4,5) [5,6)
##  [25] [4,5) [5,6) [5,6) [5,6) [5,6) [4,5) [4,5) [5,6) [5,6) [5,6) [4,5) [5,6)
##  [37] [5,6) [4,5) [4,5) [5,6) [5,6) [4,5) [4,5) [5,6) [5,6) [4,5) [5,6) [4,5)
##  [49] [5,6) [5,6) [6,7] [6,7] [6,7] [5,6) [6,7] [5,6) [6,7] [4,5) [6,7] [5,6)
##  [61] [5,6) [5,6) [6,7] [6,7] [5,6) [6,7] [5,6) [5,6) [6,7] [5,6) [5,6) [6,7]
##  [73] [6,7] [6,7] [6,7] [6,7] [6,7] [6,7] [6,7] [5,6) [5,6) [5,6) [5,6) [6,7]
##  [85] [5,6) [6,7] [6,7] [6,7] [5,6) [5,6) [5,6) [6,7] [5,6) [5,6) [5,6) [5,6)
##  [97] [5,6) [6,7] [5,6) [5,6) [6,7] [5,6) <NA>  [6,7] [6,7] <NA>  [4,5) <NA> 
## [109] [6,7] <NA>  [6,7] [6,7] [6,7] [5,6) [5,6) [6,7] [6,7] <NA>  <NA>  [6,7]
## [121] [6,7] [5,6) <NA>  [6,7] [6,7] <NA>  [6,7] [6,7] [6,7] <NA>  <NA>  <NA> 
## [133] [6,7] [6,7] [6,7] <NA>  [6,7] [6,7] [6,7] [6,7] [6,7] [6,7] [5,6) [6,7]
## [145] [6,7] [6,7] [6,7] [6,7] [6,7] [5,6)
## attr(,"discretized:breaks")
## [1] 4 5 6 7
## attr(,"discretized:method")
## [1] fixed
## Levels: [4,5) [5,6) [6,7]
# Для наглядности сравниваем результаты
table(discretize_interval)
## discretize_interval
## [4.3,5.5) [5.5,6.7) [6.7,7.9] 
##        52        70        28
table(discretize_frequency)
## discretize_frequency
## [4.3,5.4) [5.4,6.3) [6.3,7.9] 
##        46        53        51
table(discretize_cluster)
## discretize_cluster
##  [4.3,5.33) [5.33,6.27)  [6.27,7.9] 
##          46          53          51
table(discretize_fixed)
## discretize_fixed
## [4,5) [5,6) [6,7] 
##    22    61    55

Выводы

Метод ‘interval’ делит данные на интервалы одинаковой ширины, что может быть полезно, когда важно, чтобы интервалы были равномерными, но это не всегда отражает распределение данных Метод ‘frequency’ делит данные на интервалы с одинаковым количеством объектов, что помогает лучше отражать плотность данных в разных диапазонах. Метод ‘cluster’ использует кластеризацию, что позволяет адаптировать границы интервалов к данным, особенно если данные имеют структуру кластеров. Метод ‘fixed’ делит данные на интервалы, заданные заранее, что полезно, если требуется деление по заранее определённым критериям. Все методы имеют свои особенности, и их выбор зависит от того, что именно важно для анализа: равенство интервалов, равенство количества объектов в интервалах, кластеризация или заранее заданные границы.

Задание 4

Установите пакет Boruta и проведите выбор признаков для набора данных data(“Ozone”) [4, 5, 6]. Построить график boxplot, сделать выводы.

library(Boruta)
library(mlbench)
data("Ozone", package = "mlbench")
# Выбор признаков для данных Ozone и вывод результатов
Ozone <- na.omit(Ozone)
boruta_result <- Boruta(V4 ~ ., 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...
##  10. run of importance source...
##  11. run of importance source...
## After 11 iterations, +0.97 secs:
##  confirmed 9 attributes: V1, V10, V11, V12, V13 and 4 more;
##  rejected 1 attribute: V3;
##  still have 2 attributes left.
##  12. run of importance source...
##  13. run of importance source...
##  14. run of importance source...
##  15. run of importance source...
## After 15 iterations, +1.3 secs:
##  rejected 1 attribute: V2;
##  still have 1 attribute left.
##  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...
## After 46 iterations, +3.9 secs:
##  rejected 1 attribute: V6;
##  no more attributes left.
print(boruta_result)
## Boruta performed 46 iterations in 3.909413 secs.
##  9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
##  3 attributes confirmed unimportant: V2, V3, V6;
plot(boruta_result)

Выводы

По результатам анализа с использованием пакета Boruta, можно отметить, что следующие признаки имеют наибольшую важность для задачи классификации на данных Ozone. График boxplot показывает распределение важности признаков для каждого из атрибутов данных. Признаки с более высокой важностью будут более информативными для модели и могут быть использованы для построения более точных предсказаний.