
SVM은 특성 스케일에 민감

StandardScaler 사용하면 결정 경계를 명확하게 표현 가능
경계의 폭을 가능한 한 넓게 유지하는 것과 마진 오류 사이에 적절한 균형을 잡은 것
규제 하이퍼마라미터
from sklearn.svm import LinearSVC 을 사용해 선형 분류가 가능함
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)

다항 특성을 추가하는 것은 비교적 간단하지만, 모델을 느리게 만든다는 단점이 있음
커널 트릭 : 실제 특성을 추가하지 않으면서, 높은 차수의 다항 특성을 많이 추가한 것과 같은 효과를 주는 수학적 기교
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 : 모델이 높은 차수와 낮은 차수에 얼마나 영향을 받을지 조절
랜드마크와의 유사도를 측정하는 유사도함수를 활용해 특성을 추가하는 방식

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 서열 분류 시에 문자열 커널을 이용하기도 함
LinearSVC 클래스는 liblinear라이브러리 ( 커널 트릭 지원x ) 를 기반으로 함SVC 는 커널 트릭 알고리즘을 구현한 libsvm 라이브러리를 기반으로 함SGDClassifier는 기본적으로 규제 하이퍼파라미터와 learning_rate를 조정하여 결과 생성 

from sklearn.svm import LinearSVR
x, y = [ ... ] # 선형 데이터셋
svm_reg = make_pipeline(StandardScale(),
LinearSVR(epsilon=0.5, random_state=42))
svm_reg.fit(X, y)
LinearSVR은 LinearSVC의 회귀 version
1) 제한된 마진 오류에서 마진을 가능한 한 넓게 만드는 가중치 벡터(W)와 편향(b)을 찾는 것
2) 마진 오류를 일으키지 않는 것
제약조건 : 결정 함수가 모든 양성 훔련 샘플에서는 1보다 커야하고, 음성 훈련 샘플에서는 -1보다 작아야함
ㅊ
primal problem : 등식과 부등식 제약조건이 있는 본래의 최적화 문제
SVM은 primal problem, dual problem 중 하나를 선택하여 풀 수 있고, 둘 다 같은 해를 제공함