- POSTECH에서 제공하는 MOOC 중, 머신러닝기법과 R프로그래밍 Ⅰ 과정입니다.
XI. 서포트벡터머신
1. 서포트벡터머신 Ⅰ
Support Vector Machine
머신러닝
- 지도학습
- 분류모델
- kNN모델
- SVM(서포트벡터머신)
- 분류모델
- 비지도학습
- 군집모델
- 지도학습
서포트벡터머신 장단점
| 장점 | 단점 |
|---|---|
| 상대적으로 정확도가 높음 | 해석상 어려움 발생 |
| 다양한 데이터(연속형, 범주형)를 다룰 수 있음 | 데이터가 많을 때 속도와 메모리가 많이 듦 |
선형 SVM
- 각 클래스를 분류해주는 margin(각 클래스를 분류하는 하이퍼플레인)을 최대화하는 벡터를 찾는 분석 기법
비선형 SVM
- 대부분 패턴은 선형적 분리가 불가능
- 비선형 패턴의 임력공간을 선형 패턴의 feature space로 변환
- Kernel method로 비선형 경계면 도출
- 대부분 패턴은 선형적 분리가 불가능
서포트백터머신 패키지와 함수
- 서포트벡터머신 수행을 위한 패키지: e1071
- 서포트벡터머신 함수: svm(y변수~x변수, data= )
1 | # install.packages("e1071") |
1 | ## classification |
- svm 옵션(default)
- kernel = radial basis function
- gamma = 1/(# of dimension) (1/4=0.25)
서포트벡터머신 결과
- svm 모델에 적용한 예측범주와 실제범주 비교(전체 데이터 사용 결과)
1
2
3
4
5
6
7
8
9# 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로 저장
# Check accuracy (compare predicted class(pred) and true class(y))
# y <- Species or y<-iris[,5]
y<-iris[,5]
table(pred, y) - 결과 해석
- 오분류율: (4+1)/150 = 0.033%
서포트벡터머신 시각화
- iris 데이터의 서포트벡터머신 결과(전체 데이터 사용 결과)
1
2# visualize classes by color
plot(m1, iris, Petal.Width~Petal.Length, slice=list(Sepal.Width=3, Sepal.Length=4)) - 결과 해석
- 4개 변수 중, petal.width와 petal.length가 중요한 변수
2. 서포트벡터머신 Ⅱ
서포트벡터머신(kernel 함수)
커널(kernel)이란?
- Input Space → Feature Space
- f(x) = φ(x)^T^w + b
커널함수(kernel function)
x의 기저함수(basis function)
x에 대한 새로운 특징을 추출하는 변환함수
- 좋은 커널함수: x 데이터의 모든 정보를 보존하면서 class를 잘 분류할 수 있는 커널함수
커널함수와 기저함수의 관계: K(x
i,xj) = φ(xi)’φ(xj)- radial: K(x
i,xj) = exp($\frac{-||xi- xj||^2^}{2σ^2^}$) - polynomial: K(x
i,xj) = (xi‘xj+ 1)^r^ - sigmoid: K(x
i,xj) = tanh(kxi‘xj- σ)
- radial: K(x
패키지 설치
- 서포트벡터머신 수행 패키지: e1071
- 오분류율 교차표(confusion matrix) 생성 패키지: caret
1
2
3# install.packages("caret")
library(e1071)
library(caret)
iris 데이터 (학습데이터와 검증데이터 분할)
1
2
3
4
5
6
7
8
9# 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,]커널함수 적용
1
2
3
4
5
6
7
8
9#svm using kernel
m1<-svm(Species~., data = train) # default: radial
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)서포트벡터머신 결과
- 정확도 측정: kernel-radial basis function
1
2
3
4#measure accuracy
pred11<-predict(m1,test) # radial basis
confusionMatrix(pred11, test$Species)
#table(pred11, y[-tr.idx])
- 결과 해석
- 예측범주: Prediction
- 실제범주: Reference
- 정확도: 0.96
- 정확도 측정: kernel-polynomial
1
2
3pred12<-predict(m2,test) # polynomial
confusionMatrix(pred12, test$Species)
#table(pred12, y[-tr.idx])
- 결과 해석
- 정확도: 0.9
- 정확도 측정: kernel-sigmoid
1
2
3pred13<-predict(m3,test) # simoid
confusionMatrix(pred13, test$Species)
#table(pred13, y[-tr.idx])
- 결과 해석
- 정확도: 0.9
- 정확도 측정: kernel-linear
1
2
3pred14<-predict(m4,test) # linear
confusionMatrix(pred14, test$Species)
#table(pred14, y[-tr.idx])
- 결과 해석
- 정확도: 0.9393
서포트벡터머신 정확도 정리
- linear로만 처리해도 정확도 높은 경우가 많음
3. 서포트벡터머신 Ⅲ
Breast Cancer 데이터
1 | # install.packages("e1071") |
1 | # read data |
- Breast Cancer Wisconsin (Diagnostic) Data Set
- 세침흡인 세포검사를 통해 얻은 683개 유방조직의 9개 특성을 나타냄
- input변수(독립변수): 9개, output변수(종속, 타겟변수): 1개
- 학습데이터 / 검증데이터 분할
1
2
3
4
5
6
7
8
9# training (455) & test set (228)
# set.seed(1000)
N=nrow(cancer)
set.seed(998, sample.kind="Rounding")
# split train data and test data
tr.idx=sample(1:N, size=N*2/3, replace=FALSE)
train <- cancer[ tr.idx,]
test <- cancer[-tr.idx,]
서포트벡터머신 결과
- kernel 함수에 따른 서포트벡터머신
1
2
3
4
5
6
7
8#svm using kernel
m1<-svm(Y~., data = train)
summary(m1)
#measure accuracy
pred11<-predict(m1,test) # radial basis
confusionMatrix(pred11, test$Y)
#table(pred11, y[-tr.idx]) - 결과 해석
- 악성으로 오분류 4, 정상으로 오분류 1
- 정확도: 0.9781
1 | m2<-svm(Y~., data = train,kernel="polynomial") |
- 결과 해석
- 악성으로 오분류 0, 정상으로 오분류 12
- 정확도: 0.9474
- 정확도는 94% 이상이나, 암 진단 특성상 정상으로 오분류하는 경우가 많으면 안 됨
- False Positive(예측: P, 실제: N)가 더 위험한 경우
1 | m3<-svm(Y~., data = train,kernel="sigmoid") |
- 결과 해석
- 악성으로 오분류 5, 정상으로 오분류 3
- 정확도: 0.9649
1 | m4<-svm(Y~., data = train,kernel="linear") |
결과 해석
- 악성으로 오분류 1, 정상으로 오분류 3
- 정확도: 0.9825
전체 결론
- 정확도만 보았을 때 linear 모델이 적합하나, True Negative가 위험하기 때문에 radial 모델이 더 적합할 수 있음