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가 근노드인 의사결정 트리를 입력

+ Recent posts