1. Графический разведочный анализ данных с использованием CARET

Установим и подключим пакет caret.

library(caret)
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice

Выведем список доступных моделей:

names(getModelInfo())
##   [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(123)

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

Boxplot

jpeg(
  "feature_box.jpg",
  width = 1200,
  height = 900,
  res = 150
)

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

dev.off()
## png 
##   2

Для отображения графика в HTML:

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

Strip plot

jpeg(
  "feature_strip.jpg",
  width = 1200,
  height = 900,
  res = 150
)

featurePlot(
  x = x,
  y = y,
  plot = "strip",
  jitter = TRUE
)

dev.off()
## png 
##   2
featurePlot(
  x = x,
  y = y,
  plot = "strip",
  jitter = TRUE
)

Density plot

jpeg(
  "feature_density.jpg",
  width = 1200,
  height = 900,
  res = 150
)

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

dev.off()
## png 
##   2
featurePlot(
  x = x,
  y = y,
  plot = "density"
)

Попарные зависимости признаков

jpeg(
  "feature_pairs.jpg",
  width = 1200,
  height = 900,
  res = 150
)

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

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

Вывод

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

2. Определение важности признаков с использованием FSelector

Подключим пакет FSelector и загрузим набор данных iris.

library(FSelector)

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

Information Gain

ig <- information.gain(
  Species ~ .,
  data = iris
)

ig
##              attr_importance
## Sepal.Length       0.4521286
## Sepal.Width        0.2672750
## Petal.Length       0.9402853
## Petal.Width        0.9554360

Gain Ratio

gr <- gain.ratio(
  Species ~ .,
  data = iris
)

gr
##              attr_importance
## Sepal.Length       0.4196464
## Sepal.Width        0.2472972
## Petal.Length       0.8584937
## Petal.Width        0.8713692

Chi-Squared

chi <- chi.squared(
  Species ~ .,
  data = iris
)

chi
##              attr_importance
## Sepal.Length       0.6288067
## Sepal.Width        0.4922162
## Petal.Length       0.9346311
## Petal.Width        0.9432359

Symmetrical Uncertainty

su <- symmetrical.uncertainty(
  Species ~ .,
  data = iris
)

su
##              attr_importance
## Sepal.Length       0.4155563
## Sepal.Width        0.2452743
## Petal.Length       0.8571872
## Petal.Width        0.8705214

Вывод

В результате применения методов пакета FSelector была определена информативность признаков набора iris относительно целевой переменной Species. Полученные значения показывают, что признаки имеют различную степень важности для классификации. Наибольшую информативность имеют признаки Petal.Length и Petal.Width, тогда как признаки Sepal.Length и Sepal.Width имеют меньшую информативность. Таким образом, размеры лепестка являются наиболее существенными признаками для определения вида ириса.

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

Подключим пакет arules и загрузим набор данных iris.

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

x <- iris$Sepal.Length

Метод interval

d_interval <- discretize(
  x,
  method = "interval",
  breaks = 3
)

d_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]

Метод frequency

d_frequency <- discretize(
  x,
  method = "frequency",
  breaks = 3
)

d_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]

Метод cluster

set.seed(123)

d_cluster <- discretize(
  x,
  method = "cluster",
  breaks = 3
)

d_cluster
##   [1] [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [5.37,6.36)
##   [7] [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [5.37,6.36) [4.3,5.37) 
##  [13] [4.3,5.37)  [4.3,5.37)  [5.37,6.36) [5.37,6.36) [5.37,6.36) [4.3,5.37) 
##  [19] [5.37,6.36) [4.3,5.37)  [5.37,6.36) [4.3,5.37)  [4.3,5.37)  [4.3,5.37) 
##  [25] [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [4.3,5.37) 
##  [31] [4.3,5.37)  [5.37,6.36) [4.3,5.37)  [5.37,6.36) [4.3,5.37)  [4.3,5.37) 
##  [37] [5.37,6.36) [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [4.3,5.37) 
##  [43] [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [4.3,5.37)  [4.3,5.37) 
##  [49] [4.3,5.37)  [4.3,5.37)  [6.36,7.9]  [6.36,7.9]  [6.36,7.9]  [5.37,6.36)
##  [55] [6.36,7.9]  [5.37,6.36) [5.37,6.36) [4.3,5.37)  [6.36,7.9]  [4.3,5.37) 
##  [61] [4.3,5.37)  [5.37,6.36) [5.37,6.36) [5.37,6.36) [5.37,6.36) [6.36,7.9] 
##  [67] [5.37,6.36) [5.37,6.36) [5.37,6.36) [5.37,6.36) [5.37,6.36) [5.37,6.36)
##  [73] [5.37,6.36) [5.37,6.36) [6.36,7.9]  [6.36,7.9]  [6.36,7.9]  [6.36,7.9] 
##  [79] [5.37,6.36) [5.37,6.36) [5.37,6.36) [5.37,6.36) [5.37,6.36) [5.37,6.36)
##  [85] [5.37,6.36) [5.37,6.36) [6.36,7.9]  [5.37,6.36) [5.37,6.36) [5.37,6.36)
##  [91] [5.37,6.36) [5.37,6.36) [5.37,6.36) [4.3,5.37)  [5.37,6.36) [5.37,6.36)
##  [97] [5.37,6.36) [5.37,6.36) [4.3,5.37)  [5.37,6.36) [5.37,6.36) [5.37,6.36)
## [103] [6.36,7.9]  [5.37,6.36) [6.36,7.9]  [6.36,7.9]  [4.3,5.37)  [6.36,7.9] 
## [109] [6.36,7.9]  [6.36,7.9]  [6.36,7.9]  [6.36,7.9]  [6.36,7.9]  [5.37,6.36)
## [115] [5.37,6.36) [6.36,7.9]  [6.36,7.9]  [6.36,7.9]  [6.36,7.9]  [5.37,6.36)
## [121] [6.36,7.9]  [5.37,6.36) [6.36,7.9]  [5.37,6.36) [6.36,7.9]  [6.36,7.9] 
## [127] [5.37,6.36) [5.37,6.36) [6.36,7.9]  [6.36,7.9]  [6.36,7.9]  [6.36,7.9] 
## [133] [6.36,7.9]  [5.37,6.36) [5.37,6.36) [6.36,7.9]  [5.37,6.36) [6.36,7.9] 
## [139] [5.37,6.36) [6.36,7.9]  [6.36,7.9]  [6.36,7.9]  [5.37,6.36) [6.36,7.9] 
## [145] [6.36,7.9]  [6.36,7.9]  [5.37,6.36) [6.36,7.9]  [5.37,6.36) [5.37,6.36)
## attr(,"discretized:breaks")
## [1] 4.300000 5.371213 6.361482 7.900000
## attr(,"discretized:method")
## [1] cluster
## Levels: [4.3,5.37) [5.37,6.36) [6.36,7.9]

Метод fixed

d_fixed <- discretize(
  x,
  method = "fixed",
  breaks = c(-Inf, 5, 6, Inf)
)

d_fixed
##   [1] [5,6)    [-Inf,5) [-Inf,5) [-Inf,5) [5,6)    [5,6)    [-Inf,5) [5,6)   
##   [9] [-Inf,5) [-Inf,5) [5,6)    [-Inf,5) [-Inf,5) [-Inf,5) [5,6)    [5,6)   
##  [17] [5,6)    [5,6)    [5,6)    [5,6)    [5,6)    [5,6)    [-Inf,5) [5,6)   
##  [25] [-Inf,5) [5,6)    [5,6)    [5,6)    [5,6)    [-Inf,5) [-Inf,5) [5,6)   
##  [33] [5,6)    [5,6)    [-Inf,5) [5,6)    [5,6)    [-Inf,5) [-Inf,5) [5,6)   
##  [41] [5,6)    [-Inf,5) [-Inf,5) [5,6)    [5,6)    [-Inf,5) [5,6)    [-Inf,5)
##  [49] [5,6)    [5,6)    [6, Inf] [6, Inf] [6, Inf] [5,6)    [6, Inf] [5,6)   
##  [57] [6, Inf] [-Inf,5) [6, Inf] [5,6)    [5,6)    [5,6)    [6, Inf] [6, Inf]
##  [65] [5,6)    [6, Inf] [5,6)    [5,6)    [6, Inf] [5,6)    [5,6)    [6, Inf]
##  [73] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [5,6)   
##  [81] [5,6)    [5,6)    [5,6)    [6, Inf] [5,6)    [6, Inf] [6, Inf] [6, Inf]
##  [89] [5,6)    [5,6)    [5,6)    [6, Inf] [5,6)    [5,6)    [5,6)    [5,6)   
##  [97] [5,6)    [6, Inf] [5,6)    [5,6)    [6, Inf] [5,6)    [6, Inf] [6, Inf]
## [105] [6, Inf] [6, Inf] [-Inf,5) [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf]
## [113] [6, Inf] [5,6)    [5,6)    [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf]
## [121] [6, Inf] [5,6)    [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf]
## [129] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf]
## [137] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [5,6)    [6, Inf]
## [145] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [6, Inf] [5,6)   
## attr(,"discretized:breaks")
## [1] -Inf    5    6  Inf
## attr(,"discretized:method")
## [1] fixed
## Levels: [-Inf,5) [5,6) [6, Inf]

Сравнение результатов

data.frame(
  Original = x,
  Interval = d_interval,
  Frequency = d_frequency,
  Cluster = d_cluster,
  Fixed = d_fixed
)
##     Original  Interval Frequency     Cluster    Fixed
## 1        5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 2        4.9 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 3        4.7 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 4        4.6 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 5        5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 6        5.4 [4.3,5.5) [5.4,6.3) [5.37,6.36)    [5,6)
## 7        4.6 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 8        5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 9        4.4 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 10       4.9 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 11       5.4 [4.3,5.5) [5.4,6.3) [5.37,6.36)    [5,6)
## 12       4.8 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 13       4.8 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 14       4.3 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 15       5.8 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 16       5.7 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 17       5.4 [4.3,5.5) [5.4,6.3) [5.37,6.36)    [5,6)
## 18       5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 19       5.7 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 20       5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 21       5.4 [4.3,5.5) [5.4,6.3) [5.37,6.36)    [5,6)
## 22       5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 23       4.6 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 24       5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 25       4.8 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 26       5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 27       5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 28       5.2 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 29       5.2 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 30       4.7 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 31       4.8 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 32       5.4 [4.3,5.5) [5.4,6.3) [5.37,6.36)    [5,6)
## 33       5.2 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 34       5.5 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 35       4.9 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 36       5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 37       5.5 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 38       4.9 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 39       4.4 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 40       5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 41       5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 42       4.5 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 43       4.4 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 44       5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 45       5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 46       4.8 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 47       5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 48       4.6 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 49       5.3 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 50       5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 51       7.0 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 52       6.4 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 53       6.9 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 54       5.5 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 55       6.5 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 56       5.7 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 57       6.3 [5.5,6.7) [6.3,7.9] [5.37,6.36) [6, Inf]
## 58       4.9 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 59       6.6 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 60       5.2 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 61       5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 62       5.9 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 63       6.0 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 64       6.1 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 65       5.6 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 66       6.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 67       5.6 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 68       5.8 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 69       6.2 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 70       5.6 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 71       5.9 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 72       6.1 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 73       6.3 [5.5,6.7) [6.3,7.9] [5.37,6.36) [6, Inf]
## 74       6.1 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 75       6.4 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 76       6.6 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 77       6.8 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 78       6.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 79       6.0 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 80       5.7 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 81       5.5 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 82       5.5 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 83       5.8 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 84       6.0 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 85       5.4 [4.3,5.5) [5.4,6.3) [5.37,6.36)    [5,6)
## 86       6.0 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 87       6.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 88       6.3 [5.5,6.7) [6.3,7.9] [5.37,6.36) [6, Inf]
## 89       5.6 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 90       5.5 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 91       5.5 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 92       6.1 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 93       5.8 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 94       5.0 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 95       5.6 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 96       5.7 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 97       5.7 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 98       6.2 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 99       5.1 [4.3,5.5) [4.3,5.4)  [4.3,5.37)    [5,6)
## 100      5.7 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 101      6.3 [5.5,6.7) [6.3,7.9] [5.37,6.36) [6, Inf]
## 102      5.8 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 103      7.1 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 104      6.3 [5.5,6.7) [6.3,7.9] [5.37,6.36) [6, Inf]
## 105      6.5 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 106      7.6 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 107      4.9 [4.3,5.5) [4.3,5.4)  [4.3,5.37) [-Inf,5)
## 108      7.3 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 109      6.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 110      7.2 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 111      6.5 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 112      6.4 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 113      6.8 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 114      5.7 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 115      5.8 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 116      6.4 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 117      6.5 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 118      7.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 119      7.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 120      6.0 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 121      6.9 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 122      5.6 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 123      7.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 124      6.3 [5.5,6.7) [6.3,7.9] [5.37,6.36) [6, Inf]
## 125      6.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 126      7.2 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 127      6.2 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 128      6.1 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 129      6.4 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 130      7.2 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 131      7.4 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 132      7.9 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 133      6.4 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 134      6.3 [5.5,6.7) [6.3,7.9] [5.37,6.36) [6, Inf]
## 135      6.1 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 136      7.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 137      6.3 [5.5,6.7) [6.3,7.9] [5.37,6.36) [6, Inf]
## 138      6.4 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 139      6.0 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 140      6.9 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 141      6.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 142      6.9 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 143      5.8 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)
## 144      6.8 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 145      6.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 146      6.7 [6.7,7.9] [6.3,7.9]  [6.36,7.9] [6, Inf]
## 147      6.3 [5.5,6.7) [6.3,7.9] [5.37,6.36) [6, Inf]
## 148      6.5 [5.5,6.7) [6.3,7.9]  [6.36,7.9] [6, Inf]
## 149      6.2 [5.5,6.7) [5.4,6.3) [5.37,6.36) [6, Inf]
## 150      5.9 [5.5,6.7) [5.4,6.3) [5.37,6.36)    [5,6)

Вывод

В результате выполнения дискретизации непрерывная переменная Sepal.Length была преобразована в категориальную четырьмя различными способами. Метод interval формирует интервалы одинаковой ширины, frequency — интервалы с примерно одинаковым количеством наблюдений, cluster определяет категории на основе кластеризации методом k-means, а fixed использует заданные пользователем границы. В результате разные методы приводят к различному разбиению исходной непрерывной переменной на категории.

4. Выбор признаков с использованием Boruta

Подключим пакет Boruta и пакет mlbench, содержащий набор данных Ozone.

library(Boruta)
library(mlbench)

data(Ozone)

ozo <- na.omit(Ozone)

head(ozo)
##    V1 V2 V3 V4   V5 V6 V7 V8    V9  V10 V11   V12 V13
## 5   1  5  1  5 5760  3 51 54 45.32 1450  25 57.02  60
## 6   1  6  2  6 5720  4 69 35 49.64 1568  15 53.78  60
## 7   1  7  3  4 5790  6 19 45 46.40 2631 -33 54.14 100
## 8   1  8  4  4 5790  3 25 55 52.70  554 -28 64.76 250
## 9   1  9  5  6 5700  3 73 41 48.02 2083  23 52.52 120
## 12  1 12  1  6 5720  3 44 51 54.32  111   9 63.14 150

Проверим наличие пропущенных значений:

sum(is.na(ozo))
## [1] 0

Выполним выбор признаков:

set.seed(123)

boruta_result <- Boruta(
  V4 ~ .,
  data = ozo,
  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.17 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, +0.23 secs:
##  rejected 1 attribute: V6;
##  still have 1 attribute left.
##  16. run of importance source...
##  17. run of importance source...
##  18. run of importance source...
## After 18 iterations, +0.27 secs:
##  rejected 1 attribute: V2;
##  no more attributes left.
print(boruta_result)
## Boruta performed 18 iterations in 0.2735691 secs.
##  9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
##  3 attributes confirmed unimportant: V2, V3, V6;

Итоговое решение

boruta_result$finalDecision
##        V1        V2        V3        V5        V6        V7        V8        V9 
## Confirmed  Rejected  Rejected Confirmed  Rejected Confirmed Confirmed Confirmed 
##       V10       V11       V12       V13 
## Confirmed Confirmed Confirmed Confirmed 
## Levels: Tentative Confirmed Rejected

Отобранные признаки

getSelectedAttributes(boruta_result)
## [1] "V1"  "V5"  "V7"  "V8"  "V9"  "V10" "V11" "V12" "V13"

Boxplot важности признаков

plot(
  boruta_result,
  las = 2
)

Вывод

В результате применения алгоритма Boruta была выполнена оценка значимости признаков относительно целевой переменной V4. Алгоритм сравнивает важность исходных признаков с важностью случайных shadow-признаков. В результате признаки получают решения Confirmed, Tentative или Rejected. Подтверждённые признаки являются информативными для рассматриваемой задачи, а отклонённые признаки не показали достаточной значимости. На графике boxplot представлены распределения важности признаков, полученные в процессе работы алгоритма.

5. Общий вывод

В ходе лабораторной работы были рассмотрены методы графического анализа, оценки важности и отбора признаков, а также дискретизации непрерывных данных.

С помощью пакета caret выполнен графический разведочный анализ признаков с использованием функции featurePlot(). С помощью пакета FSelector определена важность признаков для классификации набора данных iris.

С использованием функции discretize() пакета arules непрерывная переменная была преобразована в категориальную четырьмя методами: interval, frequency, cluster и fixed.

С помощью алгоритма Boruta выполнен выбор информативных признаков для набора данных Ozone и построен boxplot важности признаков.