사용할 패키지는 다음과 같다.

library(ggplot2)
library(e1071)
library(caret)
library(kernlab)

데이터를 training, validation, test 데이터를 6:2:2 비율로 나눈다.

iris <- data.frame(iris, stringsAsFactors = TRUE)
set.seed(123)
ind <-sample(3, nrow(iris), replace = TRUE, prob=c(0.6, 0.2, 0.2))
iris_train <- iris[ind==1, ]
iris_valid <- iris[ind==2, ]
iris_test <- iris[ind==3, ]

Training data로 기장 기본적인 SVM모델을 fitting하여 기계학습을 한 결과, parameter는 radial kernel을 가지는 c-classification, cost=1인 모델로 fitting 되었다.

iris_svm = svm(Species ~ ., data = iris_train)
summary(iris_svm)
pred = predict(iris_svm, iris_train)
confusionMatrix(pred, iris_train$Species)

처음에 기계학습을 한 모델이 바로 Accuracy가 1이 되었지만, validation data를 이용하여 여러 kernel에 대한 tuning parameter을 시행해본다.

#radial kernel
tune1 = tune.svm(Species~., data = iris_valid, 
                 gamma=10^(-5:0), cost=2^(0:4), 
                 kernel="radial")
tune1

svm_radial = svm(Species~., data = iris_valid,
                 gamma=0.1, cost = 8,
                 kernel="radial")
summary(svm_radial)
pred2 = predict(svm_radial, iris_valid)
confusionMatrix(pred2, iris_valid$Species)

Radial kernel을 사용하여 진행한 최적의 parameter tuning 결과, gamma는 0.1, cost는 8를 적용하여 1의 Accuracy가 나왔다.

# linear kernel
tune2 = tune.svm(Species~., data = iris_valid, 
                   cost=2^(0:4), 
                   kernel="linear")
tune2

svm_linear = svm(Species~., data = iris_valid,
                 cost = 4,
                 kernel="linear")
summary(svm_linear)
pred3 = predict(svm_linear, iris_valid)
confusionMatrix(pred3, iris_valid$Species)

linear kernel을 사용하여 진행한 최적의 parameter tuning 결과, cost = 4를 적용하여 1의 Accuracy가 나왔다.

#polynomia kernel
tune3 = tune.svm(Species~., data = iris_valid, 
                 degree = 2:4, cost=2^(0:4), 
                 kernel="polynomia")
tune3

svm_poly = svm(Species~., data = iris_valid,
                 degree = 3, cost = 2,
                 kernel="polynomia")
summary(svm_poly)
pred4 = predict(svm_poly, iris_valid)
confusionMatrix(pred4, iris_valid$Species)

polynomia kernel을 사용하여 진행한 최적의 parameter tuning 결과, cost = 2, degree=3를 적용하여 0.8966의 Accuracy가 나왔다.

#test
predict = predict(svm_linear, iris_test)
confusionMatrix(predict, iris_test$Species)
predict = predict(svm_radial, iris_test)
confusionMatrix(predict, iris_test$Species)

Radial kernel과 linear kernel 모두 validation data set을 이용하여 분석하였을 때 1의 accuracy를 보였으나, 둘 중에서 예측력이 높고 안정성이 높았던 linear kernel을 선택하여 최종 test data set을 분석한 결과, 0.875의 accuracy가 나왔다.

plot(svm_linear, iris_test, Petal.Width ~ Petal.Length, slice=list(Sepal.Width=3, Sepal.Length=5))
plot(svm_linear, iris_test, Sepal.Width ~ Sepal.Length, slice=list(Petal.Width=2.5, Petal.Length=3))
plot(iris_svm, iris_test, Petal.Width ~ Petal.Length, slice=list(Sepal.Width=3, Sepal.Length=5))
plot(iris_svm, iris_test, Sepal.Width ~ Sepal.Length, slice=list(Petal.Width=2.5, Petal.Length=3))

profile
잡학꾸러기

0개의 댓글