R randomForests에서 분류 임계 값을 변경하는 방법은 무엇입니까?


10

모든 종 분포 모델링 문헌은 확률 (예를 들어, 랜덤 포레스트)을 출력하는 모델을 사용하여 종의 존재 유무를 예측할 때 실제로 존재 또는 부재로 종을 분류 할 수있는 임계치 확률의 선택이 중요하며 항상 기본값 인 0.5를 사용하지는 않습니다. 이것에 대한 도움이 필요합니다! 내 코드는 다음과 같습니다.

library(randomForest)
library(PresenceAbsence)

#build model
RFfit <- randomForest(Y ~ x1 + x2 + x3 + x4 + x5, data=mydata, mytry = 2, ntrees=500)

#eventually I will apply this to (predict for) new data but for first I predict back    to training data to compare observed vs. predicted
RFpred <- predict(RFfit, mydata, type = "prob")

#put the observed vs. predicted in the same dataframe
ObsPred <- data.frame(cbind(mydata), Predicted=RFpred)

#create auc.roc plot
auc.roc.plot(ObsPred, threshold = 10, xlab="1-Specificity (false positives)",
  ylab="Sensitivity (true positives)", main="ROC plot", color=TRUE,
  find.auc=TRUE, opt.thresholds=TRUE, opt.methods=9) 

이로부터 나는 예측 된 확률로부터 존재를 분류하기 위해 사용하고자하는 임계 값이 기본값 0.5가 아니라 0.7이라고 결정했다. 이 정보로 무엇을해야하는지 완전히 이해하지 못했습니다. 출력 맵을 작성할 때이 임계 값을 사용합니까? 연속 확률로 매핑 된 출력을 쉽게 만든 다음 현재 값이 0.7보다 큰 값을 가진 항목을 다시 분류하고 <0.7이 아닌 값을 다시 분류하면됩니다.

또는 컷오프 매개 변수를 사용하여이 정보를 가져와 randomForests 모델링을 다시 실행 하시겠습니까? 컷오프 매개 변수는 정확히 무엇을 수행합니까? 결과 투표가 변경됩니까? (현재는 "중대"라고 말합니다). 이 차단 매개 변수를 어떻게 사용합니까? 설명서를 이해하지 못합니다! 감사!


2
나는 이것이 여기에 속한다고 말할 것이다 : (1) RF로부터의 확률 추정, (2) 모델에 비용 함수를 부과 할 수 있는지 또는 모델에 빌드해야하는지, (3) 비용 함수를 구현하는 방법 RF는 단순히 프로그래밍과 관련이없는 반복되는 문제입니다.
찰스

답변:


7

# 임계 값 또는 컷오프 값을 0.7로 설정

cutoff=0.7

컷오프 값 0.7보다 낮은 모든 값은 0으로 분류됩니다 (이 경우 현재).

RFpred[RFpred<cutoff]=0

컷오프 값 0.7보다 큰 모든 값은 1로 분류됩니다 (이 경우에는 없음).

 RFpred[RFpred>=cutoff]=1

1
답을 조금 더 넓힐 수 있습니까? 최소한 코드에 주석을 달면 유용 할 것입니다.
Patrick Coulombe

2
FWIW, 나는 이것으로 충분하다고 생각합니다.
Sycorax는 Reinstate Monica

이 답변은 완벽하게 들립니다. 동의한다.
Seanosapien

7

받지 못해서 답변을 시도합니다. 이 문제를 다루기 위해 Max Kuhn의 책을 추천하십시오. 이것은 상당히 광범위한 문제입니다. 비트를 추가하십시오.

  1. ROC 곡선은 널리 사용되지만 False Negative 비용과 False Positive 결과 간의 균형을 이해하려는 경우에만 의미가 있습니다. CostFN = CostFP 인 경우에는 의미가 없습니다. c- 통계 및 기타 파생 측정 값은 여전히 ​​사용됩니다. 정확도를 극대화하려면 모델을 조정하십시오 (캐럿 패키지로 쉽게 수행 할 수 있음). ROC 곡선을 만들지 마십시오.
  2. 누구나 RF 모델에서 파생 된 확률을 사용합니다. 나는 이것을하기 위해 어떤 생각을해야한다고 생각합니다. 이것들은 확률 모델이 아니며, 이것을하기 위해 만들어지지 않았습니다. 종종 작동합니다. 내가 실제로 아기에 관심이 있다면 최소한 새로운 데이터에 대한 RF 아기의 검증 플롯을 만들 것입니다.
  3. 가장 간단한 방법은 "현재 값이 0.7보다 큰 값과 0.7이없는 값을 간단히 재 분류"를 사용하는 것입니다.
  4. 비용 (FN)이 비용 (FP)과 같지 않으면 RF를 비용에 민감하게 만들어야합니다. R은 이것을 쉽게하지 않습니다. RandomForest 패키지의 가중치 기능이 작동하지 않습니다. 가장 좋은 옵션은 샘플링을 사용하여 원하는 경우 비용 함수를 얻기 위해 과소 표본 추출을하는 것입니다. 그러나 샘플 비율과 비용의 관계는 직접적이지 않습니다. 따라서 (3)을 고수하고 싶을 수도 있습니다.

클래스 가중치에 대한 업데이트 Andy Liaw :
randomForest 패키지의 "현재"classwt "옵션은 처음부터 존재했으며 공식 Fortran 코드 (버전 4 이상)가 클래스 가중치를 구현하는 방법과 다릅니다. 클래스 분할시 단일 CART 트리가 수행되는 방식과 정확히 동일하게 노드를 분할 할 때 Gini 인덱스 계산의 가중치 Breiman 교수는 단순히 다음을 사용하여 Fortran 코드의 최신 버전에서 구현 된 새로운 클래스 가중치 구성표를 제시했습니다. Gini 지수의 가중치는 매우 불균형 한 데이터에서 큰 도움이되지 않는 것 같습니다 (예 : 1 : 100 또는 그 이상) 가중 Gini를 사용하는 것이 상황에 도움이된다면 도움이 될 것입니다. "우리가 기대했던 결과를 얻지 못했습니다."


가중 인수가 작동하지 않는 이유 (4)에 대해 자세히 설명해 주시겠습니까?
Sycorax는 Reinstate Monica

2
내 이해는 그것이 Fortran 코드 ( stat.berkeley.edu/~breiman/RandomForests/cc_software.htm ) 에서 적절하게 구현 되었지만 R 패키지는 아니라는 것입니다. ( stat.ethz.ch/pipermail/r-help/2011-September/289769.html )에 대해 논의 하고 Gini 분할뿐만 아니라 모든 트리 구축 단계에서 가중치를 사용해야하는 경우를 중심으로합니다. 따라서 분할에서 가중치 만 사용하는 현재 R 구현은 잘 작동하지 않습니다.
Charles Charles
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.