인공지능/머신러닝

Support Vector Machine(SVM)

eun_coco 2023. 1. 18. 19:03

서포트 벡터 머신이란,  결정 경계(Decision Boundary), 즉 분류를 위한 기준 선을 정의하는 모델이다.

래서 분류되지 않은 새로운 점이 나타나면 경계의 어느 쪽에 속하는지 확인해서 분류 과제를 수행할 수 있게 된다.

 

 

<결정 경계>

만약 데이터에 2개 속성(feature)만 있다면 결정 경계는 이렇게 간단한 선 형태가 된다.

출처: https://hleecaster.com/ml-svm-concept/

 

 

 

속성이 3개로 늘어난다면 3차원으로 그려야 한다.

출처ㅣ https://hleecaster.com/ml-svm-concept/

 

이때의 결정 경계는 선이 아닌 평면이 된다.

 

우리가 시각적으로 인지할 수 있는 범위는 3차원까지며, 차원, 즉 속성의 개수가 늘어날수록 복잡해진다. 이에 따라 결정 경계도 단순한 평면이 아닌 고차원이 되며 이를 “초평면(hyperplane)”이라고 한다.

 

 

 

<최적의 결정 경계>

 

결정 경계는 무수히 많이 존재할 수 있다. 어떤 경계가 좋은 경계일까?

 

출처: https://hleecaster.com/ml-svm-concept/

 

직관적으로 봤을 때,  결정 경계는 데이터 군으로부터 최대한 멀리 떨어지는 게 좋을 것이다.

위 그림에서도, C 그래프의 경우에는 선이 파란색 클래스와 너무 가까워서 부적절해보인다.

반면에 F 그래프의 경우 두 클래스 사이에서 거리가 가장 적당한 것으로 보아 가장 적절해보인다.

 

실제로 서포트 벡터 머신(Support Vector Machine)이라는 이름에서 Support Vectors는 결정 경계와 가까이 있는 데이터 포인트들을 의미하며, 이 데이터들이 경계를 정의하는 결정적인 역할을 한다.

 

 

 

<마진(Margin)>

마진(Margin)은 결정 경계와 서포트 벡터 사이의 거리를 의미한다.

출처: https://hleecaster.com/ml-svm-concept/

 

위 그림을 보면, 가운데 실선이 하나 그어져 있는데, 이것이 결정 경계이다.

그리고 이 결정 경계로부터 검은 테두리가 있는 빨간점 1개, 파란점 2개까지의 영역을 두고 점선이 그어져 있다. 이 점선으로부터 결정 경계까지의 거리가 마진이다.

 

 

그럼 다음의 결론이 도출된다.

최적의 결정 경계는 마진을 최대화한다.

 

 

 

<서포트 벡터>

 Support Vectors는 결정 경계와 가까이 있는 데이터 포인트들을 의미하며, 이 데이터들이 경계를 정의하는 결정적인 역할을 한다. 이 부분에서 SVM 알고리즘의 장점이 드러난다. 대부분의 머신러닝 지도 학습 알고리즘은 학습 데이터 모두를 사용하여 모델을 학습한다. 그런데 SVM에서는 결정 경계를 정의하는 게 결국 서포트 벡터이기 때문에 데이터 포인트 중에서 서포트 벡터만 잘 골라내면 나머지 쓸 데 없는 수많은 데이터 포인트들을 무시할 수 있다. 그래서 매우 빠르다.

 

그리고 n개의 속성을 가진 데이터에는 최소 n+1개의 서포트 벡터가 존재한다

 

 

<scikit-learn 으로 결정경계 구하기>

SVM에서 결정 경계를 구하는 것은 상당히 복잡한 최적화 문제이다. 따라서 계산 과정을 온전히 다 이해하는 것은 무리이다. 따라서 파이썬 scikit-learn 라이브러리를 통해 SVM을 구현해본다.

 

🔽 


from sklearn.svm import SVC

classifier = SVC(kernel = 'linear')
training_points = [[1,2], [1,5], [2,2], [7,5], [9,4], [8,2]]
labels = [1,1,1,0,0,0]
classifier.fit(training_points, labels)

#새로운 데이터 예측하기
print(classifier.predict([[3,2]]))

#서포트 벡터 출력하기
print(classifier.support_vectors_)

 

 

<이상치(Outlier)를 얼마나 허용할 것인가>

 

출처: https://hleecaster.com/ml-svm-concept/

 

위 그림 : 하드 마진(hard margin) - High C - 오류 허용x

- 아웃라이어를 허용하지 않고 기준을 까다롭게 세운 모양

- 서포트 벡터와 결정 경계 사이의 거리가 매우 좁다. 즉, 마진이 매우 작아진다.

이렇게 개별적인 학습 데이터들을 다 놓치지 않기 위해 아웃라이어를 허용하지 않는 기준으로 결정 경계를 정해버리면 오버피팅(overfitting) 문제가 발생할 수 있다.

 

 

아래 그림 : 소프트 마진(soft margin) - Low C - 오류 허용

- 아웃라이어를 어느 정도 허용하여 기준을 느슨하게 잡은 모양

- 서포트 벡터와 결정 경계 사이의 거리가 멀어진다. 즉, 마진이 커진다. 

- 언더피팅(underfitting) 문제가 발생할 수 있다.

 

 

 

<파라미터 C>

- scikit-learn에서는 SVM 모델이 오류를 어느정도 허용할 것인지 파라미터 C를 통해 지정할 수 있다. 

 


classifier = SVC(C = 0.01)

 

- C의 기본값은 1이다.

- C값이 클수록 hard margin, 작을수록 soft margin

 

C의 최적값은 데이터에 따라 다르므로 검증을 통해 구해야한다.

 

 

 

 

<커널(Kernel)>

출처: https://hleecaster.com/ml-svm-concept/

 

지금까지는 선형으로 결정 경계가 가능한 데이터 셋이었다. 그런데 위 그림처럼 선형으로 분리할 수 없는 데이터 셋으로 SVM 모델을 만들고 싶으면 어떻게 해야할까?

 

 

 

🔽 이는 scikit-learn에서 SVM 모델을 만들 때 kernel을 지정함으로써 해결할 수 있다.

보통은 선형('linear')로 지정하지만 이것에 'poly' 같은 것을 넣음으로써 해결한다.

 


from sklearn.svm import SVC

#classifier = SVC(kernel = 'linear')
classifier = SVC(kernel = 'poly')

 

 

<Kernel Tricks>

 

다른 커널들에 대해서 알아보자.

 

1. Polynomial Kernel

출처: https://hleecaster.com/ml-svm-concept/

 

위 그림의 경우에는 선형으로는 해결할 수 없고, 다항식 커널(polynomial kernel)을 사용해서 2차원에서 x, y 좌표로 이루어진 점들을 아래와 같은 식에 따라 3차원으로 표현하게 된다.

 

예를 들어, [1, 2] 점이 있다고 하면 아래와 같이 3차원으로 계산할 수 있다.

 

위 그림의 데이터 포인트들을 다항식 커널로 계산해서 3차원으로 그려보면 아래와 같은 모양이 나타난다.

출처: https://hleecaster.com/ml-svm-concept/

 

이제는 결정 경계를 그어볼 수 있는 꼴로 바뀌었다.

 

이처럼 다항식(polynomial) 커널을 사용하면 데이터를 더 높은 차원으로 변형하여 나타냄으로써 초평면(hyperplane)의 결정 경계를 얻을 수 있다.

 

 

 

2. RBF(Radial Bias Function) Kernel / Gaussian Kernel

 

출처: https://hleecaster.com/ml-svm-concept/

 

RBF 커널은 2차원의 점을 무한한 차원의 점으로 변환한다.

(따라서 시각화 하는 것도, RBF 커널의 작업 수행 방법에 대해서 이해하는 것도 어렵다. 따라서 복잡한 선형대수학이 사용된다는 것만 알고 넘어간다.)

 

 

🔽 scikit-learn에서 rbf 사용


from sklearn.svm import SVC

classifier = SVC(kernel='rbf')

 

 

RBF 커널의 하이퍼파라미터 감마(gamma)에 대해서만 이해하고 넘어가자.

 

Gamma 가 적절한 값이면 다음과 같은 모양이다.

출처: https://hleecaster.com/ml-svm-concept/

 

Gamma 는 결정 경계를 얼마나 유연하게 그을 것인가에 대한 하이퍼파라미터이다. 학습 데이터에 얼마나 민감하게 반응할 것인지 모델을 조정하는 것이므로 C와 비슷한 개념이라고 봐도 된다.

 

 

Gamma 값을 높이면 학습 데이터에 많이 의존하고 결정 경계를 구불구불하게 긋는다.

그러나, 너무 크면 다음과 같이 overfitting 이 발생할 수 있다.

출처: https://hleecaster.com/ml-svm-concept/

 

Gamma 값을 낮추면 학습 데이터에 많이 의존하지 않고 결정 경계를 직선에 가깝게 긋게 된다. 

그러나 너무 작으면 다음과 같이 underfitting이 발생할 수 있다.

 

출처: https://hleecaster.com/ml-svm-concept/

 

 

 

🔽 scikit-learn에서 rbf 사용- gamma 조절

 

 


classifier = SVC(kernel = "rbf", C = 2, gamma = 0.5)