[핸즈온 머신러닝] ch5. 서포트 벡터 머신

인공지능세포·2025년 9월 3일
0

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

  • 선형, 비선형 분류 / 회귀 / 특이치 탐지등에 활용할 수 있는 다목적 머신러닝 모델
  • 특히, 중소규모의 비선형 데이터셋, 분류 작업에 탁월함

1. 선형 SVM 분류

  • 실선 : SVM 분류기의 결정 경계
  • 라지 마진 분류 : SVM 분류기를 클래스 사이 가장 폭이 넓은 도로를 찾는 것

  • SVM은 특성 스케일에 민감

    • 수직축의 scale이 훨씬 커서 그래프가 수평에 가까움
    • 서포트벡터 : 경계 근처에 위치해 경계에 영향을 많이 주는 (그림에서 회색으로 표시된)
    • StandardScaler 사용하면 결정 경계를 명확하게 표현 가능

1-1) 하드 마진 분류

  • 모든 샘플이 경계 바깥쪽으로 올바르게 분류되어 있는 경우
  • 문제점
    • 데이터가 선형적으로 구분될 수 있어야만 함
    • 이상치에 민감함
    • 일반화되기 어려움

1-2) 소프트 마진 분류

  • 경계의 폭을 가능한 한 넓게 유지하는 것과 마진 오류 사이에 적절한 균형을 잡은 것

  • 규제 하이퍼마라미터

    • C : C를 감소시키면 경계가 커져서 더 많은 마진오류 발생

  • from sklearn.svm import LinearSVC 을 사용해 선형 분류가 가능함

2. 비선형 SVM 분류

  • 일반적으로 선형적으로 분류할 수 없는 데이터셋이 더 많음

2-1) 다항 특성 추가하기

  • 비선형 데이터셋을 다루기 위해서는 다항 특성과 같이 특성을 더 추가하여 선형적으로 구분될 수 있게끔 만듦

from sklearn.datasets import make_moons
from sklearn.preprocessing import PolynomialFeatures

X, y= make_moons(n_samples=100, noise=0.15, random_state=42)

polynomial_svm_clf = make_pipeline(
	PolynomialFeatures(degree=3),
    StandardScaler(),
    LinearSVC(C=10, max_iter=10_000, random_state=42)
)
polynomial_svm_clf.fit(X, y)

2-2) 다항식 커널

  • 다항 특성을 추가하는 것은 비교적 간단하지만, 모델을 느리게 만든다는 단점이 있음

  • 커널 트릭 : 실제 특성을 추가하지 않으면서, 높은 차수의 다항 특성을 많이 추가한 것과 같은 효과를 주는 수학적 기교

from sklearn.svm import SVC

poly_kernel_svm_clf = make_pipeline(StandardScaler(), SVC(kernel="poly", degree=3, coef0=1, C=5))

poly_kernel_svm_clf.fit(X, y)
  • 모델이 과대적합이라면 다항식의 차수를 줄여야하고, 과소적합이라면 차수를 늘려 조절한다.
  • coef0 : 모델이 높은 차수와 낮은 차수에 얼마나 영향을 받을지 조절

2-3) 유사도 특성

  • 랜드마크와의 유사도를 측정하는 유사도함수를 활용해 특성을 추가하는 방식

    • RBF 유사도 함수로 새로운 특성을 만들어 데이터셋을 변환시키면 선형적으로 구분할 수 있음
    • 훈련 세트가 매우 클 경우 동일한 크기의 아주 많은 특성이 만들어짐

2-4) 가우스 RBF 커널

  • 유사도 특성 방식도 ML 알고리즘에 유용하게 사용됨
  • 추가 특성을 모두 계산하려면 연산 비용이 많이 드는데 커널트릭을 사용해 유사도 특성을 많이 추가하는 것과 비슷한 결과를 얻을 수 있음
rbf_kernel_svm_clf=make_pipeline(StandardScaler(),
								SVC(kernel="rbf, gamma=5,C=0.001))
rbf_kernel_svm_clf.fit(X, y)
  • gamma : 증가시키면 결정경계가 불규칙해지고, 샘플을 따라 구불구불 휨

    • 과대적합일 때는 감소시켜야하고, 과소적합일 때는 증가시키기
  • 거의 rbf kernel만 사용 , 텍스트 문서나 DNA 서열 분류 시에 문자열 커널을 이용하기도 함

2-5) 계산 복잡도

  • LinearSVC 클래스는 liblinear라이브러리 ( 커널 트릭 지원x ) 를 기반으로 함
  • SVC 는 커널 트릭 알고리즘을 구현한 libsvm 라이브러리를 기반으로 함
  • SGDClassifier는 기본적으로 규제 하이퍼파라미터와 learning_rate를 조정하여 결과 생성


3. SVM 회귀

  • 목표 : 제한된 마진 오류 안에서 경계 안에 최대한 많은 샘플이 들어가도록 학습
  • 경계의 폭은 ε으로 조절

  • ε을 줄이면 서포트 벡터의 수가 늘어나서 모델이 규제됨
  • 마진 안에서는 샘플이 추가되어도 모델에 영향을 주지 않기 때문에 모델은 ε에 민감하지 않다고 함
from sklearn.svm import LinearSVR
x, y = [ ... ] # 선형 데이터셋
svm_reg = make_pipeline(StandardScale(),
					LinearSVR(epsilon=0.5, random_state=42))
svm_reg.fit(X, y)
  • LinearSVRLinearSVC의 회귀 version

4. SVM 이론

  • SVM 훈련 목표

1) 제한된 마진 오류에서 마진을 가능한 한 넓게 만드는 가중치 벡터(W)와 편향(b)을 찾는 것
2) 마진 오류를 일으키지 않는 것

  • 제약조건 : 결정 함수가 모든 양성 훔련 샘플에서는 1보다 커야하고, 음성 훈련 샘플에서는 -1보다 작아야함

    • 음성 샘플 (y(i)=0y^{(i)}=0)일 때 t(i)=1t^{(i)}=-1
    • 양성 샘플 (y(i)=1y^{(i)}=1)일 때 t(i)=1t^{(i)}=1
    • 제약 조건을 모든 샘플에서 t(i)(wTx(i)+b)1t^{(i)}(\mathbf{w}^T\mathbf{x}^{(i)}+b) \ge 1로 표현할 수 있음


5. 쌍대 문제 dual problem

  • primal problem : 등식과 부등식 제약조건이 있는 본래의 최적화 문제

  • SVM은 primal problem, dual problem 중 하나를 선택하여 풀 수 있고, 둘 다 같은 해를 제공함

    • 훈련 sample수가 feature수보다 작다면, dual problem을 푸는 것이 더 빠름
    • primal problem에는 커널 트릭이 적용 안되지만, dual problem에서는 적용이 됨

0개의 댓글