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