x <- matrix(rnorm(50*5),ncol=5)
y <- factor(rep(c("A", "B"), 25))
Установим и загрузим пакет с помощью команд
install.packages("caret") и
library(caret).
Просмотрим доступные методы caret с помощью команды
names(getModelInfo())
Сформируем текстовые данные, которые были упомянуты в задании:
set.seed(123)
x <- matrix(rnorm(50 * 5), ncol = 5)
y <- factor(rep(c("A", "B"), 25))
df <- as.data.frame(x)
colnames(df) <- paste0("X", 1:5)
df$Class <- y
Далее воспользуемся функцией featurePlot() из caret,
которая позволяет быстро смотреть взаимосвязи признаков и целевой
переменной. Рассмотрим несколько вариантов графиков:
jpeg("featurePlot_pairs.jpg")
featurePlot(x = df[, 1:5],
y = df$Class,
plot = "pairs")
dev.off()
На выходе получаем следующий график:
jpeg("featurePlot_ellipse.jpg")
featurePlot(x = df[, 1:5],
y = df$Class,
plot = "ellipse")
dev.off()
jpeg("featurePlot_box.jpg")
featurePlot(x = df[, 1:5],
y = df$Class,
plot = "box")
dev.off()
jpeg("featurePlot_density.jpg")
featurePlot(x = df[, 1:5],
y = df$Class,
plot = "density")
dev.off()
Основные выводы, учитывая, что данные генерируются случайно:
featurePlot() удобен для быстрого “разведочного”
анализа, чтобы понять, какие признаки отличаются (или не отличаются) по
классам.Установим и запустим пакет с помощью команд
install.packages("FSelector") и
library(FSelector)
Подготовим данные iris с помощью команд data(iris) и
head(iris)
Данные iris содержат 4 числовых признака (длина/ширина чашелистика и лепестка) и факторный признак Species (три вида ирисов).
Рассмотрим пример использования Information Gain для оценки вклада
каждого признака в определение вида (Species). Запустим следующие
команды:
weights_info_gain <- information.gain(Species ~ ., data = iris)
и weights_info_gain
Также можно использовать, например, gain ratio с помощью команд
weights_gain_ratio <- gain.ratio(Species ~ ., data = iris)
и weights_gain_ratio
В результатах заметим, что, как правило, наиболее важными признаками в классификации вида ириса оказываются Petal.Length и Petal.Width (длина и ширина лепестка). Признаки, связанные с чашелистиками, тоже имеют некоторую полезность, но обычно меньшую.
Основные выводы:
Установим и запустим arules с помощью команд
install.packages("arules") и
library(arules)
Рассмотрим признак Sepal.Length, чтобы продемонстрировать разные методы дискретизации:
disc_interval <- discretize(iris$Sepal.Length,
method = "interval",
categories = 3)
table(disc_interval)
disc_frequency <- discretize(iris$Sepal.Length,
method = "frequency",
categories = 3)
table(disc_frequency)
disc_cluster <- discretize(iris$Sepal.Length,
method = "cluster",
categories = 3)
table(disc_cluster)
Допустим, хотим разделить длину чашелистика примерно так: [4.3, 5.5), [5.5, 6.3), [6.3, 7.9], тогда:
disc_fixed <- discretize(iris$Sepal.Length,
method = "fixed",
categories = c(4.3, 5.5, 6.3, 7.9))
table(disc_fixed)
По частотам в table() будет видно, как распределились значения признака по категориям в каждом методе.
Основные выводы:
Установим и запустим пакет с помощью команд
install.packages("Boruta") и
library(Boruta)
Подготовим данные Ozone. Набор данных Ozone доступен, например, в пакете mlbench:
install.packages("mlbench")
library(mlbench)
data("Ozone")
str(Ozone)
Часть столбцов может содержать пропуски. Обычно для Boruta желательно
работать с полным набором без NA, поэтому нужно либо удалить пропуски,
либо применить какую-то стратегию заполнения (imputation). Выберем
удаление строк с пропусками. Осуществим это действие с помощью команды
ozone_clean <- na.omit(Ozone)
Запустим Boruta. Допустим, мы хотим предсказывать переменную V4 (загрязнение), а все остальные используем как предикторы. Выполним:
set.seed(123)
boruta_result <- Boruta(V4 ~ ., data = ozone_clean, doTrace = 2, maxRuns = 100)
boruta_result
В результате получим:
Мы получили информацию о том, какие признаки признаны «важными» (Confirmed), «неважными» (Rejected) или «не до конца определёнными» (Tentative).
Так же, Boruta позволяет строить диаграмму боксов (boxplot), отражающую распределение Z-оценок важности признаков. Построим такую диаграму с помощью команд:
plot(boruta_result, xlab = "", xaxt = "n")
lz<-lapply(1:ncol(boruta_result$ImpHistory),function(i)
boruta_result$ImpHistory[is.finite(boruta_result$ImpHistory[,i]),i])
names(lz) <- colnames(boruta_result$ImpHistory)
axis(side = 1, las=2, labels = names(lz),
at = 1:ncol(boruta_result$ImpHistory), cex.axis = 0.7)
В итоге, boxplot покажет Z-значения важности каждого признака, включая «теневых» (shadow) признаков, которые Boruta использует как базу для сравнения.
Основные выводы: