임의 포리스트에 대한 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.