머신러닝 모델 소개 (2) - 서포트벡터머신 (Support Vector Machine, SVM)

Mozen

·

2023. 7. 10. 10:33

반응형

반응형

 

머신러닝 모델 소개 시리즈의 두 번째 글입니다. SVM(Support Vector Machine)은 로지스틱 회귀와 함께 분류를 위한 알고리즘으로 사용됩니다. 분류를 위한 경계선과 경계선에 가장 가까운 데이터 사이의 거리를 의미하는 margin을 최대가 되도록 하는 경계선을 찾아 분류하는 알고리즘입니다. 이번 글에서는 SVM의 기본 개념을 소개하고, 파이썬의 Scikit-learn 라이브러리를 활용하여 실제 데이터에 적용하는 방법을 알아보겠습니다.

 

1. 모델 소개

 

    SVM(Support Vector Machine)은 특히 분류 작업에서 높은 성능을 발휘하는 인기 있는 알고리즘 중 하나입니다. SVM은 데이터를 고차원 공간으로 매핑하여 선형 또는 비선형 분리 평면을 찾는 방식을 이용합니다. 데이터를 잘 분류하기 위해 서포트 벡터라 불리는 핵심 샘플들을 찾아내는 특징이 있습니다. 아래 그림은 비선형 분리를 수행한 SVM의 예시를 보여줍니다.

 

Non-linear SVM 예시

 

    SVM은 분류 작업을 위해 사용되며, 주어진 데이터를 두 개 이상의 클래스로 분류하는 문제에 특히 적합합니다. 또한, SVM의 경우 분류 작업 외에도 회귀 분석에도 사용할 수 있습니다. SVM은 데이터를 분리하는 초평면(hyperplane)을 찾는 것이 주요 목표입니다. 이 초평면은 데이터를 분류하기 위해 가장 큰 마진(margin)을 가지는 서포트 벡터들로부터 구성됩니다. 

 

SVM은 데이터를 분류하기 위해 가장 큰 마진을 갖는 서포트 벡터들을 구한다.

 

    SVM은 선형 분류와 비선형 분류 모두에 사용될 수 있으며, 비선형 분류에서는 커널 함수(kernel function)를 통해 데이터를 고차원 공간으로 매핑하여 선형 분리 가능한 문제로 변환합니다. 커널 함수에는 Polynomial 커널, Sigmoid 커널, Radial Basis Function(RBF) 커널 등 다양한 커널들이 존재하며, 이 중 RBF 커널이 가장 성능이 좋기 때문에 많이 쓰이고 있습니다. RBF 커널의 경우, SVM 공통의 매개변수인 C와 RBF 커널의 매개변수인 γ  총 두개의 매개변수를 가지고 있습니다. C는 데이터 샘플들이 다른 클래스에 놓이는 것을 허용하는 정도를 결정합니다. γ는 결정 경계의 곡률을 결정합니다. 두 매개변수의 최적 값은 grid search라는 기법을 통해서 찾게 됩니다. 이에 대해서는 다른 글에서 자세히 다루겠습니다.  

 

2차원 공간에서 분류할 수 없는 문제에 커널 함수를 적용하여 3차원 공간에서 분류를 수행한다.

 

 

2. Scikit-learn 라이브러리를 활용한 SVM 사용 방법

 

    SVM은 강력한 분류 알고리즘으로 알려져 있으며, Scikit-learn은 SVM을 쉽게 사용할 수 있는 기능을 제공합니다. 이번에는 Scikit-learn에 내장된 데이터세트를 활용하여 SVM 모델을 사용하는 예시를 살펴보겠습니다. Scikit-learn은 SVM을 구현한 다양한 클래스와 함수를 제공합니다. SVM을 사용하기 위해 필요한 라이브러리를 임포트 합니다. 

 

from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

 

    이제 사용할 데이터를 준비해야 합니다. Scikit-learn에는 다양한 내장 데이터세트가 있습니다. 그중에서 붓꽃 데이터세트(iris dataset)를 사용해 보겠습니다. Scikit-learn 라이브러리를 사용하면 'load_iris'함수를 통해 붓꽃 데이터세트를 불러올 수 있습니다. 붓꽃 데이터세트는 세 가지 종류의 붓꽃에 대한 측정값을 포함하고 있으며, 분류 작업에 널리 사용되는 데이터세트입니다.

 

# 붓꽃 데이터셋 로드
iris = datasets.load_iris()

# 독립 변수와 종속 변수 분리
X = iris.data
y = iris.target

 

    데이터를 학습용과 테스트용으로 나누는 것이 중요합니다. Scikit-learn의 train_test_split 함수를 사용하여 데이터를 나눌 수 있습니다. 아래 코드에서 'test_size=0.15'란 테스트 데이터세트를 전체 데이터세트의 15%로 설정한다는 뜻입니다. 또한, 'random_state=30'는 코드의 재현성을 확보하기 위한 설정입니다. 만약 'random_state'가 특정 숫자로 정의되어 있지 않으면, 코드를 실행할 때마다 학습 데이터세트와 테스트 데이터세트의 데이터가 달라집니다. 'random_state'의 숫자는 0 이상의 정수로 아무 숫자를 사용해도 괜찮습니다.

 

# 학습용 데이터와 테스트용 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=30)

 

    이제 SVM 모델을 만들고 학습시키는 작업을 수행합니다. Scikit-learn의 SVC 클래스를 사용하여 모델을 초기화하고 fit 메서드를 사용하여 모델을 학습시킵니다.

 

# SVM 모델 초기화
model = SVC()

# 모델 학습
model.fit(X_train, y_train)

 

    모델 학습이 완료되면, 테스트 데이터를 사용하여 예측을 수행하고 모델의 성능을 평가할 수 있습니다.

 

# 테스트 데이터 예측
y_pred = model.predict(X_test)

# 정확도 계산
accuracy = accuracy_score(y_test, y_pred)

 

    위와 같이 SVM 모델을 구축하고 예측을 수행한 뒤 정확도를 계산하여 모델의 성능을 평가할 수 있습니다. SVM은 다양한 분류 문제에 적용될 수 있습니다. 예를 들어, 이메일 스팸 분류, 질병 진단, 이미지 분류 등 다양한 실제 문제에 SVM을 적용할 수 있습니다. Scikit-learn을 사용하면 간편하게 SVM 모델을 구축하고 데이터를 분석할 수 있으며, 다른 머신러닝 알고리즘과 함께 조합하여 더 복잡한 예측 모델을 구축할 수도 있습니다. 이처럼 Scikit-learn을 활용하여 SVM을 구현하고 실제 데이터에 적용하는 방법을 알아보았습니다. SVM은 강력한 분류 알고리즘으로 알려져 있으며, Scikit-learn을 통해 쉽게 사용할 수 있습니다. 데이터 분류와 예측에 SVM을 적용하여 다양한 문제를 해결할 수 있습니다.

 

머신러닝 모델 소개 시리즈

2023.07.04 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (1) - 선형 회귀 모델 (Linear Regression)

2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (2) - 서포트벡터머신 (Support Vector Machine, SVM)

2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (3) - KNN (K-Nearest Neighbor)

2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (4) - 랜덤 포레스트 (Random Forest)

2023.07.10 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (5) - 에이다부스트 (AdaBoost)

2023.07.11 - [인공지능, 머신러닝, 딥러닝] - 머신러닝 모델 소개 (6) - 다층 퍼셉트론 (Multilayer Perceptron)

반응형