랜덤 포레스트와 친구라고 할 정도로 비슷하다. 다만 차이는 그 이름에서 알 수 있듯이 extra( 조금 더 극단적으로 ) random 하게 만든 모델이다.
장점은 랜덤포레스트보다 연산속도가 빠르고(약 3배) , 편향과 분산을 낮출 수 있다고 한다.
그 이유는 다음과 같다.
1.
부트 스트래핑의 유무
먼저, 랜덤포레스트는 배깅 방식으로 부트 스트래핑을 사용해서 약한 분류기들을 학습한다.
반면에 엑스트라트리는 부트스트래핑 방식을 사용하지 않고 전체 원본 데이터를 가져다가 학습한다. 즉 배깅을 사용하지는 않는것이다. → 비복원추출방법을 사용한다고 보면 된다.
2.
split 선택 기준
또 다른 차이점은 노드를 분할하는 데 사용하는 feature 에 대한 선택 기준이 다르다는 것이다.
먼저, 랜덤포레스트는 모든 변수에 대한 정보 이득을 계산하고 가장 설명력이 높은 변수를 분할 노드로 선택한다. 즉 모든 변수를 비교해야 하기 때문에 연산량이 많고 시간이 오래 걸린다.
반면에 엑스트라트리는 분할 변수를 선택할 때 정말 무작위로 선택한다. 일단 변수 아무거나 고른 다음에, 해당 변수에 대해서만 최적의 partition을 찾아 노드를 분할한다. 따라서 속도가 랜덤포레스트보다 빨라질 수 밖에 없는 것이다.
그렇다면 랜덤포레스트보다 엑스트라 트리가 더 좋은 것인가?
일반적으로 엑스트라 트리는 부트스트래핑 방식을 사용하지 않고 전체 데이터를 학습하므로 랜덤포레스트보다 편향을 낮출수 있다고 한다. 또, 앞에서 설명하지 않았지만 split point 를 랜덤하게 선택함으로서 분산을 줄일 수 있다고 한다. 더 나아가 앞서 봤듯이 연산량이 줄어 속도도 빨라진다.
기본 모델
from sklearn.tree import ExtraTreeClassifier(criterion='gini', splitter='random', *트리모델 하이퍼파라미터, random_state=None, class_weight=None,...)
Python
복사
•
criterion : gini / entropy / log_loss : 노드 분할 평가 메소드
◦
gini : 불평등 지니계수
◦
entropy 또는 log_loss : Shannon information gain 메소드
•
splitter : 노드를 분할하기 위해 선택하는 전략
◦
random(default) : 랜덤하게 split
◦
best
•
max_depth : 트리 깊이(default = None)
•
min_samples_split(default = 2)
•
min_samples_leaf(default = 1)
•
max_features(default = ‘sqrt’)
◦
auto = sqrt : 전체 피처수의 루트 씌운 개수
◦
log2 : 전체 피처수의 log2 를 씌운 개수
◦
None : 전체 피처수
•
class_weight(default = None) : 각 class별 가중치가 들어있는 딕셔너리.→ {class_label : weight}
•
ccp_alpha(default=0.0) : 양수인 실수. default → 가지치기를 하지 않음.
gridsearchcv
# 필요한 평가 지표들 import
from sklearn.metrics import classification_report, accuracy_score
Python
복사
# 파라미터 조합 설정 방법
# 1. 여러 매개변수 중 하나의 값을 고정하고 다른 값들을 변경시켰다가 해당 변수의 최적 값을 찾은 다음에
# 2. 최적 값을 찾은 매개변수를 고정하고 또 다른 매개변수 값을 변경하면서 값을 찾는 작업을 반복한다.
# max_depth 와 n_estimators의 매개변수 최적값을 찾아보자.
params = [
{'n_estimators':[50], 'max_depth':[3,6,8,12,14]},
{'max_depth':[6], 'n_estimators':[50,100,150]}
]
# 분류기에서 매개변수의 최적 조합을 찾기 위해 사용할 성능 지표
metrics = ['f1', 'f1_weighted']
# 각 성능 지표 항목별로 그리드 검색을 통해 최적의 매개변수를 찾고 이를 이용해 분류기 학습
for metric in metrics:
print('\n ### searching optimal parameters for", metric)
extra_grid = GridSearchCV(
ExtraTreeClassifier(random_state=0),
params, cv = 2, scoring = metric)
extra_grid.fit(X_train,y_train)
# 각 매개변수 조합별로 점수 출력
print('\nGrid scores for the parameter grid:')
for params, mean_test_score in extra_grid.cv_results_:
print(params, '-->', round(mean_test_score,3))
print('\nBest parameters:', extra_grid.best_params_)
# 성능 리포트 출력
extra_grid_pred = extra_grid.predict(X_valid)
print('\nPerformance report:\n')
print(classification_report(y_valid,extra_grid_pred))
Python
복사