알고리즘을 배운다는 것은?
결정 트리 알고리즘
스무고개를 하듯이 계속적인 질문을 통해 패턴을 찾아간다.
목적: 가장 효율적인 분류가 되기 위한 규칙을 찾음(모든 리프를 균일하게 만드는 것)
정보 균일도 측정 방법
정보 이득 vs 지니 계수
- 정보 이득: 엔트로피(복잡도) 개념 기반
상이한 값들이 섞여 있으면 엔트로피 높음, 동일한 값들이 섞여 있으면 엔트로피 낮음
- 정보 이득 지수 = 1 - 엔트로피 지수
결정 트리는 이 정보 이득 지수로 분할 기준을 정한다. 즉, 정보 이득이 높은 속성을 기준으로 분할한다.
- 지니 계수: 경제학에서 불평등 지수를 나타낼 때 사용하는 지수
- 0(평등/균일) ~ 1(불평등/불균일): 낮으면 낮을 수록 좋음!
즉, 결정 트리에선 지니 계수를 0으로 만드는 것이 목적임
규칙 노드 생성 프로세스
1. 데이터 집합의 모든 아이템이 동일한 분류인지 확인
2-1. 데이터의 집합의 모든 아이템이 동일한 종류라면 리프 노드로 만들어서 분류 결정
2-2. 데이터의 집합의 아이템이 여러 종류라면 데이터를 분할하는데 가장 좋은 속성과 분할 기준을 찾음( 정보 이득 or 지니 계수 )
3. 해당 속성과 분할 기준으로 데이터를 분할하여 규칙 노드 생성
*모든 데이터 집합의 분류가 결정 될 때 까지 1 – 2.2 – 3 단계가 반복된다.
장단점
- 장점
- 쉽고 직관적이다 -> 시각화
- feature의 스케일링이나 정규화 필요 없음 -> 질문지만 잘 만들면 됨
- 단점
- 과대적합(Overfitting)으로 알고리즘 성능이 떨어질 수 있음
*과대 적합이란? 머신러닝과 통계학에서 모델이 학습 데이터에 너무 잘 맞춰져서 일반화 성능이 떨어지는 현상이다.
즉, 모델이 학습 데이터의 노이즈나 불필요한 세부사항까지 학습해 버려서 새로운 데이터나 테스트 데이터에 대해 제대로 예측하지 못하는 상태
-
- 하이퍼 파리미터 튜닝 필수(트리의 크기를 사전에 제한)
max_depth ⭐️
: 트리의 최대 깊이를 규정함. max_depth가 커질 수록 모델의 복잡도는 내려간다.
max_features
: featuure의 개수를 고려하여 최적의 분할을 결정한다.
min_samples_split
: 노드를 분할하기 위한 최소한의 샘플 데이터 개수
min_samples_leaf
: 분할된 양쪽(좌우) 노드를 만들기 위한 최소한의 샘플 데이터 개수
max_leaf_nodes
: 말단 노드의 최대 개수
Graphviz 시각화
iris 데이터로 결정 트리 생성해보기
graphviz Homebrew로 설치하기
https://graphviz.org/download/#:~:text=brew%20install%20graphviz
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, # 각 특성(Featurue)의 문자열로 된 이름
impurity = True, # 순수도(지니 계수 표현)
filled = True
)
import graphviz
with open("tree.dot") as f:
dot_graph = f.read()
graphviz.Source(dot_graph)