# 데이터를 불러온다. mydata <- read.csv("c:\\data\\binary.csv",header=T) head(mydata) # admit이 종속 변수인데 0은 불합격이고 1이 합격이다.
mydata$admit <- as.factor(mydata$admit) str(mydata)
# 훈련과 테스트를 8대2로 나눈다. library(caret) set.seed(123)
k <- createDataPartition(mydata$admit, p=0.8, list=FALSE) train_data <- mydata[k, ] test_data <- mydata[-k, ] nrow(train_data) # 321 nrow(test_data) # 79
normalize <- function(x) { return ( ( x-min(x) ) / ( max(x) - min(x) ) ) }
train_data_n <- as.data.frame( lapply( train_data[ , -1], normalize) ) test_data_n <- as.data.frame( lapply( test_data[ , -1], normalize) )
test_data_n$admit <- test_data$admit train_data_n$admit <- train_data$admit summary(train_data_n) summary(test_data_n)
# C와 gamma 값을 조정하여 모델 훈련
C_values <- c(1:100) gamma_values <- 2^(-20:-1)
results <- data.frame( C=numeric(), gamma=numeric(), accuracy=numeric() )
# 모델 생성 및 하이퍼파라미터 설정 library(e1071)
for ( C in C_values) { for ( gamma in gamma_values) { # C와 gamma 값을 조정하여 모델 훈련 set.seed(1) mydata_svm_model <- svm(admit ~ ., data = train_data, kernel = "radial", cost = C, gamma = gamma) # 모델 예측 result <- predict(mydata_svm_model, test_data[, -1]) # 정답 제외하고 예측함 # 모델 평가 accuracy <- sum(result == test_data$admit) / length(test_data$admit) results <- rbind( results, data.frame(C=C, gamma=gamma, accuracy=accuracy)) } }
options(scipen=999) library(doBy) orderBy(~ -accuracy, results) |