랜덤 포레스트 : 테스트 세트에서 새로운 요소 수준을 처리하는 방법?


13

R의 임의 포리스트 모델을 사용하여 예측하려고합니다.

그러나 테스트 세트의 일부 요소가 훈련 세트와 다른 값을 가지므로 오류가 발생합니다. 예를 들어, 테스트 세트에는 학습 세트에 표시되지 않은 Cat_234, 68, 76등 이 있습니다 . 불행히도, 테스트 세트를 제어 할 수 없습니다 ... 나는 그대로 사용해야합니다.

내 유일한 해결 방법은을 사용하여 문제가되는 요인을 숫자 값으로 다시 변환하는 것 as.numeric()입니다. 그것은 작동 하지만,이 값이 더 숫자 감각이없는 코드이기 때문에 나는 매우 만족하고 있지 않다 ...

테스트 세트에서 새로운 값을 제거하는 또 다른 솔루션이 있다고 생각하십니까? 그러나 1, 2, 14, 32훈련과 테스트에 있으며 예측에 유용한 정보를 포함 하는 다른 모든 요인 값 (값 등)을 제거하지 않습니다 .


1
테스트의 값이 훈련 세트에 있어야하는 이유를 알 수 있습니다. 분류의 아이디어는 훈련 데이터를 사용하여 클래스 조건부 밀도가 어떻게 보이는지에 대한 아이디어를 얻는 것입니다. 밀도에서 가능한 모든 값을 볼 수는 없습니다. 나는 변수가 분할 ona 트리에서 사용 된 다음 분할은 보이지 않는 값과 볼 수있는 값에 대해 어떤 분기를 따라야하는지 결정합니다.
Michael R. Chernick

당신은 올바른 지적을하지만, 요구되는 특정 도구 (R의 RF 패키지)를 사용하는 실질적인 수준에서는 이것이 허용되지 않습니다. 대치와 관련된 내 대답은 그 주위에 한 가지 방법이지만 확실히 최선의 해결책은 아닙니다. Is는 최소한의 작업 값에 대해 코드가 충돌하지 않도록 작동합니다.
Bogdanovist 2:30에

내 질문과 비슷 합니다 : stats.stackexchange.com/questions/18004/… . 새로운 요소 수준을 더 잘 다루는 것처럼 RF 대신 GBM을 사용할 수 있다고 생각합니다. 또한 파티에서 RF 구현을 살펴 보셨습니까? 이러한 문제로 인해 randomForest를 좋아하지 않았습니다 (결 측값을 완벽하게 처리 할 수 ​​없음).
B_Miner

답변:


2

테스트 세트에 새로운 요소 값으로 이러한 많은 점이 있으면 가장 좋은 방법이 무엇인지 잘 모르겠습니다. 그것이 단지 소수의 포인트라면 잘못된 인자 레벨을 누락 된 데이터로 취급하고 당신이 적합하다고 생각하는 어떤 방법 으로든 대치하는 것과 같은 까다로운 것을 피할 수 있습니다. R 구현에는 누락 된 데이터를 대치 할 수있는 몇 가지 방법이 있습니다. 이러한 요인 수준을 NA로 설정하여 누락 된 데이터를 표시하면됩니다.


8

King and Bonoit 이 스 니펫은 레벨을 조화시키는 데 유용 할 수 있습니다.

for(attr in colnames(training))
{
  if (is.factor(training[[attr]]))
  {
    new.levels <- setdiff(levels(training[[attr]]), levels(testing[[attr]]))
    if ( length(new.levels) == 0 )
    { print(paste(attr, '- no new levels')) }
    else
    {
      print(c(paste(attr, length(new.levels), 'of new levels, e.g.'), head(new.levels, 2)))
      levels(testing[[attr]]) <- union(levels(testing[[attr]]), levels(training[[attr]]))
    }
  }
}

또한 어떤 속성이 변경되었는지 인쇄합니다. 더 우아하게 (ldply 또는 무언가로) 쓸 수있는 좋은 방법을 찾지 못했습니다. 모든 팁을 부탁드립니다.


4

위의 @King의 응답을 해결하기 위해 작성한 코드가 있습니다. 오류가 수정되었습니다.

# loops through factors and standardizes the levels
for (f in 1:length(names(trainingDataSet))) {
    if (levels(testDataSet[,f]) > levels(trainingDataSet[,f])) {    
            levels(testDataSet[,f]) = levels(trainingDataSet[,f])       
    } else {
            levels(trainingDataSetSMOTEpred[,f]) = levels(testDataSet[,f])      
    }
}

안녕하세요 @ifarb, 귀하의 솔루션을 이해하려고합니다 : trainingDataSetSMOTEpred 란 무엇이며 코드에서 어디에 정의되어 있습니까?
Kasia Kulma

3

시험 및 훈련 세트를 하나의 세트로 결합한 다음 훈련 세트의 레벨을 변경해야합니다. 내 코드는 다음과 같습니다

totalData <- rbind(trainData, testData)
for (f in 1:length(names(totalData))) {
  levels(trainData[, f]) <- levels(totalData[, f])
}

이것은 시험의 레벨 수가 훈련보다 많거나 적은 모든 경우에 작동합니다.


2

R에서 randomForest를 사용할 때 큰 해결책이 있습니다. 이론적으로 소리가 좋지는 않지만 실행됩니다.

levels(testSet$Cat_2) = levels(trainingSet$Cat_2)

또는 다른 방법으로 라운드. 기본적으로 그것은 단지 R에게 단지 0 개의 경우가있는 유효한 값이라는 것을 알려줍니다. 오류에 대해 저를 괴롭히지 마십시오.

모든 범주 기능에 대해 자동으로 작업을 수행하도록 코딩하기에 충분히 똑똑하지 않습니다. 방법을 알고 있다면 코드를 보내주세요.


그러나 테스트 수준이 훈련 이상인 경우에는 작동하지 않습니다. 테스트 데이터 요인 수준이 <= 훈련 데이터 요인 수준 인 경우에만 작동합니다.
KarthikS

1

이것이 사실이라면 이미 이것을 생각했을 것입니다. 그러나 테스트 세트에 실제 값이 있고 교차 검증 목적으로 테스트 세트를 사용하는 경우 데이터 프레임을 훈련 및 테스트 데이터 프레임으로 다시 분할 이 두 요소가 이러한 요소에 균형을 이루면 문제를 피할 수 있습니다. 이 방법은 일반적으로 계층화 된 교차 검증 으로 알려져 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.