가중 랜덤 포레스트를위한 R 패키지? classwt 옵션?


16

랜덤 포레스트를 사용하여 매우 불균형 한 데이터 세트의 결과를 예측하려고합니다 (소수 클래스 비율은 약 1 % 이하입니다). 기존의 랜덤 포레스트 알고리즘은 소수 클래스에 특별한주의를 기울이지 않고 전체 오류율을 최소화하므로 불균형 데이터에는 직접 적용 할 수 없습니다. 따라서 소수 민족의 오 분류 (비용에 민감한 학습)에 높은 비용을 할당하고 싶습니다.

R 에서 옵션 classwt을 사용할 수있는 몇 가지 소스를 읽었 randomForest지만 이것을 사용하는 방법을 모르겠습니다. 그리고 randomForestfuntion에 대한 다른 대안이 있습니까?

답변:


29

스레드 는 다른 두 개의 스레드와이 문제에 대한 훌륭한 기사를 나타냅니다. 클래스 가중치와 다운 샘플링이 똑같이 좋습니다. 아래 설명과 같이 다운 샘플링을 사용합니다.

1 %만이 희귀 클래스를 특징 짓기 때문에 훈련 세트는 커야합니다. 이 클래스의 25 ~ 50 개 미만의 샘플은 문제가 될 수 있습니다. 클래스를 특징 짓는 샘플은 필연적으로 학습 된 패턴을 조잡하고 재현성이 떨어집니다.

RF는 과반수 투표를 기본값으로 사용합니다. 훈련 세트의 클래스 보급은 어떤 종류의 효과적인 사전으로 작동 할 것입니다. 따라서 희귀 계급이 완벽하게 분리되지 않는 한,이 희귀 계급이 예측할 때 다수의 투표에서 이길 가능성은 거의 없습니다. 과반수 투표로 집계하는 대신 투표 비율을 집계 할 수 있습니다.

계층화 된 샘플링을 사용하여 희귀 클래스의 영향을 증가시킬 수 있습니다. 이것은 다른 클래스를 다운 샘플링하는 비용으로 이루어집니다. 재배 된 나무는 훨씬 적은 수의 샘플을 분할해야하기 때문에 깊이가 줄어들어 학습 할 수있는 패턴의 복잡성을 제한합니다. 자라는 나무의 수는 4000과 같이 커야하며 대부분의 관측치가 여러 나무에 참여합니다.

아래 예제에서는 각각 1 %, 49 % 및 50 %의 3 가지 클래스로 5000 개의 샘플로 구성된 훈련 데이터 세트를 시뮬레이션했습니다. 따라서 클래스 0의 샘플은 50 개가됩니다. 첫 번째 그림은 두 변수 x1 및 x2의 함수로 설정된 실제 학습 클래스를 보여줍니다. 이 그림은 학습 할 시뮬레이션 패턴을 보여줍니다.

기본 모델과 클래스의 1:10:10 1 : 2 : 2 및 1 : 1 : 1 계층화가있는 세 개의 계층화 된 모델이 네 가지 모델로 훈련되었습니다. 기본적으로 각 나무의 inbag 샘플 (재 작성 포함)의 수는 5000, 1050, 250 및 150입니다. 대다수의 투표를 사용하지 않기 때문에 완벽하게 균형 잡힌 계층화를 만들 필요는 없습니다. 대신에 희귀 클래스에 대한 투표는 10 배나 다른 결정 규칙에 가중치를 부여 할 수 있습니다. 오 탐지 및 오 탐지 비용이이 규칙에 영향을 미칩니다.

다음 그림은 계층화가 투표율에 미치는 영향을 보여줍니다. 계층화 된 클래스 비율은 항상 예측의 중심입니다. 계층화 및 투표

마지막으로 ROC- 곡선을 사용하여 투표 규칙을 찾아서 특이성과 감도 사이의 균형을 맞출 수 있습니다. 검은 선은 계층화되지 않습니다 (빨간색 1 : 5 : 5, 녹색 1 : 2 : 2 및 파랑 1 : 1 : 1). 이 데이터 세트의 경우 1 : 2 : 2 또는 1 : 1 : 1이 최선의 선택입니다. 록 커브

그건 그렇고, 투표 분수는 여기에 가방 밖에서 교차 검증되었습니다.

그리고 코드 :

library(plotrix)
library(randomForest)
library(AUC)

make.data = function(obs=5000,vars=6,noise.factor = .2,smallGroupFraction=.01) {
X = data.frame(replicate(vars,rnorm(obs)))
yValue = with(X,sin(X1*pi)+sin(X2*pi*2)+rnorm(obs)*noise.factor)
yQuantile = quantile(yValue,c(smallGroupFraction,.5))
yClass = apply(sapply(yQuantile,function(x) x<yValue),1,sum)
yClass = factor(yClass)
print(table(yClass)) #five classes, first class has 1% prevalence only
Data=data.frame(X=X,y=yClass)
}

plot.separation = function(rf,...) {
triax.plot(rf$votes,...,col.symbols = c("#FF0000FF",
                                       "#00FF0010",
                                       "#0000FF10")[as.numeric(rf$y)])
}

#make data set where class "0"(red circles) are rare observations
#Class 0 is somewhat separateble from class "1" and fully separateble from class "2"
Data = make.data()
par(mfrow=c(1,1))
plot(Data[,1:2],main="separation problem: identify rare red circles",
     col = c("#FF0000FF","#00FF0020","#0000FF20")[as.numeric(Data$y)])

#train default RF and with 10x 30x and 100x upsumpling by stratification
rf1 = randomForest(y~.,Data,ntree=500, sampsize=5000)
rf2 = randomForest(y~.,Data,ntree=4000,sampsize=c(50,500,500),strata=Data$y)
rf3 = randomForest(y~.,Data,ntree=4000,sampsize=c(50,100,100),strata=Data$y)
rf4 = randomForest(y~.,Data,ntree=4000,sampsize=c(50,50,50)  ,strata=Data$y)

#plot out-of-bag pluralistic predictions(vote fractions).
par(mfrow=c(2,2),mar=c(4,4,3,3))
plot.separation(rf1,main="no stratification")
plot.separation(rf2,main="1:10:10")
plot.separation(rf3,main="1:5:5")
plot.separation(rf4,main="1:1:1")

par(mfrow=c(1,1))
plot(roc(rf1$votes[,1],factor(1 * (rf1$y==0))),main="ROC curves for four models predicting class 0")
plot(roc(rf2$votes[,1],factor(1 * (rf1$y==0))),col=2,add=T)
plot(roc(rf3$votes[,1],factor(1 * (rf1$y==0))),col=3,add=T)
plot(roc(rf4$votes[,1],factor(1 * (rf1$y==0))),col=4,add=T)

oups one figure caption은 1 : 2 : 2 대신 1 : 5 : 5라고 말합니다
Soren Havelund Welling

자세한 답변을 보내 주셔서 감사합니다. 일상 생활에서 많은 도움이 될 것입니다. 내가 이해하지 못하는 한 문장이 있습니다 : "주로 각 나무에있는 인백 샘플 (재 작성 포함)의 수는 5000,1050, 250 및 150입니다."숫자의 출처는 어디입니까?
Metariat

1
나의 즐거움;)이 예에서 희귀 한 클래스는 50 명의 멤버를 가졌다. 1:10:10을 계층화하는 경우 sampsize = c (50,500,500)을 지정해야합니다. 50 + 500 + 500 = 1050. 완전히 자란 1050 개의 샘플 트리에는 총 1050x2 노드가 있습니다.
Soren Havelund Welling 2016

내 질문이 바보라면 죄송하지만 여기서 1:10:10, 1 : 2 : 2 및 1 : 1 : 1 계층화의 의미는 무엇입니까? 그리고 당신이 "희귀 클래스에 대한 투표는 10 배 가중 될 수 있습니다"라고 말할 때. 코드의 어느 부분이 그것을 나타내는가? 1:10:10입니까? 대단히 감사합니다!
Metariat

1
1:10:10은 클래스 간 비율입니다. 시뮬레이션 된 데이터 세트는 1:49:50의 비율을 갖도록 설계되었습니다. 이 비율은 두 개의 큰 클래스를 다운 샘플링하여 변경되었습니다. 예를 들어 c (1,10,10) * 50과 동일한 sampsize = c (50,500,500)을 선택하면 트리의 클래스 비율이 변경됩니다. 50은 희귀 클래스의 샘플 수입니다. keep.inbag = TRUE를 더 설정하고 rf $ inbag를 검사하면 희귀 클래스의 샘플이 ~ 2 / 3 트리에 포장되어 있고 희귀하지 않은 클래스 샘플은 다운 샘플링으로 인해 매우 적은 수의 트리에 포함되어 있음을 알 수 있습니다.
Soren Havelund Welling 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.