임의 포리스트에 대한 OOB 및 혼동 행렬을 해석하는 방법은 무엇입니까?


35

임의의 포리스트 모델을 실행하기 위해 누군가로부터 R 스크립트를 받았습니다. 직원 데이터로 수정하고 실행했습니다. 우리는 자발적인 분리를 예측하려고합니다.

다음은 몇 가지 추가 정보입니다. 분류 모델은 0 = 직원 유지, 1 = 직원 종료, 현재 12 개의 예측 변수 만보고 있습니다. 데이터의 용어는 "불균형"입니다. 총 레코드 세트의 %

다양한 mtry 및 ntree 선택으로 모델을 실행하지만 아래에 설정되어 있습니다. 아웃 오브 밴드 내 생각은 6.8 %가 양호하지만 혼란 매트릭스는 에러율이 매우 높은 92.79 %로이기 때문에 용어를 예측하는 서로 다른 이야기를하는 것 바로 내가 의지하고이 모델 때문에 사용할 수 없습니다 가정에서 암 I 항 예측에 대한 높은 오류율? 또는 RF를 사용하고 항을 예측하기 위해 더 작은 오류율을 얻기 위해 할 수있는 일이 있습니까?

 FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree      OOB      1      2
  100:   6.97%  0.47% 92.79%
  200:   6.87%  0.36% 92.79%
  300:   6.82%  0.33% 92.55%
  400:   6.80%  0.29% 92.79%
  500:   6.80%  0.29% 92.79%
> print(FOREST_model)

Call:
 randomForest(formula = theFormula, data = trainset, mtry = 3,      ntree = 500, importance = TRUE, do.trace = 100) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 6.8%
Confusion matrix:
     0  1 class.error
0 5476 16 0.002913328
1  386 30 0.927884615
> nrow(trainset)
[1] 5908

답변:


20

혼동 매트릭스는 투표 마감에 의해 결정된 특정 지점에서 계산됩니다. 요구 사항, 즉 정밀도 향상 (가양 성 감소) 또는 감도 향상 (가양 성 감소)에 따라 다른 컷오프를 선호 할 수 있습니다.

이를 위해 (i) ROC 곡선 , (ii) 리콜 정밀도 및 (iii) 목적에 가장 잘 맞는 컷오프를 선택하기위한 보정 곡선을 플로팅하는 것이 좋습니다 . ROCR R 라이브러리 ( CRAN 에서도 사용 가능) 의 다음 2 가지 기능을 사용하여 이러한 모든 것을 쉽게 플롯 할 수 있습니다 .

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

예를 들면 다음과 같습니다.

rf <- randomForest (x,y,...);
OOB.votes <- predict (rf,x,type="prob");
OOB.pred <- OOB.votes[,2];

pred.obj <- prediction (OOB.pred,y);

RP.perf <- performance(pred.obj, "rec","prec");
plot (RP.perf);

ROC.perf <- performance(pred.obj, "fpr","tpr");
plot (ROC.perf);

plot  (RP.perf@alpha.values[[1]],RP.perf@x.values[[1]]);
lines (RP.perf@alpha.values[[1]],RP.perf@y.values[[1]]);
lines (ROC.perf@alpha.values[[1]],ROC.perf@x.values[[1]]);

나는 당신의 대답에 관심이 있으며, 당신이 공유 한 코드로 플롯했습니다. 제안한 음모에 대한 약간의 세부 정보를 찾을 수있는 자료를 제공해 주시겠습니까? 또는 그것을 해석하는 방법에 대한 문장을 거의 쓰지 않을 것입니다. 미리 감사드립니다.
MKS

위에서 설명한 ROC 곡선 항목과 여기에 언급 된 다른 항목으로 시작하는 것이 좋습니다 .
Itamar

대답은 치우친 데이터 세트에서 의사 결정 트리의 한계를 직접 다루지는 않습니다.
SmallChess

19

세트의 균형이 매우 불균형합니다.이 시나리오에서는 RF가 일반적으로 실패합니다 (즉, 더 큰 클래스 만 예측).

"0"클래스를 "1"클래스와 거의 같은 크기로 샘플링하거나 classwt파라미터 로 연주하여 세트 균형을 조정해야합니다 .


1
수있는 Being이에도 불구하고 classwt매개 변수, 나는 그것이 아직 구현 생각하지 않는다 randomForest()의 기능 randomForestR. 당에서 패키지 링크 . 전에 사용해 봤어? 다른 값으로 시도했지만 기본값과 동일한 결과를 얻었습니다 classwt=NULL.
Zhubarb

9

혼동 매트릭스를 기반으로 5,908 개의 데이터 포인트가 있으며 그 중 대다수는 0 유형입니다 ( '직원이 머물 렀습니다'). 따라서 예를 들어 다른 클래스에 속하는 것이 확실하지 않은 경우 분류기는 "게으른"상태에서 벗어나 대부분의 클래스를 선택하는 것을 피할 수 있습니다. 전체 오류율은 ~ 7 %이며 이는 Class1 예제의 비율과 매우 비슷합니다!

몇 가지 옵션이 있습니다.

  • 균형 잡힌 수업이 될 때까지 Class0 예제를 폐기하십시오. 최적으로 대표되는 부분 집합을 선택하는 방법에 대한 문헌이 있는지 모르겠지만 (다른 사람이 무게를 may 수 있습니까?) 예를 무작위로 드롭하여 시작할 수 있습니다. subsetrandomForest에 인수를 전달하면 테스트가 간단합니다.

  • 손실 함수 / 클래스 가중치를 조정하여 불균형 한 Class0 수를 보상하십시오. 본질적으로 분류자가 Class0 예제보다 Class1 예제를 잘못 분류하는 데 훨씬 더 많은 비용이 드는 것을 원합니다. Class0 = 1 / 0.07 ~ = 14x Class1을 시작하는 것이 합리적 일 수 있지만 비즈니스 요구에 따라이를 조정할 수 있습니다 (한 종류의 오류가 얼마나 심할까요). 나는 classwt매개 변수가 당신이 찾고있는 것이라고 생각합니다 .

  • 계층화 된 샘플링을 사용하여 나무의 훈련 데이터에서 두 클래스의 예제를 얻도록하십시오. 일부 트리는 Class0 데이터에 대해서만 훈련을 받았을 가능성이 있으며, 이는 일반화 성능면에서 좋지 않습니다. strata인수를 확인하십시오 .


지배적 인 클래스에서 무작위로 선택하는 것이 합리적입니다. 그들은 같을 필요는 없습니다 : 1 : 5 비율조차도 개선되어야합니다.
Itamar

@Itmar, 그게 내가 먼저 시도 할 것입니다. 그러나 보유한 예제가 더 큰 데이터 세트를 나타내는 지 확인하는 방법이 있어야합니다.
매트 크라우스

1
더 큰 세트에서 PCA (원리 구성 요소 분석)를 실행하고 첫 번째 기본 구성 요소에 따라 포인트를 클러스터링하고 각 클러스터에서 하나의 샘플을 선택할 수 있습니다.
Itamar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.