Splitting the Space

개념 확인: Decision Trees


규칙으로 공간을 나누는 분류 트리를 읽고, 지니 지수와 엔트로피로 분할을 비교한다.

문제 1

규칙에서 구역으로

문제 1~3의 구성은 ‘범주 1 : 범주 0’의 학습 관측 수다.

두 특성 x₁, x₂로 학습한 분류 트리가 다음과 같다. 뿌리는 x₁ < 3인지 묻는다. 참이면 x₂ < 5인지 다시 묻고, 참이면 끝점 A(8 : 2), 거짓이면 끝점 B(1 : 4)에 도달한다. 뿌리 조건이 거짓이면 끝점 C(3 : 9)에 도달한다.

  1. 분기점과 끝점의 수를 적고, 각 끝점의 예측 범주를 적는다.
  2. 새 관측 (x₁, x₂) = (2, 7)과 (4, 1)의 예측 범주와 도달한 끝점을 적는다.
  3. 끝점 A가 차지하는 구역을 x₁, x₂의 부등식으로 적는다.
  4. 이 나무의 구역 경계가 모두 좌표축에 수직인 이유를 적는다.
해설 펼치기
  1. 분기점 2개(뿌리 포함), 끝점 3개다. A는 범주 1, B와 C는 범주 0을 예측한다.
  2. (2, 7)은 x₁ < 3, x₂ ≥ 5이므로 B에 도달해 범주 0. (4, 1)은 x₁ ≥ 3이므로 C에 도달해 범주 0이다.
  3. x₁ < 3이고 x₂ < 5인 구역이다.
  4. 한 분할이 특성 하나와 기준값 하나만 사용하기 때문이다.
문제 2

불순도 계산

구성은 문제 1과 같은 표기로 읽는다. 엔트로피는 자연로그를 쓰고 0 ln 0 = 0으로 둔다.

  1. 구성 30 : 10인 분기점의 지니 지수와 엔트로피를 구한다(소수 셋째 자리까지).
  2. 구성 5 : 5인 분기점의 두 값을 구하고, 두 범주일 때 각 기준의 최댓값과 비교한다.
  3. 구성 40 : 0인 끝점의 두 값을 구한다.
  4. 두 끝점의 구성이 51 : 49와 90 : 10일 때 예측 범주는 같지만 지니 지수가 다른 이유를 적는다.
해설 펼치기
  1. p̂ = 0.75. G = 0.75 × 0.25 + 0.25 × 0.75 = 0.375, D = −(0.75 ln 0.75 + 0.25 ln 0.25) ≈ 0.562.
  2. G = 0.5, D = ln 2 ≈ 0.693으로 두 값 모두 두 범주에서의 최댓값이다.
  3. 한 범주만 있으므로 둘 다 0이다.
  4. 둘 다 범주 1을 예측하지만 51 : 49는 거의 반반 섞였고 90 : 10은 한 범주에 가깝다. 지니 지수는 0.4998과 0.18로 범주 구성의 차이를 반영한다.
문제 3

분할 후보 비교

구성은 문제 1과 같은 표기로 읽는다. 구성 60 : 40인 부모 구역(100개)을 두 후보로 나눈다.

후보왼쪽오른쪽
A50 : 1010 : 30
B40 : 020 : 40
  1. 부모의 지니 지수를 구한다.
  2. 각 후보의 양쪽 지니 지수와 가중 지니, 감소량 ΔG를 구한다(소수 셋째 자리까지).
  3. 각 후보를 다수 범주로 예측할 때 오분류 수를 구하고, 정확도로는 두 후보를 구별할 수 있는지 적는다.
  4. 지니 기준으로 고를 후보와, 그 선택이 전체 나무의 최선을 보장하지 않는 이유를 적는다.
해설 펼치기
  1. 1 − 0.6² − 0.4² = 0.48이다.
  2. A: 왼쪽 ≈ 0.278, 오른쪽 0.375, 가중 0.6 × 0.278 + 0.4 × 0.375 ≈ 0.317, ΔG ≈ 0.163. B: 왼쪽 0, 오른쪽 ≈ 0.444, 가중 0.6 × 0.444 ≈ 0.267, ΔG ≈ 0.213.
  3. A는 10 + 10 = 20, B는 0 + 20 = 20으로 같아 정확도로는 구별할 수 없다.
  4. ΔG가 큰 B를 고른다. 현재 구역에서 분할 하나만 비교하고 이후 분할 조합은 보지 않는 탐욕적 선택이므로 전체 최적 나무를 보장하지 않는다.
문제 4

나무를 키우는 설정

다음 코드로 분류 트리를 학습한다.

tree = DecisionTreeClassifier(
    criterion="gini", max_depth=4, min_samples_leaf=20, random_state=0
)
tree.fit(X_train, y_train)
  1. max_depth = 4일 때 끝점 수의 상한을 구하고, 실제 끝점 수가 이보다 적을 수 있는 이유 하나를 적는다.
  2. min_samples_leaf = 20은 어떤 분할을 막는지 적는다.
  3. criterion과 max_depth는 각각 무엇을 정하는지, max_depth 값은 어떻게 고르는지 적는다.
  4. X_train에 문자열 범주 열(예: "red", "blue")이 있을 때 이 코드에서 먼저 해야 할 일을 적는다.
해설 펼치기
  1. 2⁴ = 16개다. min_samples_leaf 조건이나 더 나눌 수 없는 순수한 구역 때문에 일찍 멈출 수 있다.
  2. 분할 후 한쪽 끝점에 학습 관측이 20개보다 적게 남는 분할을 막는다.
  3. criterion은 분할을 고르는 불순도 기준, max_depth는 뿌리부터 허용하는 최대 분할 횟수다. max_depth는 학습 자료가 아니라 검증 성능을 비교해 고른다.
  4. scikit-learn의 의사결정나무는 문자열 범주를 그대로 받지 않으므로 수치로 부호화한다.
문제 5

나무의 성질

  1. 특성 ‘길이’를 미터에서 센티미터로 바꾸면 분할 x < 2 m는 어떻게 바뀌고 관측의 분할은 달라지는지 적는다. 이 결과로 나무에 표준화가 보통 필요한지 적는다.
  2. 두 범주의 참 경계가 x₂ = x₁인 대각선일 때 분류 트리가 이를 어떻게 표현하는지 적는다.
  3. 학습 자료에 특성값이 모두 같은데 범주가 다른 관측 두 개가 있다. 깊이 제한 없이 키우면 학습 오차를 0으로 만들 수 있는지 적는다.
  4. 학습 자료를 조금 바꾸었더니 예측은 비슷하지만 뿌리 분할의 특성이 달라졌다. 나무 하나의 규칙을 설명 근거로 쓸 때 주의할 점을 적는다.
해설 펼치기
  1. 100x < 200 cm가 되며 같은 관측이 같은 쪽으로 간다. 축별 크기 비교만 쓰므로 단위 변환을 위한 표준화는 보통 필요하지 않다.
  2. 축에 나란한 분할을 여러 번 조합해 계단 모양으로 근사한다.
  3. 만들 수 없다. 특성값이 같으면 어떤 분할로도 두 관측을 다른 끝점으로 보낼 수 없어 끝점은 다수 범주를 예측한다.
  4. 나무는 자료 변화에 규칙이 민감할 수 있으므로 한 나무의 분할을 안정적인 결론으로 보고하지 않는다.