[Python] SVM(Support Vector Machines)

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)))

 

'programming > python' 카테고리의 다른 글

[Python] Java와 Python 연동  (4) 2019.09.04
[Python] Clustering, KNN  (0) 2019.09.03
[Python] SVM(Support Vector Machines)  (0) 2019.07.03
[Python] 의사결정나무  (0) 2019.07.02
[Python] 인공신경망  (0) 2019.06.25
[Python] 회귀분석  (0) 2019.06.24

댓글(0)

Designed by JB FACTORY