SVM은 분류, 회귀 등에 사용되는 비지도 학습 방법으로 다양한 장점이 존재하고 있다.
그러나, SVM은 다음과 같은 단점이 존재하고 있다.
SVM이 분류를 진행하는 과정에서 이진 혹은 다중 분류를 진행하는 경우에 SVC, NuSVC, LinearSVC를 사용한다.
SVC와 NuSVC는 비슷하지만 약간씩 다른 파라미터와 수학 공식으로 미세한 차이가 존재한다. 반대로 LinearSVC는 선형 커널로 분류할 때 더 빠르게 실행한다는 장점이 있지만 kernel이라는 파라미터를 받지 않는다. 그 이유는 이미 선형 커널(Linear Kernel)로 가정하기 때문이다. SVC가 받는 X, Y의 형식은 아래와 같다.
from sklearn import svc
X = [[0, 0], [1, 1]]
y = [0, 1]
clf = svm.SVC()
clf.fit(X, y)
# 학습 후에 예측하는 경우
clf.predict([2, 2])
# support vectors를 가져오는 경우
clf.support_vectors_
# support vectors 지수를 가져오는 경우
clf.support_
# support vectors 각 클래수의 개수를 가져오는 경우
clf.n_support_
SVM은 3차원을 2차원으로, 고차원을 저차원으로 줄이면서 인간이 알아볼 수 있는 구분 선, 공간을 삽입해 직관적으로 데이터들이 분류할 수 있도록 한다.
이 사진만 보더라도 빨강과 파랑의 최적의 경계선이 보이는데 3차원을 2차원으로 줄였을 때 분류하는 모습을 알 수 있다.
여기서 w^2가 최소가 되는 경계지점을 찾는 것이 중요하다. 그러나 고차원으로 넘어가면 계수나 차원 공간을 다루는 것들에 대하여 최적화 문제가 발생할 우려가 존재한다. 그래서 최종적인 SVC의 결정함수 형태를 살펴보게 되면 아래와 같은 모습을 볼 수 있다.
예측 클래스에 맞는 요소들에 대하여 샘플을 통해 파라미터들을 접근하며 평가할 수 있다.
NuSVC는 아까 특징에서 설명할 때도 파라미터 일부 추가한 것 외에는 거의 SVC와 비슷하기에 굳이 설명하지 않도록 하겠다.
SVC에서 선형 커널 함수로 가정해 커널을 진행하는 것으로 수학 공식은 아래와 같다.
여기에 hinge loss가 있는데 이는 "maximum-margin" 분류를 하는 과정에서 사용이 되는 손실 요소이다. 예를 들어, t=+1 or -1이고 score가 y로 나타났을 때, 그림과 유도 식은 다음과 같다.
최종 값이 0이하일 때는 1로 고정되고 0 이상일 때는 주어진 식을 기준으로 점점 낮아지는 것을 알 수 있다.
즉, 기존 SVC에서 hinge loss 방식을 적용해 나타난 것임을 알 수 있다.
SVC, NuSVC는 다중 클래스 분류에서 1대1 접근을 통해 실행을 한다.
X = [[0], [1], [2], [3]]
Y = [0, 1, 2, 3]
clf = svm.SVC(decision_function_shape='ovo')
clf.fit(X, Y)
dec = clf.decision_function([[1]])
dec.shape[1] # 4*3/2 = 6
>>> 6
clf.decision_function_shape = "ovr"
dec = clf.decision_function([[1]])
dec.shape[1] # 4 classes
>>> 4
LinearSVC는 1대다 접근으로 분류를 진행한다.
lin_clf = svm.LinearSVC()
lin_clf.fit(X, Y)
>>> LinearSVC()
dec = lin_clf.decision_function([[1]])
dec.shape[1]
>>> 4
불균형 데이터 내에서 분류를 진행할 때 class_weight
, sample_weight
가 사용된다.
이 그림만 봐도 조절이 된 경우와 안된 경우를 살펴보면 분류하는 과정에서 큰 차이가 존재하고 있음을 알 수 있다.
SVC, NuSVC, SVR, NuSVR, LinearSVC, LinearSVR, OneClassSVM 모두 weight를 조절할 수 있다.
회귀 과정에서도 분류와 비슷하게 훈련 세트의 하위 세트를 이용해 학습을 한다. 종류도 SVR, NuSVR, LinearSVR로 Classification -> Regression이 된 것을 알 수 있다.
from sklearn import svm
X = [[0, 0], [2, 2]]
y = [0.5, 2.5]
regr = svm.SVR()
regr.fit(X, y)
>>> SVR()
regr.predict([[1, 1]])
>>> array([1.5])
1. 데이터 복사를 피하라!
2. 커널 사이즈 조절
cache_size
를 설정하는 것을 권장한다.3. C 세팅하기
StandardScaler
과 같은 조정 함수를 통해 데이터 스케일을 줄이고 나서 SVM을 실행하는 것을 권장한다.지금까지 공부하고 작성한 것은 기본 Scikit-Learn Docs를 기반으로 되어있습니다.