상세 컨텐츠

본문 제목

혼공학습단 10기 결정트리와 앙상블 배워보자 4주차!!

혼공학습단

by 공돌이주인 2023. 7. 23. 11:04

본문

반환점을 돌아 chapter5를 공부할 4주차가 되었다. 벌써 방학의 절반이 가버렸다....

이번 chapter5는 결정트리 그리고 트리의 앙상블에 대한 주제로 진행되었다.

 

5-1 결정 트리(decision tree)  

결정 트리는 True/False 질문을 계속 하면서 정답을 찾고 학습하는 알고리즘이다. 

#결정트리
from sklearn.tree import DecisionTreeClassifier

dt = DecisionTreeClassifier(random_state=42)
dt.fit(train_scaled, train_target)
 
plt.figure(figsize=(10,7))
plot_tree(dt, max_depth=1, filled=True, feature_names=['alcohol', 'sugar', 'pH']) #트리 깊이 제한
plt.show()

결정 트리 학습 진행 과정

앞 주차에서 배웠던 knn 모델과 로지스틱 회귀 모델과 다르게 특성 중요도(어떤 특성이 유용한지 나타냄)를 알 수 있어 모델의 가중치들에 대해 이해가 쉽고, 설명이 가능하게 만든다는 점에서 결정트리가 유용한 것 같다.

 

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

이전에 과대적합과 과소적합을 알아볼 때 테스트 세트를 항상 사용하였다. 하지만 훈련 세트의 일부분을 가져와 '검증 세트'를 만들게 되면 테스트 세트를 사용하지 않고 과대적합과 과소적합을 알아볼 수 있다.

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)
#검증세트 만들기
sub_input, val_input, sub_target, val_target = train_test_split(
    train_input, train_target, test_size=0.2, random_state=42)

여기서 검증을 여러 번 할 수 있는 방법이 있을까?

당연히 있다. 훈련 세트를 N 부분으로 분할하여 N번 검증을 수행하는 것을 교차 검증, N-폴드 교차 검증이라고 한다. 

3-폴드 교차 검증

 
splitter = StratifiedKFold(n_splits=10, shuffle=True, random_state=42) #10-폴드 교차검증
scores = cross_validate(dt, train_input, train_target, cv=splitter)

이전에 2주차에 모델 파라미터에 대해 배워 보았다. 이번에는 모델이 학습할 수 없어 개발자가 지정해야하는 파라미터인 하이퍼파라미터를 튜닝하는 작업에 공부해 보았다.

모델마다 매개변수는 달라지고, 개수가 많아지면 문제는 복잡해진다. 여기서 최적의 값을 찾을 수 있도록 도와주는 '그리드 서치(grid search)'가 있다. 이것은 하이퍼파라미터 탐색과 교차 검증 둘 다 수행할 수 있도록 돕는다. 

또한 매개변수의 값을 직접 나열하기 힘들다면 '랜덤 서치'를 이용하면 편리해진다. 매개변수 탐색 값을 지정된 횟수만큼 sampling 할 수 있도록 확률 분포 객체를 전달해준다.

from sklearn.model_selection import RandomizedSearchCV

gs = RandomizedSearchCV(DecisionTreeClassifier(random_state=42), params,
                        n_iter=100, n_jobs=-1, random_state=42)
gs.fit(train_input, train_target)

 

5-3 트리의 앙상블

다음으로 배워볼 것은 트리의 앙상블이다. 여기서 앙상블(ensemble)이란 무엇일까? 

우리는 지금까지 knn, 선형 회귀, 릿지, 로지스틱 회귀 등을 배웠다. 여기서 실제로 개발자들은 모델을 만들 때 대부분 한 가지가 아닌 여러 개의 알고리즘을 상황에 맞게 조합하여 사용한다는 것이다. 이것을 앙상블(ensemble)이라고 한다. 이 중 chapter5에서는 트리의 앙상블, 랜덤 포레스트(random forest)에 대해 알아보도록 하자

이름 그 자체에서 알 수 있듯이 다수의 결정 트리를 구성하여 숲을 구성하는 앙상블 학습이라고 할 수 있다. 이 학습은 각 트리를 훈련하기 위해 데이터를 무작위로 만드는데, 특이한 점은 데이터는 중복을 허용하여 추출할 수 있다는 점이다. 이 샘플들을 부트스트랩 샘플이라고 한다.

from sklearn.model_selection import cross_validate # 교차검증 수행
from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_jobs=-1, random_state=42)
scores = cross_validate(rf, train_input, train_target, return_train_score=True, n_jobs=-1)

이때 중복을 허용하여 샘플들을 뽑다보니 뽑히지 않은, 남은 샘플도 존재할 수 있다. 이것을 OOB(out of bag) 샘플이라고 한다. OOB 샘플로 훈련한 결정 트리를 평가하여 검증 세트의 역할을 수행한다.

rf = RandomForestClassifier(oob_score=True, n_jobs=-1, random_state=42) # OOB 샘플(검증세트 역할)
rf.fit(train_input, train_target)

random forest 코딩

랜덤 포레스트 이외에도 결정트리를 기반으로 한 앙상블의 몇 가지 알고리즘을 공부하였는데, 이 중에 가장 인기가 좋은 '히스토그램 기반 그레이디언트 부스팅(Histogram-based Gradient Boosting)'을 마지막으로 써보자 한다. 이 알고리즘은 입력 특성을 256개의 구간으로 나누어 최적의 분할을 빠르게 찾을 수 있다. 

# HistGradientBoost
from sklearn.ensemble import HistGradientBoostingClassifier
# GradientBoost보다 속도와 성능을 개선
hgb = HistGradientBoostingClassifier(random_state=42)
scores = cross_validate(hgb, train_input, train_target, return_train_score=True, n_jobs=-1)

 

관련글 더보기