Machine learning/Algorithms

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

Hannah_ko 2020. 11. 28. 09:30
SMALL

SVM 서포트 벡터 머신은 머신 러닝 모델 중 가장 많은 계산을 필요로하는 모델 중 하나이다.

특히 이 모델은 차원 수가 많아서 다른 머신러닝 모델이 작 적용되지 않는 데이터셋에서 좋은 성능을 보여줄 수 있다.

 

1. SVM이란

SVM은 각 영역에서 가장 균일한 점을 생성하는 다차원 공간(hyperplane, 초평면)에 표시되는 다양한 유형의 데이터 점 간의 경계를 최대화하는 표면을 찾는 모델이다.

 

어떤 데이터 유형이라도 사용 가능하며 차원이 높은 데이터에서 특히 이점을 갖는다.

 

이미지 출처 1

2. SVM 모델 종류

1) Maximum margin classifier 최대 마진 분류기

최대 마진 분류기는 분리 폭의 margin이 최대를 갖는 초평면을 구함으로써 분류한다.

 

 

 

빨간 동그라미와 파란 동그라미를 구분할 수 있는 초평면은 무수히 많을 수 있지만 가장 넓은 슬래브(두 클래스 사이의 마진이 최대가 되는 영역)를 가지는 초평면을 가져야 한다.

실제 데이터의 경우 클래스를 완전히 분리할 수 있는 경우는 드물기 때문에 서포트 벡터 분류기가 나오게 되었다.

 

2) Support vector classifier 서포트 벡터 분류기

서포트 벡터 분류기는 최대 마진 분류기로 분류할 수 없는 데이터(클래스 별로 딱 나눌 수 없는 데이터)의 경우에 임계값 한도 내에서 약간의 오차를 허용하는 방법이다. 다시 말하면 완벽히 분리가 불가능한 경우 일부 위반을 허용하는 모델이라고 할 수 있다.

 

왼쪽 그래프는 C 값이 높은 경우로 모델이 더 관대하고 오류가 있는 공간이 넓은 반면에,

오른쪽 그래프는 C 값이 작은 경우로 위반을 허용할 범위가 없어 마진 폭이 감소하게 된다.

 

3) Support vector machine 서포트 벡터 머신

서포트 벡터 머신은 클래스 별 결정 경계가 비선형이고 서포트 벡터 분류기로도 분리하기 어려울 때 사용하는 방법으로 비선형적인 데이터를 분리 가능한 데이터로 바꿔주기 위해 커널트릭이라는 방법을 사용하는 모델이다.

위의 그림과 같은 경우가 결정 경계가 비선형이고 서포트 벡터 분류기로 분리하기 어려운 데이터를 보여준다.

 

3-1) Kernel function 커널 함수

서포트 벡터 머신의 커널 함수는 특정 벡터가 주어졌을 때 해당 벡터의 내적과 동일한 값을 반환하는 함수다.

기존 벡터 공간에서 더 높은 차원의 벡터 공간을 유도하기 위해 계산 요구사항을 제거하여 관측값이 더 높은 차원에서 선형으로 분리되도록 하는 것이 목표이다.

 

커널함수는 원점을 중심으로 대칭이면서 적분 값이 1인 non-negative 함수로 정의되며 다항식 커널(ploynomial kernal), 가우시안 커널(gaussian kernel), 방사형 기저 함수(fadial basis function) 등이 있다.

 

 

 

데이터를 1차원에서 2차원 데이터로 변환하는데 2차 다항식 커널이 적용된 예이다.

다항식 커널의 차수(degree of the polynomial demensions)는 조정 매개 변수(tuning hyperparameter)로 모델에서 더 높은 정확도가 가능한지 확인하기 위해 다양한 값으로 조정해서 테스트해 보아야 한다.

 

 

2차원의 경우 커널 함수는 차수가 2인 다항식 커널로 위와 같이 적용된다.

데이터를 더 높은 차원으로 투영한 후 선형 평면을 사용하여 관측값을 분류한 예이다.

 

 

커널 함수에서 감마 값이 작으면 더 높은 차원에서 뾰족한 모양을 보여주고 감마 값이 크면 더 완만한 모양을 보여준다.

작은 감마 값은 low bias와 high variance를 제공하는 반면 높은 감마 값은 high variance와 low bias를 제공한다.

 

 

3. 서포트 벡터 머신 예제

letter recognition 예제

import pandas as pd

letterdata = pd.read_csv('letter-recognition.csv')
letterdata.head()

x_vars = letterdata.drop(['letter'], axis=1)
y_var = letterdata['letter']

y_var = y_var.replace({'A':1, 'B':2, 'C':3, 'D':4, 'E':5, 'F':6, 'G':7, 'H':8, 'I':9, 'J':10, 'K':11, 'L':12, 'M':13, 'N':14, 'O':15, 'P':16, 'Q':17, 'R':18, 'S':19, 'T':20, 'U':21, 'V':22, 'W':23, 'X':24, 'Y':25, 'Z':26})


from sklearn.metrics import accuracy_score, classification_report
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_vars, y_var, train_size=0.7, random_state=42)


from sklearn.svm import SVC

svm_fit = SVC(kernel='lenear', C=1.0, random_state=43)
svm_fit.fit(x_train, y_train)

print('SVM Linear Classifier - Train confusion matrix\n', pd.crosstab(y_train, svm_fit.predict(x_train), rownames=["Actuall"], colnames=["Predicted"]))
print('\nSVM Linear Classifier - Train accuracy:', round(accuracy_score(y_train, svm_fit.predict(x_train)), 3))
print('\nSVM Linear Classifier - Train Classification report:\n', classification_report(y_train, svm_fit.predict(x_train)))

print("SVM Linear Classifier - Test Confusion Matrix \n", pd.crosstab(y_test, svm_fit.predict(x_test), rownames=["Actuall"], colnames=["Predicted"]))
print("\nSVM Linear Classifier - Test accuracy:", round(accuracy_score(y_test, svm_fit.predict(x_test)), 3))
print("\nSVM Linear Classifier - Test Classification Report\n", classification_report(y_test, svm_fit.predict(x_test)))

 

 


[참고문헌]

 

1. 이미지 출처 1 https://ko.wikipedia.org/wiki/%EC%84%9C%ED%8F%AC%ED%8A%B8_%EB%B2%A1%ED%84%B0_%EB%A8%B8%EC%8B%A0

 

2. Pratap Dangeti, 2017, Statistics for Machine Learning

 

LIST