서포트 벡터 머신이란?
서포트 벡터 머신(SVM)은 매우 강력하고
선형이나 비선형 분류, 회귀, 이상치 탐색에도 사용할 수 있는 다목적 머신러닝 모델입니다.
서포트 벡터 머신 모델은 가장 인기 있는 모델에 속합니다.
이 모델은 특히 복잡한 분류 모델에 잘 들어맞으면 중간 크기의 데이터셋에 적합합니다.
선형 SVM 분류
SVM의 기본 아이디어는 그림으로 설명하는 것이 가장 좋습니다.
그림을 보며 설명하겠습니다.
위 그림에서 H3는 클래스를 올바르게 분류하고 있지 않습니다.
H1과 H2는 클래스를 올바르게 분류하는데,
H1은 결정 경계가 샘플에 너무 가까워 새로운 샘플에 대해서는 잘 작동하기 힘듭니다.
H2는 결정 경계가 샘플과 멀리 떨어져있어 새로운 샘플에 대해 상대적으로 더 잘 작동할 것입니다.
여기 있는 실선은 SVM 분류기의 결정 경계입니다.
이 직선은 두 클래스를 나누고 있을 뿐만 아니라
제일 가까운 훈련 샘플로부터 가능한 한 멀리 떨어져 있습니다.
이런식으로 SVM 분류기는 샘플을 잘 나누면서 샘플과 멀리 떨어져있는 결정 경계를 찾습니다.
따라서 SVM 분류기를 클래스 사이에 있는 가장 폭이 넓은 도로를 찾는 것으로도 생각할 수 있습니다.
이런 특징 때문에 라지 마진 분류 라고도 합니다.
결정 경계를 찾을 때 도로 바깥쪽에 훈련 샘플을 추가해도 결정 경계에는 전혀 영향을 끼치지 않습니다.
도로 경계에 위치한 샘플에 의해 전적으로 결정됩니다.
이런 샘플을 서포트 벡터라고 합니다.
Tip: SVM은 특성의 스케일에 민감해서 특성의 스케일을 조절하면 좋은 결정 경계를 찾을 수 있습니다.
소프트 마진 분류
모든 샘플이 도로 바깥쪽에 올바르게 분류되어 있다면 하드 마진 분류라고 합니다.
하드 마진 분류는 데이터가 선형적으로 구분될 수 있어야 제대로 작동하며, 이상치에 민감합니다.
예를 들어, 클래스 A와 B를 나누려고 하는데 B 샘플들의 한가운데에 이상치인 A 샘플이 있다면
하드 마진 분류에서는 결정 경계를 그릴 수 없습니다.
이런 문제를 피하려면 좀 더 유연한 모델이 필요합니다.
도로의 폭을 가능한 넓게 유지하는 것과
마진 오류(샘플이 도로 중간이나 있어야 할 곳의 반대쪽에 있는 경우) 사이에 적절한 균형을 잡아야 합니다.
이를 소프트 마진 분류라고 합니다.
사이킷런의 SVM 모델을 만들 때 여러 하이퍼파라미터를 지정할 수 있는데,
C는 이런 하이퍼파라미터 중 하나입니다.
C를 낮게 설정하면 모델을 규제해서 일반화가 더 잘 될 수 있는 모델을 얻습니다.
SVM 모델이 과대적합이라면 C를 감소시켜 모델을 규제할 수 있습니다.
다음 코드는 붓꽃 데이터셋을 가져오고, 특성 스케일을 변경하고, Iris-Virginia 품종을 감지하기 위해
선형 SVM 모델을 훈련시킵니다.
이 때 LinearSVC 클래스를 선형 커널을 사용하는 SVC 클래스로 대체할 수 있습니다.
모델을 만들 때 kernel='linear'을 전달해주면 됩니다.
또 다른 방법은 SGDClassifier(loss='hinge', alpha=1/(m*C))처럼 SGDClassifier 모델을 사용하는 것입니다.
이건 LinearSVC처럼 빠르게 수렴하진 않지만
데이터셋이 아주 커서 메모리에 적재할 수 없거나(외부 메모리 훈련),
온라인 학습으로 분류 문제를 다룰 때는 유용합니다.
비선형 SVM 분류
선형 SVM 분류기가 효율적이고 많은 경우에 잘 작동하지만,
선형적으로 분류할 수 없는 데이터셋이 많습니다.
비선형 데이터셋을 다루는 여러 방법을 알아보겠습니다.
다항 특성 추가
비선형 데이터셋을 다루는 한 가지 방법은 다항 특성과 같은 특성을 더 추가하는 것입니다.
이렇게하면 선형적으로 구분되는 데이터셋이 만들어질 수 있습니다.
아래 코드는 사이킷런을 이용해서 이를 구현한 것입니다.
다항식 커널
다항식 특성을 추가하는 것은 간단하고 모든 머신러닝 알고리즘에서 잘 작동합니다.
하지만 낮은 차수의 다항식은 매우 복잡한 데이터셋을 잘 표현하지 못하고
높은 차수의 다항식은 너무 많은 특성을 추가해 모델을 느리게 만듭니다.
다행히 SVM을 사용할 때에는 커널 트릭이라는 아주 유용한 수학적 기교를 적용할 수 있습니다.
커널 트릭은 실제론 특성을 추가하지 않으면서 다항식 특성을 많이 추가한 것과 같은 결과를 얻을 수 있습니다.
아래의 코드를 참고하세요.
유사도 특성 추가
비선형 특성을 다루는 또 다른 기법은 각 샘플이 특정 랜드마크와 얼마나 닮았는지를 정하는
유사도 함수로 계산한 특성을 추가하는 것입니다.
유사도 함수의 예시로는 가우시안 방사 기저 함수(RBF)가 있습니다.
수식으로 나타내면 아래와 같습니다.
\[ \displaystyle \phi_{\gamma}(x, l) = exp(-\gamma \Vert x - l \Vert ^{2}) \]
\(\gamma\)를 증가시키면 각 샘플의 영향 범위가 작아집니다.
결정 경계가 조금 더 불규칙해지고 각 샘플을 따라 구불구불하게 휩니다.
\(\gamma\)를 감소시키면 샘플이 넓은 범위에 영향을 주므로 결정 경계가 더 부드러워집니다.
결국 \(\gamma\)가 규제의 역할을 합니다.
모델이 과대적합일 경우엔 감소시켜야 하고, 과소적합일 경우엔 증가시켜야 합니다.
랜드마크를 선택하는 간단한 방법 중 하나는
데이터셋에 있는 모든 샘플 위치에 랜드마크를 설정하는 것입니다.
이렇게 하면 차원이 매우 커지고 따라서 변환된 훈련 세트가 선형적으로 구분될 가능성이 높습니다.
단점은 훈련 세트에 있는 n개의 특성을 가진 m개의 샘플이
m개의 특성을 가진 m개의 샘플로 변환된다는 것입니다. (원본 특성 제외한다고 가정)
훈련 세트가 매우 클 경우 동일한 크기의 아주 많은 특성이 만들어집니다.
가우시안 RBF 커널
다항 특성 방식과 마찬가지로 유사도 특성 방식도 머신러닝 알고리즘에 유용하게 사용될 수 있습니다.
추가 특성을 모두 계산하려면 연산 비용이 많이 듭니다.
여기서 커널 트릭이 다항식 커널에서처럼
유사도 특성을 실제로 추가하지 않고 유사도 특성을 많이 추가하는 것과 비슷한 효과를 얻게 해줍니다.
아래는 가우시안 RBF 커널을 사용한 SVC 모델을 쓴 코드입니다.
SVM 회귀
SVM 알고리즘은 선형, 비선형 분류뿐만 아니라 선형, 비선형 회귀에도 사용할 수 있습니다.
SVM을 분류가 아니라 회귀에 적용하는 방법은 목표를 반대로 하는 것입니다.
일정한 마진 오류 안에서 두 클래스 간의 도로 폭이 가능한 한 최대가 되도록 하는 대신,
SVM 회귀는 제한된 마진 오류 안에서 도로 안에 가능한 한 많은 샘플이 들어가도록 학습합니다.
도로의 폭은 \(\varepsilon\)으로 조절합니다. (여기서 \(\varepsilon\)은 허용오차가 아닙니다.)
\(\varepsilon\)가 커지면 도로의 폭이 넓어지고,
\(\varepsilon\)가 작아지면 도로의 폭이 좁아집니다.
마진 안에서는 훈련 샘플이 추가되어도 모델의 예측에는 영향이 없습니다.
그래서 이 모델을 \(\varepsilon\)에 민감하지 않다고 말합니다.
아래는 사이킷런의 LinearSVR을 사용해 선형 SVM 회귀를 사용하는 코드입니다.
비선형 회귀 작업을 처리하려면 커널 SVM 모델을 사용합니다.
아래는 커널 트릭을 제공하는 사이킷런의 SVR을 이용하는 코드입니다.
'DATA > 머신 러닝' 카테고리의 다른 글
[머신 러닝] 비지도 학습 (0) | 2022.01.19 |
---|---|
[머신 러닝] 차원 축소 (0) | 2022.01.18 |
[머신 러닝] 경사 하강법 (Gradient descent) (0) | 2022.01.16 |
[머신 러닝] 분류 (Classification) (0) | 2022.01.15 |
[머신 러닝] 간단한 머신 러닝 프로젝트 해보기 (0) | 2022.01.11 |