반응형
32. SVM(Support Vector Machines)
32.1 개요
32.1.1 예측 기법
Boser, Guyon 및 Vapnik에 의해 1992년 제안된 이후, 1990년대 후반부터 현재까지 학계와 업계(주로 미국 및 유럽 선진국)에서 활발하게 활용되고 있는 예측 기법
32.1.2 기계학습의 분야
기계학습의 분야 중 하나로 패턴 인식, 자료 분석을 위한 지도학습 모델
32.1.3 용도
주로 분류와 회귀 분석을 위해 사용됨
32.1.4 알고리즘
두 카테고리 중 어느 하나에 속한 데이터의 집합이 주어졌을 때 새로운 데이터가 어느 카테고리에 속할지 판단하는 기준으로 가장 큰 폭을 가진 경계를 찾는 알고리즘
직선 B1과 B2 모두 두 범주를 잘 분류하고 있음
B2보다는 B1이 두 범주를 여유있게 분류하고 있으므로 좀더 나은 분류경계면이라고 할 수 있음
SVM은 두 범주 사이의 거리(margin)를 최대화하는 경계면을 찾는 기법
32.2 SVM의 장점
32.2.1 선형 분류 뿐 아니라 비선형 분류도 가능
32.2.2 모델을 만들 때 고려해야 할 파라미터가 많지 않음
32.2.3 적은 양의 데이터로도 모델을 만들 수 있음
32.2.4 딥러닝이 이전에는 분류 모형 중에서 기술적으로 가장 진보된 모형으로 평가되었음
32.3 SVM의 적용분야
32.3.1 문서분류
32.3.2 안면인식
32.3.3 주가예측
32.3.4 부도예측
32.3.5 고객구매예측
32.3.6 채권등급평가예측
32.4 실습예제(붓꽃 품종분류)
ln [1]:
# 붓꽃의 품종을 머신러닝을 이용하여 꽃잎꽈 꽃받침의 크기를 기반으로 분류
from sklearn import svm, metrics
import random, re
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import numpy as np
from matplotlib import pyplot as plt
import mglearn
from matplotlib import font_manager, rc
# 한글 처리를 위해 폰트 설정
font_name = font_manager.FontProperties(\
fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
ln [2]:
# 붓꽃 데이터 로딩
iris = datasets.load_iris()
# 2, 3열만 선택(3, 4번째 필드)
X = iris.data[:, [2, 3]]
y = iris.target
ln [9]:
import random
# BMI를 계산해서 레이블을 리턴하는 함수
def calc_bmi(h, w):
bmi = w / (h/100) ** 2
if bmi < 18.5: return "thin"
if bmi < 25: return "normal"
return "fat"
# 출력 파일 준비하기
fp = open("d:/data/bmi/bmi.csv", "w", encoding="utf-8")
fp.write("height, weight, label\r\n")
# 무작위로 데이터 생성하기
cnt = {"thin": 0, "normarl": 0, "fat": 0}
for i in range(20000):
h = random.randint(120, 200)
w = random.randint(35, 80)
label = calc_bmi(h, w)
cnt[label] += 1
fp.write("{0}, {1}, {2}\r\n".format(h, w, label))
fp.close()
print("데이터가 생성되었습니다,", cnt)
ln [14]:
from sklearn import svm, metrics
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pandas as pd
# 데이터 로딩
tbl = pd.read_csv("d:/data/bmi/bmi.csv")
# 칼럼(열)을 자르고 정규화
label = tbl["label"]
w = tbl["weight"] / 100 # 최대 100kg라고 가정
h = tbl["height"] / 200 # 최대 200cm라고 가정
# 정규화시킨 데이터 (0~1 사이의 값)
wh = pd.concat([w, h], axis=1)
# 학습용 데이터셋과 검증용 데이터셋으로 분리
data_train, data_test, label_train, label_test = \
train_test_split(wh, label)
# 데이터 학습
clf = svm.SVC()
clf.fit(data_train, label_train)
# 데이터 예측
predict = clf.predict(data_test)
# 결과 출력
print("학습용 데이터셋 정확도: {:.3f}".format(clf.score(data_train, label_train)))
print("검증용 데이터셋 정확도: {:.3f}".format(clf.score(data_test, label_test)))
cl_report = metrics.classification_report(label_test, predict)
print("리포트 :\n", cl_report)
# 2만개의 데이터 테스트 98.7% 정밀도로 분류하는데 성공
ln [26]:
# 감마, c값을 증가시켜 더 복잡한 모델 만들기
svc = SVC(C=1)
# svc = SVC(C=100)
# svc = SVC(C=1000)
svc.fit(X_train_scaled, y_train)
print("학습용 데이터셋 정확도: {:.3f}".format(svc.score(X_train_scaled, y_train)))
print("검증용 데이터셋 정확도: {:.3f}".format(svc.score(X_test_scaled, y_test)))
반응형