Research Notes

[R] Support Vector Machine (SVM) 본문

Programming Language/R

[R] Support Vector Machine (SVM)

jiachoi 2023. 7. 3. 12:13

1. 서포트벡터머신(Support Vector Machine)

: 지도학습 - 분류모델 - SVM(서포트벡터머신)

- 장점 : 정확도, 다양한 데이터를 다룰 수 있음

- 단점 : 해석상 어려움. 시간상 문제

1) 선형 SVM

위의 그림에서 원과 네모를 나누는 최적의 방법을 찾아야 함. 직선과 실선사이를 마진(margin)이라고 하는데 이를 최대화하는 벡터를 찾는 것. 양쪽의 범주를 분리하는 최적 선을 찾는 최적화 문제.

2) 비선형 SVM

x1와 x2를 분리하기 위한 패턴은 선형으로 분리 할 수 없음. 2차원 공간에서는 분리가 불가하기 떄문에 고차원 공간으로 변환.

 

2. 서포트벡터머신 패키지와 함수

- 패키지 : e1071

- 서포트벡터머신 함수 : svm

1) 패키지 설치, 작업환경 설정, 데이터 불러오기

# install package for support vector machine
install.packages("e1071")
library (e1071)
#help(svm)

# set working directory
setwd("/Users/choijia/postech_ai/ML/Week11-1")

# read data
iris<-read.csv("iris.csv")
attach(iris)

2) 서포트벡터머신 함수 : svm(y변수 ~ x변수, data=)

svm에서 디폴트 : kenel = radial basis function, gamma=1/(of dimension) (=1/x변수들의 차원)

## classification 
# 1. use all data 
m1<- svm(Species ~., data = iris, kernel="linear") # 독립변수 전체를 사용 (Species ~.) 
summary(m1)

kernal = default인것 확인,

3) 서포트벡터머신 결과

- svm 모델에 적용한 예측범주와 실제범주 비교(전체데이터 사용 결과)

- predict(svm결과모델, x(데이터))

# classify all data using svm result (m1)
# first 4 variables as attribute variables
x<-iris[, -5] 
    # iris 데이터에서 5번쨰 열을 제외한 데이터, 4개의 독립변수만 있는 데이터 
pred <- predict(m1, x) 
    # svm모델 m1을 적용하여 예측된 범주값을 pred로 저장.

# 정확도 확인 (pred, y)
# y <- Species or y<-iris[,5]
y<-iris[,5]
table(pred, y)

pred : 예측범주 / y : 실제범주 --> 오분류율 : 5/150

4) 서포트벡터머신 결과 시각화

# visualize classes by color
plot(m1, iris,  Petal.Width~Petal.Length, slice=list(Sepal.Width=3, Sepal.Length=4))

3. 서포트벡터머신-kernel 함수

▶ 커널함수란?

: 새로운 특징(feature)으로 원래의 x데이터를 변환해주는 것.

▶ 커널함수 : radial, polynomial, sigmoid 등 존재

1) 오분류율 교차표(confusion matrix) 생성을 위한 패키지 : caret 설치

# install package for confusionMatrix
install.packages("caret")
library(caret)

2) Iris 데이터 학습/검증 데이터 분할

# read data
iris<-read.csv("iris.csv")
attach(iris)

# training (100) & test set (50)
set.seed(1000, sample.kind="Rounding")
N=nrow(iris)
tr.idx=sample(1:N, size=N*2/3, replace=FALSE)
# target variable
y=iris[,5]
# split train data and test data
train=iris[tr.idx,]
test=iris[-tr.idx,]

3) 커널을 사용

- kernel default : radial / 종류 : polynomial, sigmoid, linear

#svm using kernel
help("svm")
m1<-svm(Species~., data = train) 
summary(m1)
m2<-svm(Species~., data = train,kernel="polynomial")
summary(m2)
m3<-svm(Species~., data = train,kernel="sigmoid")
summary(m3)
m4<-svm(Species~., data = train,kernel="linear")
summary(m4)

4) 서포트벡터머신 결과(Radial 기준)

#measure accuracy
pred11<-predict(m1,test) # radial basis
confusionMatrix(pred11, test$Species) # 예측범주, 실제범주간 교차표 생성