두 카테고리 중 어느 하나에 속한 데이터의 집합이 주어졌을 때, SVM 알고리즘은 주어진 데이터 집합을 바탕으로 하여
새로운 데이터가 어느 카테고리에 속할지 판단하는 비확률적 이진 선형 분류 모델을 만든다. 만들어진 분류 모델은 데이터가
사상된 공간에서 경계로 표현되는데 SVM 알고리즘은 그 중 가장 큰 폭을 가진 경계를 찾는 알고리즘이다. SVM은 선형
분류와 더불어 비선형 분류에서도 사용될 수 있다. 비선형 분류를 하기 위해서 주어진 데이터를 고차원 특징 공간으로
사상하는 작업이 필요한데, 이를 효율적으로 하기 위해 '커널 트릭'을 사용하기도 한다.
√. 기존의 지도학습모형과 같이 예측을 부분에서 활용될 수 있으며 기계학습 부분에서 다른 모델에 비해서 예측률이 높다고 알려져 있다.
√. 넓은 형태의 데이터 셋(많은 예측 변수를 가지고 있는)에 적합하다.
√. 모델을 생성할 때는 기본적인 설정사항을 이용해 비교적 빨리 모형을 생성할 수 있다.
√. 실제 응용에 있어서 인공신경망 보다 높은 성과를 내고 명백한 이론적 근거에 기반하므로 결과 해석이 상대적으로 용이하다.
library(e1071)
library(caret)
library(ROCR)
cb <- read.delim("../1022_Decision Tree_2/Hshopping.txt", stringsAsFactors=FALSE)
colnames(cb) <- c("ID","SEX","AGE","AMT","STAR","REFUND") # Jupyter note Font Error using Korean
cb$REFUND <- factor(cb$REFUND)
set.seed(1)
inTrain <- createDataPartition(y=cb$REFUND, p=0.6, list=FALSE)
cb.train <- cb[inTrain,]
cb.test <- cb[-inTrain,]
nrow(cb.train)
nrow(cb)
svm_model <- svm(REFUND ~ SEX+AGE+AMT+STAR, data=cb.train, cost=100, gamma=1, probability = T)
summary(svm_model)
options(repr.plot.height=5, repr.plot.width=5)
plot(svm_model, data=cb.train, AMT ~ AGE)
cb.test$svm_pred <- predict(svm_model, cb.test)
confusionMatrix(cb.test$svm_pred, cb.test$REFUND)
postResample(cb.test$svm_pred, cb.test$REFUND)
options(repr.plot.height=5, repr.plot.width=8)
par(mfrow=c(1,2))
cb.test$svm_pred_prob <- attr(predict(svm_model, cb.test, probability=TRUE), "probabilities")[,2] # Get Probabilities
svm_pred <- prediction(cb.test$svm_pred_prob, cb.test$REFUND)
svm_model.perf1 <- performance(svm_pred, "tpr", "fpr") # ROC-chart
svm_model.perf2 <- performance(svm_pred, "lift", "rpp")
plot(svm_model.perf1, colorize=TRUE); abline(a=0, b=1, lty=3)
plot(svm_model.perf2, colorize=TRUE); abline(v=0.4, lty=3)
performance(svm_pred, "auc")@y.values[[1]]
tune.svm(REFUND ~ SEX+AGE+AMT+STAR, data=cb.train, gamma=seq(.5, .9, by=.1), cost=seq(100,1000, by=100))