Анализ данных с использованием пакетов CARET, Fselector, arules и Boruta

1. CARET - Установка и анализ данных

# Установка пакетов 
install.packages("caret")
install.packages("ggplot2")
library(caret)
library(ggplot2)

# Просмотр доступных методов моделирования
model_methods <- names(getModelInfo())
cat("Всего доступно методов в CARET:", length(model_methods), "\n")
## Всего доступно методов в CARET: 239
cat("Первые 10 методов:\n")
## Первые 10 методов:
print(head(model_methods, 10))
##  [1] "ada"         "AdaBag"      "AdaBoost.M1" "adaboost"    "amdai"      
##  [6] "ANFIS"       "avNNet"      "awnb"        "awtan"       "bag"
# Создание набора данных
set.seed(123)
x <- matrix(rnorm(50*5), ncol=5)
y <- factor(rep(c("A", "B"), 25))
data <- data.frame(x, y)
colnames(data) <- c(paste0("Var", 1:5), "Class")

Графический анализ с помощью featurePlot()

# Диаграммы рассеяния
featurePlot(x = data[, 1:5], 
            y = data$Class,
            plot = "pairs",
            auto.key = list(columns = 2),
            main = "Матрица диаграмм рассеяния")
Графический анализ данных с помощью featurePlot()

Графический анализ данных с помощью featurePlot()

# Boxplot для каждого признака
featurePlot(x = data[, 1:5], 
            y = data$Class,
            plot = "box",
            scales = list(x = list(relation = "free"),
                         y = list(relation = "free")),
            main = "Boxplot распределений по классам")
Графический анализ данных с помощью featurePlot()

Графический анализ данных с помощью featurePlot()

# Density plot для каждого признака
featurePlot(x = data[, 1:5], 
            y = data$Class,
            plot = "density",
            scales = list(x = list(relation = "free"),
                         y = list(relation = "free")),
            adjust = 1.5,
            pch = "|",
            layout = c(3, 2),
            main = "Графики плотности распределения")
Графический анализ данных с помощью featurePlot()

Графический анализ данных с помощью featurePlot()

Выводы по разделу CARET: 1. Пакет CARET содержит множество методов моделирования 2. Функция featurePlot() позволяет визуализировать данные разными способами 3. Для искусственных данных нет явного разделения классов

2. FSELECTOR - Определение важности признаков

install.packages("FSelector")
library(FSelector)
data(iris)

# Определение важности признаков
weights_info_gain <- information.gain(Species~., iris)
weights_gain_ratio <- gain.ratio(Species~., iris)
weights_chi_squared <- chi.squared(Species~., iris)

cat("Information Gain:\n")
## Information Gain:
print(weights_info_gain)
##              attr_importance
## Sepal.Length       0.4521286
## Sepal.Width        0.2672750
## Petal.Length       0.9402853
## Petal.Width        0.9554360
cat("\nGain Ratio:\n")
## 
## Gain Ratio:
print(weights_gain_ratio)
##              attr_importance
## Sepal.Length       0.4196464
## Sepal.Width        0.2472972
## Petal.Length       0.8584937
## Petal.Width        0.8713692

Визуализация важности признаков

par(mfrow = c(2, 2))

# Information Gain
barplot(weights_info_gain[,1], 
        names.arg = rownames(weights_info_gain),
        main = "Information Gain",
        col = rainbow(4),
        ylab = "Важность",
        las = 2)

# Gain Ratio
barplot(weights_gain_ratio[,1], 
        names.arg = rownames(weights_gain_ratio),
        main = "Gain Ratio",
        col = rainbow(4),
        ylab = "Важность",
        las = 2)

# Chi-squared
barplot(weights_chi_squared[,1], 
        names.arg = rownames(weights_chi_squared),
        main = "Chi-squared",
        col = rainbow(4),
        ylab = "Важность",
        las = 2)

# Сводный график
all_weights <- cbind(weights_info_gain[,1], 
                     weights_gain_ratio[,1],
                     weights_chi_squared[,1])
colnames(all_weights) <- c("Inf.Gain", "Gain.Ratio", "Chi.Sq")

barplot(t(all_weights), beside = TRUE,
        main = "Сравнение методов",
        ylab = "Важность",
        col = c("blue", "green", "red"),
        legend.text = colnames(all_weights),
        args.legend = list(x = "topright"))
Важность признаков для набора iris

Важность признаков для набора iris

par(mfrow = c(1, 1))

Выводы по разделу FSELECTOR: 1. Petal.Length - наиболее важный признак 2. Petal.Width также очень информативен 3. Sepal.Width имеет наименьшую важность

3. ARULES - Дискретизация переменных

install.packages("arules")
library(arules)
data(iris)

# Различные методы дискретизации
disc_interval <- discretize(iris$Sepal.Length, 
                            method = "interval", 
                            categories = 4,
                            labels = c("Низкий", "Средний", "Высокий", "Очень высокий"))

disc_frequency <- discretize(iris$Sepal.Length, 
                             method = "frequency", 
                             categories = 4,
                             labels = c("Q1", "Q2", "Q3", "Q4"))

disc_cluster <- discretize(iris$Sepal.Length, 
                           method = "cluster", 
                           categories = 4)

disc_fixed <- discretize(iris$Sepal.Length,
                         method = "fixed",
                         breaks = c(-Inf, 5.0, 6.0, 7.0, Inf),
                         labels = c("Очень короткий", "Короткий", "Средний", "Длинный"))

cat("Метод 'interval':\n")
## Метод 'interval':
print(table(disc_interval))
## disc_interval
##        Низкий       Средний       Высокий Очень высокий 
##            41            48            48            13
cat("\nМетод 'frequency':\n")
## 
## Метод 'frequency':
print(table(disc_frequency))
## disc_frequency
## Q1 Q2 Q3 Q4 
## 32 41 35 42
cat("\nМетод 'cluster' (кластеризация):\n")
## 
## Метод 'cluster' (кластеризация):
print(table(disc_cluster))
## disc_cluster
##  [4.3,5.28) [5.28,6.05) [6.05,6.87)  [6.87,7.9] 
##          45          44          44          17
cat("\nМетод 'fixed' (заданные границы: (-Inf,5.0], (5.0,6.0], (6.0,7.0], (7.0,Inf)):\n")
## 
## Метод 'fixed' (заданные границы: (-Inf,5.0], (5.0,6.0], (6.0,7.0], (7.0,Inf)):
print(table(disc_fixed))
## disc_fixed
## Очень короткий       Короткий        Средний        Длинный 
##             22             61             54             13

Визуализация методов дискретизации

par(mfrow = c(2, 2))

# Метод interval
barplot(table(disc_interval), 
        main = 'Метод "interval"\n(равная ширина)',
        xlab = "Категории", 
        col = "lightgreen",
        ylim = c(0, 60))

# Метод frequency
barplot(table(disc_frequency), 
        main = 'Метод "frequency"\n(равная частота)',
        xlab = "Категории", 
        col = "lightcoral",
        ylim = c(0, 60))

# Метод cluster
barplot(table(disc_cluster), 
        main = 'Метод "cluster"\n(кластеризация)',
        xlab = "Категории", 
        col = "lightyellow",
        ylim = c(0, 60))

# Метод fixed
barplot(table(disc_fixed), 
        main = 'Метод "fixed"\n(заданные границы)',
        xlab = "Категории", 
        ylab = "Количество наблюдений",
        col = "lavender",
        border = "purple",
        ylim = c(0, 60))
Сравнение методов дискретизации

Сравнение методов дискретизации

par(mfrow = c(1, 1))

Выводы по разделу ARULES: 1. Метод ‘interval’ создает равные по ширине интервалы 2. Метод ‘frequency’ обеспечивает равное количество наблюдений 3. Метод ‘cluster’ учитывает естественную структуру данных 4.Метод ‘fixed’ позволяет задать границы вручную

4. BORUTA - Выбор признаков

install.packages("Boruta")
install.packages("mlbench")
library(Boruta)
library(mlbench)

data("Ozone", package = "mlbench")
ozone_data <- Ozone
ozone_clean <- na.omit(ozone_data)

# Выбор признаков с помощью Boruta
set.seed(123)
boruta_result <- Boruta(V4 ~ ., 
                       data = ozone_clean,
                       doTrace = 0,
                       maxRuns = 50)

cat("Результаты Boruta:\n")
## Результаты Boruta:
print(boruta_result)
## Boruta performed 24 iterations in 1.91366 secs.
##  9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
##  3 attributes confirmed unimportant: V2, V3, V6;
final_features <- getSelectedAttributes(boruta_result, withTentative = FALSE)
cat("\nОтобранные признаки:", final_features, "\n")
## 
## Отобранные признаки: V1 V5 V7 V8 V9 V10 V11 V12 V13

Визуализация результатов Boruta

plot(boruta_result, 
     main = "Важность признаков (Boruta) для набора Ozone",
     xlab = "Признаки", 
     ylab = "Важность",
     las = 2,
     cex.axis = 0.8)
Результаты отбора признаков методом Boruta

Результаты отбора признаков методом Boruta

par(mfrow = c(1, 2))

# Гистограмма важности
hist(boruta_result$ImpHistory[,1], 
     main = "Распределение важности",
     xlab = "Важность", 
     col = "lightblue",
     breaks = 20)

# Количество признаков по категориям
status_counts <- table(boruta_result$finalDecision)
barplot(status_counts,
        main = "Распределение по решениям",
        xlab = "Решение",
        ylab = "Количество",
        col = c("red", "yellow", "green"))
Результаты отбора признаков методом Boruta

Результаты отбора признаков методом Boruta

par(mfrow = c(1, 1))

Выводы по разделу BORUTA: 1. Boxplot Boruta эффективно отбирает релевантные признаки 2. График показывает статистическую значимость отбора 3. Метод работает с многомерными наборами данных

Заключение

Проведен комплексный анализ данных с использованием четырех пакетов R. Каждый инструмент решает специфические задачи: CARET - моделирование, Fselector - оценка важности, arules - дискретизация, Boruta - отбор признаков. Визуализация результатов помогает лучше понять данные и принять обоснованные решения.