You are on page 1of 13

Міністерство освіти і науки України

Донецький національний університет імені Василя Стуса


Факультет інформаційних і прикладних технологій

Кафедра інформаційних
технологій

ЗВІТ

з лабораторної роботи №1
дисципліни «Статистичне навчання»

Виконала: студентка гр. КН-20-А


Богатир А.В.

Перевірив асистент: Хмелівський Ю.С.

Вінниця – 2023
Завдання 8
У цій вправі ми створимо штучні дані, а потім виконаємо для них відбір оптимального
підмножини змінних.
а) За допомогою функції rnorm() створимо предиктор Х довжиною n = 100, а також
вектора залишку e довжиною n = 100.
> X <- rnorm(100, mean = 0, sd = 1)
> e <- rnorm(100, mean = 0, sd = 1)
Результат:

b) Створимо вектор відгуку Y довжиною n = 100 відповідно моделлю


Y = β0 + β1X + β2X2 + β3X3 + є,
де β0, β1, β2 і β3 довільно обрані вами константи.
> Y <- 3 + 2*X + 1*X^2 + 4*X^3 + e
Результат:

c) Використовуючи функцію regsubsets(), виконаємо відбір оптимальної підмножини


змінних для знаходження оптимальної моделі з предикторами Х, Х2,..., Х10.
> library(leaps)
> d <- data.frame(X, Y)
> regfit_full <- regsubsets(Y ~ X + I(X^2) + I(X^3) + I(X^4) + I(X^5) + I(X^6) + I(X^7) + I(X^8) + I(X^9) +
I(X^10), data = d, nvmax = 10, method = "exhaustive", really.big = TRUE)
Далі побудуємо графік, який показує результати відбору оптимальної підмножини
змінних. Цей графік відображає значення критерію інформаційної складності AIC для
всіх можливих підмножин змінних, які були розглянуті. На графіку вибирається
оптимальна модель із мінімальним значенням AIC.
> plot(regfit_full, scale = "bic")

d) Повторимо (с), використовуючи методи покрокового включення та покрокового


виключення змінних.
Для виконання відбору оптимального підмножини змінних з використанням методів
покрокового включення та виключення, можна використовувати функції step() або
stepAIC().
> regfit_step <- step(lm(Y ~ 1), scope = formula(~ X + I(X^2) + I(X^3) + I(X^4) + I(X^5) + I(X^6) + I(X^7) +
I(X^8) + I(X^9) + I(X^10)), direction = "forward")
Результат:
e) Тепер підгоним до цих імітованих даних ласо-модель, знову використовуючи як
предиктори Х, Х2,..., Х10. Виконаєм перехресну перевірку для знаходження оптимального
значення А. Побудуєм графік залежності помилки перехресної перевірки від А. та
наведемо підсумкові оцінки коефіцієнтів.
Для підгону ласо-моделі до імітованих даних та знаходження оптимального значення
параметра регуляризації alpha за допомогою перехресної перевірки ми можемо
використовувати функцію cv.glmnet() з пакету glmnet.
> library(glmnet)
> X <- matrix(runif(1000), ncol = 10)
> Y <- rnorm(100)
> cv_fit <- cv.glmnet(X, Y, alpha = 1, nfolds = 10)
> plot(cv_fit)
> opt_alpha <- cv_fit$lambda.min
> lasso_fit <- glmnet(X, Y, alpha = 1, lambda = opt_alpha)
> print(coef(lasso_fit))
Завдання 9
У цій вправі ми побудуємо модель для передбачення числа заяв від абітурієнтів на основі
змінних із набору даних College.
a) Розібємо дані на навчальну та контрольну вибірки.
> college = read.csv("C:/Users/Home/Documents/Лабораторні/3 курс/2 семестр/Статистичне
навчання/ALL CSV FILES - 2nd Edition/College.csv")
> set.seed(123)
> train_size <- floor(0.7 * nrow(college))
> train_indices <- sample(seq_len(nrow(college)), size = train_size)
> train_data <- college[train_indices, ]
> test_data <- college[-train_indices, ]
b) Побудуємо лінійну модель за методом найменших квадратів, використовуючи
навчальну вибірку, та повідомте отриману помилку на контрольній вибірці.
Тут ми використовуємо функцію lm() для побудови лінійної моделі на вибірці train_data.
Ми вказуємо залежну змінну Accept та інші змінні як предикторы (.).
Потім ми використовуємо функцію predict() для прогнозування значень цільової змінної
на контрольній вибірці test_data, використовуючи модель, побудовану на навчальній
вибірці.
Нарешті ми обчислюємо помилку на контрольній вибірці, порівнюючи прогнозовані
значення з фактичними значеннями test_data$Accept, використовуючи формулу для
середньоквадратичної помилки (MSE).
> library(stats)
> lm_model <- lm(train_data[, -1]$Accept ~ ., data = train_data[, -1])
> predictions <- predict(lm_model, newdata = test_data)
> error <- sqrt(mean((test_data$Accept - predictions)^2))

c) Побудуєм гребеневу регресійну модель за навчальною вибіркою зі значенням L,


вибраним за допомогою перехресної перевірки. Повідомте помилку на контрольній
вибірці.
Тут ми використовуємо функції з бібліотеки glmnet для побудови гребеневої регресійної
моделі та визначення оптимального значення параметра регуляризації L за допомогою
перехресної перевірки.
Спочатку ми поділяємо дані на навчальну та контрольну вибірки, як і в попередніх
завданнях.
Потім ми використовуємо функцію cv.glmnet() для виконання 10-кратної перехресної
перевірки, в якій ми подаємо на вхід матрицю предикторов (виключаючи цільову змінну
y) та вектор цільової змінної train_data$y. Задаємо alpha = 0 для гребеневої регресії (L2-
регуляризації). Функція повертає об'єкт cv_model, який містить значення помилок
> cv_model <- cv.glmnet(x = as.matrix(train_data[, -c(1,2)] %>% select(-
Accept)),
y = train_data[, -c(1,2)]$Accept,
alpha = 0,
nfolds = 10)
> opt_L <- cv_model$lambda.min
> ridge_model <- glmnet(x = as.matrix(train_data[, -c(1,2)] %>% select(-
Accept)),
y = train_data[, -c(1,2)]$Accept,
alpha = 0,
lambda = opt_L)
> predictions <- predict(ridge_model, newx = as.matrix(train_data[, -c(1,2)] %>% select(-Accept))
> error <- sqrt(mean((test_data$Accept - predictions)^2))
> cat("Помилка на контрольній вибірці:", round(error, 2))
Результат:

d) Далі побудуємо ласо-модель за навчальною вибіркою зі значенням L, вибраним за


допомогою перехресної перевірки. Повідомте отриману помилку на контрольній вибірці,
а також кількість ненульових оцінок коефіцієнтів.
Тут ми використовуємо функції бібліотеки glmnet для побудови ласо-моделі та
визначення оптимального значення параметра регуляризації L за допомогою перехресної
перевірки.
Спочатку ми поділяємо дані на навчальну та контрольну вибірки, як і в попередніх
завданнях.
Потім ми використовуємо функцію cv.glmnet() для виконання 10-кратної перехресної
перевірки, в якій ми подаємо на вхід матрицю предикторов (виключаючи цільову змінну
y) та вектор цільової змінної train_data$Accept. Задаємо alpha = 1 для ласо-моделі.
> cv_model <- cv.glmnet(x = as.matrix(train_data[, -c(1,2)] %>% select(- Accept)),
y = train_data[, -c(1,2)]$Accept,
alpha = 1,
nfolds = 10)
> opt_L <- cv_model$lambda.min
> lasso_model <- glmnet(x = as.matrix(train_data[, -c(1,2)] %>% select(- Accept)),
y = train_data[, -c(1,2)]$Accept,
alpha = 1,
lambda = opt_L)
> error <- sqrt(mean((test_data$Accept - predictions)^2))
> nonzero_coef <- sum(coef(lasso_model) != 0)
> cat("Помилка на контрольній вибірці:", round(error, 2))
> cat("Кількість ненульових оцінок коефіцієнтів:", nonzero_coef)
Результат:

Завдання 10
Раніше ми бачили, що при збільшенні числа включених у модель змінних помилка на
навчальній вибірці завжди буде знижуватися, тоді як помилка на контрольній вибірці не
обов'язково поводитиметься тим же чином. Тепер ми розглянемо цю властивість з
прикладу імітованих даних.
a) Створимо набір даних з р = 20 змінними, n = 1000 спостереженнями та відповідним
вектором кількісного відгуку, згенерованим згідно моделі
Y = Xβ + є,
де деякі елементи β дорівнюють 0.
Ми задаємо параметри моделі, у тому числі вектор коефіцієнтів beta, ненульові елементи
якого генеруються з нормального розподілу з параметрами mean = 2 і sd = 1. Матриця X
містить випадкові значення стандартного нормального розподілу, а вектор e містить
випадкові значення помилки, також згенеровані з нормального розподілу із заданим
стандартним відхиленням sigma. Нарешті, вектор відгуку Y обчислюється як добуток
матриці X вектор коефіцієнтів beta, збільшене на вектор помилки e. Результат
зберігається в датафреймі data, що містить стовпець відгуку Y та стовпці змінних X.
> set.seed(123)
> p <- 20
> n <- 1000
> beta <- rep(0, p)
> beta[1:5] <- rnorm(5, mean = 2, sd = 1)
> sigma <- 2
> X <- matrix(rnorm(n * p), n, p)
> e <- rnorm(n, sd = sigma)
> Y <- X %*% beta + e
> data <- data.frame(Y = Y, X)
Результат:

b) Розіб’ємо свої дані на навчальну вибірку зі 100 спостереженнями та контрольну


вибірку з 900 спостереженнями.
Для розбиття даних на навчальну та контрольну вибірки у мові R можна
використовувати функцію sample() з бібліотеки dplyr
> set.seed(123)
> train_index <- sample(1:n, 100, replace = FALSE)
> train_data <- data[train_index, ]
> test_data <- data[-train_index, ]
Результат:

c) Застосуєм метод відбору оптимального підмножини змінних до навчальної вибірки і


побудуйте графік залежності МSЕ на вибірці від розміру оптимальної моделі кожного
розміру.
Ми завантажуємо бібліотеку caret і створюємо об'єкт ctrl визначення параметрів RFE. Ми
вказуємо функції lmFuncs для використання лінійної регресії як базову модель, метод
крос-валідації "cv" з 5 блоками та виведення результатів "verbose = FALSE". Потім ми
застосовуємо функцію rfe() до навчальної вибірки train_data, виключаючи перший
стовпець (кількісний відгук), і вказуємо, що розміри моделі повинні змінюватись від 1 до
числа стовпців у навчальній вибірці. В результаті одержуємо об'єкт rfe_model, що
містить результати RFE. Нарешті, ми будуємо графік залежності MSE на навчальній
вибірці від оптимального розміру моделі кожного розміру за допомогою функції plot()
> library(caret)
> set.seed(123)
> ctrl <- rfeControl(functions = lmFuncs, method = "cv", number = 5, verbose
= FALSE)
> rfe_model <- rfe(x = train_data[, -1], y = train_data[, 1], sizes
= 1:ncol(train_data[, -1]), rfeControl = ctrl)
> plot(rfe_model, type = "o")
Результат:
d) Побудуємо графік залежності МSЕ на контрольній вибірці від розміру оптимальної
моделі.
Ми створюємо об'єкт ctrl_pred для визначення параметрів моделі, яка використовується
для передбачення на контрольній вибірці. Ми використовуємо функцію sapply() для
побудови моделей на основі кожного оптимального підмножини змінних, що
повертається методом RFE, і обчислення MSE для кожного розміру моделі. Нарешті, ми
будуємо графік залежності MSE на контрольній вибірці від розміру оптимальної моделі
за допомогою функції plot(), вказуючи тип графіка "o", вісь абсцис "Number of Variables"
та вісь ординат "MSE".
> ctrl_pred <- trainControl(method = "cv", number = 5)
> mse <- sapply(rfe_model$optVariables, function(i) {
model <- train(train_data[, -1, drop = FALSE][, i, drop = FALSE],
train_data[, 1], method = "lm", trControl = ctrl_pred)
pred <- predict(model, newdata = test_data[, -1, drop = FALSE][, i, drop =
FALSE])
mean((test_data[, 1] - pred)^2)
})
> plot(1:length(mse), mse, type = "o", xlab = "Number of Variables", ylab =
"MSE")
Результат:

Завдання 11
Зараз ми намагатимемося передбачити рівень злочинності в розрахунку душу населення
за даними Boston.
a) Спробуємо застосувати деякі з розглянутих у цій главі регресійних методів -
наприклад, відбір оптимального підмножини змінних, ласо, гребеневу регресію та
PCR.
Завантаження данних:
> library(MASS)
> data(Boston)
Підготовка данних:
> Boston <- Boston[, -1]
> set.seed(123)
> train <- sample(1:nrow(Boston), 0.7 * nrow(Boston))
> train_data <- Boston[train, ]
> test_data <- Boston[-train, ]
> train_x <- as.matrix(train_data[, -ncol(train_data)])
> train_y <- as.matrix(train_data[, ncol(train_data)])
> test_x <- as.matrix(test_data[, -ncol(test_data)])
> test_y <- as.matrix(test_data[, ncol(test_data)])
Відбір оптимального підмножини змінних:
> library(MASS)
> set.seed(123)
> lm.fit <- lm(train_y ~ ., data = train_data)
> step.fit <- step(lm.fit, direction = "backward")
Результат:

Lasso регресія
> library(glmnet)
> set.seed(123)
> cv.lasso <- cv.glmnet(train_x, train_y, alpha = 1, nfolds = 10,
type.measure = "mse")
> best.lambda <- cv.lasso$lambda.min
> lasso.fit <- glmnet(train_x, train_y, alpha = 1, lambda = best.lambda)
> plot(lasso.fit, xvar = "lambda")
Результат:

Гребенева регресія
> library(glmnet)
> set.seed(123)
> cv.ridge <- cv.glmnet(train_x, train_y, alpha = 0, nfolds = 10, type.measure = "mse")
> best.lambda <- cv.ridge$lambda.min
> ridge.fit <- glmnet(train_x, train_y, alpha = 0, lambda = best.lambda)
> plot(ridge.fit, xvar = "lambda")
Резуьтат:

PCR
> set.seed(123)
> train_pca <- prcomp(train_x)
> summary(train_pca)
> library(pls)
> set.seed(123)
> pcr.fit <- pcr(train_y ~ ., data = train_data, scale = TRUE, validation =
"CV")
> validationplot(pcr.fit, val.type = "MSEP")
Результат:

Висновки:
Результати, отримані за допомогою відбору оптимального підмножини змінних,
говорять про те, що в моделі залишено чотири змінні: рівень злочинності на душу
населення (crim), частка землі під житлову забудову, зонована для ділянок понад 25 000
кв. футів (zn), частка немає торгових земель у радіусі 25 миль від центру міста (indus) і
концентрація оксиду азоту (nox). Ці змінні було обрано з урахуванням значимості
їхнього впливу залежну змінну - рівень злочинності душу населення.
Результати Lasso регресії показали, що оптимальний коефіцієнт регуляризації було
знайдено при значенні лямбда, близькому до нуля. Це говорить про те, що всі змінні
можуть бути значущими для моделі.
Результати гребеневої регресії показали, що оптимальний коефіцієнт регуляризації
було знайдено при значенні лямбда, близькому до 0.1. Це говорить про те, що не всі
змінні моделі є значущими, і деякі з них можуть бути виключені без значної втрати
точності моделі.
PCR показало, що оптимальна кількість компонентів для побудови моделі - це 5. Це
говорить про те, що в моделі має бути використано не менше 5 змінних для досягнення
оптимальної точності.
В цілому, отримані результати говорять про те, що в моделі можуть бути використані
всі змінні або тільки частина їх залежно від методу вибору змінних. Однак, вибір
оптимального підмножини змінних може допомогти зменшити кількість незначних
змінних та покращити точність моделі.

You might also like