if(!require(caret)) {
install.packages("caret")
library(caret)
}
## Загрузка требуемого пакета: caret
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
cat("Доступные методы в CARET:\n")
## Доступные методы в CARET:
methods <- names(getModelInfo())
cat("Всего методов:", length(methods), "\n")
## Всего методов: 239
cat("Примеры методов для выбора признаков:\n")
## Примеры методов для выбора признаков:
print(methods[grep("rf|svm|rpart", methods)][1:10])
## [1] "lssvmLinear" "lssvmPoly" "lssvmRadial" "ORFsvm" "qrf"
## [6] "rf" "rfRules" "rpart" "rpart1SE" "rpart2"
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("Var1", "Var2", "Var3", "Var4", "Var5", "Class")
# Сохраняем графики в JPG
jpeg("feature_pairs.jpg", width = 800, height = 600)
featurePlot(x = data[,1:5], y = data$Class, plot = "pairs", main = "Pairs Plot")
dev.off()
## png
## 2
jpeg("feature_box.jpg", width = 800, height = 600)
featurePlot(x = data[,1:5], y = data$Class, plot = "box", main = "Box Plot")
dev.off()
## png
## 2
jpeg("feature_density.jpg", width = 800, height = 600)
featurePlot(x = data[,1:5], y = data$Class, plot = "density", main = "Density Plot")
dev.off()
## png
## 2
cat("Графики сохранены в JPG файлы\n")
## Графики сохранены в JPG файлы
cat("ВЫВОДЫ по заданию 1:\n")
## ВЫВОДЫ по заданию 1:
cat("1. CARET содержит", length(methods), "методов машинного обучения\n")
## 1. CARET содержит 239 методов машинного обучения
cat("2. Созданы 3 графика: pairs, box и density plot\n")
## 2. Созданы 3 графика: pairs, box и density plot
cat("3. Графики сохранены в формате JPG\n")
## 3. Графики сохранены в формате JPG
cat("4. Данные содержат 5 нормально распределенных признаков\n")
## 4. Данные содержат 5 нормально распределенных признаков
cat("5. Классы A и B сбалансированы (по 25 наблюдений)\n")
## 5. Классы A и B сбалансированы (по 25 наблюдений)
# Пробуем установить FSelector
tryCatch({
if(!require(FSelector)) {
install.packages("FSelector")
library(FSelector)
}
data(iris)
importance <- information.gain(Species ~ ., iris)
cat("Важность признаков для Iris:\n")
print(importance)
}, error = function(e) {
cat("FSelector не установился. Используем альтернативный метод:\n")
# Альтернатива: важность через случайный лес
data(iris)
if(require(caret)) {
model <- train(Species ~ ., data = iris, method = "rf")
imp <- varImp(model)
print(imp)
}
})
## Загрузка требуемого пакета: FSelector
## Error: не удалась загрузка пакета или пространства имен для 'FSelector':
## .onLoad не удалось в loadNamespace() для 'rJava', подробности:
## вызов: fun(libname, pkgname)
## ошибка: JAVA_HOME cannot be determined from the Registry
## пакет 'FSelector' успешно распакован, MD5-суммы проверены
##
## Скачанные бинарные пакеты находятся в
## C:\Users\User\AppData\Local\Temp\RtmpOQotel\downloaded_packages
## FSelector не установился. Используем альтернативный метод:
## rf variable importance
##
## Overall
## Petal.Width 100.0000
## Petal.Length 91.3547
## Sepal.Width 0.2468
## Sepal.Length 0.0000
cat("ВЫВОДЫ по заданию 2:\n")
## ВЫВОДЫ по заданию 2:
cat("1. Для Iris наиболее важны признаки связанные с лепестками (Petal)\n")
## 1. Для Iris наиболее важны признаки связанные с лепестками (Petal)
cat("2. FSelector использует information gain для оценки важности\n")
## 2. FSelector использует information gain для оценки важности
cat("3. При невозможности установки FSelector можно использовать caret\n")
## 3. При невозможности установки FSelector можно использовать caret
tryCatch({
if(!require(arules)) {
install.packages("arules")
library(arules)
}
data(iris)
sl <- iris$Sepal.Length
cat("Метод 'interval' (равная ширина):\n")
disc1 <- discretize(sl, method = "interval", categories = 4)
print(table(disc1))
cat("\nМетод 'frequency' (равная частота):\n")
disc2 <- discretize(sl, method = "frequency", categories = 4)
print(table(disc2))
cat("\nМетод 'cluster' (кластеризация):\n")
disc3 <- discretize(sl, method = "cluster", categories = 4)
print(table(disc3))
cat("\nМетод 'fixed' (заданные границы):\n")
disc4 <- discretize(sl, method = "fixed", breaks = c(4, 5.5, 6.5, 7, 8))
print(table(disc4))
}, error = function(e) {
cat("Arules не установился. Используем базовые функции:\n")
data(iris)
sl <- iris$Sepal.Length
cat("cut() с равными интервалами:\n")
print(table(cut(sl, breaks = 4)))
cat("\ncut() с квантилями:\n")
print(table(cut(sl, breaks = quantile(sl, probs = seq(0,1,0.25)))))
})
## Загрузка требуемого пакета: arules
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : нет пакета под названием 'arules'
## пакет 'arules' успешно распакован, MD5-суммы проверены
##
## Скачанные бинарные пакеты находятся в
## C:\Users\User\AppData\Local\Temp\RtmpOQotel\downloaded_packages
## Загрузка требуемого пакета: Matrix
##
## Присоединяю пакет: 'arules'
## Следующие объекты скрыты от 'package:base':
##
## abbreviate, write
## Метод 'interval' (равная ширина):
## Warning in discretize(sl, method = "interval", categories = 4): Parameter
## categories is deprecated. Use breaks instead! Also, the default method is now
## frequency!
## disc1
## [4.3,5.2) [5.2,6.1) [6.1,7) [7,7.9]
## 41 48 48 13
##
## Метод 'frequency' (равная частота):
## Warning in discretize(sl, method = "frequency", categories = 4): Parameter
## categories is deprecated. Use breaks instead! Also, the default method is now
## frequency!
## disc2
## [4.3,5.1) [5.1,5.8) [5.8,6.4) [6.4,7.9]
## 32 41 35 42
##
## Метод 'cluster' (кластеризация):
## Warning in discretize(sl, method = "cluster", categories = 4): Parameter
## categories is deprecated. Use breaks instead! Also, the default method is now
## frequency!
## disc3
## [4.3,5.32) [5.32,6.12) [6.12,6.98) [6.98,7.9]
## 46 49 42 13
##
## Метод 'fixed' (заданные границы):
## disc4
## [4,5.5) [5.5,6.5) [6.5,7) [7,8]
## 52 63 22 13
cat("ВЫВОДЫ по заданию 3:\n")
## ВЫВОДЫ по заданию 3:
cat("1. 'interval' - равная ширина интервалов\n")
## 1. 'interval' - равная ширина интервалов
cat("2. 'frequency' - равное количество наблюдений\n")
## 2. 'frequency' - равное количество наблюдений
cat("3. 'cluster' - группировка на основе кластеров\n")
## 3. 'cluster' - группировка на основе кластеров
cat("4. 'fixed' - ручное задание границ\n")
## 4. 'fixed' - ручное задание границ
cat("5. Выбор метода зависит от распределения данных\n")
## 5. Выбор метода зависит от распределения данных
tryCatch({
if(!require(Boruta)) {
install.packages("Boruta")
library(Boruta)
}
data(iris)
boruta_result <- Boruta(Species ~ ., data = iris, doTrace = 0)
cat("Результат Boruta для Iris:\n")
print(boruta_result)
# Boxplot
jpeg("boruta_plot.jpg", width = 800, height = 600)
plot(boruta_result, las = 2, main = "Boruta - Важность признаков")
dev.off()
}, error = function(e) {
cat("Boruta не установился. Используем альтернативный анализ:\n")
data(iris)
# Простой boxplot для визуализации
jpeg("iris_boxplot.jpg", width = 800, height = 600)
par(mfrow = c(2,2))
for(i in 1:4) {
boxplot(iris[,i] ~ iris$Species, main = names(iris)[i])
}
dev.off()
cat("Boxplot сохранен в iris_boxplot.jpg\n")
})
## Загрузка требуемого пакета: Boruta
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : нет пакета под названием 'Boruta'
## устанавливаю также зависимости 'RcppEigen', 'ranger'
## пакет 'RcppEigen' успешно распакован, MD5-суммы проверены
## пакет 'ranger' успешно распакован, MD5-суммы проверены
## пакет 'Boruta' успешно распакован, MD5-суммы проверены
##
## Скачанные бинарные пакеты находятся в
## C:\Users\User\AppData\Local\Temp\RtmpOQotel\downloaded_packages
## Результат Boruta для Iris:
## Boruta performed 9 iterations in 0.926569 secs.
## 4 attributes confirmed important: Petal.Length, Petal.Width,
## Sepal.Length, Sepal.Width;
## No attributes deemed unimportant.
## png
## 2
cat("ВЫВОДЫ по заданию 4:\n")
## ВЫВОДЫ по заданию 4:
cat("1. Boruta автоматически определяет значимые признаки\n")
## 1. Boruta автоматически определяет значимые признаки
cat("2. Метод сравниет важность реальных и случайных признаков\n")
## 2. Метод сравниет важность реальных и случайных признаков
cat("3. Boxplot помогает визуализировать различия между классами\n")
## 3. Boxplot помогает визуализировать различия между классами
cat("4. Для Iris все признаки являются значимыми\n")
## 4. Для Iris все признаки являются значимыми
cat("ОБЩИЕ ВЫВОДЫ:\n")
## ОБЩИЕ ВЫВОДЫ:
cat("1. Освоены методы выбора и анализа признаков\n")
## 1. Освоены методы выбора и анализа признаков
cat("2. Изучены различные подходы к дискретизации\n")
## 2. Изучены различные подходы к дискретизации
cat("3. Получены навыки визуализации и анализа данных\n")
## 3. Получены навыки визуализации и анализа данных
cat("4. Изучены пакеты: caret, FSelector, arules, Boruta\n")
## 4. Изучены пакеты: caret, FSelector, arules, Boruta
Лабораторная работа выполнена с использованием R