자료를 공개한 저자 오렐리앙 제롱에게 깊은 감사를 드립니다. 이와 더불어 한빛미디어로부터 강의준비에 필요한 자료를 지원받았음을 밝히며, 이에 대해 진심어린 감사를 전합니다.
라지 마진: 클래스를 구분하는 가장 넓은 도로
분류 대상 클래스들 사이의 가장 큰 도로, 즉 라지 마진을 계산하여 클래스 분류
왼편 그래프 | 오른편 그래프 | |
---|---|---|
분류기: | 선형 분류 | 마진 분류 |
실선: | 분류 좋음 | 결정 경계(최대폭 도로 중심선) |
일반화: | 일반화 어려움 | 일반화 가능 |
왼편 그래프 | 오른편 그래프 | |
---|---|---|
이상치: | 타 클래스에 섞임 | 타 클래스에 매우 가까움 |
하드 마진 분류: | 불가능 | 가능하지만 일반화 어려움 |
사이킷런의 SVM 분류기 LinearSVC
활용
Iris-Virginica 품종 여부 판단
svm_clf1 = LinearSVC(C=1, loss="hinge", random_state=42)
svm_clf2 = LinearSVC(C=100, loss="hinge", random_state=42)
왼편 그래프 | 오른편 그래프 | |
---|---|---|
C: | 작게 | 크게 |
도로폭: | 넓게 | 좁게 |
마진 위반: | 많게 | 적게 |
분류: | 덜 정교하게 | 보다 정교하게 |
SVC(kernel="linear", C=1)
SGDClassifier(loss="hinge", alpha=1/(m*C))
m
)에 반비례. 즉, 훈련 샘플 수가 크면 규제 약해짐SVC
+ 커널 트릭# 3차 다항까지 추가
polynomial_svm_clf = Pipeline([
("poly_features", PolynomialFeatures(degree=3)),
("scaler", StandardScaler()),
("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42))
])
$\gamma$: 랜드마크에서 멀어질 수록 0에 수렴하는 속도를 조절함
1: 랜드마크와 같은 위치인 경우
$$ \phi(\mathbf x, \ell) = \exp(-\gamma\, \lVert \mathbf x - \ell \lVert^2) $$
장점: 차원이 커지면서 선형적으로 구분될 가능성이 높아짐.
단점: 훈련 세트가 매우 클 경우 동일한 크기의 아주 많은 특성이 생성됨.
어떠한 특성도 새로 추가하지 않으면서 특성을 추가한 것과 수학적으로 동일한 결과가 나오게 하는 기법
다항 커널: 다항 특성을 추가하는 효과를 내주는 함수
# 두 개의 다항 커널 지정
from sklearn.svm import SVC
poly_kernel_svm_clf = Pipeline([
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="poly", degree=d, coef0=c0, C=C))
])
왼편 그래프 | 오른편 그래프 | |
---|---|---|
kernel="poly": | 다항 커널 | 다항 커널 |
degree=d: | d=3: 3차 다항 커널 | d=10: 10차 다항 커널 |
coef0=r: | r=1: 높은 차수 강조 조금 | r=100:높은 차수 강조 많이 |
C=C: | C=5: 마진 약간 크게 | C=5: 마진 약간 크게 |
rbf_kernel_svm_clf = Pipeline([
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="rbf", gamma=ga, C=C))
])
상단 왼편 그래프 | 상단 오른편 그래프 | |
---|---|---|
kernel="rbf": | 가우시안 RBF 커널 | 가우시안 RBF 커널 |
gamma=ga: | ga=0.1: 랜드마크에 조금 집중 | ga=0.1: 랜드마크에 조금 집중 |
C=C: | C=0.001: 가중치 규제 많이 | C=1000: 가중치 규제 적게 |
따라서 마진 도로폭 넓게 | 따라서 마진 도로폭 좁게 |
하단 왼편 그래프 | 하단 오른편 그래프 | |
---|---|---|
kernel="rbf": | 가우시안 RBF 커널 | 가우시안 RBF 커널 |
gamma=ga: | ga=5.0: 랜드마크에 많이 집중 | ga=5.0: 랜드마크에 많이 집중 |
C=C: | C=0.001: 가중치 규제 많이 | C=1000: 가중치 규제 적게 |
결정 경계 덜 민감 | 결졍 경계가 보다 민감 |
SVC
의 kernel
기본값은 "rbf"
=> 대부분의 경우 이 커널이 잘 맞음"linear"
커널을 사용할 수 있음LinearSVC
가 빠름분류기 | 시간 복잡도(m 샘플 수, n 특성 수) | 외부 메모리 학습 | 스케일 조정 | 커널 트릭 | 다중 클래스 분류 |
---|---|---|---|---|---|
LinearSVC | $O(m \times n)$ | 미지원 | 필요 | 미지원 | OvR 기본 |
SGDClassifier | $O(m \times n)$ | 지원 | 필요 | 미지원 | 지원 |
SVC | $O(m^2 \times n) \sim O(m^3 \times n)$ | 미지원 | 필요 | 지원 | OvR 기본 |
# LinearSVR 클래스 지정
from sklearn.svm import LinearSVR
svm_reg = LinearSVR(epsilon=e)
왼편 그래프 | 오른편 그래프 | |
---|---|---|
epsilon=e: | e=1.5: 마진 크게 | e=0.5 마진 작게 |
# SVR + 다항 커널
from sklearn.svm import SVR
svm_poly_reg = SVR(kernel="poly", degree=d, C=C, epsilon=e, gamma="scale")
왼편 그래프 | 오른편 그래프 | |
---|---|---|
degree=d: | d=2: 2차 다항 커널 | d=2: 2차 다항 커널 |
epsilon=e: | e=0.1: 마진 작게 | e=0.1 마진 작게 |
C=C: | C=100: 가중치 규제 거의 없음 | C=0.01: 가중치 규제 많음 |
샘플에 더 민감 | 샘플에 덜 민감 | |
도록폭을 보다 넓게 | 도로폭을 보다 좁게 |
LinearSVR
: LinearSVC
의 회귀 버전SVR
: SVC
의 회귀 버전결정 함수의 값이 0인 점들의 집합
$$\{\mathbf x \mid h(\mathbf x)=0 \}$$
목적 함수:
$$\frac 1 2 \mathbf w^T \mathbf w$$
아래 조건 하에서 목적 함수를 최소화 시키는 $\mathbf w$와 $b$를 구해야 함:
$$t^{(i)} (\mathbf w^T \mathbf x^{(i)} + b) \ge 1$$
단, 다음이 성립:
목적 함수:
$$\frac 1 2 \mathbf w^T \mathbf w + C \sum_{i=0}^{m-1} \zeta^{(i)}$$
아래 조건 하에서 목적 함수를 최소화 시키는 $\mathbf w$와 $b$를 구해야 함:
$$t^{(i)} (\mathbf w^T \mathbf x^{(i)} + b) \ge 1 - \zeta^{(i)}$$
단, 다음이 성립:
$C$: 아래 두 목표 사이의 트레이드오프를 조절하는 하이퍼파라미터
아랙 식을 최소화하는 $\alpha$ 찾기. 단, $\alpha^{(i)} > 0$:
$$ \frac 1 2 \sum{i=0}^{m-1} \sum{j=0}^{m-1} \alpha^{(i)} \alpha^{(j)} t^{(i)} t^{(j)} \mathbf x^{{(i)}^T} \mathbf x^{(j)}
쌍대 문제의 답 $\hat \alpha$를 이용하여 $\hat{\mathbf w}$ 와 $\hat b$를 선형 SVM 모델의 파라미터로 활용
$n_s$: 서포트 벡터 수, 즉, ${\hat \alpha}^{(i)} > 0$ 인 샘플 수
\begin{align*} \hat{\mathbf w} &= \sum_{i=0}^{m-1} {\hat \alpha}^{(i)} t^{(i)} \mathbf x^{(i)} \\ \hat b &= \frac{1}{n_s} \sum_{i=0, \; {\hat \alpha}^{(i)} > 0}^{m-1} \big( t^{(i)} - {\hat{\mathbf w}^T} \mathbf x^{(i)} \big) \end{align*}
원래 아래 2차 다항식 함수를 적용한 후에 쌍대 목적 함수의 최적화 문제를 해결해야 함.
$$ \phi(\mathbf x) = (x_1^2, \sqrt{2} x_1 x_2, x_2^2)^T $$
원래 아래 식의 최적화 문제를 해결해야 함.
선형:
$$K(\mathbf a, \mathbf b) = \mathbf a^T \mathbf b$$
다항식:
$$K(\mathbf a, \mathbf b) = \big( \gamma \mathbf a^T \mathbf b + r \big)^d$$
가우시안 RBF:
$$K(\mathbf a, \mathbf b) = \exp \big( \!-\! \gamma \| \mathbf a - \mathbf b \|^2 \big )$$
시그모이드:
$$K(\mathbf a, \mathbf b) = \tanh\! \big( \gamma \mathbf a^T \mathbf b + r \big)$$
loss
하이퍼파라미터를 hinge
로 설정하면 선형 SVM 모델 지정