글과 사진, 그리고 이야기

IE & SWCON/Machine Learning

[혼공머딥] chapter 5

뱃놀이가자 2023. 8. 22. 11:57
728x90

* 혼자공부하는 머신러닝+딥러닝의 교재의 학습 요약 내용입니다
 
https://hongong.hanbit.co.kr/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D/

 

혼자 공부하는 머신러닝+딥러닝

혼자 공부하는 머신러닝 딥러닝, 무료 동영상 강의, 머신러닝+딥러닝 용어집을 다운로드 하세요. 포기하지 마세요! 독학으로 충분히 하실 수 있습니다. ‘때론 혼자, 때론 같이’ 하며 힘이 되겠

hongong.hanbit.co.kr

* 경희대학교 데이터분석 동아리 KHUDA의 2023년 8월 기초세션 1주차 학습내용입니다.
https://cafe.naver.com/khuda

 

KHUDA : 네이버 카페

경희대학교 데이터 분석 동아리 KHUDA

cafe.naver.com

* 2차배포 및 상업적의도로의 사용 목적 및 의도가 없습니다
* 모든 저작권은 책 출판사 한빛미디어에 있습니다 !

 


chapter 05. 트리 알고리즘

 

5-1. 결정트리

 

** 훈련세트와 테스트 세트의 개수를 확인하기 위한 방법에 대하여(복기)

from sklearn.model_selection import train_test_split

train_input, test_input, train_target, test_target=train_test_split(data, target, test_size=0.2, random_state=42)

 

print(train_input.shape, test_input.shape)

 

결정트리모델은 설명하기 쉽다는 장점을 가지고 있다. 다시 말해, 스무고개와 같이 특성을 나누는 작업을 하는 것이다.

 

gini라는 새로운 값이 나왔다. gini는 불순도를 의미하는데, 

 

이렇게 구한다. 클래스라 함은 우리가 구분하고자 하는 이진변수에 대하여 하나를 음성으로 하고 다른 하나를 양성으로 하는데 분류에 초점이 맞추어지다보니 노드를 거치면서 어느 한쪽이 절반 이상으로 분류가 될 때, 즉 리프 노드에서 가장 많은 클래스가 예측 클래스가 된다고 볼 수 있다. 이 경우 예측 클래스가 왼쪽도 양성 클래스(1745), 오른쪽 노드도 양성 클래스(2194)로 되어 있어 샘플이 모두 양성 클래스로 예측된다고 볼 수 있다. 

 

당연하겠지만 위의 지니 계수를 바탕으로 추론할 때 지니불순도가 0.5에 해당하는 값은 최악의 경우로 0이 되는 값은 전부 한 쪽으로 분류가 되었다고 하여 순수 노드라고 부른다. 

 

위 계층을 부모노드로 그 아래 계층을 자식노드라고 하는데 부모와 자식 노드의ㅏ 불순도 차이를 정보 이득이라고 부른다. 

그 계산은 다음과 같다. 

참고로 entropy계산 방법도 있다. 불순도를 계산할 때.

트리의 결과를 시각화 하기 위해서는 plot_tree( )  를 활용할 수 있다. 

 

 

5-2. 교차검증과 그리드 서치

 

일반적으로 테스트 세트로 일반화 성능을 올바르게 예측하기 위해서는 가능한 한 테스트 세트를 마지막에 딱 한번만 사용할 것을 권장한다. 그도 그럴것이 테스트세트는 테스트용이기 때문이다. 그렇다고 훈련세트만 사용할 수는 없는 노릇이니 또 다른 검증을 위한 방법을 고민할 필요가 있다. 

 

그 첫번째가 앞서 처음 분류한 훈련 세트에 대해 일부를 검증 세트로 나누는 것이다. 

 

이 방법은 너무 단순한 방법이자 불안정한 검증 방법이다. 결국 훈련세트의 빈도가 줄고 검증하는 세트 또한 정해져 있기 때문이다. 따라서 교차검증이란 개념이 따라오는데 , 교차 검증이란 검증 세트를 떼어 평가하는 과정을 여러 번 반복하는 것이고 K-fold 교차 검증이라는 것이 존재한다. 

 

외에도 다양한 파라미터가 존재한다. 

즉, 최대한의 성능을 위해 많은 매개변수를 조절할 수 있다는 의미인데 결정트리를 예시로 들자면

최적의 max_depth, 최적의 min_sample_split 등을 경우의 수를 계산하여 정하는 것이다. 우리가 확률과 통계에서 잠시 배웠지만 경우의 수라 함은 변수의 개수가 늘어날 수록 많아진다. 

 

따라서 for 반복문을 통하여, 혹은 이미 만들어진 도구를 활용할 수 있고 그것이 그리드 서치(Grid Search)이다. 

Grid Search는 어느정도 범위가 정해져 있을 때 사용할 수 있다. 한편, 매개변수의 값이 수치일 때 값의 범위나 간격을 미리 정하기 어려울 수 있다. 이럴 경우 Random Search로 대략적인 개요를 살펴볼 수 있다. 

 

5-3. 트리의 앙상블

 

결정트리를 랜덤하게 만들어 결정 트리의 숲을 만드는 앙상블 방법 중의 하나가 랜덤 포레스트라고 할 수 있다. 랜덤포레스트는 각 트리를 훈련하기 위한 데이터를 랜덤하게 만드는데, 이 데이터를 만드는 방법은 복원 추출, 부트스트랩 샘플로 정한다. 부트스트랩 샘플 추출 방법이 좋은 점은 특성의 일부를 랜덤하게 선택을 하므로 더 다양한 특성이 훈련에 기여할 기회를 얻으므로 과대적합을 줄이고 일반화 성능을 높이는데 도움이 된다는 점에서 좋다고 할 수 있다. 또한 부트스트랩을 하면서 샘플에 포함되지 않는 남는 것, OOB(out of bag)에 대해 검증의 역할을 주기도 한다. 

 

랜덤포레스트와 비슷하게 엑스트라 트리도 존재한다. 엑스트라 트리는 부트스트랩 샘플 없이 전체 훈련 세트를 사용한다는 점이 특징이라고 할 수 있다. 엑스트라 트리는 무작위성이 더 강하다. 따라서 피쳐의 개수가 많아 질 수록 성능이 떨어지는 단점이 존재한다. 이에 따라오는 장점으로는 계산속도라고 볼 수 있겠다. 

 

세번째. 그레이디언트 부스팅이다. 이는 깊이가 얕은 결정 트리를 사용하여 이전 트리의 오차를 보완하는 방식의 앙상블 방법이다. 기본적으로 깊이가 3인 결정 트리를 100개 사용을 한다. 

 

마지막. 히스토그램 기반 그레이디언트 부스팅이다. 이는 정형 데이터를 다루는 머신러닝 알고리즘 중에 가장 인기가 높다고 하는데 노드를 분할 할 때 256개의 구간을 나누어서 최적의 분할을 매우 빠르게 찾도록 한다는 점이 특징이다. 

 

코드 전문을 공유하며 마무리.

 

1. 기본

import numpy as npimport pandas as pd
from sklearn.model_selection import train_test_split
wine = pd.read_csv('https://bit.ly/wine_csv_data')
data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
target = wine['class'].to_numpy()
train_input, test_input, train_target, test_target = train_test_split(data, target, test_size=0.2, random_state=42)

2. 랜덤포레스트

 

3. 엑스트라 트리

 

4. 그레이디언스 부스팅

 

5. 히스토그램 기반 부스

6. 번외 (XGboost, LightGBM)

 

Q1. 지니와 엔트로피 검증을 구분하는데 언제 어느것을 사용하는지에 대한 경우가 따로 있을까?

Q2. 랜덤서치는 어느정도로 값의 범위를 예측할 수 없을 때 사용하는 것이 적절하며 랜덤서치가 그리드 서치의 성능을 상회할 수 있을까?

Q3. 어느 경우에 어느 트리를 사용하는 것이 좋을까?

 

728x90

'IE & SWCON > Machine Learning' 카테고리의 다른 글

[혼공머딥] chapter 6 - 교재 外 심화과정  (0) 2023.08.30
[혼공머딥] chapter 6  (0) 2023.08.29
[혼공머딥] chapter 4  (0) 2023.08.15
[혼공머딥] chapter3  (0) 2023.08.08
[혼공머딥] chapter 1,2  (0) 2023.07.30