민프
[AI | ML] [분류기] SVM (Support Vector Machine)에 대해서 알아보자 본문
저번 포스팅에서는 KNN에 대해서 알아보았는데요
https://minf.tistory.com/search/KNN#google_vignette
이번 포스팅에서는 SVM에 대해서 알아보겠습니다
SVM (Support Vector Machine)
SVM(Support Vector Machine)은 패턴 인식, 분류, 그리고 회귀 분석 등의 머신러닝 알고리즘이다. 이는 고차원 또는 무한 차원에서 최적의 분리 초평면을 찾아내는 방식을 사용하며, 데이터를 분류하거나 예측하는데 사용된다.
- wikidocs
SVM(Support Vector Machine)은 기계 학습의 분야 중 하나의 패턴 인식, 자료 분석을 위한 지도 학습 모델이며, 주로 분류와 회귀 분석을 위해 사용한다. SVM에서 데이터 점이 p-차원의 벡터로 주어졌을 때, 이러한 데이터 점을 (p-1)차원의 초평면으로 분류하는 것을 의미한다.
- wikipedia
wikidocs와 wikipedia에서 나온 정의는 위 와 같습니다.
결론부터 쉽게 말씀드려보자면
SVM은 wikidocs에 나와있는대로 훈련데이터를 이용하여서 마진(Margin)을 최대화하는 초평면(hyperplane)을 찾아내는 분류기 입니다.
다른 예로 "국경"을 예시로 들자면
지도에서 2차원적으로 보면 북한과 남한의 3.8선이 초평면이고, 3.8선에서 근접한 지역을 Supprot Vector이고, 근접한 지역과 초평면의 거리를 마진(margin) 이라고 합니다.
아직 이렇게 설명해드려도 이해가 잘 안되실겁니다.
코드 및 이미지와 함께 설명해보도록 하곘습니다
1. Support Vector, hyperplane, Margin?
위 정의에서 눈에 띄는 건 초평면(hyperplane)을 찾아내는 방식을 찾아낸다는 건데
초평면(HyperPlane)은 어떻게 찾아내는건지 알아보도록 하겠습니다.
support Vector는 학습 데이터 집합이 선형적으로 분리될 수 있을 떄, 데이터 집합을 분리하는 걸 초평면(hyperplane)이라 하고, 그 초평면과 가장 가까운 벡터를 Support Vector라고 합니다.
아래 사진은 jupyter notebook으로 학습 데이터를 넣고 그 데이터를 SVM으로 분류를 하고, plt으로 만든 사진인데요
보시면 분홍색 선이 바로 초평면(hyperplane)이고, 초평면에서 가장 가까운 데이터를 바로 Support Vector라고 합니다.
아래 위키피디아에서 서포트 벡터의 정의를 말해주는 부분이 있는데
아래 사진에서 보면 X+, X-가 잘 생성된 것을 확인하실 수 있습니다.
여기에서 초평면과 Supprort Vector 사이의 거리를 마진(Margin)이라고 합니다.
이제 Wikidocs에서 설명하고 있는"SVM(Support Vector Machine)은 최적의 초평면(hyperplane)을 찾는데 사용되고, 데이터를 분류하거나 예측하는데 사용된다"라는 부분이 이해가 가시나요?
즉, 초평면(hyperplane)을 기준으로 영역이 잡히게 되는게 해당 영역으로 Classification이 된다는 것 입니다.
그럼 저렇게 Support Vector들이 확실하게 구분이 가는 경우에는 명확하게 초평면이 만들어지겠지만
아래와 같이 빨간색 원과 파란색 원의 영역 구분이 애매할 때 "소프트 마진(Soft Margin)"을 사용하게 됩니다.
소프트 마진은 무엇일까요?
2. 최적화 문제 - Margin 분류 (Hard Margin, Soft Margin)
마진 분류에는 Hard Margin, Soft Margin이 있습니다.
2-1. Hard Margin
Hard Margin은 아래 왼쪽 사진과 같이 모든 데이터 포인트가 초평면(hyperplane)과 마진 밖에 완벽하게 분류된 상황을 나타냅니다.
이러한 하드 마진 분류는 훈련 세트가 선형적으로 구분되는 경우에만 가능하며 이상치에 매우 민감한 특성을 가지고 있습니다.
따라서 오른쪽 사진과 같이 비선형 데이터 빨간색과 파란색 데이터가 섞여 있으면 하드 마진을 찾을 수 없게 되거나, 데이터 이상치로 인한 일반화가 되지 않을 수 있습니다.
이러한 문제를 해결하기 위해 Soft Margin을 사용하게 됩니다.
2-2. Soft Margin
Soft Margin은 1995년 Corinna Cortes와 Vladimir N. Vapnik가 잘못 분류된 자료들을 허용하는 변형된 최대 마진 분류기 아이디어를 아래와 같이 제안했었습니다.
만약 “네” 또는 “아니오”라는 결과를 내야하는 자료들을 분할하는 초평면이 존재하지 않는다고 하면,
소프트 마진 방법은 여전히 가장 가까이 위치해 있는 제대로 분리되는 자료들의 거리를 최대화하면서, 주어진 자료들을 가능한 한 제대로 분리하는 초평면을 찾을 것 이다.
즉, Margin 값을 크게 하는 것 입니다.
아래 공식을 이용하여 서포트 벡터가 정의되게 되는데
여기에 초평면 사이에 데이터가 없다는 제약조건을 추가했을 때 미분이 불가능한 형태로 계산이 안되게 되는데
여기에서 아래 공식과 같이 느슨한 변수(Slack Variable)이 ξi 이용되게 됩니다.
이것을 사용한 목적 함수는 마진을 크게 하는 것과 에러에 대한 패널티를 작게 하는 것의 균형을 마추게 되고, 어느 정도의 오분류를 허용하는 방법이 됩니다.
위 설명을 들으시고 "수학적 공식은 잘 모르겠다" 라고 생각이 드시면
쉽게 그냥 마진을 최대한 허용할 수 있는 값을 늘리는겁니다.
코드를 보시면 더 이해하시기 편하실 겁니다.
sklearn에서 마진을 허용하는 하이퍼파라미터 C값을 조정해주면 됍니다.
from sklearn.svm import SVC
# SVM 모델 학습 C=1
svm = SVC(kernel='linear', C=1)
# SVM 모델 학습 C=100
svm = SVC(kernel='linear', C=100)
아래 첨부된 사진은 제가 난해한 데이터 셋을 만들어서 아래 코드와 같이 SVM SoftMargin의 C값에 따라서 어떻게 인식이 달라지는지 코드로 만들어보았습니다.
def plot_svm_margin(C_value, ax):
# SVM 모델 학습
svm = SVC(kernel='linear', C=C_value)
svm.fit(X_scaled, y)
.
.
.
plot_svm_margin(C_value=1, ax=axes[0]) # C=1
plot_svm_margin(C_value=100, ax=axes[1]) # C=100
.
.
.
보시는 것 과 같이 C값이 크면 마진이 좁아지면서 더 많은 데이터 포인트가 정확히 분류되도록 만들 수 있습니다.
좀 더 자세히 말씀드려보면 아래 사진을 보면 ξi(Slack Variable)은 초평면 를 기준으로 각 Support Vector와의 에러 수치(training error)인데 이걸 허용을 해줘야 이상이 있는 데이터에 대한 분류를 할 수 있다는 것 입니다.
여기에서 traing error을 마냥 크게 허용을 할 수 가 없는데 적절하게 허용하면서 Margin을 설정해줘야합니다.
아래 공식을 보면 C값이 보이시나요? 여기가 해당 부분을 조절합니다.
즉, C는 Margin과 training error에 대한 trade-off를 결정하는 tuning parameter입니다.
여기에서
- C를 높히면 : training error를 많이 허용하지 않는 것(과적합 : overfitting)
- C를 내리면 : training error를 많이 허용 (underfit)
그래서 아래 사진처럼 C값이 높으면 마진 값이 작아지고,
C값이 작으면 마진값이 커지는 것 이었습니다.
확실히 KNN과 비교해서 단순하지 않고, 복잡한 것을 알 수 있었고,
Noise Data에 민감하다는 것도 알 수 있었습니다.
이번 포스팅은 여기서 마치겠습니다.
참고 링크
https://ko.wikipedia.org/wiki/%EC%84%9C%ED%8F%AC%ED%8A%B8_%EB%B2%A1%ED%84%B0_%EB%A8%B8%EC%8B%A0
https://www.youtube.com/watch?v=ltjhyLkHMls