작성한 코드는 여기에서 확인.
https://www.kaggle.com/code/smarcle/ch5-svm
데이터를 분류하는 초평면(현 데이터의 차원보다 한 차원 낮은 평면, 사실상의 경계 같은 역할)을 구하는 방식의 지도 학습 모델.
사이킷런에서 기본 제공하며, 성능이 꽤나 좋아서 다양한 곳에 활용 가능하다.
from sklearn.datasets import load_iris
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
iris=load_iris(as_frame=True)
X=iris.data[["petal length (cm)", "petal width (cm)"]].values
y=(iris.target==2)
svm_clf=make_pipeline(StandardScaler(), LinearSVC(C=1, random_state=42))
svm_clf.fit(X, y)
X_new=[[5.5, 1.7], [5.0, 1.5]]
svm_clf.predict(X_new)
svm_clf.decision_function(X_new)
iris 데이터셋에 대해 svm을 사용해 분류를 실행한 코드.
여기서 5.5, 1.7이라는 데이터는 True로, 5.0, 1.5라는 데이터는 false로 분류되었다.
또한, 각 샘플과 결정 경계(구한 초평면) 간 거리도 확인할 수 있는데, 각각 0.66163411과 -0.22036063으로 나왔다.
from sklearn.datasets import make_moons
from sklearn.preprocessing import PolynomialFeatures
X2, y2 = 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(X2, y2)
아까의 경우 선형의 초평면을 구했다면, 이번 경우는 초평면이 일직선으로 나오지 않는다. 따라서 다항 특성을 추가하거나, 그에 준하는 조치를 취할 것이다.
주로 활용되는 것은 바로 '커널 트릭'으로, 실제로는 다항 특성을 추가하지 않으면서도 높은 차수의 다항 특성을 많이 추가한것과 같은 효과를 내기 때문에, 실제로 특성 조합이 늘어나지 않으면서도 복잡한 데이터셋을 잘 표현할 수 있다.
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(X2, y2)
3차 커널을 이용해 svm을 훈련시키는 코드.
여기서 coef0은 모델이 높은 차수와 낮은 차수에 얼마나 영향을 받는지를 조절해준다. 여기서는 1.
지도학습 모델이므로 이쪽도 회귀에도 활용할 수 있다.
from sklearn.svm import LinearSVR
X3, y3 = 선형 데이터셋 아무거나
svm_reg = make_pipeline(StandardScaler(), LinearSVR(epsilon=0.5, random_state=42))
svm_reg.fit(X3, y3)
적절한 데이터셋을 찾아서 돌려보면 꽤 괜찮은 결과가 나온다네요
교재에 있던 부분인데, 내 능력으로 어떻게 설명할 수 있는 부분이 아니라 핵심 개념 몇개만 적어놓음.
이쪽도 코드로 설명하기 힘들어서 몇개 용어만 소개.
코딩으로 이미지 뽑고 다 하는 인간이라 코드가 없으면 뭘 할수가 없네요...