1. Работа с пакетом CARET

Установка и загрузка пакета

# Установка пакета
if (!require("caret")) install.packages("caret")

# Загрузка пакета
library(caret)

Список доступных методов

# Получаем список всех доступных моделей
model_list <- names(getModelInfo())
cat("Всего доступно моделей:", length(model_list), "\n\n")
## Всего доступно моделей: 239
cat("Первые 20 моделей:\n")
## Первые 20 моделей:
print(model_list[1:20])
##  [1] "ada"         "AdaBag"      "AdaBoost.M1" "adaboost"    "amdai"      
##  [6] "ANFIS"       "avNNet"      "awnb"        "awtan"       "bag"        
## [11] "bagEarth"    "bagEarthGCV" "bagFDA"      "bagFDAGCV"   "bam"        
## [16] "bartMachine" "bayesglm"    "binda"       "blackboost"  "blasso"

Графический разведочный анализ

# Создаем тестовые данные
set.seed(123) # для воспроизводимости
x <- matrix(rnorm(50*5), ncol = 5)
y <- factor(rep(c("A", "B"), 25))
data <- data.frame(x, y)
names(data) <- c(paste0("Variable", 1:5), "Class")

# Создаем папку для графиков
if (!dir.exists("plots")) dir.create("plots")

# 1. Boxplot
jpeg("plots/boxplot.jpg", width = 800, height = 600)
featurePlot(x = data[, 1:5], 
            y = data$Class,
            plot = "box",
            scales = list(x = list(relation = "free"), 
                         y = list(relation = "free")))
dev.off()
## png 
##   2
# 2. Density plot
jpeg("plots/density.jpg", width = 800, height = 600)
featurePlot(x = data[, 1:5], 
            y = data$Class,
            plot = "density",
            scales = list(x = list(relation = "free"), 
                         y = list(relation = "free")),
            adjust = 1.5,
            pch = "|",
            auto.key = list(columns = 2))
dev.off()
## png 
##   2
# 3. Scatter plot
jpeg("plots/scatter.jpg", width = 800, height = 600)
featurePlot(x = data[, 1:5], 
            y = data$Class,
            plot = "pairs",
            auto.key = list(columns = 2))
dev.off()
## png 
##   2
# 4. Выводим графики
par(mfrow = c(2, 2))
featurePlot(x = data[, 1:5], 
            y = data$Class,
            plot = "box",
            main = "Boxplot")

featurePlot(x = data[, 1:5], 
            y = data$Class,
            plot = "density",
            main = "Density Plot")

Выводы по разделу 1: - Были установлены и загружены необходимые пакеты - Получен список доступных методов машинного обучения в CARET - Построены различные типы графиков для анализа данных - Графики сохранены в файлы jpg в папке plots/

2. Определение важности признаков с использованием Fselector

# Проверяем, установлен ли пакет
if (!requireNamespace("FSelector", quietly = TRUE)) {
  stop("Пакет FSelector не установлен. Установите его командой: install.packages('FSelector')")
}

library(FSelector)

# Загружаем данные iris
data(iris)

# 1. Information Gain
weights_ig <- information.gain(Species ~ ., data = iris)
cat("Information Gain:\n")
print(weights_ig)

# 2. Gain Ratio
weights_gr <- gain.ratio(Species ~ ., data = iris)
cat("\nGain Ratio:\n")
print(weights_gr)

# 3. Symmetrical Uncertainty
weights_su <- symmetrical.uncertainty(Species ~ ., data = iris)
cat("\nSymmetrical Uncertainty:\n")
print(weights_su)

# Визуализация результатов
par(mfrow = c(1, 3))
barplot(weights_ig$attr_importance, names.arg = rownames(weights_ig), 
        main = "Information Gain", col = "lightblue", las = 2, ylim = c(0, 1))
barplot(weights_gr$attr_importance, names.arg = rownames(weights_gr), 
        main = "Gain Ratio", col = "lightgreen", las = 2, ylim = c(0, 1))
barplot(weights_su$attr_importance, names.arg = rownames(weights_su), 
        main = "Symmetrical Uncertainty", col = "lightcoral", las = 2, ylim = c(0, 1))

3. Преобразование непрерывной переменной в категориальную

# Установка и загрузка пакета
if (!require("arules")) install.packages("arules")
library(arules)

# Работаем с переменной Sepal.Length из iris
data <- iris$Sepal.Length

# 1. Метод "interval" (равная ширина интервала)
discrete_interval <- discretize(data, method = "interval", categories = 3)
table(discrete_interval)
## discrete_interval
## [4.3,5.5) [5.5,6.7) [6.7,7.9] 
##        52        70        28
# 2. Метод "frequency" (равная частота)
discrete_frequency <- discretize(data, method = "frequency", categories = 3)
table(discrete_frequency)
## discrete_frequency
## [4.3,5.4) [5.4,6.3) [6.3,7.9] 
##        46        53        51
# 3. Метод "cluster" (кластеризация)
discrete_cluster <- discretize(data, method = "cluster", categories = 3)
table(discrete_cluster)
## discrete_cluster
##  [4.3,5.33) [5.33,6.27)  [6.27,7.9] 
##          46          53          51
# 4. Метод "fixed" (заданные границы)
discrete_fixed <- discretize(data, 
                            method = "fixed", 
                            breaks = c(-Inf, 5.5, 6.5, Inf),
                            labels = c("Короткий", "Средний", "Длинный"))
table(discrete_fixed)
## discrete_fixed
## Короткий  Средний  Длинный 
##       52       63       35
# Визуализация результатов
par(mfrow = c(2, 2))
hist(iris$Sepal.Length, main = "Исходные данные", col = "lightblue")
hist(as.numeric(discrete_interval), main = "Interval method", col = "lightgreen")
hist(as.numeric(discrete_frequency), main = "Frequency method", col = "lightcoral")
hist(as.numeric(discrete_cluster), main = "Cluster method", col = "lightyellow")

# Сравнение таблиц
cat("Метод interval:\n")
## Метод interval:
print(table(discrete_interval))
## discrete_interval
## [4.3,5.5) [5.5,6.7) [6.7,7.9] 
##        52        70        28
cat("\nМетод frequency:\n")
## 
## Метод frequency:
print(table(discrete_frequency))
## discrete_frequency
## [4.3,5.4) [5.4,6.3) [6.3,7.9] 
##        46        53        51
cat("\nМетод cluster:\n")
## 
## Метод cluster:
print(table(discrete_cluster))
## discrete_cluster
##  [4.3,5.33) [5.33,6.27)  [6.27,7.9] 
##          46          53          51
cat("\nМетод fixed:\n")
## 
## Метод fixed:
print(table(discrete_fixed))
## discrete_fixed
## Короткий  Средний  Длинный 
##       52       63       35

Выводы по разделу 3: - Метод “interval” создает интервалы равной ширины, что может привести к неравномерному распределению наблюдений - Метод “frequency” создает интервалы с примерно равным количеством наблюдений - Метод “cluster” группирует данные на основе кластеризации - Метод “fixed” позволяет задать границы интервалов вручную

4. Выбор признаков с использованием Boruta

# Установка и загрузка пакетов
if (!require("Boruta")) install.packages("Boruta")
if (!require("mlbench")) install.packages("mlbench")
library(Boruta)
library(mlbench)

# Загружаем данные
data(Ozone, package = "mlbench")
ozone_data <- Ozone

# Предобработка данных: удаляем NA
ozone_clean <- na.omit(ozone_data)

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

# Выводим результаты
print(boruta_result)
## Boruta performed 24 iterations in 1.676293 secs.
##  9 attributes confirmed important: V1, V10, V11, V12, V13 and 4 more;
##  3 attributes confirmed unimportant: V2, V3, V6;
# Визуализация результатов
par(mfrow = c(1, 2))
plot(boruta_result, las = 2, cex.axis = 0.7, main = "Важность признаков")
plotImpHistory(boruta_result, main = "История важности признаков")

# Получаем окончательное решение
final_vars <- getSelectedAttributes(boruta_result, withTentative = TRUE)
cat("\nОтобранные признаки:\n")
## 
## Отобранные признаки:
print(final_vars)
## [1] "V1"  "V5"  "V7"  "V8"  "V9"  "V10" "V11" "V12" "V13"
# Создаем датафрейм с отобранными признаками
ozone_selected <- ozone_clean[, c(final_vars, "V4")]

# Boxplot для важных признаков
par(mfrow = c(2, 3))
for (i in 1:min(5, length(final_vars))) {
  boxplot(ozone_selected[[final_vars[i]]] ~ ozone_selected$V4,
          main = final_vars[i],
          xlab = "V4", ylab = final_vars[i],
          col = c("lightblue", "lightgreen"))
}

Выводы по разделу 4: - Boruta отобрала важные признаки. - Boxplot показывает, что распределения значений важных признаков различаются между группами