일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 5
- leetcode 49
- leetcode 819
- 빅데이터를 지탱하는 기술
- leetcode125
- ctf-d
- leetcode 344
- leetcode 234
- 머신러닝
- 데이터레이크와 데이터웨어하우스
- airflow docker
- leetcode 937
- 배열
- 블로그 이전했어요
- 올바른 변수명 짓기
- leetcode
- Python
- MapReduce 실습
- webcrawler
- 컴퓨터구조
- leetcode 121
- Hortonworks Sandbox
- docker로 airflow 설치하기
- Hadoop
- leetcode 15
- leetcode 238
- 문자열 조작
- leetcode 561
- 스파크 완벽 가이드
- Today
- Total
HyeM
2부_3장 머신러닝의 이해와 지도학습을 이용한 분류(1) 본문
2부에서는 머신러닝의 기술의 유형의 특징과 차이점을 살펴보고, 지도학습과 비지도 학습의 대표적인 알고리즘을 다룬다.
이번 3장에서는 파이썬으로 의사결정나무와 서포트 벡터 머신 알고리즘을 직접 구현해보며 머신러닝 알고리즘을 이용하는 방법을 알아본다.
[실무가 훤히 보이는 머신러닝&딥러닝_마창수,최재철 지음] 을 읽고 정리한 글입니다.
01. 머신러닝의 유형
머신러닝에는 지도학습, 비지도학습, 강화학습 총 3가지 유형이 있다. 각각 기술적 구현의 차이도 있고, 경우에 따라 활용하는 기술이 다르다.
- 지도학습 : 훈련 데이터 정답(Label)이 있어 주어진 정답에 맞게 특징이 학습되기를 기대하는 경우에 사용
- 비지도학습 : 훈련 데이터에 정답이 없고 주어진 특징내에서 분류간 서로 구분이 잘 되도록 나누기 원하는 경우에 사용
- 강화학습 : 학습(or 수집)되는 데이터에 정답은 없으나 동작하거나 반응하는 결과에 상과 벌을 주어서 스스로 진화할 수 있는 경우에 사용
이 책에서 지도학습의 분류 중 의사결정나무와 서포트벡터머신 그리고, 비지도 학습의 군집화에서 K-평균 알고리즘만 다룬다.
01_1. 지도학습
[지도학습]
지도학습 : 정답을 미리 알려주고 문제를 풀게하는 것
과거의 데이터를 가지고 학습 모델을 만들 수 있어, 새로운 데이터를 적용해서 예측/추정, 분류 등의 작업을 수행한다.
사용되는 경우 : 과거의 데이터로 미래 이벤트를 예측해야 하는 경우
[지도학습 처리 절차]
훈련 데이터는 정답인 라벨 데이터가 미리 있어야 된다.
-> 라벨값과 관계 없이 특징 추출
-> 이후 라벨값 추가되어 모델 학습
~> 추출된 특징값은 주어진 정답 라벨 값에 따라 특징들의 가중치가 조절된다. (주어진 라벨에 최적화하도록 학습)
[지도학습 구분]
-
분류
-
이중분류 : 두 개의 군집으로 나눔. 텍스트 분석의 감정분석
-
다중분류 : 이미지태킹, 텍스트 분석의 토픽 모델링
-
-
회귀 : 훈련 데이터의 값을 분석해, 주어진 값에 대한 결과 수치를 예측한다.
01_2. 비지도학습
[비지도학습]
비지도학습 : 입력에 대한 정답이 부여되지 않으며, 정답 없이 데이터만을 학습에 이용한다.
정답 찾기보다는 분류를 통해, 데이터 자체에서 유용한 패턴(특성)을 찾아내는 학습 방법
[비지도학습 처리절차]
지도학습과 다르게 비지도학습은 훈련데이터에 라벨 정보 제공 X
추출된 특징값을 기준으로 군집을 생성한다. 생성한 이 군집이 최종적인 라벨값임
So, 특징에 따른 부류이므로특징 벡터의 선택이 군집을 구성하는데 영향을 줌
[비지도학습 구분]
-
군집화 : 특징이 비슷한 데이터끼리 묶는 것
-
차원축소 : 특성이 많은 데이터의 특징 수를 줄이면서 꼭 필요한 특징을 포함한 데이터로 표현하는 방법
=> 모두 데이터를 새롭게 표현하여, 컴퓨터가 원래의 데이터를 좀 더 쉽게 해석할 수 있도록 하기 위함
02. 의사결정나무
[의사결정나무]
데이터 분포를 나누는 지도학습의 분류에 해당
연속적인 질문을 통해 예측 결과를 제공하는 예측모델로서, 의사 결정에 필요한 규칙을 나무형태로 분류해 나가는 분석 기법이다.
[의사결정나무 특징]
-
알고리즘 해석이 용이
-
수치형, 범주형 데이터도 적용이 가능함
-
필요한 전처리가 적다.
의사결정나무는 데이터를 어떤 기준으로 분할되는지 쉽게 볼 수 있고, 어떤 특징으로 분할하는게 가장 효과적인지 알 수 있음 -> 전처리에 따른 작업이 훨씬 수월해짐
-
과적합되기 쉬움.
훈련데이터를 검토해서 이상값이나 예외값을 정제하는 대책 필요
-
예측과 회귀 가능
마케팅 대상 여부에 대한 예측으로 쓰일 수도 있지만, 성공적인 마케팅을 하기 위해 영향을 많이 주는 변수를 찾는 데도 쓸 수 있음.(회귀)
02_1. 의사결정나무의 대표 알고리즘
의사결정나무에는 분석을 위한 여러가지 알고리즘 (ID3, C4.5, CART, CHAID 등)이 있다.
카트
- 가장 잘 알려진 방법론 중 하나로, 파이썬으로 구현이 용이한 알고리즘.
- 지니계수 또는 분산의 감소량을 사용해 나무의 가지를 이진 분리한다.
(범주형 변수는 지니계수 사용, 연속형 변수는 분산의 감소량 사용)
- 의사결정나무는 지니계수가 높은 조건(속성이 비슷한 것)을 찾고, 자식 트리 노드에 걸쳐 반복적으로 분할함. 모든 데이터가 특정 분류에 속하게 되면 분할 멈춤.
+ 지니계수 : 데이터의 속성들이 많이 일치하면 1, 반대로 속성들이 각기 다른 형태이면 0, 의사 결정나무는 지니계수가 높은 속성을 기준으로 분할한다. ( 속성이 비슷한 것끼리 묶어서 분류)
C4.5
- C4.5는 ID3을 개량, 발전 시킨것으로, ID3은 분할의 평가 기준으로 정보 이득을 사용했지만, C4.5는 이득 비율을 이용한다.
- C4.5는 두 가지밖에 분기할 수 없는 CART와 달리, 세 가지 분기가 가능하다.
02_2. 사이킷런으로 시작하는 의사결정나무 _[ 사이킷런을 이용해 의사결정나무 직접 구현해보기 ]
사이킷런은 대표적인 머신러닝 오픈소스 라이브러리
- 사이킷런 안에는 머신러닝 알고리즘과 표준 데이터 세트가 내장되어 있고, 의사결정나무의 구조를 DOT 파일확장자로 출력하는 특수한 기능을 갖음.
- 사이킷런에서 의사결정나무 알고리즘은 tree 모듈의 DecisionTreeClassifier이라는 클래스로 구현됨.
[ 실습 1 : 의사결정나무로 붓꽃 분류하기 ]
0. 실습을 위해 '넘파이'와 '사이파이' 추가 설치
넘파이 : 배열, 행렬 등 수치 계산을 위한 파이썬 모듈
사이파이 : 과학 계산용 파이썬 모듈
1. 붓꽃 데이터를 이용해서 의사결정나무를 만드는 코드 작성
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
def main():
dataset=datasets.load_iris() # load_iris 함수를 통해 붓꽃(iris) 데이터를 가져온다.
features = dataset.data
targets= dataset.target
#꽃잎의 길이와 넓이 정보만 특징으로 사용
petal_features=features[:, 2: ]
#의사결정모델 클래스 생성
cIris= DecisionTreeClassifier(criterion = 'entropy', max_depth =3)
#불순도 계산방법은 엔트로피이고, 트리의 깊이는 3
#모델 학습
cIris.fit (petal_features, targets)
#fit 함수에 원인에 해당하는 독립변수(petal_features)와 결과값의 종속변수(targets)를 넣으면 학습완료
#DOT 언어의 형식으로 결정나무의 형태를 출력
with open ('iris-dtree.dot',mode='w' ) as f:
tree.export_graphviz (cIris, out_file=f)
#export_grahpviz 내보내기 도구를 사용해 iris_dtree.dot라는 이름으로 파일 저장함.
if __name__ == '__main__' :
main()
cIris = DecisionTreeClassifier (기준 = '엔트로피', 최대 _ 깊이 = 3)
DecisionTreeClassifiers는 사이킷런에서 제공하는 의사결정나무 모델로, 이를 통해 모델 학습함.
DecisionTreeClassifier에서 지원하는 불순도 방법은 지니계수와 엔트로피 이다. (기본 값은 지니계수)
-
기준 = '지니'
지니계수(gini)는 분류를 잘못하는 확률을 최소화하기 위한 목적으로 오분류의 척도로 사용됨
( 지니계수를 측정한 후 가장 낮은 것을 선택)
-
기준 = '엔트로피'
엔트로피는 혼잡도. 보통 학습 시작단계에선 분류가 안되어 있어 엔트로피가 높은 상태. 이를 정리하면서 엔트로피를 줄여서 0에 근접하게 하는 방식이다.
* cIris.fit (petal_features, 대상)
fit 함수에 원인에 해당하는 독립변수(petal_features)와 결과값의 종속변수(targets)를 넣으면 학습완료
* 열기 ( 'iris-dtree.dot', mode = 'w')가 f 인 경우 :
tree.export_graphviz (cIris, out_file = f)
export_grahpviz 내보내기 도구를 사용해 iris_dtree.dot라는 이름으로 파일 저장함.
2. 그래프비즈를 이용하여 이미지 데이터로 변환
명령어 실행시, 해당 위치에 iris_dtree.png 파일이 생김.
3. iris_dtree.png 파일
나뭇가지 모양으로 분류된 것을 확인 가능하고, 어떤 규칙에 따라 분류되고, 각 노드가 어떻게 구성되어 있는지 확인가능하다.
x[0]은 꽃잎길이
x[1]은 꽃잎 폭
루트노드에서 꽃잎길이인 2.45를 기준으로 참이라면 왼쪽, 거짓이면 오른쪽 자식 노드로 이동.
자식 노드에서는 꽃잎 폭을 기준으로 다시 참과 거짓을 분류한다. 이런 방식으로 계속 분류를 해서, 모든 데이터가 다 그룹에 속하고 더 이상 분류할 수 없게 되면 트리가 완성된다.
4. 정리
데이터를 효과적으로 분류하기 위해 꽃잎 길이, 꽃잎 폭을 선택했는데 선택한 근거로 지니계수를 이용함.
또한, 어떤 규칙으로 분류 되었는지 시각적으로 보기 위해 그래프비즈를 이용해 의사결정나무 시각화함.
-> 의사결정나무는 직관적이고 시각적으로 표현가능해서 해석하기 용이하다.
[ 실습 2 : 의사결정나무로 유방암 분류하기 ]
1. 유방암데이터를 이용해서 의사결정나무 만드는 코드
from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
from sklearn.model_selection import train_test_split
def main() :
#iris 데이터 로드
cancer = datasets.load_breast_cancer()
#데이터를 훈련, 테스트 데이터로 나누기
x_train, x_test, y_train, y_test = train_test_split(cancer.data,
cancer.target,
stratify=cancer.target,
test_size=0.2,
random_state=42)
#의사결정모델 클래스를 생성
cancer_model = DecisionTreeClassifier(criterion='entropy', max_depth=3)
#모델을 학습
cancer_model.fit(x_train, y_train)
print("훈련 점수 : {:.3f}".format(cancer_model.score(x_train, y_train)))
print("테스트 점수 : {:.3f}".format(cancer_model.score(x_test,y_test)))
#DOT 언어의 형식으로 결정나무의 형태를 출력
with open ( 'cancer-dtree.dot', mode='w') as f:
tree.export_graphviz(cancer_model, out_file =f)
if __name__ == '__main__' :
main()
* x_train, x_test, y_train, y_test = train_test_split(cancer.data,
cancer.target,
stratify=cancer.target,
test_size=0.2,
random_state=42)
train_test_split()는 model_selection 모듈 내의 함수로, 데이터 세트 내의 훈련 데이터와 테스트 데이터로 나누어서 학습한다.
stratify 옵션 : 구성비가 다른 불균형 데이터인 경우 활성화하기 ; 만약 테스트 데이터와 훈련 데이터에 존재하는 타깃 값들의 비율이 다르면 학습결과와 성능평가 결과 모두에 잘못된 영향을 줌
test_size 옵션 : 테스트용 데이터의 비율을 지정 ; 0.2면 20%의 데이터를 무작위로 골라 테스트용으로 할당한다.
random_state 옵션 : seed 값을 지정 ( 지정하면 매번 다르게 분할됨 )
2. 그래프비즈를 이용하여 이미지 데이터로 변환
3. cancer-dtree.png 파일
종양에 대한 특성중 worst radius가 가장많은 영향을 주고 있다.
그 다음은 worst concave points와 texture error로 분류되었음을 알수 있다.
클래스를 통해 암인지 그렇지 않은지 판단 가능하다.
의사결정나무 알고리즘의 처리흐름 1. 분류에 필요한 파이썬 모듈+데이터 세트 준비 ( 사이킷런의 데이터 세트 ) 2. 분석할 데이터 세트의 특성 파악. 각 데이터의 특징과 레이블 확인 ( + 트레이닝 및 검증용 데이터 분할) 3. 의사결정나무의 변수를 조정. ->변수 조정함으로써 모델링 정확도 높임 4. 모델 의 내용 시각화 함. |
'Study > AI&DeepLearning' 카테고리의 다른 글
6부_3장 베이스정리로 텍스트 분류하기 (0) | 2020.07.25 |
---|---|
6부_2장 Word2Vec로 문장을 백터로 변환하기 (0) | 2020.07.17 |
6부_1장 한국어 분석(형태소 분석) (1) | 2020.07.17 |
2부_3장 머신러닝의 이해와 지도학습을 이용한 분류(2) (0) | 2020.07.10 |
1부_ 인공지능이란 무엇이고, 적용하기 위한 방법은? (1) | 2020.07.07 |