본문 바로가기
Study/ML

5. 분류(Classification) - Decision Tree

by 까망우동 2023. 5. 27.
반응형

Index

    분류(Classification)모델은 이산형(Discrete), 범주형(Categorical)한 변수를 예측하는 분야로 KNN, SVM 과 같이 고전적인 방법, Logistic Regression, 딥러닝 분야의 Neural Network, 여러가지 ML모델을 결합한 Ensemble등 다양한 모델이 있다. 

    그중에서 이번 포스팅에서는 '데이터의 균일도' 를 기반으로 분류하는 모델인 Decision Tree 모델에 대해 정리한다. 


    일반적으로 음성/텍스트(NLP)/이미지 등의 데이터셋에는 신경망 구조의 딥러닝 모델이 강력하고, Tabular 형식의 정형 데이터의 분류에는 앙상블(Ensemble) 모델이 높은 성능으로 자주 사용되고 있다. 

     

    1. Decision Tree 개요

    • 스무고개와 같이 Rule 기반으로 if/else 규칙을 자동으로 찾아내 학습하는 알고리즘
    • if/else 규칙 조건이 되는 규칙노드(Decision Node) 와 클래스로 결정된 값이 되는 리프노트(Leaf Node)로 구성됨
    • Sub Tree가 많을수록 Depth 가 깊다고 표현하며, 결정방식이 복잡해 과적합으로 이어지기 쉽다. (예측 성능 ↓)
    • "정보의 균일도" 를 기준으로 데이터 분류 규칙을 생성하고, 정보균일도는 ①지니계수 ②정보이득 계수를 이용한다
    • 정보의 균일도가 높은 데이터가 먼저 분류되도록한다. 예를들어 공 색깔이 빨/노/파, 모양이 □/△/○ 있고 노랑색이 네모만 있다면? → 첫 번째 규칙은, if color is yellow 가 되겠다.
    • 장점: 균일도 기반이라 학습이 쉽고, 전처리 필요없고, 직관적이고, 해석가능성이크다. 단점: 데이터가 새로 생길 수록 트리의 깊이가 계속 깊어진다. → Overfitting 방지를 위해 트리의 크기를 사전에 제한해야한다. 

     

    2. Decision Tree 의 Parameter 

    • min_samples_split : 노드 분할을 위한 최소 샘플데이터 수. 이 숫자보다 작으면 더이상 노드를 추가하지 않는다. 이 값이 클수록 노드 분할을 많이 하지 못한다. 
    • min_samples_leaf : 리프노드(결정노드)가 되기 위한 최소 샘플 데이터 수, 이 숫자보다 작으면 리프가 될 수 없다. 즉, 이 값이 클수록 함부로 분할할 수 없게 된다. 
    • max_features : 최대 피쳐개수. 즉, 규칙노드에서 데이터셋이 가지고 있는 피쳐중, 정해진 개수만큼만 사용
    • max_depth : 최대 깊이 
    • max_leaf_nodes : 최대 리프노드 개수 


    3. Decision Tree 결과 시각화, 피쳐 중요도 파악

    - Decision Tree 결과 시각화 및 해석

    Decision Tree 의 결과값은 graphviz 라는 패키지를 통해 시각화할 수 있다. 

    # Graphviz 를 통합 시각화
    from sklearn.tree import export_graphviz

    export_graphviz(dt_clf, out_file="tree.dot", class_names=iris_data.target_names, feature_names = iris_data.feature_names, impurity=True, filled=True)

    import graphviz
    with open("tree.dot") as f:
        dot_graph = f.read()
    graphviz.Source(dot_graph)

    • petal width, length 등 피쳐에 대한 조건문이 있어야 규칙노드
    • value 값은 각 레이블의 클래스값에 대한 갯수로 하나의 클래스값만 갖으면 리프토드
    • gini 계수는 낮을수록 균일도가 높다. gini=0 이면 리프노드
    • class = virginica 의 뜻은 virginica 클래스의 데이터가 가장 많다는 것 
    •  각 노드의 색깔은 Class 별로 다르고, 진할수록 지니계수가 낮은 것

     

     

    - Decision Tree 의 피쳐 중요도 확인

    아래와 같이 Decision Tree 객체는 feature_importances_ 라는 내장된 매서드를 통해 중요도를 반환받을 수 있다. 

    # 피쳐 중요도 추출
    print("Feature importances:{0}".format(np.round(dt_clf.feature_importances_,3)))
    결과값 : Feature importances:[0.025 0. 0.555 0.42 ]

     

    반응형

    댓글