now is better than never
5. [지도학습] 서포트 벡터 머신 (Support Vector Machine - SVM) 본문
서포트 벡터 머신 (SVM)
- 지도학습 기법으로 고차원 또는 무한 차원의 공간에서 초평면을 찾아
이를 이용하여 분류와 회귀(수치예측)를 수행하는 알고리즘 - 선형 / 비선형 둘 다 가능
- 적은 데이터로도 분류 가능
이진 분류만 가능
결정경계
- 분류를 위한 기준선
- 2차원일 때는 선, 3차원일 때는 평면이 됨
서포트 벡터
- 결정경계와 가까지 있는 데이터 포인트들
- 경계를 정의하는 결정적인 역할을 함

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

이상치들을 허용하는지 결정하는 하이퍼 파라미터
- C
- 값이 클수록 하드 마진, 작을 수록 소프트 마진
- gamma
- 비선형일 때 얼마나 유연하게 선을 그릴 것인지,
- 값이 클수록 학습데이터에 의존 = 이상치 포함 -> 오버피팅
로지스틱 회귀 VS 서포트 벡터 머신
- 로지스틱 회귀 : 이진 분류하는 머신러닝 모델
- 로지스틱 회귀 수식을 개선한 것이 소프트 벡터 머신
- 로지스틱 회귀 분석 순서
- 데이터 생성
- 모델 생성
- 모델 훈련
- 모델 예측
- 분류 시각화
- 모델 평가
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 : 비선형
본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.
'머신러닝 & 딥러닝' 카테고리의 다른 글
7. [비지도학습] 군집분석 (Clustering) (0) | 2023.04.03 |
---|---|
6. [비지도학습] 연관규칙 (Association Rules) (0) | 2023.03.31 |
4-2. [지도학습] 회귀분석 (Regression) (2) (0) | 2023.03.23 |
4. [지도학습] 회귀분석 (Regression) (1) (0) | 2023.03.22 |
3-2. [지도학습] 의사결정나무 (1R/Ripper) (0) | 2023.03.21 |