Hayden's Archive

[AI/머신러닝] 결정 트리(Decision Tree) / 가지치기(Pruning) 본문

Study/AI & Math

[AI/머신러닝] 결정 트리(Decision Tree) / 가지치기(Pruning)

_hayden 2020. 7. 22. 17:38

결정 트리(Decision Tree)
의사를 결정.
- Tree를 거꾸로 뒤집으면 이 모양이 됨.

분류의 방법 => 분류한다는 것은 나눈다는 얘기
이진 분류(Binary Classification) => 이거 아니면 저거.
다중 분류(Multi-label Classification) => A,B,C 중 어디야? 

회귀(Regression) => x가 90~10 사이니? y값이 어디보다 크니 작니  
 

자료 출처 : https://towardsai.net/p/programming/decision-trees-explained-with-a-practical-example-fe47872d3b53

맨 위를 Root Node라고 하고 맨 끝을 Leaf Node / Terminal Node 라고 함. 중간 마디를 Intermediate Node라고 하며, Edge는 질문의 답과 질문을 연결하는 선을 말한다.

 

노드 위로 올라갈수록 중요도가 올라감(위로 올라갈수록 중요한 특징)

 

 

불순도(Impurity) => 해당 범주 안에 서로 다른 데이터가 얼마나 섞여 있는지를 뜻함. 얼마나 다른 카테고리(라벨)와 섞여있느냐. 

엔트로피(Entropy)불순도(Impurity)를 수치적으로 나타낸 척도. 내부적으로 엔트로피를 통해 불순도를 판단함.

 

예) 빨간공과 파란공이 다 합쳐서 10개 있다고 치자.

엔트로피가 1이면 불순도가 최대 (빨간공 5개, 파란공 5개일 때)

불순도가 최소일 때 -> 빨간공 1개, 파란공 9개일 때

엔트로피가 0이면 불순도가 없음 (빨간공 0개, 파란공 10개일 때) -> Overfitting

 

의사결정의 기준은 불순도. 불순도가 높을수록 기준이 됨. 
불순도를 낮추는 방향으로 계속 감. (근데 그렇다고 불순도가 아예 없으면 overfitting 돼서 안 됨)

 

counts에서 왼쪽이 동그라미의 개수, 오른쪽이 세모의 개수인데 왼쪽 노드보다 오른쪽 노드가 더 불순도가 높다. 

 

[2, 0]과 [0, 32]는 불순도가 없고, [1, 10]은 불순도가 거의 없다.

 


출처 : https://tensorflow.blog/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/2-3-5-%EA%B2%B0%EC%A0%95-%ED%8A%B8%EB%A6%AC/



기계는 병적으로 불순도를 낮추려고 함.
한 범주 내에 한 가지 target(라벨)만을 남기는 것으로 나아감.
=> 지나치게 기존 데이터에 의존해서 의사결정을 해서 구분하게 되면 Overfitting 일어남.
-> Overfitting 안 나게 하는 방법이 가지치기(Pruning)깊이를 줄이는 건 가지치기 방법 중 하나.

 


특성 중요도(Feature Importance)

특성 중요도는 처음부터 안 나옴. 결정 트리가 생성된 후에 확인할 수 있음. 중요한 특성도만을 가지고 다시 결정 트리를 만들수도 있음.
특성 중요도는 반드시 0~1 사이의 값. -> 이걸 정규화한다(normalize)라고 함(모든 값을 formal한 값으로 정량화)

모든 feature의 특성 중요도를 다 합하면 1이 된다.

출처 : https://towardsdatascience.com/explaining-feature-importance-by-example-of-a-random-forest-d9166011959e

 

특성 중요도는 불순도와 밀접한 관련이 있음. 불순도를 낮추다 보면 특성 중요도가 내부적으로 만들어짐.

 


가지치기(Pruning) 
- 하부 트리를 제거하여 일반화 성능을 높임
- 결정트리를 쓰면 무조건 overfitting이 일어나게 되는데 이를 해결함. 
pruning을 하게 되면 깊이가 줄어들고 결과의 개수가 줄어든다. 

 

가지치기 방법

1) 속성을 제한 - 트리의 깊이(Depth), Leaf Node의 최대갯수, 노드가 분할하는 최대 개수

: 그 중에서도 max_depth 를 통해 tree의 깊이 제한

2) min_sample_split 파라미터 조정 - 한 노드에 들어있는 최소 데이터 수를 정함

 

 

pruning 해야 하는데 pruning하면 overfitting은 줄어들지만 또 너무 pruning 하면 데이터 정확도가 떨어질 수 있음. 그래서 hyperparameter를 잘 줘야 함 
-> 결정 트리 여러개 묶어 놓은 게 랜덤 포레스트. 훨씬 더 정확함.