서포트 벡터 머신¶
(5.1) 선형 SVM 분류¶
선형 SVM 분류는 적절하면서도 훈련 샘플에서 가능한 한 멀리 떨어지도록 하는 결정 경계를 고른다.¶
LMC large margin classification
→ **LMC large margin classification**
**서포트 벡터** : 결정 경계를 결정하는 샘플
- (5.1.1) 소프트 마진 분류
→ 하드 마진 분류
: 모든 샘플이 도로 바깥쪽에 분류된 경우
(-) 반드시 데이터가 선형적이어야 함
(-) 이상치에 민감
→ 소프트 마진 분류
: 보다 유연한 모델
: 도로의 폭을 넓게 유지하면, 일반화가 용이하나 margin violation이 증가하고
: 반대의 경우에는 이상치에 민감하게 된다.
: 하이퍼파라미터
: 도로의 폭을 넓게 유지한다.
마진 오류
소프트 마진 분류
힌지 손실
In [3]:
import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
#붓꽃 데이터셋 적재
iris = datasets.load_iris()
#2 - 꽃잎 길이 , 3 - 꽃잎 너비
X = iris["data"][:, (2,3)]
y = (iris["target"]==2).astype(np.float64)
#선형 SVM 모델 훈련
svm_clf = Pipeline([
("scaler", StandardScaler()),
#C파라미터를 1로 지정함
("linear_svc", LinearSVC(C=1, loss="hinge")),
])
svm_clf.fit(X,y)
Out[3]:
Pipeline(steps=[('scaler', StandardScaler()), ('linear_svc', LinearSVC(C=1, loss='hinge'))])
In [4]:
svm_clf.predict([[5.5, 1.7]])
Out[4]:
array([1.])
In [6]:
#사이킷런을 이용한 비선형 SVM classification
from sklearn.datasets import make_moons
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
# moons 데이터 불러오기
X,y= make_moons(n_samples=100, noise=0.15)
# PolynomialFeatures, StandardScaler, LinearSVC 이용해서 Pipeline 만들기
polynomial_svm_clf = Pipeline([
("poly_features", PolynomialFeatures(degree=3)),
("scaler", StandardScaler()),
("svm_clf", LinearSVC(C=10, loss="hinge"))
])
polynomial_svm_clf.fit(X,y)
C:\Users\82109\anaconda3\lib\site-packages\sklearn\svm\_base.py:985: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations. warnings.warn("Liblinear failed to converge, increase "
Out[6]:
Pipeline(steps=[('poly_features', PolynomialFeatures(degree=3)), ('scaler', StandardScaler()), ('svm_clf', LinearSVC(C=10, loss='hinge'))])
5.2.1 다항식 커널¶
비선형 SVM classification에 따라, 다항식 특성을 추가한다고 하자. 그러나 낮은 차수의 다항식은 단점이 더 큼
---> 커널 트릭 kernel trick 사용 가능
In [7]:
from sklearn.svm import SVC
poly_kernel_svm_clf = Pipeline([
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
])
poly_kernel_svm_clf.fit(X,y)
Out[7]:
Pipeline(steps=[('scaler', StandardScaler()), ('svm_clf', SVC(C=5, coef0=1, kernel='poly'))])
In [10]:
# 가우시안 RBF 커널을 사용한 SVC 모델
rbf_kernel_svm_clf = Pipeline([
("scaler", StandardScaler()),
#gamma와 C 값에 따라 모델 달라진다.
#gamma 작으면 -> 샘플이 넓은 범위에 영향을 준다.
#gamma 크면 -> 샘플의 영향 범위가 작아진다. (넓이)
("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
])
rbf_kernel_svm_clf.fit(X,y)
Out[10]:
Pipeline(steps=[('scaler', StandardScaler()), ('svm_clf', SVC(C=0.001, gamma=5))])
5.2.4. 계산 복잡도¶
$O(m*n)$
5.3. SVM regression¶
SVM 알고리즘을 regression에 적용하면?
제한된 마진오류 안에 최대한 많은 샘플이 들어가도록 학습
ε : 도로의 폭을 결정하는 hyperparameter
In [16]:
from sklearn.svm import LinearSVR, SVR
#사이킷런의 linearSVR 이용
svm_reg = LinearSVR(epsilon=1.5)
svm_reg.fit(X,y)
#사이킷런의 SVR 이용
svm_poly_reg = SVR(kernel = "poly", degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X,y)
Out[16]:
SVR(C=100, degree=2, kernel='poly')
In [ ]:
'Data Science > AI' 카테고리의 다른 글
[8.9] 공동세션 분석 리뷰 (0) | 2021.08.10 |
---|---|
[머신러닝] decision tree - 핸즈온 머신러닝 6장 (0) | 2021.07.31 |
[발표 자료] 핸즈온 머신 러닝 4장 - 모델 훈련 (0) | 2021.07.24 |
[데이터 시각화] Tableau 기본 차트 이용법 - 막대, 라인, 파이, 도넛, 맵, 대시보드 등 (0) | 2021.07.23 |
[발표 자료] 핸즈온 머신러닝 3장 - 분류 classification (0) | 2021.07.23 |