본문 바로가기

수업내용정리/인공지능

[SckitLearn]지도학습 알고리즘(4)_SVM 회귀의 특징과 사용법

저번 시간에는 비선형 서포트 벡터 머신(SVM) 분류기의 기본적인 개념과 사용법을 살펴보았다.
이번시간에는 SVM 분류가 아닌 SVM 회귀에 대해 알아보도록 하자.


SVM 회귀란?

SVM 회귀에 대해 알아보기 전에 SVM 분류가 어떤 식으로 동작하는지 살펴봤던 기억을 떠올릴 필요가 있다.

SVM 분류는 아래처럼 기준선과 샘플(서포트 벡터) 간의 거리(마진)가 최대가 되도록 하며, 기준선과 마진 사이에 샘플이 최대한 적게 들어가도록(마진 오류가 적도록) 선을 긋는 것이다. 

[그림-1] SVM 선형 분류기

선형 SVM분류기의 경우, 기준선과 각 클래스 간의 거리(margin)가 가장 크도록 선을 긋는다. 그래서 라지 마진 분류(large margin classification)라고 불린다.

 

회귀는 분류와 같이 기준선과 샘플 간의 거리(마진)는 최대한으로 한다.

하지만, 분류와 달리 마진 내에 샘플들이 많이 들어가도록 하며 기준선을 긋는다는 차이가 존재한다.

 

아래의 선형 데이터셋 예제로 SVM 회귀가 어떻게 동작하는지 살펴보도록 하자.

[그림 1] sklearn.datasets.make_regression() 으로 만든 데이터셋

 

[그림 1]을 보면 선형적으로 증가하는 데이터셋이 만들어진 것을 확인할 수 있다.

이 데이터셋을 가지고 마진의 폭(epsilon)이 100선형 SVM 회귀모델을 만들어보도록 하자.

 

[그림 2] sklearn.svm.LinearSVC() 로 만든 회귀 모델

[그림 2]를 보면 마진의 폭이 100선형 SVM 회귀모델이 만들어진 것을 확인이 가능하다.

 

그렇다면 [그림 1]처럼 선형적인 데이터가 아니라 [그림 3-1]처럼 비선형적인 특성을 지닌 데이터는 어떻게 해야 하는가?

[그림 3-1] 비선형적인 데이터

비선형 SVM 분류 때와 마찬가지로 커널함수를 사용하면 된다.

2차식의 다항식 커널함수를 사용한 결과 [그림 3-2]과 같은 결과를 얻을 수 있다. 확인해 보면 모델이 잘 만들어진 것을 확인이 가능하다. 

[그림 3-2] 비선형 SVM 회귀

SVM 회귀 사용하기

선형 SVM 회귀

 

선형 SVM 회귀는 sklearn.svm.LinearSVR()으로 회귀 모델을 만들 수 있다.

 

from sklearn.svm import LinearSVR
import numpy as np
from sklearn.datasets import make_regression

#훈련 샘플 생성
X,y = make_regression(n_samples = 100, n_features = 1, noise = 50, random_state = 2021)

#모델 불러오기 및 학습
svr_model = LinearSVR(epsilon=100)
svr_model.fit(X,y)

#시각화
xline = np.linspace(X.min(),X.max(),num=100)
xline = xline.reshape(100,1)
y_pred = svr_model.predict(xline)

plt.scatter(X,y,color="orange")
plt.plot(xline,y_pred,color="red")
plt.plot(xline,y_pred+100,"r--")
plt.plot(xline,y_pred-100,"r--")

 

파라미터

epsilon 도로의 폭.
tol 중지 기준에 대한 허용 오차.
C 오류를 얼마나 허용할 지에 대한 수치. C가 클수록 오류를 적게 허용하고, 낮을수록 오류를 많이 허용한다. (규제항)
random_state 데이터를 섞을 때 사용할 난수를 만드는 시드값. 미지정시 기본적으로 시스템이 알아서 섞는다.
max_iter 최대 반복 횟수. 기본은 1000이다.

 

비선형 SVM 회귀 

 

비선형 SVM 회귀의 경우 sklearn.svm.SVR()을 통해 모델을 만들 수 있다.

 

from sklearn.svm import SVR
import numpy as np

#random seed 결정
np.random.seed(2021)

#훈련 데이터셋 만들기
m = 100
X2 = 2 * np.random.rand(m, 1) - 1
y2 = (0.2 + 0.1 * X2 + 0.5 * X2**2 + np.random.randn(m, 1)/10).ravel()

#모델 만들기 및 학습
svr_model2 = SVR(kernel="poly", degree=2, C=100, epsilon=0.1, gamma="scale")
svr_model2.fit(X2,y2)
y_pred2 = svr_model2.predict(xline)

#모델 시각화
plt.figure(figsize=(10,4))
plt.subplot(1,2,1)
plt.scatter(X2,y2,color="orange")
plt.subplot(1,2,2)
plt.scatter(X2,y2,color="orange")
plt.plot(xline,y_pred2,color="red")
plt.plot(xline,y_pred2+0.1,"r--")
plt.plot(xline,y_pred2-0.1,"r--")
plt.axis([-1,1,0,1])

 

파라미터

epsilon 도로의 폭.
tol 중지 기준에 대한 허용 오차.
C 오류를 얼마나 허용할 지에 대한 수치. C가 클수록 오류를 적게 허용하고, 낮을수록 오류를 많이 허용한다. (규제항)
random_state 데이터를 섞을 때 사용할 난수를 만드는 시드값. 미지정시 기본적으로 시스템이 알아서 섞는다.
max_iter 최대 반복 횟수. 기본은 1000이다.

참조

Geron Aurelien, 박해선 역, 핸즈온 머신러닝, 한빛미디어, 2020

 

https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html

 

sklearn.svm.SVR

Examples using sklearn.svm.SVR: Prediction Latency Prediction Latency Comparison of kernel ridge regression and SVR Comparison of kernel ridge regression and SVR Support Vector Regression (SVR) usi...

scikit-learn.org

 

https://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVR.html

 

sklearn.svm.LinearSVR

 

scikit-learn.org