install.packages("caret")
## Warning: пакет ''caret'' сейчас используется и не будет установлен
library(caret)
x <- matrix(rnorm(50*5), ncol=5)
y <- factor(rep(c("A","B"),25))
head(names(getModelInfo()))
## [1] "ada" "AdaBag" "AdaBoost.M1" "adaboost" "amdai"
## [6] "ANFIS"
set.seed(123)
x <- matrix(rnorm(50 * 5), ncol = 5)
y <- factor(rep(c("A", "B"), 25))
x <- as.data.frame(x)
colnames(x) <- c(
"Feature1",
"Feature2",
"Feature3",
"Feature4",
"Feature5"
)
head(x)
## Feature1 Feature2 Feature3 Feature4 Feature5
## 1 -0.56047565 0.25331851 -0.71040656 0.7877388 2.1988103
## 2 -0.23017749 -0.02854676 0.25688371 0.7690422 1.3124130
## 3 1.55870831 -0.04287046 -0.24669188 0.3322026 -0.2651451
## 4 0.07050839 1.36860228 -0.34754260 -1.0083766 0.5431941
## 5 0.12928774 -0.22577099 -0.95161857 -0.1194526 -0.4143399
## 6 1.71506499 1.51647060 -0.04502772 -0.2803953 -0.4762469
jpeg("feature_box.jpg")
featurePlot(
x = x,
y = y,
plot = "box"
)
dev.off()
## png
## 2
featurePlot(
x = x,
y = y,
plot = "box"
)
jpeg("feature_density.jpg")
featurePlot(
x = x,
y = y,
plot = "density"
)
dev.off()
## png
## 2
featurePlot(
x = x,
y = y,
plot = "density"
)
jpeg("feature_pairs.jpg")
featurePlot(
x = x,
y = y,
plot = "pairs"
)
dev.off()
## png
## 2
featurePlot(
x = x,
y = y,
plot = "pairs"
)
list.files(pattern = "*.jpg")
## [1] "boruta_boxplot.jpg" "feature_box.jpg" "feature_density.jpg"
## [4] "feature_pairs.jpg"
С помощью функции featurePlot() был выполнен графический
разведочный анализ данных. Были построены графики распределения
признаков и их попарных зависимостей. Поскольку данные были
сгенерированы случайным образом, выраженного разделения между классами A
и B обнаружено не было.
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
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,
decreasing = TRUE),
]
weights_sorted
## [1] 0.9554360 0.9402853 0.4521286 0.2672750
По результатам расчёта Information Gain была определена информативность признаков набора данных iris. Наиболее значимыми являются признаки с максимальным значением показателя attr_importance, а наименее значимыми — признаки с минимальным значением данного показателя.
library(arules)
data(iris)
В качестве непрерывного признака используется переменная Sepal.Length.
disc_interval <- discretize(
iris$Sepal.Length,
method = "interval",
categories = 3
)
table(disc_interval)
## disc_interval
## [4.3,5.5) [5.5,6.7) [6.7,7.9]
## 52 70 28
disc_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!
table(disc_frequency)
## disc_frequency
## [4.3,5.4) [5.4,6.3) [6.3,7.9]
## 46 53 51
disc_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!
table(disc_cluster)
## disc_cluster
## [4.3,5.33) [5.33,6.27) [6.27,7.9]
## 46 53 51
disc_fixed <- discretize(
iris$Sepal.Length,
method = "fixed",
breaks = c(4, 5.5, 7, 8)
)
table(disc_fixed)
## disc_fixed
## [4,5.5) [5.5,7) [7,8]
## 52 85 13
Были рассмотрены различные методы дискретизации непрерывного признака. Метод interval формирует интервалы одинаковой ширины, frequency распределяет наблюдения по категориям примерно поровну, cluster определяет границы автоматически на основе структуры данных, а fixed использует заранее заданные пользователем границы.
library(Boruta)
library(mlbench)
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 ...
Ozone_clean <- na.omit(Ozone)
boruta_model <- Boruta(
V4 ~ .,
data = Ozone_clean,
doTrace = 0
)
boruta_model
## Boruta performed 27 iterations in 0.4569731 secs.
## 9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
## 3 attributes confirmed unimportant: V2, V3, V6;
attStats(boruta_model)
## meanImp medianImp minImp maxImp normHits decision
## V1 0.40484161 0.40025241 0.35308063 0.45488575 1.0000000 Confirmed
## V2 0.03361663 0.03198824 -0.04127076 0.09496684 0.1111111 Rejected
## V3 -0.05382516 -0.07882605 -0.11794678 0.06388712 0.0000000 Rejected
## V5 0.38208645 0.38500256 0.31825077 0.43936492 1.0000000 Confirmed
## V6 0.03845126 0.02797858 -0.04940123 0.15538728 0.1851852 Rejected
## V7 0.53072632 0.53006074 0.48180759 0.57025349 1.0000000 Confirmed
## V8 0.77666988 0.78527109 0.70412404 0.82644840 1.0000000 Confirmed
## V9 0.87549954 0.87167817 0.82754363 0.93815318 1.0000000 Confirmed
## V10 0.42730352 0.42069548 0.38298284 0.49923461 1.0000000 Confirmed
## V11 0.54405838 0.54047650 0.48736479 0.62269556 1.0000000 Confirmed
## V12 0.65418861 0.64836545 0.59427434 0.72194726 1.0000000 Confirmed
## V13 0.40698244 0.40112032 0.35501746 0.49397854 1.0000000 Confirmed
jpeg("boruta_boxplot.jpg")
plot(boruta_model)
dev.off()
## png
## 2
plot(boruta_model)
Метод Boruta позволил определить значимость признаков относительно целевой переменной. По результатам работы алгоритма признаки были разделены на подтверждённые (Confirmed), отклонённые (Rejected) и неопределённые (Tentative). Наиболее информативными являются признаки, получившие статус Confirmed и имеющие наибольшие значения важности.
В ходе лабораторной работы были изучены методы анализа и отбора признаков с использованием пакетов CARET, FSelector, arules и Boruta. Были выполнены визуальный анализ данных, оценка информативности признаков, дискретизация непрерывных переменных и автоматический отбор наиболее значимых признаков для решения задач классификации.