[BDA 11기] 데이터 분석 모델링(ML1) - 10주차

2026. 1. 5. 17:18·BDA-11th

🌀 SVM


1. SVM (Support Vector Machine)

  • 두 클래스가 존재한다고 가정
    • e.g. 0(파란색 클래스)와 1(주황색 클래스)
  • SVM의 핵심 아이디어: 두 클래스 사이에 가장 넓은 도로를 내는 것
  • 즉, 두 클래스 사이의 가장 넓은 도로를 찾고 그 가운데 중앙선을 모델이라고 함.
  • 분류와 회귀에서 모두 사용 가능

중요한 용어 정리

결정 경계(Decision Boundary)

  • 클래스를 구분하는 경계선, 도로의 중앙선
  • SVM에서 결정 경계가 바로 모델!
  • 수학적으로는 초평면(hyper plane)이라고 부름

백터(Vector)

  • 모든 데이터 포인트
  • 각각의 관측치(샘플)를 의미

서포트 벡터(Support Vector)

  • 결정 경계와 가장 가까운 데이터 포인트
  • 도로의 가장자리에 놓인 점들
  • 특징
    • 전체 데이터 중 일부만 모델을 결정
    • 이 점들이 이동하면 결정 경계와 마진도 함께 변함

마진(Margin)

  • 서포트벡터와 결정경계 사이의 거리. 도로의 폭.
  • SVM의 목표: 폭이 가장 넓은 도로를 뚫는 것 (= 마진 최대화)
  • 마진이 클 수록 새로운 데이터에 대해 안정적 분류가 가능

결정 경계(Decision Boundary)와 마진

model1

  • 모델은 하나의 오차도 허용하지 않고 완벽히 분류
  • But, 마진이 매우 좁음
  • 파란색 클래스 데이터가 조금만 벗어나도 잘못 분류될 가능성이 큼 → 일반화 성능 ↓

model2

  • 주황색 클래스에 대해 일부 오차(2개)를 허용
  • 마진이 넓음
  • 기존 데이터에서 조금 벗어나도 안정적으로 분류 가능 → 일반화 성능 우수




2. 비용(C)

마진과 오류

  • 마진(도로의 폭)은 가능한 넓게 & 오류는 가능한 적게
  • 마진의 크기와 오류에 대한 허용 정도는 Trade-off
  • 조절할 수 있는 것: 비용(C)

C 값을 높이면

  • 오류를 허용하지 않으려는 비용 증가
  • 결과적으로 훈련 데이터에 최대한 맞춘 결정 경계 선택
  • 마진이 좁하질 가능성 증가
  • 특징:
    • 학습 데이터 성능 ↑
    • 테스트 데이터 성능 ↓ 가능
  • ➔ Overfitting 가능성 높아짐

C 값을 낮추면

  • 오류를 허용하는 비용 감소
  • 일부 오차를 감수하고 마진이 넓은 결정 경계 선택
  • 특징
    • 학습 데이터 성능 ↓
    • 테스트 데이터에서 안정적인 성능 가능
  • ➔ Underfitting 가능성 높아짐




🌀 SVM 실습

(1) import

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.model_selection import train_test_split
from sklearn.datasets import make_moons, make_classification

from sklearn.svm import SVC

import warnings    # 경고메시지 제외
warnings.filterwarnings(action='ignore')

(2) svm 모델을 시각화 하는 함수 만들기

def svm_visualize(x, y, model, title = "") :

    xx, yy = np.meshgrid(np.linspace(x[:,0].min(), x[:,0].max(), 50),
                         np.linspace(x[:,1].min(), x[:,1].max(), 50)) # mesh grid

    # 메쉬 그리드값에 대해 모델 부터 거리 값 만들기.
    Z = model.decision_function(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    # 그래프 그리기
    plt.figure(figsize=(4, 4))
    # 데이터 산점도
    sns.scatterplot(x=x[:,0], y=x[:,1], hue=y)
    # levels= 0 모델 ,  -1, 1 은 마진 경계
    plt.contour(xx, yy, Z, levels=[-1, 0, 1], colors = 'gray',linestyles  = ['--','-','--'])
    plt.title(title)
    plt.axis("tight")
    plt.show()

(3) 샘플 데이터 생성

seed = 8

x, y = make_classification(n_samples=100,
                        n_features=2,
                        n_redundant=0,
                        weights = [0.5, 0.5],  # class 0과 1의 비율 조정 ==> class imbalance 상황만들기
                        n_clusters_per_class=1,
                        random_state=seed)
sns.scatterplot(x=x[:,0],y=x[:,1], hue = y)
plt.show()

(4) SVM 모델 생성 및 시각화

model = SVC(kernel = 'linear', C = 10)
model.fit(x,y)
svm_visualize(x, y, model)
C=0.1 C=10 C=50

(5) 결정 경계와 마진

seed = 34
x, y = make_classification(n_features=2, n_redundant=0, weights = [0.5, 0.5],
                        n_clusters_per_class=1, random_state=seed)
sns.scatterplot(x=x[:,0],y=x[:,1], hue = y)
plt.show()

(6) cost 값에 따른 모델

cost = 40
model = SVC(kernel = 'linear', C = cost)
model.fit(x,y)
svm_visualize(x, y, model, cost)
C=0.1 C=10 C=40




🌀 비선형 SVM

1. 커널 트릭(Kernel Trick)

매핑 함수

  • 비선형 데이터 문제를 해결하기 위해
  • 저차원 공간의 데이터를 고차원 데이터로 변환하는 함수
  • 원래 구분되지 않던 데이터가 선형 분리 가능해질 수 있음
  • 문제점: feature수가 과도하게 증가하여 연산 시간이 엄청나게 길어짐 → 계산 비용 커짐

커널 트릭

  • 실제 고차원 feature를 생성하지 않음
  • 대신, 고차원 공간에서의 내적 결과만 계산
  • → 고차원 feature를 확장한 것과 동일한 효과



2. 커널 종류

poly(Polynomial Kernel)

  • 다차항(polynomial) 커널
  • 입력 변수들 조합을 통해 곡선 형태 결정 경계 생성
  • 주요 하이퍼파라미터 : degree(차수), coef0(다차항 별 영향도 조절), C (오차 비용),
    gamma(결정경계 복잡도)

⭐rbf(Radial Basis Function)

  • 보통 가우시안 커널이라고 부름. 가우시안분포(정규분포)를 이용
  • 대부분 rbf를 많이 씀. SVM에서 default가 rbf임!
  • 주요 하이퍼파라미터 : C (오차 비용), gamma(결정경계 복잡도)

sigmoid

  • 시그모이드 함수 기반 커널

선형 SVM과 비선형 SVM 비교



3. 비선형 SVM에서의 Hyper Parameter

COST

  • rbf 커널에서 Cost의 변화
    • Cost가 증가할 수록 마진의 폭이 줄어들고, 오차를 줄이기 위한 모델이 생성
    • 마진 폭이 줄어들 수록 모델이 복잡해짐.


Gamma

  • 하나의 데이터 포인트가 결정 경계 형성에 영향을 미치는 범위를 의미
  • 직관적으로 결정 경계의 곡률을 조절
  • gamma 값이 클 수록
    • 곡률 반경이 작아짐
    • 결정 경계가 매우 세밀하고 복잡해짐
  • Train Set에 잘 fitting 됨.
  • But, 다른 데이터에서는 잘 안 맞을 가능성 증가 → 과적합 위험 증가




🌀 비선형 SVM 실습

(1) 데이터 생성 및 시각화

x, y = make_moons(n_samples = 200, noise = .13, random_state = 10)

plt.figure(figsize = (6,6))
sns.scatterplot(x=x[:,0], y=x[:,1], hue = y)
plt.show()

(2) 선형경계로 분류

model = SVC(kernel = 'linear')
model.fit(x,y)
svm_visualize(x, y, model)

(3) 커널 트릭 사용: rbf

model = SVC(kernel = 'rbf', C = 1)
model.fit(x,y)
svm_visualize(x, y, model)
C=0.1 C=1 C=10

(4) 하이퍼파라미터 - Cost에 따른 결정경계 변화

for cost in [0.1, .5, 2, 20] :
    model = SVC(kernel = 'rbf', C = cost)
    model.fit(x,y)
    svm_visualize(x, y, model, cost)
C=0.1 C=0.5 C=2 C=20

(5) 하이퍼파라미터 - Gamma 따른 결정경계 변화

for g in [.5, 1, 5, 10] :
    model = SVC(kernel = 'rbf', C = 2, gamma =  g)
    model.fit(x,y)
    svm_visualize(x, y, model, g)
C=0.5 C=1 C=5 C=10

즉, Cost와 Gamma는 모델의 복잡도와 일반화 성능을 결정하는 핵심 하이퍼파라미터이므로,
튜닝을 통해 최적의 조합을 탐색해야 한다!



'BDA-11th' 카테고리의 다른 글

[BDA 11기] 데이터 분석 모델링(ML1) - 11주차  (0) 2026.01.15
[BDA 11기] 데이터 분석 모델링(ML1) - 10주차 모델링 실습  (0) 2026.01.06
[BDA 11기] 데이터 분석 모델링(ML1) - 9주차  (0) 2026.01.04
[BDA 11기] 데이터 분석 모델링(ML1) - 8주차  (0) 2026.01.04
[BDA 11기] 데이터 분석 모델링(ML1) - 6주차  (0) 2026.01.04
'BDA-11th' 카테고리의 다른 글
  • [BDA 11기] 데이터 분석 모델링(ML1) - 11주차
  • [BDA 11기] 데이터 분석 모델링(ML1) - 10주차 모델링 실습
  • [BDA 11기] 데이터 분석 모델링(ML1) - 9주차
  • [BDA 11기] 데이터 분석 모델링(ML1) - 8주차
choisio2
choisio2
sio2-dev 님의 블로그 입니다.
  • choisio2
    SiO2 for Developer
    choisio2
  • 전체
    오늘
    어제
    • 분류 전체보기 (46) N
      • TAVE-16th (14)
      • BDA-11th (16)
      • C++ (5)
      • 개인 프로젝트 (4)
      • 백준 (4) N
      • 컴퓨터 그래픽스 (1)
      • 잡담 (1)
  • 블로그 메뉴

    • 태그
    • 방명록
  • 링크

    • github.com/choisio2
  • 공지사항

  • 인기 글

  • 태그

    백준
    spotify
    알고리즘
    바이브코딩
    알고리즘스터디
    BDA #데이터분석모델링
    polling
    playconsole
    데시벨측정
    BDA
    AI시대
    개발자미래
    BDAI
    KakaoOauth
    calculator
    프론트엔드
    kotin
    geminicli
    C++
    SpotifyAPI
    코테
    백준1463
    kotlin
    frontend
    viewpager2
    androidstudio
    Tave
    데이터분석모델링
    개발자
    코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
choisio2
[BDA 11기] 데이터 분석 모델링(ML1) - 10주차
상단으로

티스토리툴바