Discover us

About us

Projects

Blog

Events

Members

Development Blog

GDGoC CAU 개발자와 디자이너의 작업 과정과
결과물을 공유하는 공간입니다.

어떻게 프로젝트를 시작하게 되었고,
진행하면서 느낀 개발자와 디자이너의
생생한 스토리를 직접 확인해보세요!

Development

서포트 벡터(SVM)으로 최적의 결정 경계를 찾아보기

  • #DS/ML/DL
  • YuJin Son
  • 2023. 9. 18.

서포트 벡터(SVM)으로 최적의 결정 경계를 찾아보기

CH5. Support Vector Machines

===================================================
이번 챕터에서는 …. SVM의 개념 / 어떻게 사용하는지 / 어떻게 작동하는지에 대해
===================================================

참조 사이트

00.SVM ( Suppor Vector Machine)

  • 매우 강력하고 변하기 쉬운 ML모델임
  • *******************************************************************************************************************************************************선형(linear)이나 비선형(nonlinear) 분류(classification)/회귀(regression)/이상치 탐색(outlier detection)이 가능하다.********************************************************************************************************************************************************
  • *********************************************************그 중에서도 특히 분류 ; 작지만 복잡한/중간사이즈의 데이터 셋에 적합함**********************************************************
⇒ 데이터를 선형으로 분리하는 최적의 선형 결정 경계를 찾는 알고리즘

CHAPTER 5) Support Vector Machine

01. 선형 SVM 분류

notion image
01
두 class가 직선으로 명확히 나뉘어져 있다. = linearly separable

왼쪽 그림

: 3개의 가능한 선형 분류기(linear clasifier)의 결정경계(decision boundary)가 표시되어있다.
점선모델 = bad (두 데이터 군을 잘 분리하고 있지 않음) / 나머지 두 실선모델 = 잘 분리하고는 있지만 결정경계가 너무 가까워서 다른 샘플에 적용하기가 쉽지 않음

오른쪽 그림 :SVM 분류기의 결정경계

: 여기서 실선은 두 데이터 군을 분리 + 가까운 두 샘플을 가능한 멀리 떨어져있게 함.

<라지 마진 분류기(Large Margin Classification)>

notion image
real 02
  • margin ; 두 데이터 군과 결정 경계가 떨어져 있는 정도를 의미
  • *SVM분류기 == (평행한 점선으로 나뉜)클래스들의 사이 폭이 가장 넓은 도로를 찾는 것과 비슷**
: 도로(점선) 바깥쪽에 훈련 샘플을 더 추가해도 결정 경계에는 아무런 영향을 미치지 X데이터가 추가되더라도 안정적으로 분류해낼 수 있음
  • 결정 경계는 도로(점선) 경계에 위치한 샘플에 의해 결정됨/(의지됨)(=supported)
⇒ 경계에 위치한 샘플 : SUPPORT VECTOR 서포트 벡터들의 위치에 따라 결정 경계의 위치도 달라짐.
notion image
02
→ SVM은 특성 스케일에 민감
→ 왼쪽 그래프 : X1 스케일 >X0 스케일 ⇒ 가장 넓은 도로가 거의 수평에 가까움
→ 오른쪽 그래프 : 특성의 스케일을 조정하면 결정 경계가 훨씬 좋아짐.

02. 소프트 마진 분류(Soft Margin Classification)

notion image
03

왼쪽 그림

  • * 하드 마진 분류(Hard Margin Classification)**
: 모든 샘플이 도로 바깥쪽에 올바르게 분류가 되어 있으면
-단점👎 데이터가 선형적으로 구분될 때만 가능👎 이상치(outliers)에 민감
⇒ more 유연한 모델!!

*<소프트 마진 분류기(Soft Margin Classifier)>**

  • 도로의 폭을 가능한 한 넓게 유지하면서
  • *마진 오류(margin violation; 샘플이 도로 중간에 있거나 반대 방향에 있는 것)을 줄이는 것**
사이에 적절한 균형을 잘 찾아야함
In Scikit-Learn’s SVM classes,
  • C 하이퍼파라미터를 사용해 이 균형을 통제할 수 있음
notion image
04
< 마진 오류 大 VS 마진오류 少 >

왼쪽 그림 : C 값 → LOW

: C값을 작게 → 도로폭은 넓어짐 BUT, 마진 오류는 많아짐
⇒ 마진오류가 많긴 하지만 이 경우에서는 일반화가 더 잘 된 것

오른쪽 그림 : C값 → HIGH

: C값을 크게 → 마진 오류는 적어지지만, 마진이 작아짐
-cf)만약 SVM모델이 overfitting 됐으면, C값을 줄여서 조절할 수 있다.
->Scikit-Learn code : loads the iris dataset / scales the features / trains a linear SVM modelimport numpy as npfrom sklearn import datasetsfrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.svm import LinearSVCiris = datasets.load_iris()X = iris["data"][:, (2, 3)] # petal length, petal widthy = (iris["target"] == 2).astype(np.float64) # Iris-Virginicasvm_clf = Pipeline([ ("scaler", StandardScaler()), ("linear_svc", LinearSVC(C=1, loss="hinge")), ])svm_clf.fit(X, y)>>> svm_clf.predict([[5.5, 1.7]])array([1.])
Using LinearSVC class (with C=1) & hinge loss function

03. 비선형 SVM 분류(Nonlinear SVM Classification)

  • 비선형적인 데이터셋을 다루는 방법 : 다항특성(4장)과 같은 특성을 더 추가하는 것
선형적으로 구분되는 데이터셋으로 만들어짐
notion image
05

왼쪽 그림 : 특성 하나 (X1)만을 가진 데이터셋

: 선형적으로 구분되지 않음.

오른쪽 그림 : 왼쪽그림 + 두번째 특성(X2=(X1^2)) ⇒ 2차원 데이터셋

⇒ 왼쪽그림에서 두번째 특성을 추가함완벽히 선형적으로 구분이 가능해짐.
  • 위 아이디어를 Scikit-Learn으로 구현하기 위해, PolynomialFeatures변환기와 StandardScaler, LinearSVC를 포함한 Pipelin으로 생성할 수 있다.
    • from sklearn.datasets import make_moonsfrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import PolynomialFeaturespolynomial_svm_clf = Pipeline([ ("poly_features", PolynomialFeatures(degree=3)), ("scaler", StandardScaler()), ("svm_clf", LinearSVC(C=10, loss="hinge")) ])polynomial_svm_clf.fit(X, y)
      notion image
      06
<다항 특성을 사용한 선형 svm분류기>

04. 다항식 커널(Polynomial Kernel)

  • 다항식 특성을 추가하는 것은 구현하기 쉽고 SVMs뿐만아니라 모든 머신러닝 알고리즘에서 잘 작동한다.
    • BUT!!👎 낮은 차수의 다항식에서는 매우 복잡한 데이터셋을 잘 표현하지 못하고,👎 높은 차수의 다항식에서는 매우매우 많은 특성을 추가해서 모델을 느리게 만든다.
  • 다행이도, SVMs를 사용할때는 커널 트릭(Kernel Trick)이라는 기교적인 수학적 기술을 적용할 수 있다.

<커널 트릭(Kernel Trick)>

notion image
real 07
  • 심지어는 매우 높은 차수의 다항식에서도, 실제론 다항식 특성을 추가하지 않으면서, 많이 추가한 것과 같은 결과를 내게 할 수 있다.
: 실제로 어떠한 특성도 추가하지 않기 때문에, 수 많은 특성의 조합이 생기지 않는다.주어진 데이터를 고차원 특성 공간으로 사상해주는 것
  • moons 데이터셋에서 테스트 해보기 by SVC class
from sklearn.svm import SVCpoly_kernel_svm_clf = Pipeline([ ("scaler", StandardScaler()), ("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5)) ])poly_kernel_svm_clf.fit(X, y)
notion image
07

왼쪽 그림 :

: 이 코드는 3차원 다항식 커널을 사용해 SVM분류기를 훈련시킨다.

오른쪽 그림 :

: 10차원 다항식 커널을 사용한 SVM분류기
⇒ 모델이 overfitting 되었다면 다항식의 차수를 줄이면 된다.
⇒ 반대로, 모델이 underfitting되었다면, 다항식의 차수를 크게 하면된다.
⇒ 하이퍼파라미터 coef0는 모델이 높은 차수와 낮은 차수에 얼마나 영향을 받을지 조절함.

05. 비슷한 특성 추가하기(Adding Similarity Features)

  • 비선형 특성을 다루는 또 다른 기술 : 각 샘플이 특정 landmark와 얼마나 닮았는지를 측정하는 유사도 함수(similarity function)로 계산한 특성을 추가하는 것
  • 예)

<가우시안(Gaussian) 방저 기저 함수(RBF; Radial Basis Function)>

를 유사도 함수로 정의 with y = 0.3인
notion image
r08

왼쪽 그림 :

: 일차원 데이터셋에 2개의 랜드마크 X1=-2과 X1=1을 추가
notion image
08
  • 종(bell)모양 : 함수의 값이 0부터(랜드마크에서 아주 멀리 떨어진) ~ 1까지(랜드마크 위치) 변화함
  • X1 = -1일때 샘플, 첫번째 랜드마크로부터 거리가 1만큼 떨어져 있고 두 번쨰 랜드마크로부터 2만큼 떨어져있음.
⇒ 새로운 특성은
notion image
09
notion image
10

오른쪽 그림 :

: 변화된 데이터셋을 보여줌 ⇒ 이제 선형적으로 구분이 가능해짐
  • 랜드마크를 선택하는 방법
: 가장 간단한 접근방법 : 데이터셋에 각각의 그리고 모든 샘플의 위치에 랜드마크를 생성하면 된다.
👍 차원이 커지고 변화된 훈련셋이 선형적으로 구분될 기회가 증가한다.👎 m개의 샘플과 n개의특성을 가지고 있는 훈련셋이 m개의 샘플과 m개의 특성을 가지는 훈련셋으로 변환된다.(원래의 것을 잃어버릴수도 있다.) / 훈련 세트가 매우 크면, 똑같이 많은 특성이 생긴다

06. 가우시안 RBF 커널 (GaussianRBF Kernel)

  • 다항식 특성의 방법처럼, 유사도 특성방식도 어떠한 머신러닝 알고리즘에 유용하지만, 모든 추가적인 특성을 모두 계산하려고 하면 연산비용이 비싸진다. 훈련셋이 클수록 더 그러하다.
⇒ 커널트릭이 SVM마술을 부리면, 실제로 추가하지 않고도 유사도 특성을 많이 추가한것과 같은 비슷한 결과를 낼수 있다.

<가우시안 RBF 커널(Gaussian RBF kernel)>

  • using SVS class:
notion image
!
11이 코드 : 왼쪽 아래 그림의 모델
  • 다른 그림들은 하이퍼파라미터 감마(gamma)와 C값을 다르게 훈련시킨 모델이다.
⇒ 감마 값을 크게 하면 그래프의 종 모양이 좁아지고, 따라서 각 샘플의 영향범위가 좁아진다. + 결정 경계가 더 불규칙해지고, 각 샘플에 따라 구불구불하게 휘어진다.
⇒ 반대로, 감마 값을 작게 하면, 종 모양이 더 넓어지고, 따라서 샘플들은 넓은 영향범위를 가지고 결정 경계가 부드러워질것이다.
  • 따라서 감마는 규제(regularization)의 역할을 한다.
⇒ 모델이 overfitting이면,감마 값을 줄이고, underfitting이면, 감마 값을 늘리면 된다. (C 하이퍼파라미터와 비슷)
  • 다른 커널들도 존재하지만, 거의 사용하지 않는다.
⇒예) 어떤 커널들은 특정 데이터구조에 특화되어있다.String 커널은 종종 텍스트 문서나 DNA서열을 분류할 때 사용된다.
  • WHY? 수많은 커널 중에 어떤 것을, 어떻게 정해야 하는가?
항상 선형 커널을 시도해봐야한다.(LinearSVC > SVS(kernel=”linear” → more faster)특히, 만약 훈련셋이 아주 크지 않거나, 특성 수가 많은 경우에 좋음여분의 시간과 컴퓨팅 성능이 있다면, 교차검증과 그리드탐색을 이용해 다른 커널들을 시도해볼 수도 있다.

07. 계산 복잡도(Computational Complexity)

  • LinearSVS 클래스는 linear SVMs를 위해 최적화된 알고리즘을 구현하는 liblinear 라이브러리를 기반으로 한다.
: 이 라이브러리는 커널 트릭을 지원하진 않지만, 훈련 샘플과 특성들의 수에 거의 선형적으로 늘어난다. ⇒ 훈련 시간복잡도 : O(m x n)
⇒ 만약, 매우 높은 정확성을 요구하면 알고리즘은 더 오래걸린다.
⇒ tolerance 하이퍼파라미터 told(Scikit-Learn) 의해 통제된다.
  • SVS 클래스는 커널 트릭을 의지하고 있는 알고리즘을 구현하는 libsvm 라이브러리를 기반으로 하고 있다.
⇒ 훈련 시간 복잡도 : O( m^2 x n ) ~: O( m^3 x n ) : == 훈련 샘플 수가 커지면 엄청나게 느려진다는 뜻이다
⇒ 이 알고리즘은 복잡하지만 작고 중간 사이즈의 훈련 셋에 적합하다.
⇒ 그러나 특히 희소 특성(각 샘플에 0이 아닌 특성이 거의 없는 경우)의 경우와 같이 특성의 갯수에 잘 확장된다. : 이 경우 알고리즘은 샘플 별 샘플이 가진 0이 아닌 특성의 객수의 평균수에 거의 비례하게 확장된다.
notion image
13
<SVM분류를 위한 Scikiti-Learn’s 클래스들의 비교>

07. SVM 회귀(SVM Regression)

  • SVM알고리즘은 다목적으로 쓰인다 .
: 선형, 비선형, 분류뿐만아니라 선형/비선형 회귀에도 사용이 가능하다.
  • 회귀에 사용되는 것은 그 목적이 반대다
: 마진 오류를 제한하면서 두 클래스들의 도로 사이를 가능한 크게 맞추도록 노력하는 대신, SVM 회귀는 마진 오류를 제한하면서 도로 밖의 샘플들이 도로 위에 있게하도록 노력한다.도로의 폭은 하이퍼파라미터 ε로 조절된다.
from sklearn.svm import LinearSVRsvm_reg = LinearSVR(epsilon=1.5)svm_reg.fit(X, y)
: 이 코드는 아래 왼쪽 그림을 나타냄ㅁ ⇒ SVM회기를 수행하는데 Scikit-Learn’s Linear SVR 클래스를 사용할 수 있다.
notion image
14
<랜덤 선형 데이터(왼쪽은 큰 도로폭 = 1.5, 오른쪽은 작은 도로폭 = 0.5)로 훈련된 두 개의 선형 SVM 회귀 모델>
ε-insentive 마진 안에서 훈련샘플들을 더 추가해도 모델의 예측에는 아무런 영향을 끼치지 않는다.
from sklearn.svm import LinearSVRsvm_reg = LinearSVR(epsilon=1.5)svm_reg.fit(X, y)
: 이 코드는 아래 왼쪽 그림의 모델을 나타낸다.
⇒ SVR클래스 == SVC 클래스의 회귀 버전 / LinearSVR 클래스 == LinearSVC클래스의 회귀 버전
⇒ LinearSVR클래스는 훈련세트의 크기에 비례해 선형적으로 늘어남.
⇒ SVR클래스는 훈련세트의 크기가 커지면 엄청 느려진다.
notion image
15
<2차 다항식 커널을 사용한 SVM회귀>
⇒ 비선형 회귀를 수행하려면, 커널된 SVM모델을 사용해야한다.
⇒ 예)왼쪽 그림 : 규제가 덜하다.(C값이 크다) / 오른쪽 그림 : 규제가 많다.(C값이 작다.)

08. Under the hood

  • 이 챕터에서는 SVMs를 다룰 때 더 편하고 흔한 다른 관습을 사용할 것이다.
: 편향(bias) : b
: 특성의 가중치 벡터 : w입려 특성 벡터에 어떠한 편향 벡터도 추가되지 않는다.

09. 결정함수와 예측 (Decision Function and Predictions)

  • <span style=’background-color: #F7DDBE’선형 SVM분류기 모델은 결정 함수 w^Tx + b = w1x1 +⋯ + wnxn + b를 계산하여 새로운 샘플 x를 예측한다.
⇒ 결과 == 양성 : 예측된 클래스 y(hat) = 양성클래스(1)
⇒ 결과 == 음성: 예측된 클래스 y(hay) = 음성 클래스(0)
데이터 셋이 두 개의 특성(꽃잎의 너비와 길이)을 가져기에 ⇒ 2차원 평면
notion image
17
<span style=’background-color: #F7DDBE’결정 경계는 결정함수가 0이 되는 점들(= 두 평면의 교차점인 직선(두꺼운 실선으로 표시되어있음))의 집합이다.
<span style=’background-color: #F7DDBE’점선은 결정함수가 1 이나 -1인 점들을 나타낸다.(= 점선은 결정경계로부터 마진을 형성하며, 결정경계에서의 거리가 같거나 평행하다)
<span style=’background-color: #F7DDBE’linear SVM분류기를 훈련하는 것 == 마진 오류을 발생기키지 않거나(하드 마진) 제한하면서(소프트 마진)가능한 마진을 넓게 만드는 w과 b의 값을 찾는 것

10. 목적 함수(Training Objective)

  • <span style=’background-color: #F7DDBE’결정함수의 기울기 == 가중치 벡터 ||w||의 norm
: 기울기를 2로 나누면 → 결정함수가 == +/- 1인 점들이 결정경계로부터 2배 멀어진다.
⇒ same with 마진에 2를 곱한 것
notion image
18
<span style=‘background-color: #F7DDBE’<가중치 벡터 w가 작을수록 마진은 더 커진다.>
⇒ 따라서 우리는 넓은 마진을 얻기 위해 ||w||를 최소화하고자 한다.
  • 마진오류를 피하려면(하드 마진)
  1. 결정함수가 모든 양성 훈련 샘플에서 1보다 커야한다.
  1. 그리고 음성 훈련 샘플에서는 -1보다 작아야 한다.
notion image
r019
<하드 마진 선형 svm분류기 목적함수>
⇒제약이 있는 최적화의 문제로 하드 마진 선형 SVM분류기의 목적함수를 표현할 수 있다.
⇒ 만약, 음성 샘플로 t^(i) = -1 (y^(i)=0)이면), 양성 샘플로 t^(i) = 1 (y^(i)=1)이면),로 정의한다면, 모든 샘플에 대해 위의 subject를 제약으로 표현할 수 있다.
⇒||w||를 최소화하는 것보다 1/2w^Tw(=1/2||w||)를 최소화해야함
  • 소프트 마진 목적함수를 얻으려면,
notion image
19
<소프트 마진 선형 svm분류기 목적함수>
⇒ 각 샘플에 슬랙 변수(slack variable) ζ를 도입해야한다.슬랙 변수(slack variable) ζ는 i번째 샘플이 마진을 얼마나 위반할 것인지를 측정한다.
===⇒ 두개의 상충되는 목표를 가진다.
**- 마진 오류를 줄이기 위해 슬랙 변수들을 가능한 작게 만드는 것- 마진을 넓히기 위해 1/2w^Tw의 값을 가능한 작게 만드는 것⇒ 여기에 하이퍼파라미터C가 두 목표 사이의 trade-off를 정의한다.**

11. 2차 계획법(QuadraticProgramming)

<2차 계획법(Quadratic Programming)>

: 하드마진과 소프트 마진문제는 모두 선형적인 제약이있는 볼록 2차 최적의 문제이다. QP
notion image
20
  • QP파라미터를 다음과 같이 정하면, 하드마진을 갖는 선형 SVM분류기의 목적함수를 쉽게 검증할 수 있다.
    • **⇒ np = n + 1, // n : 특성의 수 ( +1은 for 편향)⇒ nc = m // m : 훈련 샘플들의 수⇒ H : np x np identity 행렬 // 왼쪽 맨 위의 원소가 0(편향을 무시하기 위해)것을 제외하고⇒ f = 0 : np-dimensional vecit full of 0s=> b = –1, an nc-dimensional vector full of –1s.=> a^(i) = –t^(i) x˙ //x˙^(i) == x^(i) with 추가 편향 x˙ 0 = 1**
  • 하드 마진 선형 SVM 분류기를 훈련시키는 한 가지 방법은 이미 있는 파라미터를 QP알고리즘에 전달하는 것이다.
⇒ 결과 벡터 p는 편향 b = p0와 특성 가중치 wi = pi(i=1,2,3,…,n)를 포함하고 있다.
⇒ 비슷하게, QP알고리즘으로 소프트 마진문제도 해결할 수 있다.
  • 커널트릭을 사용하려면 제약이 있는 최적화문제를 다른 시각으로 봐야한다.

12. 이중 문제(The Dual Problem)

  • 근본적인 문제)primial problem)로 알려진 제약이 있는 최적화문제가 주어지면, 이중문제(dual problem)이라고 불리는 문제와 가깝게 관련된 다른 문제로 표현이 가능하다.
  • 이중문제의 해결책 : 일반적으로 근본적인 문제의 해결책에 대한 하한 값을 제공하지만, 어떤 조건 아래하에 근본적인 문제와 똑같은 해결책을 가질 수도 있다.
  • 운이 좋게, SVM 문제는 이 조건들을 만족시킨다.
식0. 위 식을 최소화 하는 a hat을 찾았다면, 아래 식을 사용하여 근본적인 문제를 최소화 하는 w hat과 b hat을 계산할 수 있다.
notion image
notion image
22
  • 이중 문제는 훈련 샘플들이 특성 수보다 작을 때 근본 문제보다 더 빨리 해결할 수 있다.
  • 더 중요하게, 근본문제에서는 안되는 커널 트릭을 해결할 수 있게 한다.

13. 커널된 SVM (Kernelized SVM)

  • 2차원 훈련 셋에 2차 다항식 변환을 적용하고 싶어한다고 가정해보자 → 그 다음, 변형된 훈련 셋에 선형 SVM 분류기를 훈련시킨다.
notion image
23
<식1. 적용하고 싶은 2차 다항식 매핑 함수 ϕ>
⇒변형된 벡터는 2차원 대신 3차원이다.
2개의 이차원 벡터 a와 b에 2차원 다항식을 매핑한후 변환된 벡터를 점곱을 계산
notion image
  • 변형된 벡터의 점곱 == 원래의 벡터의 점곱의 제곱 /
notion image
25
  • 모든 훈련 샘플에 변환ϕ을 적용하면, 이중문제가 점곱ϕ(XT ϕ(X^(j))을 포함될 것이다.
    • (i))
  • 그러나, ϕ가 2차 다항식 변환이 식1에 의해 정의된 것이라면, 변형된 벡터의 점곱을 간단하게( XT ϕ(X2로 교체할 수 있다. ⇒ 따라서 실제로 모든 훈련 샘플을 다 변환할 필요가 없다.
    • (i))
      (j))
; 그냥 식0에 있는 점곱을 제곱으로 바꾸면 된다.
  • 결과는 실제로 훈련샘플을 변환하고 선형 SVM알고리즘에 맞춘 것과 같으며, 전체 과정이 계산적으로 더 효율적일 것이다.
notion image
26
<흔한 커널>
  • 함수 K(a,b) = (a2는 2차 다항식 커널로 불리운다.
    • Tb)
: 머신러닝에서 커널은 변환 ϕ을 계산하지 않아도 원래 벡터 a와 b에만 근거하여 점 곱 ϕ(a)^T ϕ(b)를 계산할 수 있는 함수다.

14. 온라인 SVMs(Online SVMs)

  • 선형 SVM 분류기에서, 아래의 비용함수를 최소화하는 한가지 방법은 근본 문제에서 유도된 경사하강법을 사용하는 것이다.
: 그러나 경사하강법은 QP기반의 방법보다 훨씬 느리다.
notion image
27
⇒ 첫번째 항 : 작은 가중치 벡터 w를 가지도록 하여 더 큰 마진을 가지게 한다.
⇒ 두번 쨰 항 : 모든 마진 오류들을 계산한다.만약 샘플이 올바른 쪽의 도로에 있지 않다면 샘플의 마진 오류 = 0그렇지 않다면, 마진 오류는 올바른 쪽의 도로 경계선까지의 거리에 비례한다.이 항을 최소화하면 모델이 마진 오류를 가능한 한 작게 만들도록 한다.
notion image