일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- wargame.kr
- leetcode 561
- Python
- docker로 airflow 설치하기
- leetcode 819
- leetcode 49
- 블로그 이전했어요
- ctf-d
- leetcode125
- MapReduce 실습
- leetcode 937
- 빅데이터를 지탱하는 기술
- Hortonworks Sandbox
- leetcode 121
- 문자열 조작
- 올바른 변수명 짓기
- Hadoop
- leetcode 234
- 머신러닝
- leetcode 5
- leetcode 238
- leetcode 344
- 배열
- 스파크 완벽 가이드
- webcrawler
- 데이터레이크와 데이터웨어하우스
- leetcode
- airflow docker
- 컴퓨터구조
- leetcode 15
- Today
- Total
HyeM
2부_3장 머신러닝의 이해와 지도학습을 이용한 분류(2) 본문
서포트 벡터 머신 알고리즘
: 데이터 분포를 나누는 지도학습의 분류
지금까지도 보편적으로 사용하는, 분류를 위한 머신러닝 모델이다.
라벨이 달린 이진 분류 문제에 주로 사용된다.
01.서포트 벡터 머신 알고리즘 이해하기
각 데이터 항목을 다차원의 벡터 공간에 점으로 표시한다.
만약 2차원 공간에 있는 두 개의 그룹을 분류한다는 가정해보면.
두 그룹을 잘 구분하는 직선을 찾는 것이 서포트 벡터 머신의 핵심이다.
=> 서포트 벡터 머신은 데이터를 선형 또는 비선형으로 분리하는 최적의 경계를 찾는 알고리즘이다.
단계 1. 직선을 그려 그룹을 나눈다.
단계 2. 마진을 최대화하여 균형있게 나눈다.
직선을 한쪽에 치우치지 않게 양쪽 그룹 모두 균형있게 나누기 위해서, 직선식을 사이에 두고 가능하면 최대한 멀리 떨어지도록 점선을 구하면 된다. ( 최대마진 )
+ 최대마진은 점선이 속한 점이 직선을 침범하지 않도록 만드는 안전지대 또는 지지대 역할을 한다고 해서 서포트 벡터라고도 부른다.
02. 서포트 벡터 머신을 이용해 당뇨병 분류하기 (예제 1)
판다스(Pandas)를 이용해 데이터 처리를 쉽게 처리 한다. 판다스는 DataFrame이라는 자체 데이터 구조체를 가지고 있는데, 행과 열로 이루어진 2차원 데이터를 담는다. 이는 CSV 데이터를 쉽게 다룰 수 있게 한다.
데이터 세트는 외부에서 피마 인디언의 당뇨병 데이터 세트를 가져와 이용한다.
( 피마 인디언의 당뇨병 데이터 세트는 총 768개 샘플로 구성되어 있고, 각 샘플에는 8개의 측정값과 하나의 진단 결과값이 들어있다.
0~7번까지는 측정값, 8번째 는 당뇨병 유무
[ 코드작성 ]
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
#표준화(정규화(모든 값을 0-1에 맞게 변환))
#또는 표준화(평균 0, 분산 1이 되도록 변환)가 필요하다)
from sklearn.preprocessing import StandardScaler
#데이터 세트 로드
pi_diabetes =pd.read_csv('pima-indians-diabetes.csv', header=None)
# 외부 데이터를 읽어옴. 이 파일은 헤더정보 없기 때문에 none 옵션을 준다.
x = pi_diabetes.iloc[:, :8]
y = pi_diabetes.iloc[:, 8:].values.flatten() #1차원으로 전개
# 판다스의 dataframe은 2차원인데ㅡ x에 0~7번까지 데이터를 넣고, Y에 8번째 데이터를 넣고, 배열로 나오는 결과를 flatten 함수로 2차원에서 1차원으로 바꾼다.
print('x shape : {}, x shape : {}'.format(x.shape,y.shape))
#훈련데이터와 테스트 데이터의 분리
x_train, x_test, y_train, y_test = train_test_split(x,y,random_state=0)
# train_test_split()함수로 훈련데이터와 테스트 데이터를 분리한다.
#정규화를 위한 모듈 사용
std_scl =StandardScaler()
std_scl.fit(x_train)
x_train = std_scl.transform(x_train)
x_test = std_scl.transform(x_test)
#0~7번째 항목의 수치의 범위 다르기 때문에, 정규화 기법을 사용하여 좀더 학습을 최적화한다.
#학습 및 테스트
svc = SVC()
svc.fit(x_train, y_train)
#원인에 해당하는 변수와 결과값에 해당하는 변수를 fit 함수에 넣으면 학습 완료
print('훈련점수 : {: .3f}'.format(svc.score(x_train, y_train)))
print('테스트 점수 : {: .3f}'.format(svc.score(x_test, y_test)))
* x_train, x_test, y_train, y_test = train_test_split(x,y,random_state=0)
train_test_split()함수로 훈련데이터와 테스트 데이터를 분리한다.
+훈련데이터는 학습을 이용한 용도, 테스트 데이터는 향후 모델이 잘 만들어졌는지를 검증하는 용도
* std_scl =StandardScaler()
std_scl.fit(x_train)
x_train = std_scl.transform(x_train)
x_test = std_scl.transform(x_test)
0~7번째 항목의 수치의 범위 다르기 때문에, 정규화 기법을 사용하여 좀더 학습을 최적화한다.
+ 정규화란 모든 값을 0과 1사이의 범위에 맞게 변환하는 작업
[ 실행화면 ]
총 768개의 데이터를 가져오고 학습한 결과를 볼 수 있음
훈련점수는 82점. 테스트 점수는 77으로 괜찮은 점수이다.
=> 서포트 벡터 머신은 다른 머신러닝 기법에 비해 학습 속도가 비교적 빠르다.
02. 서포트 벡터 머신을 이용해 버섯 종류 분류하기 (예제 2)
캘리포니아대학 어바인 캠퍼스 학습 저장소에 공개되어 있는 독버섯 데이터를 가지고 독버섯 여부를 분류해본다.
훈련데이터의 한 행 : 하나의 버섯
맨 왼쪽 첫 번째 문자가 독성 유무 (p : 유, e :무)
이후의 문자를 통해 모양과 색깔등의 특징을 알 수 있음.
이번 예제에서는 맨 왼쪽의 첫 번째 문자인 독버섯의 유무를 레이블로 정하고, 그 이후의 데이터는 설명변수로 활용
[ 코드작성 ]
#pandas 모듈 추가
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
#데이터 세트 로드
mushroom = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/mushroom/agaricus-lepiota.data', header=None)
#외부의 데이터를 read_csv 함수로 읽어옴
#문자를 수치로 치환
x = []
y = []
# 이번 데이터는 문자로 이루어져 있기 때문에, 분석을 위해 숫자형으로 변환해준다. (전처리 과정)
for row_index, row in mushroom.iterrows():
y.append(row[0])
row_X = []
for v in row[1:]:
row_X.append(ord(v)) # ord함수는 문자를 유니코드 코드 포인트를 나타내는 정수를 돌려줌.
x.append(row_X)
#훈련데이터와 테스트 데이터 나누기
x_train, x_test, y_train, y_test = train_test_split(x, y)
# 학습 및 테스트
svc = SVC()
svc.fit(x_train, y_train)
print('훈련 점수 : {:.3f}'.format(svc.score(x_train, y_train)))
print('테스트 점수 : {:.3f}'.format(svc.score(x_test, y_test)))
* x = []
y = []
이번 데이터는 문자로 이루어져 있기 때문에, 분석을 위해 숫자형으로 변환해준다. (전처리 과정)
* row_X.append(ord(v))
ord함수는 문자를 유니코드 코드 포인트를 나타내는 정수를 돌려줌.
[ 실행화면 ]
( 목표 변수는 독성의 유무)
버섯 훈련 데이터 세트로 서포트 벡터 머신을 수행한 결과, 당뇨병 예측 보다 더 높은 점수인 99%의 점수를 얻었다.
위 글은 [실무가 훤히 보이는 머신러닝&딥러닝_마창수,최재철 지음] 을 읽고 정리한 글입니다.
'Study > AI&DeepLearning' 카테고리의 다른 글
6부_3장 베이스정리로 텍스트 분류하기 (0) | 2020.07.25 |
---|---|
6부_2장 Word2Vec로 문장을 백터로 변환하기 (0) | 2020.07.17 |
6부_1장 한국어 분석(형태소 분석) (1) | 2020.07.17 |
2부_3장 머신러닝의 이해와 지도학습을 이용한 분류(1) (0) | 2020.07.10 |
1부_ 인공지능이란 무엇이고, 적용하기 위한 방법은? (1) | 2020.07.07 |