SVM(Support Vector Machine)은 주어진 데이터가 어디에 속하는지 분류하는 이진 선형 분류 모델이다. N차원의 공간을 (N-1)차원으로 나눌 수 있는 초평면을 찾는 분류 기법이다. 초평면은 경계를 뜻하며, 특히 2차원 뿐만 아니라 고차원에서도 분류할 수 있는 경계를 의미한다.
Margin(마진)은 클래스들 사이의 간격, 즉 각 클래스의 끝에 위치한 데이터들 사이의 거리를 의미한다.
위와 같이 두 개의 클래스로 분류되는 데이터들이 있을 때 최적의 경계는 직관적으로 생각했을 때 저 직선이 될 것이다.
최적의 경계는 마진이 최대화되는 경계이다.
Support Vector는 마진에서 가장 가까이 위치한, 즉 각 클래스들의 끝에 있는 데이터를 지칭한다. 위의 그림에서 점선에 걸쳐진 두 데이터가 서포트 벡터라고 볼 수 있다. 이 데이터들의 위치에 따라 경계(초평면)의 위치가 달라지기에 초평면 함수를 지지한다는 뜻에서 서포트 벡터라는 이름을 가진다고 한다.
SVM는 선형으로 분류가 가능한 경우와 불가능한 경우에 따라 다른 종류가 쓰인다.
하드마진은 두 클래스를 분류할 수 있는 최대마진의 초평면을 찾는 방법이다. hard인만큼 오차를 절대 허용하지 않는다. 즉 모든 데이터는 마진 밖에 있어야 한다. 그러나 모든 데이터를 오차없이 나누는 경계를 찾는 것은 쉽지 않다.
하드마진의 단점을 보완하는 방식이 소프트마진이다. 즉 일정한 오차나 잘못된 분류를 허용한다. 이를 위해 Slack Variable을 사용한다. Slack Variable의 크기만큼 초평면의 위, 아래로 오차를 허용한다.
선형분리가 불가능한 데이터셋에서 데이터의 차원을 높여서 선형분리를 진행한 후 다시 기존의 입력공간으로 변환하는 과정이다.
위와 같이 선형분리가 불가능한 1차원의 데이터를 2차원의 평면으로 바꾸어 선형분리가 가능하도록 한다.
위의 그림은 2차원의 데이터를 3차원의 특정공간으로 변환하여 선형분리가 가능하도록 한 후 2차원의 초평면으로 분류한 것이다.
from sklearn import svm
svm_clf = svm.SVC(kernel='linear', C=1.0)
svm_clf.fit(X_train, y_train)
y_predict_train = svm_clf.predict(X_train)
train_score = accuracy_score(y_train, y_predict_train)
y_predict_test = svm_clf.predict(X_test)
test_score = accuracy_score(y_test, y_predict_test)
print("train accuracy: {0:.3f}".format(train_score))
print("test accuracy: {0:.3f}".format(test_score))