로지스틱 회귀 : 확률 기반. 모델에서 입력 데이터가 들어오면 가중치와 바이어스를 학습. 0.5 기준 임계값을 사용해 0과 1 또는 그 이상을 분류.
결정트리 : 모델이 질문을 던짐. 거기서 예/아니오를 던짐. 그 상황에서 계속 추가적인 질문이 발생. 계속 예/아니오 분기. 마치 나무처럼 하나의 뿌리에서 여러가지 확장.
-> '왜 이렇게 예측했는지'를 알 수 있는 모델.
스무고개 하듯이 질문을 하나씩 던지며 분류하는 모델
핵심 : "어떤 질문을 먼저 해야 가장 효율적으로 분류할 수 있을까?"
-> 불순도 Imputrity를 가장 많이 줄이는 질문부터 함
루트 노드 Root : 가장 첫 번째 질문.
내부 노드 Internal : 중간 질문들
잎 노드 Leaf : 최종 답(예측 라벨)
깊이 Depth : 루드에서 잎까지의 질문 횟수
분기 Split : 질문에 따라 데이터를 나눈 것 (예/아니오)

노드 : 질문 + 질문으로 인한 상태 (박스 안에서 첫 번째 줄)
gini : 0에 가까울수록 혼란이 되지 않음. 0.5가 정말 분류하기 어려운 케이스. 불순도 수치 줄여가는 것이 결정트리의 목적
samples : 지금 이 노드에 도달하기까지 데이터가 총 몇 개 있는지
values : class별로 몇 개씩 섞여있는지 -> 다 더하면 samples
class : 질문횟수가 정해져있을 때, 마지막 분류라고 생각한 것. class를 통해 가능성이 가장 높은 친구를 보여주는 것
from sklearn.tree import DecisionTreeClassifier
df = DecisionTreeClassifier(max_depth=None, random_state=42)
# max_depth=None : 무제한 질문
# max_depth=3 : 질문 개수를 3으로 설정. depth.
print(classification_report(y_test, y_pred, target_names=target_names, digits=3))
질문횟수가 무제한이라고 좋은 건 아님. 예외 규칙을 너무 세밀하게 세우면 오히려 틀릴 수 있음. 적절한 질문의 개수로 제한하는 것이 성능을 높임
cm = confusion_matrix(y_test, y_pred)
#-> 혼동행렬
가장 크게 나눌 수 있는 질문부터 선택
-> 불순도를 크게 줄이는 질문이 좋은 질문.
한 노드에 여러 클래스가 섞여 있을수록 불순도가 높음
Gini

Entropy

-> 1.0이 최대 불순. 0은 완벽히 분류된 것
과적합 : 모델이 훈련 데이터에 너무 달라붙어 새 데이터에서 성능이 떨어지는 현상
-> 결정트리에서 깊이를 제한하지 않으면 모든 훈련 데이터를 완벽하게 외워버림
-> 변형 버전은 정답을 맞히지 못함
train과 test의 accuracy 값이 높고, 둘의 차이가 가장 적은 depth로 고르면 좋음.
핵심 : 깊이 제한 = 질문 횟수 제한 = 큰 질문만 하고 세부사항 무시. 중요한 가지치기!
min_samples_split = 최소 몇 명이 있어야 더 질문할 수 있나?
min_samples_leaf = 마지막 그룹에 최소 몇 명은 있어야 하나? samples=숫자 이하로는 질문 안 함
어떤 피쳐가 분류에 가장 중요한 역할을 했는지(가장 많이 사용됐는지) 확인 가능
주의 : Feature가 많이 사용되었다는 뜻이지 인과관계가 성립하는 것은 절대 아님. 단서일 뿐. 불순도를 낮출 때 가장 중요하게 사용되었던 것.
e.g. 우산을 많이 써서 비가 오는 건 아님
데이터나 샘플량에 따라 달라질 수 있음