728x90
인풋:훈련 데이터세트D = {(x1, y1), (x2, y2)...(xm, ym)};
속성 집합 A = {a1, a2... ad};
최대 깊이 MaxDepth = maxDepth
과정:함수 TreeDenerate(D, A, maxDepth)
1: NodeQueue、DataQueue、AQueue 3개의 큐(queue)를 생성해 각각 노드, 데이터, 나머지 속성 세트로 사용;
2: 노드 생성 Node_root;
3: if A가 비었으면 OR D의 샘플이 모두 동일 클래스라면:
4: Node_root의 레이블이 잎 노드가 되고, 레이블은 D에서 가장 많은 클래스로 설정;
5: return Node_root;
6: end if
7: Node를NodeQueue로; D를 DataQueue로; A를 AQueue로;
8: 뎁스를 초기화 depth=0;
9: 초기화L = 1; # L은 각 층에 비(非)잎노드 수를 기록
10: while NodeQueue 비어있지 않다면:
11: L* = 0
12: for _ in range(L): # L개의 비(非)잎노드를 훑는다
13: NodeQueue 에서Node 꺼내고; DataQueue에서D꺼내고; AQueue에서A꺼낸다;
14: A에서 최적 분할 속석 a*를 선택;
15: for a* 의 각 값에 대해 a*v do:
16: 새로운 노드node*를 만들고,node*를 Node의 가지에 연결;
17: Dv로 D에 존재하는 a*상의 값이 a*v인 샘플 세트를 표시;
18: if Dv가 비었다면:
19: node*로 잎 노드를 표기, 그리고 클래스는 D에서 가장 많은 클래스로 설정;
20: continue;
21: end if
22: if A\{a*}가 비었다면 OR Dv상의 샘플이 모두 동일 클래스라면 OR depth == maxDepth:
23: node*를 잎 노드로 설정, 클래스는 Dv에서 가장 많은 클래스로 설정;
24: continue;
25: end if
26: node*를NodeQueue로; Dv를 DataQueue로; A\{a*}을AQueue로;
27: L* += 1; # depth+1 번째 층에 비(非)잎노드 개수를 세는데 사용
28: L = L*;
29: depth += 1;
30: return Node_root;
Node_root가 근노드인 의사결정 트리를 입력