Ця тема стосується двох інших тем і тонкої статті з цього приводу. Здається, класифікація та зниження тиску однаково хороші. Я використовую downsampling, як описано нижче.
Пам'ятайте, що навчальний набір повинен бути великим, оскільки лише 1% характеризуватиме рідкісний клас. Менше ніж 25 ~ 50 зразків цього класу, ймовірно, буде проблематичним. Мало зразків, що характеризують клас, неминуче зроблять вивчений малюнок грубим і менш відтворюваним.
РФ використовує більшість голосів за замовчуванням. Поширеність класу навчального набору буде функціонувати як деякий ефект до попереднього. Таким чином, якщо рідкісний клас не може бути відокремлений, навряд чи цей рідкісний клас виграє більшість голосів при прогнозуванні. Замість того, щоб зібрати більшість голосів, ви можете зібрати фракції голосів.
Стратифікований відбір проб може бути використаний для посилення впливу рідкісного класу. Це робиться за рахунок витрат на зниження тиску інших класів. Вирощені дерева стануть менш глибокими, оскільки потрібно розділити набагато менше зразків, що обмежує складність вивченого потенційного шаблону. Кількість вирощених дерев повинна бути великою, наприклад 4000 таких, що більшість спостережень бере участь у кількох деревах.
У наведеному нижче прикладі я моделював набір навчальних даних з 5000 зразків з 3 класом з перевагою відповідно 1%, 49% та 50%. Таким чином, буде 50 зразків класу 0. На першому малюнку показано справжній клас навчального набору як функція двох змінних x1 та x2.
Підготовлено чотири моделі: модель за замовчуванням та три стратифіковані моделі з 1: 10 1: 2: 2 та 1: 1: 1 стратифікацією класів. Основне, а кількість зразків накладних (у тому числі перемальовок) у кожному дереві становитиме 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)