결정트리란 뿌리노드(가지가 시작되는 처음 = Root Node)부터 시작해서,
Yes or No로 가지를 마침내 리프노드(가지의 마지막 = Leaf Node)까지 뻗어나가는 의사 결정 과정을 뜻한다.
스무고개처럼 계속해서 질문을 하며 정답을 도출해나가는 과정이다.
많은 질문을 통하여도 정답으로 갈 수 있지만,
어쨌든 알고 싶은 것은 정답이고 정답은 빨리 알아낼 수록 좋은 것!
Leaf Node = Terminal Node
스무고개에서 질문을 무엇을 할지 선택하는 것처럼
결정트리를 학습하는 것도 노드를 어떻게 분할할 것인지의 문제이다.
Impurity(불순도)는 여러 Label이 섞여있는 상태를 말한다.
Parent node에는 두 레이블이 16:14로 섞여있는, 불순도가 높은 상태이고
child node로 갈 수록 섞여있는 레이블의 비율이 적어지며 하나의 레이블로 정제되어 있는 것을 볼 수 있다.
한 노드에서 불순도가 최대로 감소하는 지점(분할지점)을 찾는 것이 중요하다.
정보획득은 특정한 특성을 사용해 분할했을 때 엔트로피의 감소량을 뜻한다.
𝐼𝐺(𝑇,𝑎)=H(𝑇)−H(𝑇|𝑎)
= 분할전 노드 불순도 - 분할 후 자식노드 들의 불순도
scikit-learn 라이브러리 사용
from sklearn.tree import DecisionTreeClassifier
pipe = make_pipeline(
OneHotEncoder(use_cat_names=True),
SimpleImputer(),
DecisionTreeClassifier(random_state=1, criterion='entropy'))
pipe.fit(X_train, y_train)
print('훈련 정확도: ', pipe.score(X_train, y_train))
print('검증 정확도: ', pipe.score(X_val, y_val))
>>>
훈련 정확도: 0.9908667674880646
검증 정확도: 0.7572055509429486
y_val.value_counts(normalize=True)
>>>
0 0.761001
1 0.238999
Name: vacc_h1n1_f, dtype: float64
파이프라인 라이브러리를 사용하여 중복되는 method를 간단히 바꿔줄 수 있다.
결정트리에서는 노드를 결정하는 것이 관건이기 때문에 수치를 scale 해주는 StandardScaler는 효과가 없다.
샘플에서 값들의 비율을 count해준다.
이 데이터에서는 0이 다수범주(76퍼센트)를 차지하고 있다.
데이터에 0만 있다고 가정한 모델을 만들어도, 정확도는 0.76은 무조건 될 것이므로
이 값이 기준모델이 된다.
훈련 정확도는 0.99
검증 데이터는 0.757로 다수범주(0의 비율)와 비슷하게 나왔다.
훈련(train) 정확도보다 검증(validation) 정확도가 낮다는 것은,
모델이 훈련데이터에만 너무 적합하다는 뜻이 된다.
이것을 과적합이라고 한다. (대부분을 0으로 예측)
또한 기준모델과 비슷하게 나온 검증 정확도는 훈련이 제대로 되지 않았음을 의미한다.