My Data Story
[모델 알고리즘] 서포트 벡터 머신 - 비선형 SVM 분류 본문
◈ '서포프 벡터 머신' 목차 ◈
2. 비선형 SVM 분류기
선형적으로 구분할 수 없는 데이터에 대해 사이킷런을 통해 비선형 SVM 분류 모델을 구현하는 방법을 살펴보자.
1. 비선형 SVM 분류 모델 구현
선형적으로 분류할 수 없는 데이터 셋을 구분하기 위해서는 다항 특성을 추가하거나 유사도 특성을 추가하여 비선형 SVM 분류 모델을 만들어 볼 수 있다.
1.1 다항 특성
비선형 데이터셋을 다루는 한 가지 방법은 다항 회귀처럼 다항 특성을 추가하는 것이다.
사이킷런을 통해 구현할 때 직접 다항 특성을 추가할 수도 있고 다항식 커널을 활용할 수도 있다.
(1) 다항 특성 생성
사이킷런에서 LinearSVC 는 선형 SVM 분류기라,
비선형 데이터셋을 다룰 때는 PolynomialFeatures로 직접 다항 특성을 추가하여 구현한다.
from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
X, y = make_moons(n_sample=100, noise=0.15)
polynomial_svm_clf = Pipeline([
('poly_featurest', PolynomialFeatures(degree=6)),
('scaler', StandardScaler()),
('svm_clf', LinearSVC(C=10, loss='hinge'))
])
polynomial_svm_clf.fit(X,y)
(2) 다항식 커널
다항식 특성을 추가하는 것은 간단하고 모든 머신러닝 알고리즘에서 잘 작동한다.
하지만 낮은 차수의 다항식은 복잡한 데이터 셋을 잘 표현하지 못하고,
높은 차수의 다항식은 많은 특성을 추가하므로 모델을 느리게 만든다.
SVM을 사용할 땐 커널트릭이라는 수학적 기교를 적용할 수 있다.
커널 트릭이란,
실제로 특성을 추가하지 않으면서 다항식 특성을 추가한 것과 같은 결과를 얻을 수 있다.
from sklearn.svm import SVC
poly_kernel_clf = Pipeline([
('scaler', StandardScaler()),
('svm_clf', SVC(kernel='poly', degree=3, coef0=1, C=5))
])
poly_kernel_clf.fit(X, y)
모델이 과대 적합이라면 차수를 줄여야 하고, 과소 적합이라면 차수를 늘려야 한다.
SVC 의 매개변수 coef0은 모델이 높은 차수와 낮은 차수에 얼마나 영향을 받을지 조절한다.
coef0 값이 작을 수록 최고차 항의 영향력은 감소한다.
SVC 의 적절한 하이퍼파라미터 찾는 것은 Grid Search 를 통해 찾는다.
1.2 유사도 특성
비선형 특성을 다루는 또 다른 방법은 각 샘플이 특정 랜드마크와 얼마나 닮았는지 측정하는 유사도 함수 값을 특성으로 추가하는 것 이다. 가우시안 방사 기전 함수(RBF) 를 유사도 함수로 사용할 수 있다.
가우시안 방사 기전 함수 공식은 다음과 같다.
가우시안 방사 기저 함수(RBF) 는 0부터 1까지 변하면서 종모양을 나타낸다.
아래 왼쪽 그래프를 살펴보면,
X2 곡선은 첫 번째 빨간점을 랜드마크로 설정했을 때의 RBF 유사도 곡선이고
X3 곡선은 두 번째 빨간점을 랜드마크로 설정했을 때의 RBF 유사도 곡선이다.
아래 오른쪽 그래프를 살펴보면,
모든 샘플들에 대해 X2 유사도와 X3 유사도를 측정하여,
해당 유사도를 특성으로 갖는 축에 샘플을 위치시킨다.
왼쪽 그래프에서는 선형적으로 구분할 수 없었는데,
유사도를 특성으로 갖는 비선형적 데이터로 변형함으로써
오른쪽 그래프에서는 선형 결정 경계에 대한 인사이트를 도출할 수 있다.
그렇다면 랜드 마크는 어떻게 선택해야 할까?
간단한 방법은 데이터 셋에 있는 모든 샘플 위치를 랜드 마크로 설정하여 서로 간의 유사도를 측정한다.
이렇게 하면 차원이 매우 커져서 변환된 훈련 세트는 선형적으로 구분될 가능성이 높아진다.
하지만 n개의 특성과 m개의 샘플인 훈련 세트는 m개의 특성과 m개의 샘플인 훈련 세트로 변환된다.
훈련 세트 샘플 크기가 클 경우, 매우 많은 특성이 생성된다.
(1) 가우시안 RBF 커널
다항 특성 방식과 마찬가지로, 유사도 특성 방식도 머신러닝 알고리즘에 유용하게 사용될 수 있다.
다만 추가 특성을 계산하려면 연산 비용이 많이 든다. (특히 훈련세트가 클 경우 더 그렇다.)
SVC 모델 생성 시, 가우시안 RBF 커널을 활용하여 수학적 기교를 발휘할 수 있다.
rbf_kernel_svm_clf = Pipeline([
('scaler', StandardScaler()),
('svm_clf', SVC(kernel='rbf', gamma=5, C=0.001))
])
rbf_kernel_svm_clf.fit(X,y)
이때 SVC 의 매개 변수 gamma는 가우시안 RBF 함수식에 포함되어 있는 상수이다.
결국 하이퍼파라미터 gamma 는 C와 같이 규제의 역할을 한다.
▶ 그렇다면, 여러 가지 커널 중 어떤 것을 사용해야 할까?
step1
언제나 선형 커널을 가장 먼저 시도한다.
(LinearSVC 가 SVC(kernel='linear') 보다 훨씬 빠르다.)
특히 훈련 세트가 아주 크거나 특성 수가 매우 많을 때 그렇다.
step2
훈련 세트가 너무 크지 않다면 가우시안 RBF 커널을 시도해본다.
대부분 경우 이 커널이 잘 들어 맞는다.
step3
시간과 컴퓨팅 성능이 충분하다면,
교차검증과 그리드 탐색을 사용해 다른 커널도 좀 더 시도해볼 수 있다.
※ 일반적인 커널
1.3 계산 복잡도
(1) LinearSVC
- 선형 SVM을 위한 최적화된 알고리즘을 구현한 liblinear 라이브러리 기반
- 커널 트릭 지원하지 않음
- 계산 복잡도는 훈련 샘플과 특성 수에 거의 선형적으로 늘어남
- 훈련 시간 복잡도는 대략 O(m x n)
(2) SVC
- 커널 트릭 알고리즘을 구현한 libsvm 라이브러리 기반
- 훈련 시간 복잡도는 O(m2 x n) ~ O(m3 x n)
- 훈련 샘플 수가 커지면 엄청나게 느려져, 복잡하지만 작거나 중간 규모의 훈련 세트에 적당
- 특성 개수에는 희소 특성(각 샘플에 0이 아닌 특성이 얼마 없는 경우)에는 잘 확장된다.
※ SVM 분류를 위한 사이킷런 파이썬 클래스 비교
파이썬 클래스 | 시간 복잡도 | 외부 메모리 학습지원 | 스케일 조정의 필요성 | 커널 트릭 |
Linear SVC | O(m x n) | 아니오 | 예 | 아니오 |
SGD Classifier | O(m x n) | 예 | 예 | 아니오 |
SVC | O(m2 x n) ~ O(m3 x n) | 아니오 | 예 | 예 |
'Machine Learning > 2. 지도 학습 알고리즘' 카테고리의 다른 글
[모델 알고리즘] 서포트 벡터 머신 - SVM 이론 (0) | 2021.08.09 |
---|---|
[모델 알고리즘] 서포트 벡터 머신 - SVM 회귀 (0) | 2021.08.09 |
[모델 알고리즘] 서포트 벡터 머신 - 선형 SVM 분류 (0) | 2021.08.09 |
[분류] K 최근접 이웃(KNN) (0) | 2021.08.09 |
[분류] 모델 평가 (0) | 2021.08.07 |