# Установка и загрузка пакета CARET
if(!require(caret)) {
  install.packages("caret", dependencies = TRUE)
  library(caret)
}

# Просмотр доступных методов
cat("=== ДОСТУПНЫЕ МЕТОДЫ В CARET ===\n")
## === ДОСТУПНЫЕ МЕТОДЫ В CARET ===
model_methods <- names(getModelInfo())
cat("Количество доступных методов:", length(model_methods), "\n")
## Количество доступных методов: 239
cat("Примеры методов машинного обучения:\n")
## Примеры методов машинного обучения:
print(head(model_methods, 15))
##  [1] "ada"         "AdaBag"      "AdaBoost.M1" "adaboost"    "amdai"      
##  [6] "ANFIS"       "avNNet"      "awnb"        "awtan"       "bag"        
## [11] "bagEarth"    "bagEarthGCV" "bagFDA"      "bagFDAGCV"   "bam"
# Методы выбора признаков
feature_selection_methods <- c("rfe", "sbf", "gafs", "safs")
cat("\nОсновные методы выбора признаков в CARET:\n")
## 
## Основные методы выбора признаков в CARET:
print(feature_selection_methods)
## [1] "rfe"  "sbf"  "gafs" "safs"
# Создание данных для анализа
set.seed(123)
x <- matrix(rnorm(50*5), ncol = 5)
y <- factor(rep(c("A", "B"), 25))
data_df <- data.frame(x, y)
colnames(data_df) <- c(paste0("Variable", 1:5), "Class")

cat("\nСтруктура данных:\n")
## 
## Структура данных:
print(str(data_df))
## 'data.frame':    50 obs. of  6 variables:
##  $ Variable1: num  -0.5605 -0.2302 1.5587 0.0705 0.1293 ...
##  $ Variable2: num  0.2533 -0.0285 -0.0429 1.3686 -0.2258 ...
##  $ Variable3: num  -0.71 0.257 -0.247 -0.348 -0.952 ...
##  $ Variable4: num  0.788 0.769 0.332 -1.008 -0.119 ...
##  $ Variable5: num  2.199 1.312 -0.265 0.543 -0.414 ...
##  $ Class    : Factor w/ 2 levels "A","B": 1 2 1 2 1 2 1 2 1 2 ...
## NULL
cat("\nПервые 6 строк данных:\n")
## 
## Первые 6 строк данных:
print(head(data_df))
##     Variable1   Variable2   Variable3  Variable4  Variable5 Class
## 1 -0.56047565  0.25331851 -0.71040656  0.7877388  2.1988103     A
## 2 -0.23017749 -0.02854676  0.25688371  0.7690422  1.3124130     B
## 3  1.55870831 -0.04287046 -0.24669188  0.3322026 -0.2651451     A
## 4  0.07050839  1.36860228 -0.34754260 -1.0083766  0.5431941     B
## 5  0.12928774 -0.22577099 -0.95161857 -0.1194526 -0.4143399     A
## 6  1.71506499  1.51647060 -0.04502772 -0.2803953 -0.4762469     B
# Графический анализ - pairs plot
cat("\nСоздание графиков...\n")
## 
## Создание графиков...
jpeg("feature_plot_pairs.jpg", width = 1000, height = 800)
featurePlot(x = data_df[, 1:5], 
            y = data_df$Class,
            plot = "pairs",
            auto.key = list(columns = 2))
dev.off()
## png 
##   2
# Графический анализ - density plot
jpeg("feature_plot_density.jpg", width = 1000, height = 800)
featurePlot(x = data_df[, 1:5], 
            y = data_df$Class,
            plot = "density",
            scales = list(x = list(relation = "free"),
                         y = list(relation = "free")),
            adjust = 1.5,
            pch = "|",
            layout = c(3, 2),
            auto.key = list(columns = 2))
dev.off()
## png 
##   2
# Графический анализ - boxplot
jpeg("feature_plot_boxplot.jpg", width = 1000, height = 800)
featurePlot(x = data_df[, 1:5], 
            y = data_df$Class,
            plot = "boxplot",
            scales = list(y = list(relation = "free"),
                         x = list(rot = 45)),
            layout = c(3, 2))
dev.off()
## png 
##   2
cat("Графики сохранены в файлы:\n")
## Графики сохранены в файлы:
cat("- feature_plot_pairs.jpg\n")
## - feature_plot_pairs.jpg
cat("- feature_plot_density.jpg\n") 
## - feature_plot_density.jpg
cat("- feature_plot_boxplot.jpg\n")
## - feature_plot_boxplot.jpg
# Установка и загрузка пакета Fselector
if(!require(FSelector)) {
  install.packages("FSelector", dependencies = TRUE)
  library(FSelector)
}

# Загрузка данных Iris
data(iris)
cat("=== АНАЛИЗ ДАННЫХ IRIS ===\n")
## === АНАЛИЗ ДАННЫХ IRIS ===
cat("Структура данных Iris:\n")
## Структура данных Iris:
print(str(iris))
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
## NULL
cat("\nСтатистика данных:\n")
## 
## Статистика данных:
print(summary(iris))
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
# Определение важности признаков различными методами
cat("\n=== ВАЖНОСТЬ ПРИЗНАКОВ ===\n")
## 
## === ВАЖНОСТЬ ПРИЗНАКОВ ===
# Information Gain
weights_info_gain <- information.gain(Species ~ ., iris)
cat("1. Information Gain:\n")
## 1. Information Gain:
print(weights_info_gain)
##              attr_importance
## Sepal.Length       0.4521286
## Sepal.Width        0.2672750
## Petal.Length       0.9402853
## Petal.Width        0.9554360
# Gain Ratio
weights_gain_ratio <- gain.ratio(Species ~ ., iris)
cat("\n2. Gain Ratio:\n")
## 
## 2. Gain Ratio:
print(weights_gain_ratio)
##              attr_importance
## Sepal.Length       0.4196464
## Sepal.Width        0.2472972
## Petal.Length       0.8584937
## Petal.Width        0.8713692
# Symmetrical Uncertainty
weights_sym_uncert <- symmetrical.uncertainty(Species ~ ., iris)
cat("\n3. Symmetrical Uncertainty:\n")
## 
## 3. Symmetrical Uncertainty:
print(weights_sym_uncert)
##              attr_importance
## Sepal.Length       0.4155563
## Sepal.Width        0.2452743
## Petal.Length       0.8571872
## Petal.Width        0.8705214
# Chi-squared
weights_chi_squared <- chi.squared(Species ~ ., iris)
cat("\n4. Chi-squared:\n")
## 
## 4. Chi-squared:
print(weights_chi_squared)
##              attr_importance
## Sepal.Length       0.6288067
## Sepal.Width        0.4922162
## Petal.Length       0.9346311
## Petal.Width        0.9432359
# Визуализация важности признаков
par(mfrow = c(2, 2), mar = c(5, 4, 2, 1))

# Information Gain
barplot(weights_info_gain$attr_importance, 
        names.arg = rownames(weights_info_gain),
        main = "Information Gain",
        las = 2,
        col = "lightblue",
        ylab = "Важность")

# Gain Ratio
barplot(weights_gain_ratio$attr_importance, 
        names.arg = rownames(weights_gain_ratio),
        main = "Gain Ratio",
        las = 2,
        col = "lightgreen",
        ylab = "Важность")

# Symmetrical Uncertainty
barplot(weights_sym_uncert$attr_importance, 
        names.arg = rownames(weights_sym_uncert),
        main = "Symmetrical Uncertainty",
        las = 2,
        col = "lightcoral",
        ylab = "Важность")

# Chi-squared
barplot(weights_chi_squared$attr_importance, 
        names.arg = rownames(weights_chi_squared),
        main = "Chi-squared",
        las = 2,
        col = "lightgoldenrod",
        ylab = "Важность")

# Сводная таблица важности признаков
importance_summary <- data.frame(
  Feature = rownames(weights_info_gain),
  Information_Gain = weights_info_gain$attr_importance,
  Gain_Ratio = weights_gain_ratio$attr_importance,
  Symmetrical_Uncertainty = weights_sym_uncert$attr_importance,
  Chi_squared = weights_chi_squared$attr_importance
)

cat("\nСводная таблица важности признаков:\n")
## 
## Сводная таблица важности признаков:
print(importance_summary)
##        Feature Information_Gain Gain_Ratio Symmetrical_Uncertainty Chi_squared
## 1 Sepal.Length        0.4521286  0.4196464               0.4155563   0.6288067
## 2  Sepal.Width        0.2672750  0.2472972               0.2452743   0.4922162
## 3 Petal.Length        0.9402853  0.8584937               0.8571872   0.9346311
## 4  Petal.Width        0.9554360  0.8713692               0.8705214   0.9432359
# Установка и загрузка пакета arules
if(!require(arules)) {
  install.packages("arules", dependencies = TRUE)
  library(arules)
}

cat("=== ДИСКРЕТИЗАЦИЯ ДАННЫХ ===\n")
## === ДИСКРЕТИЗАЦИЯ ДАННЫХ ===
# Работа с переменной Sepal.Length
sepal_length <- iris$Sepal.Length
cat("Исходная переменная Sepal.Length:\n")
## Исходная переменная Sepal.Length:
print(summary(sepal_length))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.300   5.100   5.800   5.843   6.400   7.900
# 1. Метод равной ширины интервала
disc_interval <- discretize(sepal_length, method = "interval", categories = 4)
cat("\n1. Метод 'interval' (равная ширина интервала):\n")
## 
## 1. Метод 'interval' (равная ширина интервала):
interval_summary <- summary(disc_interval)
print(interval_summary)
## [4.3,5.2) [5.2,6.1)   [6.1,7)   [7,7.9] 
##        41        48        48        13
# 2. Метод равной частоты
disc_frequency <- discretize(sepal_length, method = "frequency", categories = 4)
cat("\n2. Метод 'frequency' (равная частота):\n")
## 
## 2. Метод 'frequency' (равная частота):
frequency_summary <- summary(disc_frequency)
print(frequency_summary)
## [4.3,5.1) [5.1,5.8) [5.8,6.4) [6.4,7.9] 
##        32        41        35        42
# 3. Метод кластеризации
disc_cluster <- discretize(sepal_length, method = "cluster", categories = 4)
cat("\n3. Метод 'cluster' (кластеризация):\n")
## 
## 3. Метод 'cluster' (кластеризация):
cluster_summary <- summary(disc_cluster)
print(cluster_summary)
##  [4.3,5.28) [5.28,6.05) [6.05,6.87)  [6.87,7.9] 
##          45          44          44          17
# 4. Метод с заданными границами
disc_fixed <- discretize(sepal_length, method = "fixed", 
                        breaks = c(-Inf, 5.5, 6.5, 7.5, Inf),
                        labels = c("Короткий", "Средний", "Длинный", "Очень длинный"))
cat("\n4. Метод 'fixed' (заданные границы):\n")
## 
## 4. Метод 'fixed' (заданные границы):
fixed_summary <- summary(disc_fixed)
print(fixed_summary)
##      Короткий       Средний       Длинный Очень длинный 
##            52            63            29             6
# Сравнительная таблица для первых 15 наблюдений
comparison <- data.frame(
  Original = round(sepal_length[1:15], 2),
  Interval = as.character(disc_interval[1:15]),
  Frequency = as.character(disc_frequency[1:15]),
  Cluster = as.character(disc_cluster[1:15]),
  Fixed = as.character(disc_fixed[1:15])
)

cat("\nСравнение методов дискретизации (первые 15 наблюдений):\n")
## 
## Сравнение методов дискретизации (первые 15 наблюдений):
print(comparison)
##    Original  Interval Frequency     Cluster    Fixed
## 1       5.1 [4.3,5.2) [5.1,5.8)  [4.3,5.28) Короткий
## 2       4.9 [4.3,5.2) [4.3,5.1)  [4.3,5.28) Короткий
## 3       4.7 [4.3,5.2) [4.3,5.1)  [4.3,5.28) Короткий
## 4       4.6 [4.3,5.2) [4.3,5.1)  [4.3,5.28) Короткий
## 5       5.0 [4.3,5.2) [4.3,5.1)  [4.3,5.28) Короткий
## 6       5.4 [5.2,6.1) [5.1,5.8) [5.28,6.05) Короткий
## 7       4.6 [4.3,5.2) [4.3,5.1)  [4.3,5.28) Короткий
## 8       5.0 [4.3,5.2) [4.3,5.1)  [4.3,5.28) Короткий
## 9       4.4 [4.3,5.2) [4.3,5.1)  [4.3,5.28) Короткий
## 10      4.9 [4.3,5.2) [4.3,5.1)  [4.3,5.28) Короткий
## 11      5.4 [5.2,6.1) [5.1,5.8) [5.28,6.05) Короткий
## 12      4.8 [4.3,5.2) [4.3,5.1)  [4.3,5.28) Короткий
## 13      4.8 [4.3,5.2) [4.3,5.1)  [4.3,5.28) Короткий
## 14      4.3 [4.3,5.2) [4.3,5.1)  [4.3,5.28) Короткий
## 15      5.8 [5.2,6.1) [5.8,6.4) [5.28,6.05)  Средний
# Визуализация результатов дискретизации
par(mfrow = c(2, 3), mar = c(4, 4, 2, 1))

# Исходное распределение
hist(sepal_length, main = "Исходное распределение\nSepal.Length", 
     xlab = "Длина чашелистика", col = "lightblue", breaks = 15)

# Метод interval
plot(disc_interval, main = "Метод: Interval\n(равная ширина)", 
     xlab = "Интервалы", ylab = "Частота", col = "lightgreen")

# Метод frequency
plot(disc_frequency, main = "Метод: Frequency\n(равная частота)", 
     xlab = "Интервалы", ylab = "Частота", col = "lightcoral")

# Метод cluster
plot(disc_cluster, main = "Метод: Cluster\n(кластеризация)", 
     xlab = "Интервалы", ylab = "Частота", col = "lightgoldenrod")

# Метод fixed
plot(disc_fixed, main = "Метод: Fixed\n(заданные границы)", 
     xlab = "Интервалы", ylab = "Частота", col = "lightpink")

# Установка и загрузка пакета Boruta
if(!require(Boruta)) {
  install.packages("Boruta", dependencies = TRUE)
  library(Boruta)
}

# Загрузка данных Ozone
data(Ozone, package = "mlbench")
cat("=== АНАЛИЗ ДАННЫХ OZONE ===\n")
## === АНАЛИЗ ДАННЫХ OZONE ===
# Исследование исходных данных
cat("Структура данных Ozone:\n")
## Структура данных Ozone:
print(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 ...
## NULL
cat("\nРазмерность данных:\n")
## 
## Размерность данных:
print(dim(Ozone))
## [1] 366  13
cat("\nПервые 6 строк:\n")
## 
## Первые 6 строк:
print(head(Ozone))
##   V1 V2 V3 V4   V5 V6 V7 V8    V9  V10 V11   V12 V13
## 1  1  1  4  3 5480  8 20 NA    NA 5000 -15 30.56 200
## 2  1  2  5  3 5660  6 NA 38    NA   NA -14    NA 300
## 3  1  3  6  3 5710  4 28 40    NA 2693 -25 47.66 250
## 4  1  4  7  5 5700  3 37 45    NA  590 -24 55.04 100
## 5  1  5  1  5 5760  3 51 54 45.32 1450  25 57.02  60
## 6  1  6  2  6 5720  4 69 35 49.64 1568  15 53.78  60
# Предобработка данных - удаление пропущенных значений
ozone_clean <- na.omit(Ozone)
cat("\nПосле удаления пропущенных значений:\n")
## 
## После удаления пропущенных значений:
cat("Исходный размер:", dim(Ozone), "\n")
## Исходный размер: 366 13
cat("Очищенный размер:", dim(ozone_clean), "\n")
## Очищенный размер: 203 13
# Проверка названий столбцов
cat("\nНазвания переменных:\n")
## 
## Названия переменных:
print(names(ozone_clean))
##  [1] "V1"  "V2"  "V3"  "V4"  "V5"  "V6"  "V7"  "V8"  "V9"  "V10" "V11" "V12"
## [13] "V13"
# Выбор признаков с Boruta
cat("\n=== ЗАПУСК АЛГОРИТМА BORUTA ===\n")
## 
## === ЗАПУСК АЛГОРИТМА BORUTA ===
set.seed(123)
boruta_result <- Boruta(V4 ~ ., data = ozone_clean, doTrace = 2, maxRuns = 100)

# Результаты анализа
cat("\nРезультаты Boruta:\n")
## 
## Результаты Boruta:
print(boruta_result)
## Boruta performed 24 iterations in 1.837872 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), mar = c(8, 4, 2, 1))

# Основной график Boruta
plot(boruta_result, las = 2, cex.axis = 0.7, 
     main = "Важность признаков - Boruta",
     xlab = "")

# Boxplot важности
plot(boruta_result, xlab = "", las = 2, cex.axis = 0.7,
     main = "Распределение важности признаков")

# Получение окончательного набора признаков
final_features <- getSelectedAttributes(boruta_result, withTentative = FALSE)
cat("\nОкончательный набор важных признаков:\n")
## 
## Окончательный набор важных признаков:
print(final_features)
## [1] "V1"  "V5"  "V7"  "V8"  "V9"  "V10" "V11" "V12" "V13"
tentative_features <- getSelectedAttributes(boruta_result, withTentative = TRUE)
cat("\nВсе отобранные признаки (включая tentative):\n")
## 
## Все отобранные признаки (включая tentative):
print(tentative_features)
## [1] "V1"  "V5"  "V7"  "V8"  "V9"  "V10" "V11" "V12" "V13"
# Статистика важности
importance_stats <- attStats(boruta_result)
cat("\nДетальная статистика важности признаков:\n")
## 
## Детальная статистика важности признаков:
print(importance_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
jpeg("boruta_boxplot_detailed.jpg", width = 1200, height = 800)
par(mar = c(10, 4, 4, 2))
plot(boruta_result, las = 2, cex.axis = 0.8, 
     main = "Анализ важности признаков для прогнозирования озона (Boruta)")
dev.off()
## png 
##   2
cat("\nДетальный boxplot сохранен в файл: boruta_boxplot_detailed.jpg\n")
## 
## Детальный boxplot сохранен в файл: boruta_boxplot_detailed.jpg