🎶 SVM에 대해 알아보자!
지난 포스트에서는 k-means clustering에 대해 알아봤다.
K-means clustering 에 대해 알아보고 python 으로 구현해보자!
K-means clustering 에 대해 알아보고 python 으로 구현해보자!
🎶 K-means clustering이란? 지난 포스트에서는 차원 축소와 주성분 분석에 대해 알아봤다.차원 축소(Dimension reduction) - 주성분분석(PCA) 차원 축소(Dimension reduction) - 주성분분석(PCA)🎶 차원 축소에 대
ybbbb.tistory.com
이번 포스트에서는 'SVM'에 대해 살펴보도록 하겠다.
SVM 이하 서포트 벡터 머신(support vector machine)은,
인공 신경망이 딥러닝을 통해 인공지능 분야의 중심으로 떠오르기 전에 가장 각광받던 학습 방법 중 하나로써, 두 데이터 그룹을 나누는 '초평면(hyperplane)'을 찾으면서 이 폭이 가장 넓은 것을 찾는 머신러닝 기법이다.
(🎃 초평면은 3차원 공간 속 평면을 뜻하는 말로, 여기서는 데이터를 구분짓는 선이라고 생각하면 된다.)
이 폭을 '마진(margin)'이라고 부르는데, 어떠한 데이터도 이 마진 내에 들어오지 않을 경우 '하드 마진(hard margin)'이라고 부르고, 일부 데이터가 마진 내에 들어오도록 허용할 경우 '소프트 마진(soft margin)'이라고 부른다.
(🎃 참고로 양쪽 마진 내에 붙어 있는 데이터들 서포트 벡터(support vector)라고 부른다.)
SVM에서는 이 마진의 넓이가 큰 값이 될수록 학습이 잘 됐다고 여길 수 있는데, 이는 다음과 같은 SVM 최적화 문제에 여실히 들어나 있다.
첫 번째 수식이 바로 최적화해야 할 목적함수이고, 두 번째 수식이 목적함수를 최적화 할때의 제약조건이다.
(🎃 y는 레이블 값으로써, +1일 경우 위(오른쪽)에, -1일 경우 아래(왼쪽)로 분류하도록 설정하는 것이다.)
그런데, 하드 마진 SVM을 사용할 경우 잡음에 민감하고 분류가 제대로 이루어지지 않을 수 있어서 대체로 소프트 마진 SVM을 사용한다. 즉, 소프트 마진을 사용하는 자체가 모델 정칙화(regularization)의 일종이라고 여길 수 있는 것이다!
(🎃 잡음에 민감하다는 것은 데이터에 과적합 된다는 것을 의미한다.)
소프트 마진을 사용할 때는 마진 내에 들어갈 수 있는 데이터의 수를 제어하며 이 값을 제어하는 변수를 사용하는데, 이 변수가 바로 '슬랙(slack) 변수'이다.
첫 번째 수식에서
이렇게 선형 조건들만으로 데이터를 예쁘게 분리할 수 있으면 좋겠지만, 대부분 현실세계의 데이터는 단순히 선형적인 선 만으로 구분하기 힘들다는 것이 정론이다!
그래서 비선형적 관계를 갖는 데이터간의 초평면을 찾는 것이 무엇보다도 중요한데, 이를 위해서 도입한 것이 바로 '커널 트릭'이다.
커널 트릭(kernel trick)이란,
원래의 특징 공간 A를 새로운 특징 공간 B로 변환하여 선형에 가까운 데이터 분포로 만들 때 커널 함수를 사용하는 것으로, 요약하자면 비선형 데이터를 고차원 공간으로 매핑하여 선형적으로 분리 가능한 형태로 변환하는 기법이다.
이 때 이 커널 함수는 원래 특징 공간에서 직접 계산을 수행하지 않고도 고차원 공간으로의 비선형 매핑을 간접적으로 수행할 수 있도록 해주는 역할을 도맡는데, 대표적인 예로는 다음과 같은 것들이 있다.
(1) 다항식 커널(Polynomial Kernel)
(2) RBF 커널 이하 가우시안 커널(Radial Basis Function Kernel)
바로 이 함수를 활용해서, SVM에서의 내적을 구하는 부분을 커널 K로 대체하는 것이다!
⚔️ 즉, 커널 함수를 사용하면 고차원 공간에서의 내적을 직접 계산하지 않고도 효율적으로 계산할 수 있음과 동시에, 입력 데이터 값들을 선형적으로 분리시키는 부수효과까지 얻게 되는 것이다.
👓 이제 앞서 살펴본 SVM을 python으로 직접 구현해보자!
우선 관련 라이브러리들을 임포트하고 임의의 데이터셋을 생성하자.
(🎃 make_blobs 함수는 k-means clustering 에서 설명했으니 포스트 맨 위 링크를 참조하길 바란다.)
그 후 데이터들을 훈련 데이터와 테스트 데이터로 분리 및 전처리를 진행한다.
- train_test_split는 test_size 비율만큼 훈련 데이터와 테스트 데이터로 나누는 함수로써, 여기서는 train 데이터만 사용하므로 그다지 중요한 함수는 아니다. 다만, 머신러닝을 구현할 때 자주 쓰이는 함수니까 기억해두자!
- StandardScaler 함수는 아래 포스트를 참조하길 바란다.
신경망튜닝 - 데이터 전처리와 드롭아웃(drop-out)
신경망튜닝 - 데이터 전처리와 드롭아웃(drop-out)
🎶 인공신경망의 성능을 향상시키기 위한 튜닝 방안에는 어떤 것들이 있을까? 지난 포스트에서는 인공신경망의 파라미터 학습에 밀접한 연관성을 갖는 경사하강법의 여러 가지 최적화 방안에
ybbbb.tistory.com
SVM 모델을 생성 및 훈련하고, 이를 시각화하기 위한 함수를 정의한다.
(🎃 def로 정의한 사용자 설정 함수는 그냥 시각화를 위한 함수이므로, 이해가 되지 않는다면 넘어가도 좋다. 단 밑의 두 개의 함수는 SVM과 관련된 내장함수이므로 알고 넘어가는 것이 좋다.)
- model.predict()은 각 데이터셋에 대해 0 또는 1의 레이블을 반환하는 내장함수. 즉, 초평면에 의해 분리된 데이터셋의 레이블을 결정한다.
- model.supprot_vectors_ 는 생성한 SVM모델의 서포트 벡터를 리턴한다.
이제 subplot을 활용해 원본 데이터와 SVM모델을 통해 분리된 레이블 및 초평면을 확인해보자.
오른쪽 SVM 모델에서 Support Vectors가 바로 서포트 벡터로써, 실제로 모델을 저장할 때에는 이 서포트 벡터들만 저장하기 때문에 저장 효율 측면에서도 SVM 모델이 우수하다.
각설하고, 출력 결과를 통해 SVM 모델이 두 데이터의 레이블을 잘 분리하고 있다는 사실을 확인해 볼 수 있다. 위에서 구현한 코드는 단지 훈련에 사용된 데이터들을 시각화를 위해 SVM모델과 함께 찍은 것에 불과하기 때문에, 독자들은 위 코드에서 test 데이터를 활용해 SVM 모델에 데이터를 집어 넣었을 때, 구현한 모델이 데이터를 잘 구분하는지 직접 확인해 보길 바란다!
(🎃 데이터를 잘 구분하는지 확인하기 위해서는, 위에서 설명한 predict을 활용해야 한다.)
'머신러닝' 카테고리의 다른 글
OpenAI Gym - OpenAI Gym 개념과 cartPole-v1, 그리고 정책 하드코딩 (0) | 2025.04.06 |
---|---|
앙상블(Ensemble) - 배깅(Bagging), 부스팅(Boosting), 스태킹 (0) | 2025.01.30 |
[RL] 강화학습(Reinforcement Learning) - 에이전트, 정책, 정책탐색, 환경, 리턴, 할인율 (2) | 2025.01.16 |
[RL] 강화학습 알고리즘 - PPO (Proximal Policy Optimization) with TRPO, Clipped Surrogate Objective, GAE, 상태가치함수, 엔트로피 보너스 (2) | 2025.01.15 |
K-means clustering 에 대해 알아보고 python 으로 구현해보자! (0) | 2025.01.05 |
차원 축소(Dimension reduction) - 주성분분석(PCA) (0) | 2025.01.01 |
LSTM과 GRU - 장기 의존성 문제를 해결한 RNN (2) | 2024.12.31 |
RNN(Recurrent Neural Networks)이란? (0) | 2024.12.30 |