binary <- read.csv("binary.csv", header = T)
head(binary)
str(binary)
binary$admit <- as.factor(binary$admit) # 숫자형은 직접 팩터로 변환해주어야 한다.
str(binary) # 변환됐는지 확인
# 최대 최소 정규화
normalize <- function(x) {
return ( ( x-min(x) ) / ( max(x) - min(x) ) )
}
## 데이터 프레임 만드는 방식의 차이
test_data_n$admit <- test_data$admit
train_data_n$admit <- train_data$admit
# 데이터 프레임으로 만들기
#train_data_n2 <- data.frame(train_data_n, admit=train_data[ , c("admit")])
#test_data_n2 <- data.frame(test_data_n, admit=test_data[ , c("admit")])
nrow(train_data_n) # 321개
nrow(test_data_n) # 79개
summary(train_data_n) # 정규화 잘 됐는지 확인
summary(test_data_n)
# 모델 생성 및 하이퍼파라미터 설정
library(e1071)
# 반복문 - 데이터 프레임 만들어서 그 결과 출력
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) {
set.seed(1)
binary_svm_n <- svm(train_data$admit ~ . , data = train_data_n, kernel = "radial", cost = C, gamma = gamma)
# 모델 예측
result <- predict(binary_svm_n, 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))
}
}
library(doBy)
options(scipen = 999)
head(orderBy(~ -accuracy, results)) # C = 12, gamma = 0.5
# C와 gamma 값을 최적의 값으로 조정하여 모델 훈련
set.seed(1)
binary_svm_n <- svm(train_data$admit ~ . , data = train_data_n, kernel = "radial", cost = 12, gamma = 0.5)
# 모델 예측
result <- predict(binary_svm_n, test_data_n[, -4]) # 정답 제외하고 예측
result
# 모델 평가
accuracy <- sum(result == test_data_n$admit) / length(test_data_n$admit)
accuracy # 정확도 0.7468354