+ 지도학습은 레이블(Lable), 즉 명시적인 정답이 있는 데이터가 주어진 상태에서 학습하는 머신러닝 방식
앙상블의 기본 알고리즘으로 사용된다.
예측 성능 향상을 위한 복잡한 규칙구조를 가지게 되면 과적합 발생 위험이 있다.
ML 알고리즘 중 직관적으로 이해하기 쉽다.
if, else 를 자동으로 찾아내 예측을 위한 규칙을 만든다.
데이터의 어떤 기준을 바탕으로 규칙을 만들어야 가장 효율적인 분류가 될 것인가가 중요하다.
분류를 결정하는 방식이 복잡해지면 즉, 트리의 깊이가 깊어지면 결정트리의 예측 성능은 저하된다.
따라서 적은 결정노드로 높은 예측 정확도를 만들기 위해서 데이터를 분류할 때, 최대한 많은 데이터 세트가 해당 분류에 속할 수 있도록해야한다. 또, 이렇게 하기 위해서 최대한 균일한 데이터 세트를 구성할 수 있도록 해야한다.
+ 결정노드는 정보 균일도가 높은 데이터 세트를 먼저 선택할 수 있도록 규칙 조건을 만든다.
+ 균일한 데이터 세트란 비슷한 값들이 속한 데이터 세트를 말한다.
++ 정보 균일도 측정방법은 정보이득지수와 지니계수가 있다.
+++ 정보 이득 지수란 엔트로피(혼잡도가 높으면, 엔트로피는 크다 or 혼잡도가 낮으면, 엔트로피는 작다) 개념을 차용한 지표이다. [ 정보 이득 지수 = 1 - 엔트로피 ]이고 결정트리는 정보이득이 높은 속성을 기준으로 분할한다.
+++ 지니계수란 0이 평등(다양한 값을 가지는 경우), 1이 불평등(특정값으로 쏠릴 경우)인 지표로 결정트리는 지니계수가 높은 속성을 기준으로 분할한다.
사이킷런에서 구현할 DecisionTree Classifier은 지니계수를 이용해 데이터 세트를 분할한다.
결정 트리 모델의 특징
결정 트리는 균일도를 기반으로 하고 있기 때문에 알고리즘이 쉽고 직관적이라는 장점이 있다.
또, 정보의 균일도만 신경쓰면 되므로 특별한 경우를 제외하고는 각 피처의 스케일링과 정규화 같은 전처리 작업이 필요없다.
반면, 과적합으로 정확도가 떨어진다는 점이 단점이다.
균일도 규칙에 따라 서브트리를 만들다보면, 피처가 많고, 주어진 데이터의 균일도가 다양하게 주어질 수록 트리의 깊이가 커지며 복잡해질 수밖에 없기 때문이다.
복잡한 학습 모델은 결국 실제 상황에서 즉, 테스트 데이터 세트에서 유연하게 대처할 수 없어서 예측 성능이 떨어질 수밖에 없다.
따라서 모든 데이터 상황을 만족하는 완벽한 규칙은 만들 수 없다고 인정하고 트리의 크기를 사전에 제한 하는 것이 오히려 성능 튜닝에 도움이 된다.
결정 트리 파라미터
사이킷런은 결정 트리 알고리즘을 구현한 DecisionTreeClassifier와 DecisionTreeRegressor 클래스를 제공한다.
DecisionTreeClassifier는 분류를,
DecisionTreeRegressor는 회귀를 위한 클래스이다.
사이킷런의 결정 트리 구현은 CART(Classification And Regression Trees)알고리즘 기반이다.
CART는 분류뿐만 아니라 회귀에서도 사용될 수 있는 트리 알고리즘이다.
두 클래스에서 사용되는 파라미터이다.
- min_samples_split : 노드를 분할하기 위한 최소한의 샘플 데이터 수, 디폴트는 2이고, 작게 설정할수록 분할되는 노드가 많아져 과적합 가능성 증가 -> 분할하기 전의 샘플 데이터 수가 min_samples_split 보다 커야한다는 것
- min_samples_leaf : 말단 노드(Leaf)가 되기 위한 최소한의 샘플 데이터 수, 과적합을 제어하기 위한 용도로 비대칭적 데이터의 경우 특정 클래스의 데이터가 극도로 작을 수 있으므로 이 경우엔 작은 설정이 필요하다.
- max_features : 최적의 분할을 위해 고려할 최대 피처 개수, 디폴트는 None , int형으로 지정하면 대상 피처의 개수, float형으로 지정하면 전체 피처 중 대상 피처의 퍼센트이다. ( 'sqrt','auto','log','None' )
- max_depth : 트리의 최대 깊이를 규정, 디폴트는 None. None으로 설정하면 완벽하게 클래스 결정 값이 될 때까지 깊이를 계속 키우며 분할하고나 노드가 가지는 데이터 개수가 min_samples_split 보다 작아질 때까지 계속 깊이를 증가시킴. 깊이가 깊어지면 과적합할 수 있으므로 적절한 값으로 제어 필요.
- max_leaf_nodes : 말단 노드(Leaf)의 최대 개수
결정 트리 모델의 시각화
리프 노드 : 더 이상 자식 노드가 없는 노드, 최종 클래스(레이블) 값이 결정되는 노드, 오직 하나의 클래스 값으로 구성되거나 리프노드가 될 수 있는 하이퍼 파라이터 조건을 충족한 것
브랜치 노드 : 자식노드가 있는 노드, 분할 규칙 조건을 가지고 있음
노드 내에 기술된 지표의 의미
petal length(cm) <= 2.45 자식 노드를 만들기 위한 규칙 조건, 조건이 없다면 리프 노드
gini 는 value - []로 주어진 데이터 분포에서의 지니계수
samples 현 규칙에 해당하는 데이터 건수
value = []는 클래스 값 기반의 데이터 건수
예시) 붓꽃 데이터 세트 클래스 값으로 0,1,2가 있고, Value = [41,40,39]라면
클래스 0이 41개, 클래스 1이 40개, 클래스 2가 39개라는 의미
class = setosa는 하위 노드를 가질 경우에 setosa의 개수가 41개로 제일 많다는 의미
190p
첫번째 에서 length 사용 두번째에서 weight 사용 세번째에서 다시 length사용 -> 사용할 만한 칼럼이 이 두개라서 그런가 ?
194p의 피쳐 중요도를 살펴보면 답을 확인할 수 있다 ! petal length 가 0.555의 중요도를 가지기 때문
균일도에 기반해 어떠한 속성을 규칙 조건으로 선택하느냐가 중요하다.
몇 개의 피처가 명확한 규칙 드리를 만드는데 기여하고, 모델을 더 간결하고 이상치에 강한 모델을 만들 수 있기 때문이다.
사이킷런은 결정 트리 알고리즘이 학습을 통해 규칙을 정하는 데 있어 피처의 중요한 역할 지표를 DecisionTreeClassifier 객체의 feature_importances_속성으로 제공한다.
import seaborn as sns
import numpy as np
%matplotlib inline
# feature importance 추출
print("Feature importances:\n{0}".format(np.round(dt_clf.feature_importances_, 3)))
# feature별 importance 매핑
for name, value in zip(iris_data.feature_names , dt_clf.feature_importances_):
print('{0} : {1:.3f}'.format(name, value))
# feature importance를 column 별로 시각화 하기
sns.barplot(x=dt_clf.feature_importances_ , y=iris_data.feature_names)
정형데이터 예측 분석에서 높은 예측 성능을 가진다.
배깅과 부스팅 두 가지로 나뉜다.
랜덤 포레스트
그래디언트 부스팅 - 수행시간이 오래걸려 최적화 모델튜닝 어렵다.
XgBoost - 예측 성능이 높고 수행시간이 단축되었다.
LightGBM - 예측 성능이 높고 수행시간이 단축되었다.
[Kaggle] Spaceship 0416 : 0.77507 (0) | 2024.04.22 |
---|---|
[파이썬 머신러닝 완벽 가이드] 04 분류 (4) 결정 트리 실습 (1) | 2024.04.18 |
[파이썬 머신러닝 완벽 가이드] 04 분류 (3) 결정트리 과적합 (0) | 2024.04.18 |
[파이썬 머신러닝 완벽 가이드] 04 분류 (2) 결정 트리 시각화 (0) | 2024.04.18 |
[공간분석] Lattice Spatial Data 예측 모델 (SAR, CAR) (0) | 2024.04.17 |