기계학습/Intro to ML in Udacity

SVM (Support Vector Machine) (1/38) -> (38/38)

내꿈은자동화 2017. 4. 3. 23:37

좀 늦었네요.


이번 글에서는 SVM (Support Vector Machine) 에 대해 소개할 것이다. (러시아 사람에 의해 고안되었다. 이름은 못찾겠는데 시간나면 찾아서 업데이트 하겠다.)


SVM 은 지도학습을 통한 분류 (Supervised Classification) 이다. 

앞서 소개한 Naive Bayes 와 다른 점은 Hyper dimension 을 사용한다는 것이다.


그림들을 이용하여 선형 (Linear) SVM 의 특징에 대한 소개를 하겠다. (비선형도 존재한다.)

<그림 1> SVM Classification


<그림 1> 에서 SVM을 이용하여 <빨간 원> 과 <녹색 사각형> 을 구분 (Classify) 한다면 어떤 선으로 구분할까?

답은 (아마도) <Line 2> 이다.


<그림 2> SVM Margin


그렇다면 <그림 2> 에서 SVM 을 이용하여 분류한다면 어느 선으로 분류될까?

정답은 <Line 2> 이다. 왜 <Line 2> 일까?


이 부분에서 Margin 의 개념을 소개한다.

Margin 이란 Boundary (line) 가까이에 있는 요소 (Element) 에서 Boundary 까지의 거리의 합을 의미한다. (여기서 얼마나 가까이에 있는 원소까지 사용할지는 Parameter 설정에서 다룬다.)

SVM 에서는 Margin 값이 가장 큰 Line 을 선택한다.


그리고 강건함 (Robust) 의 관점에서 <Line 1> 이나 <Line 3> 은 적절하지 않다.

<Line 1> 의 경우 왼쪽 위에 빨간색 원의 위치가 조금 바뀔 때 Boundary 를 넘어 다른 Label 을 침범하게 된다.


<그림 3> SVM Order


<그림 3> 에서는 SVM 을 사용하면 어떤 선으로 분류할까?

Classification 의 관점에서 보면 <Line 1> 이 맞고 Margin 의 관점에서 보면 <Line 2> 가 맞다.

정답은 <Line 1> 이다. 

그 이유는 SVM 은 Classification 을 한 다음에 Margin 이 가장 큰 선을 선택하기 때문이다.


SVM 에서의 Outlier 에 대해 알아보겠다.


<그림 4> SVM Outlier


<그림 4> 에서 선형 SVM 을 사용하면 어떤 선으로 요소들을 분류할 것인가?

여기서의 답은 <Line 1> 이다. 선형 SVM 은 Outlier 을 어느정도 무시하며 최선의 선택을 한다. (Outlier 에 강건함 (Robust))


여기까지가 선형 SVM 에 대한 이론적인 설명이다. Katie 가 진행하는 sklearn 기반 예제를 풀어보자.

########################## SVM #################################
### we handle the import statement and SVC creation for you here
from sklearn.svm import SVC           #    Import module
clf = SVC(kernel="linear")            #    SVC : Support Vector Classifier
clf.fit(features_train,labels_train) #    Fitting training data

pred = clf.predict(features_test)     #    Predict data from training set

<코드 1> SVM 예제


<코드 1> 과 같이 코드를 입력하면 선형 SVM 으로 데이터의 요소들을 분류한다.



다음으론 비선형 (Nonlinear) SVM 에 대해 알아보겠다.


<그림 5> SVM Nonlinear


<그림 5> 와 같은 형태에서 두 요소를 어떻게 분류할까? 이 경우 X,Y 평면에서 선형으로 구분할 수 없다. 이 때 비선형 SVM 을 사용하게 되는데 그 원리는 위 그림과 같다. Z 를 원점에서의 거리로 했을 때 X,Z 평면에서 두 요소는 <그림 5> 의 오른쪽과 같이 나오고 이를 선형으로 분류할 수 있게 된다. (It can linearly separable) 이렇게 Z 평면을 하나 더 추가할 때 추가한 Z 평면을 Hyper dimension 이라 부르고 추가하는 것을 Feature 를 더했다고 한다.


(여기서 kernel 의 개념이 나온다. SVM 에서 kernel 은 차원의 세분화를 뜻한다. <그림 5> 의 경우 X,Y 에서 X,Y,Z 로 변한 것)



다음으론 sklearn 에서 SVM 에 사용되는 parameter 들에 대해 알아보겠다.


Classifier 로 SVM 을 사용할 때 <코드 1> 에서와 같이 clf = SVC(parameters) 로 사용한다. 


SVM 에서 사용되는 Parameter 는 kernel, C, gamma 가 있다. (더 있는데 주의해서 봐야할건 이것들이다.)

먼저 여기서 사용할 kernel 은 rbf, linear 이다. (rbf 는 Radial Basis Function 의 약자이다. 이것의 값은 특정 중심에서 거리에 의존하는 함수(값)이다. <참고문헌 2>)

C 값을 낮추면 Boundary 가 매끄러워지고(Smooth Boundary), 값을 높이면 요소들을 더 잘 분류한다. (Classifying training points correctly)

Gamma 값을 낮추면 Boundary 에서 멀리 떨어진 요소들의 영향이 낮고 값을 높이면 멀리 떨어진 요소들의 값의 영향이 크다. (값을 높일 경우 Boundary 에 인접한 요소들의 영향 (weight) 가 커지기 때문에 Boundary 가 울퉁불퉁 (Uneven) 하게 된다.)


다음으론 Overfitting 에 대해 알아보겠다.

<그림 6> SVM Overfitting


<그림 6> 과 같은 형태로 Boundary 를 정한것을 보고 Overfitting 되었다고 하고 Machine Learning 에서는 이러한 경우를 피해야 한다.

SVM Parameters 인 Kernel, C, Gamma 는 Overfitting 에 영향을 주는 요소 중 일부이다.



여기까지가 SVM 에 대한 설명이고 마지막으로 Mini Project 에 대한 설명을 하고 글을 마치겠다.


이번 프로젝트에서는 앞서 Naive Bayes 에서와 같은 데이터를 사용할 것이다.

Github 에서 클론한 폴더 내 svm 폴더 내의 svm_author_id.py 파일을 실행한다.

이후 <코드 1> 에서와 같이 import -> create classifier -> fitting data (training) -> predict 순서로 코딩한다.

(코딩을 하였던 py 파일이 지금 포스팅하는 컴퓨터에 없어서... 코드 부분은 생략하겠습니다.)

이번 프로젝트에서 눈여겨 볼 것은 다음과 같다.

1. 기존의 Naive Bayes 방법과의 accuracy 를 비교해 보는 것

2. Training Dataset 을 1% 로 줄였을 때 accuracy 가 얼마나 감소하는지

3. SVM 에서 Kernel, C, Gamma 변경할 때 accuracy 의 변화 (특히 C 값이 최적일 때 보기)




<참고 문헌>

1. Intro to ML in Udacity

2. Wikipedia, RBF (https://en.wikipedia.org/wiki/Radial_basis_function)


<그림>


<코드>

'기계학습 > Intro to ML in Udacity' 카테고리의 다른 글

Decision Tree (1/41) -> (41/41)  (0) 2017.04.07
Naive Bayes (22/43) -> (43/43)  (0) 2017.03.30
Welcome to Machine Learning -> Naive Bayes (22/43)  (0) 2017.03.29
소개  (1) 2017.03.29