5-2. 서포트 벡터 머신(SVM) - 비선형 SVM 분류

2021. 5. 4. 15:47Machine Learning

비선형 SVM 분류


SVM을 통한 선형/비선형 데이터 분류

출처 : ai.plainenglish.io/what-is-deep-learning-and-how-deep-learning-works-6f055125633d

5-1 장에서는 선형 데이터를 SVM으로 분류하는 방법에 대해서 살펴보았다. 

 

비선형 데이터 역시 SVM으로 분류가 가능한데, 선형 회귀에서 비선형 데이터를 처리하던 것과 마찬가지로 

 

기존 데이터에 다항 특성을 추가하여 SVM을 사용할 수 있다. 

 

 

    X, y  = make_moons(n_samples=100, noise=0.15)
    
    polynomial_svm_clf = Pipeline([
        ("poly_feathers", PolynomialFeatures(degree=3)),
        ("scaler", StandardScaler()),
        ("svm_clf", LinearSVC(C=10, loss="hinge"))
    ])

    polynomial_svm_clf.fit(X,y)

Moon 데이터셋을 가져와서 

 

1) 다항식 특성을 추가하고

2) 데이터를 표준화하고

3) 선형 SVM 모델로 훈련시킨다

 

이 과정을 파이프라인으로 연결시킨다. 

    for x_i in X:
        if polynomial_svm_clf.predict([x_i])==1:
            plt.scatter(x_i[0], x_i[1], c='red', marker='s')
        else:
            plt.scatter(x_i[0], x_i[1], c='blue', marker='o')
    plt.grid(linestyle='dotted')
    plt.show()

SVM으로 분류된 Moon 데이터셋

 

 

다항식 커널


SVM을 사용할 때, 커널 트릭이라는 기법을 사용할 수 있다. 

 

커널 트릭은 실제로 다항 특성을 추가하지 않으면서 다항식 특성을 추가한 것과 비슷한 효과를 얻을 수 있다. 

 

    X, y  = make_moons(n_samples=100, noise=0.15)
    poly_kernel_svm_clf = Pipeline([
        ("scaler", StandardScaler()),
        ("svm_clf", SVC(kernel="poly",degree=3, coef0=1, C=5))
    ])

SVC 객체에 3차 다항식 커널을 통해 훈련시켰다. coef0 파라미터는 차수에 얼마나 영향을 받을지 조정한다. 

 

SVM 다항 커널 값과 규제를 달리했을 경우를 비교

다항 커널의 값과 규제의 정도를 달리 적용했을 때의 SVM 모델의 예측한 결과를 비교한 사진이다. 

 

 

유사도 특성


비선형 데이터를 다루는 또다른 기법으로 유사도 특성을 들 수 있다. 

 

유사도 특성이란, 유사도 함수를 통해 특정 샘플이 특정 랜드마크와 얼마나 밀접한지 측정된 값을

 

새로운 특성으로 추가한 것이다. 유사도 함수를 방사 기저 함수(Radial basis function)으로 정의해보겠다. 

 

방사 기저 함수

방사 기저 함수는 랜드마크로 지명된 샘플 x와 나머지 샘플들과의 유사도를 계산한다. 

 

유사도 함수로 정의 가능한 여러 함수들

출처 : www.r-bloggers.com/2016/05/the-kernel-trick-in-support-vector-machines-seeing-similarity-in-more-intricate-dimensions/

이 유사도 특성이 기존 샘플들에 새로운 특성으로 추가된다. 특성이 추가된 샘플들을 SVM으로 훈련시킨 뒤 예측하면

 

랜드마크를 기준으로 샘플들의 군집이 형성된다. 

 

데이터셋의 모든 샘플들을 랜드마크로 지정하면 샘플들을 선형적으로 구분하는 것이 가능해지는데, 

 

샘플들의 수가 많다면, 그에 따라 다른 샘플들도 서로 데이터셋의 크기만큼 특성을 추가해야하므로,

 

특성의 수가 매우 많아진다는 단점이 있다. 

 

 

가우시안 RBF 커널 


유사도 특성을 추가하지 않고, 커널 트릭을 통해 유사도 특성을 추가한 것과 같은 효과를 누릴 수 있다. 

    rbf_kernel_svm_clf = Pipeline([
        ("scaler", StandardScaler()),
        ("svm_clf", SVC(kernel="rbf", gamma=5, C=1000))
    ])
    rbf_kernel_svm_clf.fit(X,y)

gamma, C값을 달리 적용한 RBF 커널 SVM

gamma 값은 유사도 함수의 너비를 결정한다. gamma값이 클 경우, 유사도 함수가 좁아져서 샘플들의 영향 범위가

 

작아지고(과대적합 위험), gamma가 작을 경우 유사도 함수가 평탄해져서 샘플들의 영향 범위가 넓어져

 

군집이 넓어진다(과소적합 위험). 따라서 gamma가 규제의 역할을 한다. 

 

 

SVM 분류의 결정


출처 : www.researchgate.net/figure/Principle-of-support-vector-machine-SVM-A-maximummargin-hyperplane-that-separates-the_fig6_222682226

서포트 벡터 머신(SVM)에서는 결정함수 wx를 계산하여 0보다 크면 양성클래스(1) 0보다 작으면 음성클래스(0)으로

 

분류한다. 서포트 벡터로 선정된 샘플은 이 결정함수의 값이 -1 혹은 1인 샘플들이다. 

 

SVM은 이 마진이 최대한 커지도록 하는데, 이는 가중치 벡터의 노름 ||w||이 작아지는 결과를 낳게한다.