사이킷런에서 커널 svm 사용하여 비선형 데이터 분류하기
March 4, 2022, 10:56 p.m.
1. 커널이란?
바로 이전 포스트에서 서포트 벡터 머신(svm)에 대해서 알아보았어요. 굉장히 간단하고 성능이 좋은 분류기입니다. 하지만 svm의 진가는 커널을 사용할 수 있다는 것입니다.
커널 방법은 비선형으로 구분되어지는 데이터를 선형으로 구분되어지는 어떤 고차원 공간으로 투영하여 그 공간에서 선형 분류를 하는 것입니다. 고차원 공간으로 투영하는 방법은 굉장히 많은데 그 중에서 가장 유용하게 쓰이는 것은 바로 가우시안 커널, 혹은 RBF 라고 부르는 것입니다.
수학적인 내용을 깊게 들어가지는 않겠습니다. 몰라도 사이킷런에서 잘만 사용할 수 있으니까요!
2. 사용하기
아래에 비선형으로 구분되는 데이터를 만들어 보았습니다.
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1000)
X_xor = np.random.randn(200, 2)
y_xor = np.logical_xor(X_xor[:, 0] > 0, X_xor[:, 1] > 0)
y_xor = np.where(y_xor, 1, -1)
plt.scatter(X_xor[y_xor == 1, 0], X_xor[y_xor ==1, 1], c='b', marker='x',label='1')
plt.scatter(X_xor[y_xor == -1, 0], X_xor[y_xor == -1, 1],c='r', marker='s', label='-1')
plt.xlim([-3,3])
plt.ylim([-3,3])
plt.legend(loc='best')
plt.tight_layout()
plt.show()
누가 봐도 직선으로(선형적으로) 구분할 수 없는 데이터 입니다. 하지만 커널 svm을 이용한다면 가능합니다.!
from sklearn.svm import SVC
svm_k = SVC(kernel='rbf', random_state=1, gamma=0.1, C=100.0)
svm_k.fit(X_xor, y_xor)
kernel을 rbf으로 바꾸어주기만 하면 됩니다. 대신에 새로운 하이퍼파라미터인 gamma를 넣어주어야 하네요.
실제로 위와 같이 학습한 svm 분류기는 위의 데이터를 잘 구분하는 모습을 보여줍니다.
파라미터 C는 이전 포스트에서 보았듯이 결정경계에서 얼마나 오차를 허용하는지, 즉 편향과 과대적합 여부를 결정합니다. C값이 클수록 테스트 셋에 과대적합되고, 작을수록 편향이 커집니다.
gamma도 마찬가지입니다. gamma는 가우시안 구의 크기를 제한하는 매개변수인데요, 서포트 벡터의 영향을 결정합니다. gamma 값을 크게 할 수록 결정경계는 샘플에 더욱 가까워지며 과대적합됩니다.
훈련셋에서도 훌륭한 정확도를 보이며 동시에 테스트 셋에서 일반화 했을 때 성능이 좋으려면 이 두가지 하이퍼파라미터를 잘 튜닝하여야겠죠?
그럼 이제 커널 svm을 이용해서 붖꽃 데이터셋을 분류해 보겠습니다.
3. 적용하기
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
X = iris.data[:, [2,3]] //두개의 특성만 사용
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1, stratify=y) // stratify 옵션은 데이터를 나눌때 클래스별 비율을 동일하게 만든다.
사이킷런에서 제공하는 붖꽃 데이터 셋을 가져왔습니다.
이제 커널 svm을 적용해 보겠습니다!
from sklearn.svm import SVC
svm = SVC(kernel='rbf', gamma=0.1, C=10.0, random_state=1) // SVM 모델 생성
svm.fit(X_train, y_train) // 학습
어떤가요? 꽤나 구분이 잘 되는 모습을 볼 수 있습니다. 파라미터를 더 조절해보면 더욱 성능이 좋은 분류기를 만들 수 있을 거에요.
이번 포스트에서는 커널 svm에 대한 간단한 이해와 사이킷런에서의 사용법까지 알아 보았습니다.
자세한 내용은 제가 책으로 공부하면서 적어놓은 깃허브 코랩 코드를 확인해 보세요.
그럼 안녕!
사이킷런 scikit-learn svm 커널