R пакет для зваженого випадкового лісу? варіант classwt?


16

Я намагаюся використовувати Random Forest для прогнозування результатів надзвичайно незбалансованого набору даних (показник класу меншості становить приблизно лише 1% або навіть менше). Оскільки традиційний алгоритм випадкового лісу мінімізує загальний показник помилок, а не приділяє особливу увагу класам меншин, він не застосовується безпосередньо для незбалансованих даних. Тому я хочу віднести високу вартість до помилкової класифікації класу меншин (навчання, яке залежить від витрат).

Я прочитав кілька джерел , які ми можемо використовувати опцію classwtз randomForestв R, але я не знаю , як використовувати це. А чи є у нас інші альтернативи функції randomForest?

Відповіді:


29

Ця тема стосується двох інших тем і тонкої статті з цього приводу. Здається, класифікація та зниження тиску однаково хороші. Я використовую 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 здається найкращим вибором. крива roc

До речі, фракції голосів тут перекреслені.

І код:

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)

У підписі на одну цифру написано 1: 5: 5 замість 1: 2: 2
Сорен Хавелунд Веллінг

дуже дякую за вашу детальну відповідь, що, безумовно, мені дуже допоможе у щоденній роботі. Є одне речення, яке я не розумію: "Основне, тоді як кількість зразків пачок (включаючи перемальовки) у кожному дереві буде 5000,1050, 250 та 150". Чи можете ви мені пояснити, звідки беруться цифри?
Менаріат

1
мені приємно;) у цьому прикладі рідкісний клас мав 50 членів. Якщо стратифікувати 1:10:10, нам потрібно вказати sampsize = c (50 500 500). 50 + 500 + 500 = 1050. Повністю вирощене дерево з 1050 зразків матиме загалом 1050x2 вузли.
Сорен Хавелунд Веллінг

Вибачте, якщо моє запитання є ідіотським, але в чому сенс стратифікації 1:10:10, 1: 2: 2 та 1: 1: 1? І коли ви сказали, "голоси на рідкісних класах можна зважити в 10 разів". Яка частина коду представляє це? Це 1:10:10? Велике спасибі!
Менаріат

1
1:10:10 - співвідношення між класами. Модельований набір даних був розрахований на співвідношення 1:49:50. Ці співвідношення були змінені шляхом відбору проб двох великих класів. Вибравши, наприклад, sampsize = c (50,500,500) те саме, що c (1,10,10) * 50, ви змінюєте співвідношення класів у деревах. 50 - кількість зразків рідкісного класу. Якщо ви додатково встановите Keep.inbag = TRUE та огляньте rf $ inbag, ви побачите, що зразки рідкісних класів містяться в ~ 2/3 деревах, тоді як кожен не рідкісний зразок класу включається в дуже мало дерев через відсутність вибірки.
Сорен Хавелунд Веллінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.