library(caret)
models <- names(getModelInfo())
length(models)
## [1] 239
head(models)
## [1] "ada" "AdaBag" "AdaBoost.M1" "adaboost" "amdai"
## [6] "ANFIS"
Функция getModelInfo() возвращает список реализованных в пакете caret алгоритмов машинного обучения для задач классификации и регрессии.
set.seed(141)
x <- matrix(rnorm(50*5), ncol = 5)
colnames(x) <- paste0("X", 1:5)
y <- factor(rep(c("A", "B"), 25))
set.seed(141) - фиксирует случайностьrnorm(50*5) - 250 случайных чиселmatrix(rnorm(50*5), ncol=5) - 50 объектов, 5
признаковcolnames() - имена признаковfactor(rep(c("A", "B"), 25)) - два класса A и BfeaturePlot(x = x, y = y, plot = "pairs")
jpeg("featurePlot_pairs.jpg", width = 2000, height = 2000)
featurePlot(x = x, y = y, plot = "pairs")
dev.off()
## quartz_off_screen
## 2
featurePlot(x = x, y = y, plot = "density")
jpeg("featurePlot_density.jpg", width = 2000, height = 2000)
featurePlot(x = x, y = y, plot = "density")
dev.off()
## quartz_off_screen
## 2
Попарные диаграммы рассеяния признаков показали, что объекты классов A и B существенно перекрываются во всех двумерных проекциях пространства признаков. Чёткой разделимости классов по парам признаков не наблюдается, что указывает на отсутствие выраженной структуры в данных.
library(FSelector)
data(iris)
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
weights <- information.gain(Species ~ ., iris)
weights
## attr_importance
## Sepal.Length 0.4521286
## Sepal.Width 0.2672750
## Petal.Length 0.9402853
## Petal.Width 0.9554360
weights_sorted <- weights[order(-weights$attr_importance), , drop = FALSE]
weights_sorted
## attr_importance
## Petal.Width 0.9554360
## Petal.Length 0.9402853
## Sepal.Length 0.4521286
## Sepal.Width 0.2672750
library(arules)
## Loading required package: Matrix
##
## Attaching package: 'arules'
## The following objects are masked from 'package:base':
##
## abbreviate, write
data(iris)
x <- iris$Petal.Length
x_interval <- discretize(x, method = "interval", breaks = 3)
table(x_interval)
## x_interval
## [1,2.97) [2.97,4.93) [4.93,6.9]
## 50 54 46
x_frequency <- discretize(x, method = "frequency", breaks = 3)
table(x_frequency)
## x_frequency
## [1,2.63) [2.63,4.9) [4.9,6.9]
## 50 49 51
x_cluster <- discretize(x, method = "cluster", breaks = 3)
table(x_cluster)
## x_cluster
## [1,2.85) [2.85,4.89) [4.89,6.9]
## 50 49 51
x_fixed <- discretize(x, method = "fixed", breaks = c(1, 3, 5, 7))
table(x_fixed)
## x_fixed
## [1,3) [3,5) [5,7]
## 50 54 46
head(data.frame(
original = x,
interval = x_interval,
frequency = x_frequency,
cluster = x_cluster,
fixed = x_fixed
))
## original interval frequency cluster fixed
## 1 1.4 [1,2.97) [1,2.63) [1,2.85) [1,3)
## 2 1.4 [1,2.97) [1,2.63) [1,2.85) [1,3)
## 3 1.3 [1,2.97) [1,2.63) [1,2.85) [1,3)
## 4 1.5 [1,2.97) [1,2.63) [1,2.85) [1,3)
## 5 1.4 [1,2.97) [1,2.63) [1,2.85) [1,3)
## 6 1.7 [1,2.97) [1,2.63) [1,2.85) [1,3)
В результате дискретизации непрерывного признака Petal.Length различными методами получены различные варианты разбиения диапазона значений на интервалы. Метод равной ширины интервалов формирует интервалы одинакового размера, но с неравным числом объектов в каждом. Метод равной частоты обеспечивает приблизительно одинаковое количество наблюдений в каждом интервале. Метод кластеризации формирует интервалы с учётом структуры данных. Метод фиксированных границ позволяет задавать интервалы на основе предметной области.
library(mlbench)
library(Boruta)
Загрузка данных и просмотр структуры:
data(Ozone)
str(Ozone)
## 'data.frame': 366 obs. of 13 variables:
## $ V1 : Factor w/ 12 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ V2 : Factor w/ 31 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ V3 : Factor w/ 7 levels "1","2","3","4",..: 4 5 6 7 1 2 3 4 5 6 ...
## $ V4 : num 3 3 3 5 5 6 4 4 6 7 ...
## $ V5 : num 5480 5660 5710 5700 5760 5720 5790 5790 5700 5700 ...
## $ V6 : num 8 6 4 3 3 4 6 3 3 3 ...
## $ V7 : num 20 NA 28 37 51 69 19 25 73 59 ...
## $ V8 : num NA 38 40 45 54 35 45 55 41 44 ...
## $ V9 : num NA NA NA NA 45.3 ...
## $ V10: num 5000 NA 2693 590 1450 ...
## $ V11: num -15 -14 -25 -24 25 15 -33 -28 23 -2 ...
## $ V12: num 30.6 NA 47.7 55 57 ...
## $ V13: num 200 300 250 100 60 60 100 250 120 120 ...
summary(Ozone)
## V1 V2 V3 V4 V5
## 1 : 31 1 : 12 1:52 Min. : 1.00 Min. :5320
## 3 : 31 2 : 12 2:52 1st Qu.: 5.00 1st Qu.:5700
## 5 : 31 3 : 12 3:52 Median : 9.00 Median :5770
## 7 : 31 4 : 12 4:53 Mean :11.53 Mean :5753
## 8 : 31 5 : 12 5:53 3rd Qu.:16.00 3rd Qu.:5830
## 10 : 31 6 : 12 6:52 Max. :38.00 Max. :5950
## (Other):180 (Other):294 7:52 NA's :5 NA's :12
## V6 V7 V8 V9
## Min. : 0.000 Min. :19.00 Min. :25.00 Min. :27.68
## 1st Qu.: 3.000 1st Qu.:49.00 1st Qu.:51.00 1st Qu.:49.73
## Median : 5.000 Median :65.00 Median :62.00 Median :57.02
## Mean : 4.869 Mean :58.48 Mean :61.91 Mean :56.85
## 3rd Qu.: 6.000 3rd Qu.:73.00 3rd Qu.:72.00 3rd Qu.:66.11
## Max. :11.000 Max. :93.00 Max. :93.00 Max. :82.58
## NA's :15 NA's :2 NA's :139
## V10 V11 V12 V13
## Min. : 111 Min. :-69.0 Min. :27.50 Min. : 0.0
## 1st Qu.: 890 1st Qu.:-10.0 1st Qu.:51.26 1st Qu.: 70.0
## Median :2125 Median : 24.0 Median :62.24 Median :110.0
## Mean :2591 Mean : 17.8 Mean :60.93 Mean :123.3
## 3rd Qu.:5000 3rd Qu.: 45.0 3rd Qu.:70.52 3rd Qu.:150.0
## Max. :5000 Max. :107.0 Max. :91.76 Max. :500.0
## NA's :15 NA's :1 NA's :14
Удаление пропусков:
oz <- na.omit(Ozone)
Запуск boruta:
set.seed(123)
bor <- Boruta(V4 ~ ., data = oz, doTrace = 1)
## After 11 iterations, +0.62 secs:
## confirmed 9 attributes: V1, V10, V11, V12, V13 and 4 more;
## rejected 1 attribute: V3;
## still have 2 attributes left.
## After 15 iterations, +0.84 secs:
## rejected 1 attribute: V2;
## still have 1 attribute left.
## After 21 iterations, +1.2 secs:
## rejected 1 attribute: V6;
## no more attributes left.
Результат:
bor
## Boruta performed 21 iterations in 1.153435 secs.
## 9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
## 3 attributes confirmed unimportant: V2, V3, V6;
Извлечение полезных признаков:
getSelectedAttributes(bor, withTentative = TRUE)
## [1] "V1" "V5" "V7" "V8" "V9" "V10" "V11" "V12" "V13"
Построение графика boxplot:
plot(bor, las = 2, cex.axis = 0.7)
С использованием алгоритма Boruta выполнен отбор признаков для набора данных Ozone. В результате были выделены признаки, обладающие статистически значимой важностью по сравнению с «теневыми» признаками, что позволяет считать их информативными для предсказания уровня озона. Часть признаков была отклонена как неинформативная. Визуализация boxplot подтверждает различия важности реальных признаков относительно уровня шума.