의사 결정 트리에서 이진 분할 구현의 차이점


12

나는 의사 결정 트리의 이진 분할의 실제 구현에 대한 호기심 - 그것은 범주 예측의 수준에 관련된 .Xj

특히, 예측 정확도와 안정성을 향상시키기 위해 의사 결정 트리를 사용하여 예측 모델을 작성할 때 일종의 샘플링 방식 (예 : 배깅, 오버 샘플링 등)을 자주 사용합니다. 이러한 샘플링 루틴 동안, 범주 형 변수가 전체 레벨 세트보다 작은 트리 피팅 알고리즘에 제시 될 수 있습니다.

변수 X가 레벨을 차지한다고 가정 해보십시오 {A,B,C,D,E}. 샘플에는 레벨 만있을 수 있습니다 {A,B,C,D}. 그리고, 결과 트리가 예측을 위해 사용될 때, 전체 세트가 존재할 수있다.

이 예에서 계속해서 나무가 X에서 쪼개 져서 {A,B}왼쪽과 {C,D}오른쪽으로 보냅니다 . 바이너리 분할의 논리는 새로운 데이터에 직면했을 때 "X에 값 A 또는 B가 있으면 왼쪽으로 보내고 그렇지 않으면이 경우를 오른쪽으로 보냅니다"라고 말할 것입니다. 일부 구현에서 발생하는 것으로 보이는 것은 "X에 A 또는 B 값이 있으면 X가 C 또는 D 값을 오른쪽으로 보내면 왼쪽으로 보냅니다"입니다. 이 경우 E 값을 받으면 알고리즘이 작동하지 않습니다.

이진 분할을 처리하는 "올바른"방법은 무엇입니까? 훨씬 더 강력한 방법이 자주 구현되는 것처럼 보이지만 항상 그런 것은 아닙니다 (아래 Rpart 참조).

다음은 몇 가지 예입니다.

Rpart는 실패하고 다른 것은 괜찮습니다.

#test trees and missing values

summary(solder)
table(solder$PadType)

# create train and validation
set.seed(12345)
t_rows<-sample(1:nrow(solder),size=360, replace=FALSE)
train_solder<-solder[t_rows,]
val_solder<-solder[-t_rows,]

#look at PadType
table(train_solder$PadType)
table(val_solder$PadType)
#set a bunch to missing
levels(train_solder$PadType)[train_solder$PadType %in% c('L8','L9','W4','W9')] <- 'MISSING'


#Fit several trees, may have to play with the parameters to get them to split on the variable

####RPART
mod_rpart<-rpart(Solder~PadType,data=train_solder)
predict(mod_rpart,val_solder)
#Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = attr(object,  : 
#factor 'PadType' has new level(s) D6, L6, L7, L8, L9, W4

####TREE
mod_tree<-tree(Solder~PadType,data=train_solder,split="gini")
predict(mod_tree,val_solder) #works fine

####ctree
mod_ctree<-ctree(Solder~PadType,data=train_solder,control = ctree_control(mincriterion = 0.05))
predict(mod_ctree,val_solder) #works fine

답변:


9

실제로 두 가지 유형의 요인이 있습니다 (예 : Tiny <Small <Medium <Big <Huge <Huge) 및 비 정렬 (Cucumber, Carrot, Fennel, Aubergine).
퍼스트 클래스는 연속 클래스와 동일합니다. 모든 피벗을 확인하는 것이 쉬울뿐 아니라 레벨 목록을 확장해도 문제가 없습니다.
두 번째 클래스의 경우 한 분기에서 다른 요소를 남겨두고 다른 지점으로 향하게하는 요소 집합을 만들어야합니다.이 경우 다음 중 하나를 수행 할 수 있습니다.

  1. 오류를 던지다
  2. 보이지 않는 수업이 가장 좋아하는 지점으로 이동한다고 가정
  3. 이것을 NA로 취급하고보다 무작위로 분기를 선택하십시오.

12#categories11ii

가장 합리적인 아이디어는 사용자가 전체 요소 세트를 정의하게하고 (예를 들어 R이 서브 세트 조작을 통해 레벨을 보존하는 유기적으로 수행함) 선언되지 않은 레벨 및 옵션 2에 대해 옵션 1을 사용하는 것입니다. . NA 처리 인프라가 이미있는 경우 옵션 3이 의미가있을 수 있습니다.

*) Breiman 인코딩과 같이 레벨을 사소한 수준으로 다시 코딩하는 부수적 인 전략도 있지만 더 많은 문제가 발생합니다.


1
내 예제에서 ctree 또는 tree는 실제로이 정렬되지 않은 요소를 정렬 된 요소로 취급하여 "0"분기로 보냅니다.
B_Miner

@mbq 분할을 수행 할 수있는 총 방법 수가 2 ^ (# categories + 1)-2 인 이유를 설명해 주시겠습니까? 왜 "-2"부분인지 이해가되지 않습니다.
honeybadger

흠,이 공식을 망친 것 같습니다. 2 ^ n n- 비트 단어와 비슷하지만, 단어 a와 ~ a를 모두 포함하지 않으므로 2 ^ (n-1)은 전혀 흘리지 않는 스플릿을 좋아하지 않으므로 2 ^ (n-1) -1 (즉, 1부터 계산) n = 1은 특별한 경우입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.