1. 의사결정나무(Decision Tree)
- 데이터 사이에 존재하는 패턴을 찾아 이 규칙들의 조합으로 예측 모델을 만드는데 쓰이는 알고리즘
- 설명 변수를 '하나씩만' 활용하여 가지뻗기를 진행한다.
- 의사결정나무는 규칙을 조합하여 데이터에 대한 예측 모델을 이룬다.
- 분류(Classification) 문제와 회귀(Regression) 문제 모두 적용가능한데
- 분류문제의 경우 해당 데이터가 최종적으로 속한 최하위 그룹의 최빈값을 예측 값으로 활용
- 회귀문제의 경우 그 그룹 내 데이터의 평균값을 예측값으로 활용한다.
2. 의사결정나무의 철학
- 한 가지 질문에 대한 답변에 정답을 추리는데 도움이 된다면 정보획득(Information Gain)이라고 부른다.
- 이렇게 얼마나 도움이 되는지를 순도(homogeneity)라고 한다.
- 이와 반대로 불순도(impurity)도 존재
- 순도, 불순도를 수치로 나타내기 위한 종류는 대표적으로 3개자기 존재(Entropy, Gini Index, Misclassification Error)
- 의사결정나무의 학습방법에서 핵심은 엔트로피(entropy) 지수가 낮아지는 쪽으로 분기를 하는 것이다.
3. 의사결정나무의 종류
위에서 언급한 3가지 대표 지표외에도 불순도를 측정하는 다양한 적도와 계산법이 존재하는데 이는 종속 변수의 성격이 연속형인지 범주형인지에 따라 나뉘며 이에 따라 다양한 형태의 의사결정나무가 존재한다. 가장 많이 쓰이고 있는 모델은 CART 모델
- CART(Classification and Regression Tree)
- 가장 널리 쓰이는 의사결정나무 알고리즘. 범주형 종속변수에 대해서는 지니지수를 기준으로 분기가 일어나고 연속형 종속변수에 대해서는 분산을 활용한 이진분리가 기준이 된다.
- C4.5
- 각 노드에서 다중분리(multiple split)가 가능하다는 것이 특징이다. 범주형 종속변수의 학습에만 활용되는 알고리즘으로 엔트로피 지수를 통해 분기가 일어난다.
- CHAID(CHi-sqaured Automatic Interaction Detection)
- 다른 알고리즘과 달리 "*Full Tree" 를 만족할 때까지 분기가 일어나지 않고 적당한 크기에서 분기를 중단하는 것이 특징이다. 분기 기준으로는 카이제곱 통계량을 활용하고 독립변수는 범주형 데이터여야 한다는 특징 또한 가지고 있다.
4. 의사결정나무의 학습과정
- 재귀적 분기(recrusive partitioning)와 가지치기(pruning), 2 단계를 거쳐 모델을 생성
- 재귀적 분기
- 초기 엔트로피 지수를 구한다. 만약 엔트로피 지수가 1이라면 가장 불순도가 높은 것이다.
- 만약 데이터가 8개라면 1:7, 2:6 비율 분기마다 엔트로피를 계산하여 정보획득을 계산하며 이렇게 반복하므로 재귀적 분기라고 부른다.
- 가지치기(pruning)
- 과적합을 방지하기 위해 분기 작업이 모두 끝나면 여러 Leaf 노드를 가지고 있는 나무의 상위 노드에서 가지를 쳐내며 일부 데이터를 병합하는 과정을 거치며 이를 가지치기라고 한다.
- 비슷한 새 데이에 대해서는 참담한 성능을 보이는 일반화 성능이 꽝이 되지 않기 위해 수행
- 가지치기 과정도 분기 과정과 비슷하게 그 기준인 비용함수(cost fuction)의 정도를 모든 분기점에 대해 조사한 후 손실이 가장 적은 분기점을 병합하는 식인데 Top-Down방식과 Bottom-Up 방식이 있다
CC(CT) = E(DT) + a X L(DT)
CC: CostComplexity,최종비용
E:Error, 해당 분기를 가지치기 하였을 때, 트레이닝/학습 misclassification error
a: 정규화 상수(사용자에 의해 0.1~0.01 정도의 값으로 설정됨)
L: Leaves, 모델의 최하위 노드의 수
5. sklearn 라이브러리를 활용한 의사 결정 나무
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import DecisionTreeRegressor
# 객체 생성
DT_C = DecisionTreeClassifier()
DT_r = DecisionTreeRegressor()
# 객체 학습
model_c = DT_C.fit(xdata,ydata,sample_weight)
model_r = DT_R.fit(xdata,ydata,sample_weight)
# 의사 결정나무 객체 예측/분류
predict_C = model_c.predict(xtest)
predict_R = model_r.predict(xtest)
# 의사 결정나무 객체 평가
score_c = model_c.score(xtest,ytest,sample_weight)
score_r = model_r.score(xtest,ytest,sample_weight)
더 알아보면 좋을 개념
- Entropy 지수
- 지니지수, 분산감소량
- 카이제곱 통계량, Anova F-통계량
- misclassification error
Reference
'IT > Meachine Learning' 카테고리의 다른 글
Random Forests (0) | 2024.08.06 |
---|---|
Underfitting and Overfitting (0) | 2024.08.05 |
MAE(Mean Absolute Error), 평균절대오차 (0) | 2024.08.05 |