now is better than never

5. [지도학습] 서포트 벡터 머신 (Support Vector Machine - SVM) 본문

머신러닝 & 딥러닝

5. [지도학습] 서포트 벡터 머신 (Support Vector Machine - SVM)

김초송 2023. 3. 30. 14:58

서포트 벡터 머신 (SVM)

  •  지도학습 기법으로 고차원 또는 무한 차원의 공간에서 초평면을 찾아
    이를 이용하여 분류와 회귀(수치예측)를 수행하는 알고리즘
  • 선형 / 비선형 둘 다 가능
  • 적은 데이터로도 분류 가능
    이진 분류만 가능

 

결정경계

  • 분류를 위한 기준선
  • 2차원일 때는 선, 3차원일 때는 평면이 됨 

 

서포트 벡터

  • 결정경계와 가까지 있는 데이터 포인트들
  • 경계를 정의하는 결정적인 역할을 함

 

마진

  • 점선으로 부터 결정경계까지의 거리
  • 최적의 결정경계는 마진을 최대화 함
  • 마진을 최대화해야하는 이유
    : 훈련 데이터로 잘 분류해야 할 뿐만 아니라 테스트 데이터도 잘 분류 해야하기 때문
  • 하드 마진
    훈련 데이터의 이상치까지 분류 (까다롭게)
    서포트 벡터와 결정경계 사이 거리가 좁음 = 마진 작음
    -> overfitting 문제 발생
  • 소프트 마진
    이상치는 제외하고 분류 = 이상치들을 마진 안에 포함
    서포트 벡터와 결정경계 사이 거리가 멂

 

이상치들을 허용하는지 결정하는 하이퍼 파라미터

  1. C
    • 값이 클수록 하드 마진, 작을 수록 소프트 마진
  2. gamma
    • 비선형일 때 얼마나 유연하게 선을 그릴 것인지,
    • 값이 클수록 학습데이터에 의존 = 이상치 포함 -> 오버피팅

 

로지스틱 회귀 VS 서포트 벡터 머신

  • 로지스틱 회귀 : 이진 분류하는 머신러닝 모델
  • 로지스틱 회귀 수식을 개선한 것이 소프트 벡터 머신
  • 로지스틱 회귀 분석 순서
    1. 데이터 생성
    2. 모델 생성
    3. 모델 훈련
    4. 모델 예측
    5. 분류 시각화
    6. 모델 평가
from sklearn.datasets import make_blobs
x, y = make_blobs(centers=4, random_state=8)
y = y % 2

import mglearn
import matplotlib.pyplot as plt
mglearn.discrete_scatter(x[:, 0], x[:, 1], y)

from sklearn.linear_model import LogisticRegression
logistic_model = LogisticRegression()
logistic_model
logistic_model.fit(x, y)

mglearn.plots.plot_2d_seperator(model, x) # 결정경계선 출력
mglearn.discrete_scatter(x[:, 0], x[:, 1], y)

logistic_model.score(x, y)
  • centers : 4개의 클래스 생성
  • x = 독립변수
    y = 종속변수
from sklearn.svm import SVC
SVM_model = SVC()
SVM_model.fit(x, y)

# 시각화
mglearn.plots.plot_2d_seperator(SVM_model, x) 
mglearn.discrete_scatter(x[:, 0], x[:, 1], y)

SVM_model.score(x, y)
  • 모델 생성할 때 하이퍼 파라미터 C 설정 가능

 

R로 SVM 모델 구현

iris <- read.csv("C:/Data/iris.csv", stringsAsFactors = TRUE)
head(iris)

colSums(is.na(iris))

normalize <- function(x) { (x-min(x)) / (max(x)-min(x))}
iris_norm <- as.data.frame(lapply(iris[ , -5], normalize))
summary(iris_norm)

iris2 <- cbind(iris_norm, Species = iris$species)

library(caret)
set.seed(1)

split <- createDataPartition(iris2$Species, p =0.9, list=F)

train <- iris2[split, ]
test <- iris2[-split, ]
nrow(train)
nrow(test)

install.packages("e1071")
library(e1071)

svm_model <- svm(Species ~ ., data=train, kernel='linear')
svm_model

result <- predict(svm_model, test[ , -5])
result

sum(result == test$Species) / length(test$Species) * 100
  • kernel : 선형 / 비선형 선택
    - linear :  선형
    - radial : 비선형

 

본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.