py
SVM
#
Find similar titles
- 최초 작성자
- 최근 업데이트
Structured data
- Category
- Statistics
Table of Contents
서포트 벡터 머신(SVM) #
서포트 벡터 머신(SVM) #
서로 다른 범주에 속한 인스턴스들 간의 거리를 최대한 크게 만드는 인스턴스들을 선택하는 방법으로 초평면을 얻는 지도 학습 기법이다.
다음 그림은 두 범주(검은색, 흰색)와 두 속성(X1, X2)의 2차원 공간에 대한 예제이다.
이미지 출처 : https://ko.wikipedia.org/wiki/%EC%84%9C%ED%8F%AC%ED%8A%B8_%EB%B2%A1%ED%84%B0_%EB%A8%B8%EC%8B%A0
녹색 초평면(H3)은 일부의 분류를 오류로 만들기 때문에 두 범주를 구분할 수가 없다. 대신 파란색(H1)과 빨간색 초평면(H2)은 오류없이 두 범주를 구분한다.
그러나 빨간색 초평면(H2)은 최대한 넓은 폭으로 두 범주를 구별한다. 두 범주에서 가까운 인스턴스간 거리가 가장 먼 초평면이다. 이러한 접근법의 최대 장점은 일반화 오차를 낮추고, 모델이 과적합화(Over-fitting)되지 않도록 방지한다.
SVM의 장,단점 #
장점 #
SVM의 가장 뛰어난 장점은 학습할 속성이 고차원 속성 공간일때 매우 효율적이다. 즉, 데이터가 희소(Sparse)일때 SVM은 매우 효율적이다. 학습 공간에서 점의 부분집합을 결정 평면으로 표현하기 때문에 메모리 공간의 관점으로 SVM은 매우 효율적이다.
단점 #
SVM 모델은 매우 계산 집중적일 수 있고 모델을 훈련하면서 어떻게 예측되었는지에 대한 수치 지시자를 반환하지 않는다.
SVM 예제 #
얼굴 인식에 SVM을 적용해보고자 한다. 먼저 학습데이터는 라벨된 사람 얼굴 이미지인 인스턴스 그룹이고, 보지 못한 새로운 인스턴스의 라벨을 예측하는 모델을 학습 시킨다. 즉, 이미지 픽셀 값이 학습 속성이 되고, 개별의 라벨이 목적 범주가 된다.
Import dataset #
Dataset은 40명의 총 400개 얼굴에 대한 이미지이다. 참고로 이들 이미지는 다른 조명 조건과 얼굴 표정으로 구성되어 있다.
import sklearn as sk
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_olivetti_faces
faces = fetch_olivetti_faces()
print(faces.DESCR)
이미지 출처 : 예제 데이터를 직접 코딩(Jupyter)
데이터 셋의 정보는 images, data, target 등으로 구성되어 있으며, image는 400개의 얼굴 이미지이고, data는 64 X 64 픽셀로 구성된 400개의 얼굴에 대한 픽셀 배열을 포함하며, target은 0부터 39까지의 목적 범주 배열이다.
이미지 출처 : 예제 데이터를 직접 코딩(Jupyter)
서포트 벡터 머신 훈련 #
Scikit-learn의 SVM을 사용하기 위하여 sklearn.svm 모듈에서 SVM 클래스를 임포트하고, 데이터 셋을 훈련 데이터(75%)와 테스트 데이터(25%)로 구분한다.
이미지 출처 : 예제 데이터를 직접 코딩(Jupyter)
자체적인 훈련 데이터에 대한 훈련을 수행하고 테스트 데이터에 대한 성능을 평가해보면, 다음과 같이 훈련한 후 평가하면 분류기는 거의 오차없이 수행되는 것을 확인할 수 있다.
이미지 출처 : 예제 데이터를 직접 코딩(Jupyter)
안경을 쓴 사람과 그렇지 않은 사람에 대한 분류 #
그렇다면 안경을 쓴 사람과 그렇지 않은 사람에 대한 분류를 진행해보자. 먼저 안경을 쓴 사람에 대한 이미지를 정의하는 것이 가장 우선이다.
## 안경 쓴 사람 이미지 색인 ##
glasses = [(10, 19), (30, 32), (37, 38), (50, 59), (63, 64), (69, 69), (120, 121), (124, 129), (130, 139), (160, 161), (164, 169), (180, 182), (185, 185), (189, 189), (190, 192), (194, 194), (196, 199), (260, 269), (270, 279), (300, 309), (330, 339), (358, 359), (360, 369)]
그 후 안경을 쓰지 않은 얼굴에는 0, 안경을 쓴 얼굴에는 1이라는 새로운 목적 범주를 적용한다.
def create_target(segments):
# 0으로 새로운 목적 배열 크기만큼 초기화한다.
y = np.zeros(faces.target.shape[0])
# 특정 부분에 1을 넣는다.
for (start, end) in segments:
y[start:end + 1] = 1
return y
target_glasses = create_target(glasses)
그에 따른 데이터 셋을 훈련 데이터(75%)와 테스트 데이터(25%)로 구분한다.
X_train, X_test, y_train, y_test = train_test_split(faces.data, target_glasses, test_size = 0.25, random_state = 0)
앞에서 정의해놓은 평가 함수를 통해 교차 검증을 수행하게 되면 약 0.970의 정확도를 얻는다.
svc_2 = SVC(kernel = "linear")
이미지 출처 : 예제 데이터를 직접 코딩(Jupyter)
참고 사이트 및 문헌 #
위키백과 서포트백터머신(https://ko.wikipedia.org/wiki/%EC%84%9C%ED%8F%AC%ED%8A%B8_%EB%B2%A1%ED%84%B0_%EB%A8%B8%EC%8B%A0)
scikit-learn을 활용한 파이썬과 기계학습(전철욱 옮김,2015)