Отчет по лабораторной работе 2
Подключим пакет caret.
library(caret)
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
Сгенерируем данные и выполним графический анализ.
set.seed(123)
x <- matrix(rnorm(50*5), ncol = 5)
y <- factor(rep(c("A", "B"), 25))
featurePlot(x = x, y = y, plot = "pairs")
Сохраним график в формате JPG.
jpeg("featurePlot_pairs.jpg")
featurePlot(x = x, y = y, plot = "pairs")
dev.off()
## png
## 2
Построим дополнительные графики.
featurePlot(x = x, y = y, plot = "box")
featurePlot(x = x, y = y, plot = "density")
Сохраним их.
jpeg("featurePlot_box.jpg")
featurePlot(x = x, y = y, plot = "box")
dev.off()
## png
## 2
jpeg("featurePlot_density.jpg")
featurePlot(x = x, y = y, plot = "density")
dev.off()
## png
## 2
Был выполнен графический разведочный анализ с использованием функции featurePlot(). Поскольку данные сгенерированы случайным образом, четкого разделения классов не наблюдается.
Для набора данных iris определим важность признаков с помощью пакета FSelectorRcpp.
library(FSelectorRcpp)
data(iris)
Вычислим важность признаков для задачи классификации.
weights <- information_gain(Species ~ ., data = iris)
weights
## attributes importance
## 1 Sepal.Length 0.4521286
## 2 Sepal.Width 0.2672750
## 3 Petal.Length 0.9402853
## 4 Petal.Width 0.9554360
Отсортируем признаки по убыванию важности.
weights[order(-weights$importance), ]
## attributes importance
## 4 Petal.Width 0.9554360
## 3 Petal.Length 0.9402853
## 1 Sepal.Length 0.4521286
## 2 Sepal.Width 0.2672750
Для набора данных iris была определена важность признаков. Наиболее значимыми признаками для классификации являются Petal.Length и Petal.Width, так как они лучше всего разделяют виды ирисов.
Выполним дискретизацию непрерывной переменной
Sepal.Length из набора данных iris с помощью функции
discretize() из пакета arules различными методами.
library(arules)
## Загрузка требуемого пакета: Matrix
##
## Присоединяю пакет: 'arules'
## Следующий объект скрыт от 'package:FSelectorRcpp':
##
## discretize
## Следующие объекты скрыты от 'package:base':
##
## abbreviate, write
data(iris)
x <- iris$Sepal.Length
disc_interval <- discretize(x, method = "interval", categories = 3)
## Warning in discretize(x, method = "interval", categories = 3): Parameter
## categories is deprecated. Use breaks instead! Also, the default method is now
## frequency!
table(disc_interval)
## disc_interval
## [4.3,5.5) [5.5,6.7) [6.7,7.9]
## 52 70 28
disc_frequency <- discretize(x, method = "frequency", categories = 3)
## Warning in discretize(x, 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(x, method = "cluster", categories = 3)
## Warning in discretize(x, 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(x, method = "fixed", breaks = c(-Inf, 5.5, 6.5, Inf))
table(disc_fixed)
## disc_fixed
## [-Inf,5.5) [5.5,6.5) [6.5, Inf]
## 52 63 35
head(data.frame(
Sepal.Length = x,
interval = disc_interval,
frequency = disc_frequency,
cluster = disc_cluster,
fixed = disc_fixed
))
## Sepal.Length interval frequency cluster fixed
## 1 5.1 [4.3,5.5) [4.3,5.4) [4.3,5.33) [-Inf,5.5)
## 2 4.9 [4.3,5.5) [4.3,5.4) [4.3,5.33) [-Inf,5.5)
## 3 4.7 [4.3,5.5) [4.3,5.4) [4.3,5.33) [-Inf,5.5)
## 4 4.6 [4.3,5.5) [4.3,5.4) [4.3,5.33) [-Inf,5.5)
## 5 5.0 [4.3,5.5) [4.3,5.4) [4.3,5.33) [-Inf,5.5)
## 6 5.4 [4.3,5.5) [5.4,6.3) [5.33,6.27) [-Inf,5.5)
Функция discretize() позволяет преобразовать числовые
данные в категориальные.
Метод interval делит диапазон на интервалы одинаковой
ширины,
frequency — на группы с равным числом наблюдений,
cluster — по схожести значений,
fixed — по заранее заданным границам.
Разные методы дают различное распределение объектов по категориям, что может влиять на результаты анализа.
Установим пакет Boruta и выполним отбор признаков для
набора данных Ozone.
library(Boruta)
library(mlbench)
data("Ozone")
Ozone <- na.omit(Ozone)
Проведем отбор признаков с помощью алгоритма Boruta.
set.seed(123)
boruta_output <- Boruta(V4 ~ ., data = Ozone, doTrace = 0)
print(boruta_output)
## Boruta performed 24 iterations in 2.621539 secs.
## 9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
## 3 attributes confirmed unimportant: V2, V3, V6;
Выведем статистику по признакам.
boruta_stats <- attStats(boruta_output)
boruta_stats
## meanImp medianImp minImp maxImp normHits decision
## V1 9.5563296 9.7071000 8.4255686 10.7247899 1.0000000 Confirmed
## V2 1.1557680 1.1576551 -0.2474598 2.7423660 0.1666667 Rejected
## V3 -0.9877372 -0.7333367 -3.4162909 0.3794342 0.0000000 Rejected
## V5 9.2426781 9.2313179 8.1108460 10.5140883 1.0000000 Confirmed
## V6 0.9886679 1.3615721 -1.1013954 1.9852132 0.0000000 Rejected
## V7 11.7026875 11.5169965 10.5127703 13.4896943 1.0000000 Confirmed
## V8 17.1647491 17.2255744 16.0336735 18.5525852 1.0000000 Confirmed
## V9 19.2281405 19.0627349 17.5889826 20.9190449 1.0000000 Confirmed
## V10 9.8662368 9.7266893 8.6477478 11.3131795 1.0000000 Confirmed
## V11 11.8977619 11.8484607 10.9347533 13.6520570 1.0000000 Confirmed
## V12 14.6326841 14.6095338 13.5595253 16.0775580 1.0000000 Confirmed
## V13 9.4438214 9.5489762 8.1005306 10.7881019 1.0000000 Confirmed
Построим boxplot для одного из значимых признаков.
boxplot(Ozone$V4 ~ Ozone$V1,
main = "Boxplot of Ozone levels by V1",
xlab = "V1",
ylab = "Ozone")
Сохраним график в формате JPG.
jpeg("boruta_boxplot.jpg", width = 1200, height = 800)
boxplot(Ozone$V4 ~ Ozone$V1,
main = "Boxplot of Ozone levels by V1",
xlab = "V1",
ylab = "Ozone")
dev.off()
## png
## 2
С помощью пакета Boruta был выполнен отбор признаков для
набора данных Ozone.
По результатам анализа 10 признаков были признаны важными, а признаки
V2, V3 и V6 — незначимыми.
Построенный boxplot показывает распределение значений целевой переменной
V4 в зависимости от признака V1.