본문 바로가기

머신러닝/혼자 공부하는 머신러닝

13강 트리의 앙상블

이 글은 https://www.youtube.com/watch?v=Moz8i-tKurk 보고 공부한 글 입니다.

 

지난 시간에 

 

정형 데이터와 비정형 데이터 

정형 데이터 - 머신러닝

비정형 데이터 - 딥러닝

정형 데이터 = 데이터베이스에 담을 수 있는 데이터

행과 열이 잘 구분되어 있다.

 

비정형 데이터 = 딥러닝에서 뛰어난 성능을  보여준다.

텍스트, 오디오, 이미지, 영상 등이 있다.

 

정형 데이터는 전처리, 특성공학 처리를 해서 머신러닝에 잘 적용할 수 있었다.

 

비정형 데이터는 전처리, 특성공학을 처리하기 어렵다.

특성을 추출하는 작업표현학습이라고 한다. 

 

 

랜덤 포레스트 

앙상블 - 여러개의 모델을 합쳐서 하나의 결과로 만든다.

RandomForestClassifier로 랜덤한 분류를 한다.

 

 

랜덤 포레스트 훈련 방법 

부트스트랩 샘플이란

 

5개의 샘플이 있다.

 

랜덤하게 샘플링을 한다.

 

동일한 샘플이 여러개 골라질 수 있다(중복을 허용한 샘플링)

네모를 꺼내고 다시 집어 넣는다.

 

훈련 세트가 5개인것을 맞춰서 랜덤 샘플링한 것들을 부트스트랩 샘플이라고 한다. 

 

결정트리로 훈련을 해서 결과를 예측한다.

 

결정트리에서 나오는 확률이 있다.

 

클래스 별로나오는 확률을 모두 더하고 트리개수로 나눈다

그러면 각 클래스마다 평균이 나온다.

 

 

회귀모델이면 

예측값이 나올 것이다. 

 

 

각각 트리를 만들 때 훈련세트를 바꿔서(중복 세트를 포함) 결정트리를 여러개 만들고 각각 예측값의 평균을 구하는 것이 랜덤 포레스트이다. 

 

 

가지고 있는 특성중에서 어떤 것이 불순도가 높을까 생각한다.

 

트리의 노드를 분할할 때 노드의 불순도 차이가 최대가 되도록 분할 한다.

 

ex)

ph,당도로 최선의 분할을 선택한다. 

다른 노드로 할 때 또다른 특성 2개를 선택한다.

 

이렇게 회방을 놓는다. 

 

 

랜덤 포레스트 훈련 

ensemble밑에 위치해 있다.

 

croess_validate = 교차검증 

 

n_jobs = -1 로 컴퓨터의 최대한 많은 코어를 끌어다가 쓴다는 뜻이다.

 

기본은 검증세트의 값만 반환했다. 훈련 세트의 점수도 뽑기 위해서 return_train_score를 지정해준다.

 

이름은 test_score지만 테스트 세트는 떨어트려 놨기 때문에 이는 검증 세트의 점수가 될 것이다. 

 

rf객체를 교차검증 하지 않고 훈련세트로 훈련을 하면 기본 매개변수가 만족스럽다고 가정한다. (=최종모델)

 

결정트리 기반의 랜덤 포레스트도 feature_importance가 제공된다. 

 

부트스트랩 샘플을 쓰기 때문에 트리 하나를 만들때 훈련세트에서 남는 샘플이 있다(=out of back)  

중복을 허용했기 때문이다.

 

남는 샘플을 가지고 평가를 하려면 기본값은 oob값을 가지고 성능을 평가하지 않는다.

oob_score=Ture로 하면 따로 값을 따로 저장해놓는다.

 

 

엑스트라 트리 

ExtraTreesClassifier에 있다.

 

100개의 트리를 사용한다. 

 

불릴 때는 특성의 갯수의 제곱근을 사용한다. 랜덤하게 노드를 분할 할 때 일부 특성을 사용한다.

 

여기서는 부트스트랩샘플을 사용하지 않는다. 전체샘플을 사용한다. 

(과대적합을 억제하는 부트스트랩 샘플을 사용하지 않는다. )

 

다른방식으로 억제하는데 노드를 분할할 때 후보특성에서 랜덤하게 분할을 한다. 

랜덤한 분할중에 가장 좋은 불순도 차이를 찾아서 분할한다. 

 

랜덤하게 분할을 하니 빠르게 트리를 만든다. 그래서 속도가 빠르다.

 

 

그레디언트 부스팅 

가장 많이 사용하는 트리의 앙상블이다. 

손실함수를 만들고 손실함수의 최저점을 찾는것을 경사하강법이라고 한다. 

가중치를 변경해가면서 손실함수 값이 낮아지도록 모델을 조정해봤다.

 

분류 = 로지스틱 손실

회귀 = 평균제곱오차

그레이디언트 부스팅도 위와 같은 방법을 한다. 

 

손실함수의 값들은 실수값이다. 

 

실수값을 낮추도록 트리를 추가하는 것이다. 

 

learning_rate 매개변수로 학습속도를 제어한다. (기본 = 0.1)

 

회귀트리를 사용하면 max_depth를 3으로 제한해서 깊이를 낮춰서 과대적합을 막는다.(성능이 좋지 않다.)

 

n_estimators로 트리의 갯수를 정할 수 있다. 

 

 

히스토그램 기반 그레이디언트 부스팅 

데이터를 일정한 구간으로 쪼개서 막대 그래프로 그린것 = 히스토그램

훈련데이터를 256개 구간으로 짤라서 데이터를 변화하는 것

 

255개 구간으로 나누고 나머지 1개구간은 누락된 구간으로 넣는다. 

 

이 트리에는 특성중요도를 구하는 함수는 없다.

 

 

 

억지로 특성중요도를 구할 수 있다.

 

Permytation importance (치환 중요도)

1개의 특성을 랜덤하게 돌리고 정확도를 출력

이를 전체 세트에 반복하고 

 

랜덤하게 돌린 특성중에 가장 높은 정확도가 무었인가?

그에 답이 특성중요도라고 구한다. 

특성중요도를 구할 수 있다.

 

n_repeats은 기본적으로 5의 갑이다.

 

 

 

 

사실 히스토그램 기반 그레이디언트 부스팅은 다른 패키지에서 영향을 받아서 만든 것이다. 

 

XGBoost vs LightGBM

두 패키지 모두 colab에 설치되어있다.

 

tree_method로 모델을 정해주는데 'hist'로 주면 히스토그램 기반의 모델을 만든다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90