library(ggplot2)
library(lattice)
library(caret)
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"
data(iris)
x <- matrix(rnorm(50 * 5), ncol=5)
y <- factor(rep(c("A", "B"), each=25))
data <- data.frame(x, y)
featurePlot(x=data[, 1:5], y=data$y, plot="density")
Эти графики отображают кривые плотности для каждого класса, показывая
распределение значений признаков в данных для каждого из них.
На графике, соответствующем признаку X4, можно заметить, что пики кривых расположены в разных точках: у одного класса максимум приходится на значение около -1, а у другого — на 1. Это говорит о том, что данный признак существенно отличается между классами.
В то же время график для признака X5 демонстрирует, что распределения значений для обоих классов практически совпадают, и пики расположены вблизи нуля. Это свидетельствует о том, что данный признак слабо помогает различать классы.
library(FSelector)
data(iris)
importance <- information.gain(Species ~ ., data=iris)
print(importance)
## attr_importance
## Sepal.Length 0.4521286
## Sepal.Width 0.2672750
## Petal.Length 0.9402853
## Petal.Width 0.9554360
Анализ важности признаков для классификации в наборе данных iris показывает, что наибольшую значимость имеют Petal.Length и Petal.Width, с важностью 0.94 и 0.95 соответственно. Эти признаки являются ключевыми для различения классов, так как размер и форма лепестков оказываются основными характеристиками для идентификации видов ирисов. В то же время Sepal.Length обладает умеренной значимостью (0.45), а наименее информативным оказался признак Sepal.Width с важностью 0.27. Таким образом, признаки, связанные с лепестками, являются определяющими для выполнения задачи классификации.
suppressMessages(library(Matrix))
suppressMessages(library(arules))
data(iris)
intervals <- discretize(iris$Sepal.Width, method="interval", breaks=3)
print(intervals)
## [1] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [3.6,4.4] [2.8,3.6)
## [8] [2.8,3.6) [2.8,3.6) [2.8,3.6) [3.6,4.4] [2.8,3.6) [2.8,3.6) [2.8,3.6)
## [15] [3.6,4.4] [3.6,4.4] [3.6,4.4] [2.8,3.6) [3.6,4.4] [3.6,4.4] [2.8,3.6)
## [22] [3.6,4.4] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6)
## [29] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [3.6,4.4] [3.6,4.4] [2.8,3.6)
## [36] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2,2.8)
## [43] [2.8,3.6) [2.8,3.6) [3.6,4.4] [2.8,3.6) [3.6,4.4] [2.8,3.6) [3.6,4.4]
## [50] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2,2.8) [2,2.8) [2,2.8)
## [57] [2.8,3.6) [2,2.8) [2.8,3.6) [2,2.8) [2,2.8) [2.8,3.6) [2,2.8)
## [64] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2,2.8) [2,2.8) [2,2.8)
## [71] [2.8,3.6) [2,2.8) [2,2.8) [2,2.8) [2.8,3.6) [2.8,3.6) [2,2.8)
## [78] [2.8,3.6) [2.8,3.6) [2,2.8) [2,2.8) [2,2.8) [2,2.8) [2,2.8)
## [85] [2.8,3.6) [2.8,3.6) [2.8,3.6) [2,2.8) [2.8,3.6) [2,2.8) [2,2.8)
## [92] [2.8,3.6) [2,2.8) [2,2.8) [2,2.8) [2.8,3.6) [2.8,3.6) [2.8,3.6)
## [99] [2,2.8) [2,2.8) [2.8,3.6) [2,2.8) [2.8,3.6) [2.8,3.6) [2.8,3.6)
## [106] [2.8,3.6) [2,2.8) [2.8,3.6) [2,2.8) [2.8,3.6) [2.8,3.6) [2,2.8)
## [113] [2.8,3.6) [2,2.8) [2,2.8) [2.8,3.6) [2.8,3.6) [3.6,4.4] [2,2.8)
## [120] [2,2.8) [2.8,3.6) [2,2.8) [2,2.8) [2,2.8) [2.8,3.6) [2.8,3.6)
## [127] [2,2.8) [2.8,3.6) [2,2.8) [2.8,3.6) [2,2.8) [3.6,4.4] [2,2.8)
## [134] [2,2.8) [2,2.8) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2.8,3.6)
## [141] [2.8,3.6) [2.8,3.6) [2,2.8) [2.8,3.6) [2.8,3.6) [2.8,3.6) [2,2.8)
## [148] [2.8,3.6) [2.8,3.6) [2.8,3.6)
## attr(,"discretized:breaks")
## [1] 2.0 2.8 3.6 4.4
## attr(,"discretized:method")
## [1] interval
## Levels: [2,2.8) [2.8,3.6) [3.6,4.4]
intervals <- discretize(iris$Sepal.Width, method="frequency", breaks=3)
print(intervals)
## [1] [3.2,4.4] [2.9,3.2) [3.2,4.4] [2.9,3.2) [3.2,4.4] [3.2,4.4] [3.2,4.4]
## [8] [3.2,4.4] [2.9,3.2) [2.9,3.2) [3.2,4.4] [3.2,4.4] [2.9,3.2) [2.9,3.2)
## [15] [3.2,4.4] [3.2,4.4] [3.2,4.4] [3.2,4.4] [3.2,4.4] [3.2,4.4] [3.2,4.4]
## [22] [3.2,4.4] [3.2,4.4] [3.2,4.4] [3.2,4.4] [2.9,3.2) [3.2,4.4] [3.2,4.4]
## [29] [3.2,4.4] [3.2,4.4] [2.9,3.2) [3.2,4.4] [3.2,4.4] [3.2,4.4] [2.9,3.2)
## [36] [3.2,4.4] [3.2,4.4] [3.2,4.4] [2.9,3.2) [3.2,4.4] [3.2,4.4] [2,2.9)
## [43] [3.2,4.4] [3.2,4.4] [3.2,4.4] [2.9,3.2) [3.2,4.4] [3.2,4.4] [3.2,4.4]
## [50] [3.2,4.4] [3.2,4.4] [3.2,4.4] [2.9,3.2) [2,2.9) [2,2.9) [2,2.9)
## [57] [3.2,4.4] [2,2.9) [2.9,3.2) [2,2.9) [2,2.9) [2.9,3.2) [2,2.9)
## [64] [2.9,3.2) [2.9,3.2) [2.9,3.2) [2.9,3.2) [2,2.9) [2,2.9) [2,2.9)
## [71] [3.2,4.4] [2,2.9) [2,2.9) [2,2.9) [2.9,3.2) [2.9,3.2) [2,2.9)
## [78] [2.9,3.2) [2.9,3.2) [2,2.9) [2,2.9) [2,2.9) [2,2.9) [2,2.9)
## [85] [2.9,3.2) [3.2,4.4] [2.9,3.2) [2,2.9) [2.9,3.2) [2,2.9) [2,2.9)
## [92] [2.9,3.2) [2,2.9) [2,2.9) [2,2.9) [2.9,3.2) [2.9,3.2) [2.9,3.2)
## [99] [2,2.9) [2,2.9) [3.2,4.4] [2,2.9) [2.9,3.2) [2.9,3.2) [2.9,3.2)
## [106] [2.9,3.2) [2,2.9) [2.9,3.2) [2,2.9) [3.2,4.4] [3.2,4.4] [2,2.9)
## [113] [2.9,3.2) [2,2.9) [2,2.9) [3.2,4.4] [2.9,3.2) [3.2,4.4] [2,2.9)
## [120] [2,2.9) [3.2,4.4] [2,2.9) [2,2.9) [2,2.9) [3.2,4.4] [3.2,4.4]
## [127] [2,2.9) [2.9,3.2) [2,2.9) [2.9,3.2) [2,2.9) [3.2,4.4] [2,2.9)
## [134] [2,2.9) [2,2.9) [2.9,3.2) [3.2,4.4] [2.9,3.2) [2.9,3.2) [2.9,3.2)
## [141] [2.9,3.2) [2.9,3.2) [2,2.9) [3.2,4.4] [3.2,4.4] [2.9,3.2) [2,2.9)
## [148] [2.9,3.2) [3.2,4.4] [2.9,3.2)
## attr(,"discretized:breaks")
## [1] 2.0 2.9 3.2 4.4
## attr(,"discretized:method")
## [1] frequency
## Levels: [2,2.9) [2.9,3.2) [3.2,4.4]
intervals <- discretize(iris$Sepal.Width, method="cluster", breaks=3)
print(intervals)
## [1] [3.33,4.4] [2.76,3.33) [2.76,3.33) [2.76,3.33) [3.33,4.4] [3.33,4.4]
## [7] [3.33,4.4] [3.33,4.4] [2.76,3.33) [2.76,3.33) [3.33,4.4] [3.33,4.4]
## [13] [2.76,3.33) [2.76,3.33) [3.33,4.4] [3.33,4.4] [3.33,4.4] [3.33,4.4]
## [19] [3.33,4.4] [3.33,4.4] [3.33,4.4] [3.33,4.4] [3.33,4.4] [2.76,3.33)
## [25] [3.33,4.4] [2.76,3.33) [3.33,4.4] [3.33,4.4] [3.33,4.4] [2.76,3.33)
## [31] [2.76,3.33) [3.33,4.4] [3.33,4.4] [3.33,4.4] [2.76,3.33) [2.76,3.33)
## [37] [3.33,4.4] [3.33,4.4] [2.76,3.33) [3.33,4.4] [3.33,4.4] [2,2.76)
## [43] [2.76,3.33) [3.33,4.4] [3.33,4.4] [2.76,3.33) [3.33,4.4] [2.76,3.33)
## [49] [3.33,4.4] [2.76,3.33) [2.76,3.33) [2.76,3.33) [2.76,3.33) [2,2.76)
## [55] [2.76,3.33) [2.76,3.33) [2.76,3.33) [2,2.76) [2.76,3.33) [2,2.76)
## [61] [2,2.76) [2.76,3.33) [2,2.76) [2.76,3.33) [2.76,3.33) [2.76,3.33)
## [67] [2.76,3.33) [2,2.76) [2,2.76) [2,2.76) [2.76,3.33) [2.76,3.33)
## [73] [2,2.76) [2.76,3.33) [2.76,3.33) [2.76,3.33) [2.76,3.33) [2.76,3.33)
## [79] [2.76,3.33) [2,2.76) [2,2.76) [2,2.76) [2,2.76) [2,2.76)
## [85] [2.76,3.33) [3.33,4.4] [2.76,3.33) [2,2.76) [2.76,3.33) [2,2.76)
## [91] [2,2.76) [2.76,3.33) [2,2.76) [2,2.76) [2,2.76) [2.76,3.33)
## [97] [2.76,3.33) [2.76,3.33) [2,2.76) [2.76,3.33) [2.76,3.33) [2,2.76)
## [103] [2.76,3.33) [2.76,3.33) [2.76,3.33) [2.76,3.33) [2,2.76) [2.76,3.33)
## [109] [2,2.76) [3.33,4.4] [2.76,3.33) [2,2.76) [2.76,3.33) [2,2.76)
## [115] [2.76,3.33) [2.76,3.33) [2.76,3.33) [3.33,4.4] [2,2.76) [2,2.76)
## [121] [2.76,3.33) [2.76,3.33) [2.76,3.33) [2,2.76) [2.76,3.33) [2.76,3.33)
## [127] [2.76,3.33) [2.76,3.33) [2.76,3.33) [2.76,3.33) [2.76,3.33) [3.33,4.4]
## [133] [2.76,3.33) [2.76,3.33) [2,2.76) [2.76,3.33) [3.33,4.4] [2.76,3.33)
## [139] [2.76,3.33) [2.76,3.33) [2.76,3.33) [2.76,3.33) [2,2.76) [2.76,3.33)
## [145] [2.76,3.33) [2.76,3.33) [2,2.76) [2.76,3.33) [3.33,4.4] [2.76,3.33)
## attr(,"discretized:breaks")
## [1] 2.000000 2.757595 3.329544 4.400000
## attr(,"discretized:method")
## [1] cluster
## Levels: [2,2.76) [2.76,3.33) [3.33,4.4]
disc_interval <- discretize(iris$Sepal.Width, method = "fixed", breaks = c(2,3,4,5))
print(disc_interval)
## [1] [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [2,3) [3,4) [3,4) [3,4)
## [13] [3,4) [3,4) [4,5] [4,5] [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4)
## [25] [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [4,5] [4,5] [3,4) [3,4)
## [37] [3,4) [3,4) [3,4) [3,4) [3,4) [2,3) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4)
## [49] [3,4) [3,4) [3,4) [3,4) [3,4) [2,3) [2,3) [2,3) [3,4) [2,3) [2,3) [2,3)
## [61] [2,3) [3,4) [2,3) [2,3) [2,3) [3,4) [3,4) [2,3) [2,3) [2,3) [3,4) [2,3)
## [73] [2,3) [2,3) [2,3) [3,4) [2,3) [3,4) [2,3) [2,3) [2,3) [2,3) [2,3) [2,3)
## [85] [3,4) [3,4) [3,4) [2,3) [3,4) [2,3) [2,3) [3,4) [2,3) [2,3) [2,3) [3,4)
## [97] [2,3) [2,3) [2,3) [2,3) [3,4) [2,3) [3,4) [2,3) [3,4) [3,4) [2,3) [2,3)
## [109] [2,3) [3,4) [3,4) [2,3) [3,4) [2,3) [2,3) [3,4) [3,4) [3,4) [2,3) [2,3)
## [121] [3,4) [2,3) [2,3) [2,3) [3,4) [3,4) [2,3) [3,4) [2,3) [3,4) [2,3) [3,4)
## [133] [2,3) [2,3) [2,3) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [3,4) [2,3) [3,4)
## [145] [3,4) [3,4) [2,3) [3,4) [3,4) [3,4)
## attr(,"discretized:breaks")
## [1] 2 3 4 5
## attr(,"discretized:method")
## [1] fixed
## Levels: [2,3) [3,4) [4,5]
Анализ применения различных методов discretize() к переменной Sepal.Width из набора данных iris показывает следующие особенности:
Метод interval (Равная ширина интервала): Создает интервалы одинаковой ширины, но не учитывает частоту значений. Подходит, когда нужно равномерно распределить данные по категориям.
Метод frequency (Равная частота): Гарантирует одинаковое количество наблюдений в каждой категории, но интервалы могут быть разной ширины. Хорош для случаев, когда важно равное количество данных в категориях.
Метод cluster (Кластеризация): Разделяет данные на основе кластеров, что помогает выделить естественные группы. Подходит для поиска скрытых паттернов в данных.
Метод fixed (Заданные границы): Позволяет вручную задать границы категорий. Используется, когда известны важные точки разделения, но не учитывает частоту значений.
Выбор метода зависит от цели анализа:
Interval — для равномерных интервалов. Frequency — для равных категорий по количеству данных. Cluster — для учета скрытых групп. Fixed — для заданных границ.
library(Boruta)
data("airquality")
head(airquality)
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
airquality <- na.omit(airquality)
airquality$OzoneLevel <- factor(ifelse(airquality$Ozone > median(airquality$Ozone, na.rm = TRUE), "High", "Low"))
set.seed(123)
result <- Boruta(OzoneLevel ~ ., data = airquality, 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...
## After 10 iterations, +0.15 secs:
## confirmed 5 attributes: Day, Ozone, Solar.R, Temp, Wind;
## still have 1 attribute left.
## 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...
## After 47 iterations, +0.68 secs:
## confirmed 1 attribute: Month;
## no more attributes left.
print(result)
## Boruta performed 47 iterations in 0.6817429 secs.
## 6 attributes confirmed important: Day, Month, Ozone, Solar.R, Temp and
## 1 more;
## No attributes deemed unimportant.
boxplot(airquality$Wind ~ airquality$OzoneLevel,main = "Wind and Ozone Level",xlab = "Ozone Level", ylab = "Wind",col = c("red", "blue"))
График 1
Данный график показывает, что при высоком уровне озона скорость ветра ниже, чем при низком его уровне. И при низком, и при высоком уровне озона имеется большие отклонения от медианы что показывает на нестабильность скорости ветра.
boxplot(airquality$Temp ~ airquality$OzoneLevel,main = "Temp and Ozone Level",xlab = "Ozone Level", ylab = "Temp",col = c("red", "blue"))
График 2
На данном графике видно, что при высоком уровне озона температура выше, чем при низком его уровне. При высоком уровне озона отображены небольшие отклонения от медианы, которые демонстрируют стабльно высокую темпеатуру по фаренгейту. При низком же уровне озона температура имеет большие отклонения, что указывает на ее нестабильность. К тому же она ниже, чем при высоком уровне озона.