오늘은 Support Vector Machine (SVM)을 사용하는 데 있어서 알아두면 좋을 하이퍼파라미터들과 간단한 수식들을 정리해 본다. svm은 대게 분류모델의 시작점으로 사용하기 유용하며, sklearn에서 모델을 제공하기 때문에 사용하기 용이하다. 라이브러리 버전은 1.3을 기준으로 작성한다. 

참고 1 : https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

 

sklearn.svm.SVC

Examples using sklearn.svm.SVC: Release Highlights for scikit-learn 0.24 Release Highlights for scikit-learn 0.22 Classifier comparison Plot classification probability Recognizing hand-written digi...

scikit-learn.org

 

참고 2 : 머피의 머신러닝 1


0. SVM이란 (optional) 

SVM은 Support Vector Machine의 약자이다. 말 그대로 support vector의 도움을 받아 분류작업을 진행할 수 있다. support vector가 무엇인지 알기 전에 SVM이 어떻게 동작하는 친구인지 보면 다음과 같다.

 

아래 그림과 같이 2가지의 데이터가 있다고 가정했을 때, 두 종류의 데이터가 분리될 수 있는 선(또는 공간)을 긋는다. 예시로는 linear function(wx + b 꼴)을 들겠다. 이 선이 decision boundary이다. 예를 들어 이 decision boundary보다 위에 데이터가 존재한다면 검은색 데이터로, decision boundary의 아래에 있다면 빨간색 데이터로 분류할 수 있게 된다. 

 

svm (support vector machine)
svm

이때 연분홍색 선은 margin이라고 부른다. 검은색 종류의 데이터와 빨간색 데이터와의 사이 거리다. 왼쪽 선은 margin이 큰 반면 오른쪽 그림에서는 margin이 작다. 그렇기 때문에 margin은 모델의 robustness와 밀접한 연관이 있다. 오른쪽 그림에 내가 새로운 데이터를 추가했다. decision boundary 내부에 있는 데이터들은 어떻게 되는 걸까? decision boundary의 위에 있는 데이터는 검은색 데이터로 분류하기로 했는데! 이렇듯 outlier 데이터에 취약해지는 모델은 robust 하지 않다고 말할 수 있다. 

svm
svm

 

아하! SVM은 데이터들 사이를 분류 할 수 있는 decision boundary를 정하는데, 이때 데이터와 decision boundary 사이를 margin이라고 한다. 마진을 설정하기 위해 채택하는 데이터들의 도움을 받기 때문에 이 데이터들은 support vector다. 

 

이렇듯 svm에서는 1)decision boundary를 정하고, 2) margin의 크기를 설정하는 것이 중요한 문제다. 

 

 

 

1. 하이퍼파라미터 알아보기 

sklearn에서 제공하는 svm은 다양한 인자를 input으로 받을 수 있다. 이 중 중요한 친구들을 살펴보자. 

C

이 C가 svm에서 거의 핵심이다. 위에서 우리는 decision boundary가 데이터들 간 가지는 거리인 margin이 중요함을 알았다. SVM을 최적화하기 위해  파라미터(w 등)을 업데이트하는 수식의 보라색 부분을 살펴보면 이 C가 ξ (margin에서 벗어나는 값에 얼마나 관대할 것이냐에 대한 값. )에 곱해지게 된다. 

 

sklearn에서 C는 default는 1로 설정되어있는데, C값이 커지면 현재 decision boundary의 마진에서 살짝 넘어가는 값들도 다 정답으로 간주하고 싶어 한다. 그러니까 hard-margin classifier가 되는 것을 허용하게 된다. 규제가 없는 상태인 것이다. 그러므로 모델은 robust 해지지 않고, 오버피팅에도 민감하게 된다. 

 

반대로 C가 너무 작아지게 된다면 더욱 엄격한 모델이 된다. 아래 그림예시를 볼 때 decision boundary에 애매한 검정색 데이터가 끼어있다. C가 크다면 이 검은색 데이터도 정답으로 간주하기 위한 decision boundary를 그린다. 학습 입장에서 봤을 때 loss가 줄어드는 효과는 보일 수 있다. 하지만 C가 충분히 작다면 이 outlier 검은색 데이터는 얄짤없다. 

sklearn
C에 따른 SVM
svm C

 

그러니 내 svm모델을 튜닝하는데, 현재 오버피팅이 있는것 같다 하면 C 값을 내리는 것도 좋은 방법이다. 보통 grid search로 최적값을 찾게 될텐데 튜닝 시작값의 C는 되도록 작게 시작해서 서서히 올리는게 좋다.  margin을 크게 줬다가 서서히 좁히는 느낌이다.

 

2. kernel

지금까지 decision boundary를 선형 함수(linear)로 예시를 들었다. SVM에선 이 함수의 형태를 바꿀 수 있다. linear(선형함수), poly(다형함수), rbf(가우시안 커널), sigmoid, precomputed 총 5개를 주로 선택지로 준다. 현재 default는 rbf로 되어 있다. 만약 데이터가 해석하기 쉽다면 linear로 해도 큰 문제는 없을 거다. 아래는 sklearn에서 예시로 보여주는 linear, rbf, poly kernel 사용 시 그려지는 decision boundary다. 

svm kernels

 

 

3. degree

위 Kernel에서 'poly'를 선택한다면 몇차함수의 꼴로 커널을 그릴건지 선택할 수 있다. default는 3이다. 

 

4. gamma

위 kernel에서 'poly', 'rbf', 'sigmoid' 선택 시 만지면 된다. scale, auto 중 선택할 수도 있고, 현재 default는 scale이다. 감마는 주로 커널이 좁은지 큰지를 나타낸다. 

 

이 gamma값과 1번에서 다룬 C는 제법 밀접한 연관이 있다. 감마값이 크다면 커널이 좁다는 것을 의미하기 때문에 C값도 커져버리면 감당이 안될 거다. 감마를 크게 잡을 거면 C는 작게 잡아주자.

 

5. class_weight

클래스간 데이터 수가 차이가 날 때(class imbalance) 사용해 볼 법한 하이퍼파라미터다. 'balanced'로 선택한다면 클래스당 데이터 수의 역수만큼 가중치를 줄 수 있으며, default는 None이다. 

 

6. decision_function_shape 

default는 one-vs-rest (ovr)로 되어있으며, one-vs-one(ovo)도 선택할 수 있다. 현재 버전 기준으로 binary classification 시 이 하이퍼파라미터는 건들 필요가 없다. 

ovo는 2개 클래스씩을 뽑아서 decision boundary를 찾는것을 반복한다면 ovr는 특정 클래스와 나머지 클래스들(rest)로 퉁 쳐서 둘 사이의 decision boundary를 찾고, 이를 클래스 수만큼 반복한다. 참고로 multiclass시 내부적으로 ovo를 알아서 선택해준다고 한다.

 

 

2. 주의점 - 데이터 scaling

SVM은 데이터 벡터들을 기반으로 다른 클래스 벡터 사이에 boundary를 생성하는 방법이다. 그렇기 때문에 데이터의 scaling이 사전에 이뤄져야 한다. sklearn 공식문서의 example에 scaler를 추가해 주는 부분이 이 이유에서다. 

 

아래 왼쪽 그림처럼 scaling을 해주지 않는다면 데이터의 scale이 들쭉날쭉해서 예상보다 좁은 margin의 SVM모델을 학습하게 된다. 반면 오른쪽과 같이 scaling한 데이터는 값이 일정하게 normalize 된 상태로 margin이 상대적으로 커지게 잘 학습할 수 있다. 

svm with preprocessing

 

 


 

오늘은 SVM 모델을 사용할 때 알아두면 좋을 베이스 지식과 함께 해당 하이퍼파라미터 튜닝법에 도움이 될 내용을 다루어 보았다. 학부때 패턴인식 수업에서 가장 먼저 배웠던 모델이어서 기억에 더 오래 남는 것 같다. 내가 학부 수업을 들을 적 많이 도움이 되었던 최유경교수님의 svm 설명 pdf 링크를 남긴다. 

https://github.com/sejongresearch/2019.Fall.PatternRecognition/blob/master/LectureNote/%ED%8C%A8%ED%84%B4%EC%9D%B8%EC%8B%9D_SVM_20191017.pdf

 

보다 자세한 svm의 수식적 설명은 조만간 새로운 글로 작성할 예정이다. 

728x90

+ Recent posts