Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

StudyStudyStudyEveryday

[파이썬머신러닝] 선형 서포트 벡터 머신 (SVM) 분류 본문

DataScience/핸즈온 머신러닝 Hands-on ML

[파이썬머신러닝] 선형 서포트 벡터 머신 (SVM) 분류

따듯한붕어빵 2022. 4. 1. 02:33

 

 

 

 

서포트 벡터 머신 (Support Vector Machine, SVM)

서포트 벡터 머신 : 매우 강력하고 선형/비선형/분류/회귀/이상치 탐색 등에 사용할 수 있는 다목적 머신러닝 모델이다.

 

머신러닝에서 가장 인기있는 모델에 속하며, SVM은 특히 복잡한 분류 문제에 잘 맞으며 작거나 중간 크기의 데이터셋에 적합하다.

 

 

선형 SVM 분류

라지 마진 분류

위 그림을 보면 두 클래스가 직선으로 나뉜 것을 볼 수 있다. (선형적으로 구분)

  • 왼쪽 그래프 : 점선으로 나타난 결정 경계를 만든 모델은 클래스를 적절히 분류하지 못하고 있다. 다른 두 모델은 잘 작동하지만, 결정 경계가 샘플에 너무 가까워 새로운 샘플에 대해서는 잘 작동하지 못할 것이다.
  • 오른쪽 그래프 : 실선은 SVM 분류기의 결정 경계로 두 클래스를 잘 나눌 뿐 아니라 제일 가까운 훈련 샘플로부터 가능한 멀리 떨어져 있다. 

=> 즉, SVM 분류기를 클래스 사이 가장 폭이 넓은 도로를 찾는 것으로 생각할 수 있다. 그래서 라지 마진 분류(large margin classification)이라고 한다.

=> 도로 바깥쪽에 훈련 샘플을 더 추가해도 결정 경계에 영향을 끼치지 않으며, 도로 경계에 위치한 샘플에 전적으로 결정된다. 이런 샘플을 서포트 벡터(support vector)라고 한다.

 

특성의 스케일에 따른 민감성

 

SVM은 특성의 스케일에 민감하다. StandardScaler 등을 이용해 특성의 스케일을 조정하면 오른쪽 그래프와 같이 결정 경계가 훨씬 좋아진다.

 

 

소프트 마진 분류

하드 마진 분류 (hard margin classification) : 모든 샘플이 도로 바깥쪽에 올바르게 분류되어 있음

  • 하지만, 데이터가 선형적으로 구분될 수 있어야 제대로 작동함
  • 이상치에 민감함

이상치에 민감한 하드 마진

왼쪽 그래프는 하드 마진을 찾을 수 없으며, 오른쪽 그래프의 결정 경계는 이상치가 없던 결정 경계와 매우 다르고 일반화가 힘들다.

 

따라서, 이러한 하드 마진 분류의 문제를 피하려면 좀 더 유연한 모델이 필요하다.

 

 

소프트 마진 분류 (soft margin classification)

  • 도로 폭을 가능한 넓게 유지
  • 샘플이 도로 중간이나 반대쪽에 있는 등의 마진 오류(margin violation) 사이에 적절한 균형 유지
  • 어느 정도 오류를 허용하는 형태임

넓은 마진(왼쪽) 적은 마진 오류(오른쪽)

 사이킷런의 SVM 모델에 필요한 하이퍼파라미터 C를 낮게 설정하면 왼쪽 그림과 같은 모델을 만들고, 높게 설정하면 오른쪽 그림과 같은 모델을 만든다. 마진 오류는 일반적으로 적은 것이 좋지만 이 경우 왼쪽 모델에 마진 오류가 많지만 일반화가 더 잘 되었다.

 

* SVM 모델이 과대적합이면 C를 감소시켜 모델을 규제할 수 있다.

 

 

사이킷런으로 SVM 모델 훈련

import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

# 데이터 로드
iris = datasets.load_iris()
X = iris["data"][:, (2, 3)]  # 꽃잎 길이, 꽃잎 너비
y = (iris["target"] == 2).astype(np.float64)  # Iris virginica

# 특성 스케일 변경 및 데이터 훈련
svm_clf = Pipeline([
        ("scaler", StandardScaler()),
        ("linear_svc", LinearSVC(C=1, loss="hinge", random_state=42)),
    ])

svm_clf.fit(X, y)

svm_clf.predict([[5.5, 1.7]])

SVM 분류기는 로지스틱 회귀 분류기와 다르게 클래스에 대한 확률을 제공하지 않는다.

 

LinearSVC 클래스 대신 선형 커널을 사용하는 SVC로 대체할 수 있다. 

SVC(kernel="linear", C=1)

 

 


* 해당 포스팅은 머신러닝 학습 중 핸즈온 머신러닝 2판을 참고하여 작성하였습니다. *

 

 

 

 

 

Comments