# 데이터 로드
setwd("c:\\data")
binary <- read.csv("binary.csv", stringsAsFactors = TRUE)
head(binary)
# 종속변수를 팩터형으로 변환
binary$admit <- as.factor(binary$admit)
str(binary)
nrow(binary) # 400
# 훈련 데이터와 테스트 데이터를 분리
library(caret)
set.seed(123)
k <- createDataPartition(binary$admit, p = 0.8, list = FALSE)
train_data <- binary[k,]
test_data <- binary[-k,]
# 정규화를 위한 normalize 함수 생성
normalize <- function(x) {
return((x - min(x))/(max(x) - min(x)))
}
# 2 ~ 5번째 컬럼 데이터를 정규화한 데이터로 변환해서 추출
train_data_n <- as.data.frame(lapply(train_data[ , -1], normalize))
test_data_n <- as.data.frame(lapply(test_data[ , -1], normalize))
# 정규화 데이터에 원래 데이터의 종속변수를 붙임
train_data_n$admit <- train_data[ , 1]
test_data_n$admit <- test_data[ , 1]
nrow(train_data_n) # 321
nrow(test_data_n) # 79
# C와 gamma 값을 조정하여 모델 훈련
C_values <- c(1:100)
gamma_values <- 2^(-20:-1)
results <- data.frame(C = numeric(), gamma = numeric(), accuracy = numeric())
for ( C in C_values) {
for ( gamma in gamma_values) {
# 모델 생성 및 하이퍼파라미터 설정
library(e1071)
# C와 gamma 값을 조정하여 모델 훈련
set.seed(123)
binary_svm_model <- svm(admit ~ . , data = train_data_n, kernel = "radial", cost = C, gamma = gamma)
# 모델 예측
result <- predict(binary_svm_model, test_data_n[ , -4]) # 종속변수(정답) 제외하고 예측함
# 모델 평가
accuracy <- sum(result == test_data_n$admit) / length(test_data_n$admit)
results <- rbind(results, data.frame(C = C, gamma = gamma, accuracy = accuracy))
}
}
options(scipen = 999)
library(doBy)
orderBy(~ -accuracy, results)