Otázka:
Balíček R pro vážený náhodný les? možnost classwt?
Metariat
2015-06-19 16:50:30 UTC
view on stackexchange narkive permalink

Pokouším se pomocí Random Forest předpovědět výsledek extrémně nevyváženého souboru dat (míra menšinové třídy je asi jen 1% nebo dokonce méně). Protože tradiční algoritmus Random Forest minimalizuje celkovou míru chyb, spíše než věnovat zvláštní pozornost třídám menšin, není přímo použitelný na nevyvážená data. Chci tedy přiřadit vysoké náklady k nesprávné klasifikaci třídy menšin (nákladově citlivé učení).

Přečetl jsem několik zdrojů, že můžeme použít volbu classwt z randomForest v R, ale nevím, jak ji použít. A máme nějaké další alternativy k funkci randomForest ?

Jeden odpovědět:
Soren Havelund Welling
2015-06-22 02:06:41 UTC
view on stackexchange narkive permalink

Toto vlákno odkazuje na dvě další vlákna a skvělý článek o této záležitosti. Zdá se, že klasifikace a převzorkování jsou stejně dobré. Používám převzorkování, jak je popsáno níže.

Nezapomeňte, že tréninková sada musí být velká, protože pouze 1% bude charakterizovat vzácnou třídu. Méně než 25 ~ 50 vzorků této třídy bude pravděpodobně problematických. Několik vzorků charakterizujících třídu nevyhnutelně učiní naučený vzor hrubým a méně reprodukovatelným.

RF používá jako výchozí hlasování většiny. Prevalence třídy v tréninkové sadě bude fungovat jako nějaký druh účinného předchozího. Není-li tedy vzácná třída dokonale oddělitelná, je nepravděpodobné, že tato vzácná třída získá při předpovídání většinové hlasování. Místo agregace podle většinového hlasování můžete agregovat hlasovací zlomky.

Ke zvýšení vlivu vzácné třídy lze použít stratifikované vzorkování. To se provádí na nákladech na převzorkování ostatních tříd. Vyrostlé stromy se stanou méně hlubokými, protože je třeba rozdělit mnohem méně vzorků, což omezuje složitost naučeného potenciálního vzoru. Počet pěstovaných stromů by měl být velký, např. 4000 tak, že většina pozorování se účastní několika stromů.

V níže uvedeném příkladu jsem simuloval tréninkovou datovou sadu 5000 vzorků s třídou 3 s prevalencí 1%, 49% a 50%. Bude tedy 50 vzorků třídy 0. První obrázek ukazuje skutečnou třídu tréninkové sady jako funkci dvou proměnných x1 a x2. This picture shows the simulated pattern to learn

Byly trénovány čtyři modely: výchozí model a tři stratifikované modely s stratifikací tříd 1:10:10 1: 2: 2 a 1: 1: 1. Hlavní, zatímco počet inbagových vzorků (včetně překreslení) v každém stromu bude 5 000, 1050, 250 a 150. Protože nepoužívám většinové hlasování, nemusím vytvářet dokonale vyvážené rozvrstvení. Místo toho by hlasy ve vzácných třídách mohly být váženy 10krát nebo jiným rozhodovacím pravidlem. Vaše cena falešných negativů a falešných poplachů by měla ovlivnit toto pravidlo.

Následující obrázek ukazuje, jak stratifikace ovlivňuje hlasovací zlomky. Všimněte si, že poměr stratifikovaných tříd je vždy těžištěm předpovědí. stratification and voting

Nakonec můžete použít ROC křivku k nalezení pravidla hlasování, které vám poskytne dobrý kompromis mezi specificitou a citlivostí. Černá čára není stratifikace, červená 1: 5: 5, zelená 1: 2: 2 a modrá 1: 1: 1. Pro tento soubor dat se zdá být nejlepší volbou 1: 2: 2 nebo 1: 1: 1. roc curve

Mimochodem, frakce hlasování jsou zde křížově neplatné.

A kód:

  knihovna (plotrix) knihovna (randomForest) knihovna (AUC) make.data = funkce (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 = kvantil (yValue, c (smallGroupFraction, .5)) yClass = použít (sapply (yQuantile, funkce (x) x<yValue), 1, součet) yClass = faktor (yClass) tisk (tabulka (yClass)) # pět tříd , první třída má pouze 1% prevalenciData = data.frame (X = X, y = yClass)} plot.separation = function (rf, ...) {triax.plot (rf $ hlasů, ..., col.symbols = c ("# FF0000FF", "# 00FF0010", "# 0000FF10") [as.numeric (rf $ y)])} # vytvořit datovou sadu, kde třída "0" (červené kruhy) jsou vzácnými pozorováními # třída 0 je poněkud oddělitelné od třídy „1“ a zcela oddělitelné od třídy „2 "Data = make.data () par (mfrow = c (1,1)) plot (Data [, 1: 2], main =" problém s oddělením: identifikujte vzácné červené kruhy ", col = c (" # FF0000FF ", "# 00FF0020", "# 0000FF20") [as.numeric (Data $ y)]) # výchozí vlak RF a 10x 30x a 100x převzorkování stratificationrf1 = randomForest (y ~., Data, ntree = 500, sampsize = 5000 ) rf2 = randomForest (y ~., Data, ntree = 4000, sampsize = c (50 500 500), vrstvy = Data $ y) rf3 = randomForest (y ~., Data, ntree = 4000, sampsize = c (50 100 100), vrstvy = Data $ y) rf4 = randomForest (y ~., Data, ntree = 4000, sampsize = c (50,50,50), vrstvy = Data $ y) #plot out-of-bag pluralistické předpovědi (hlasovací zlomky). par (mfrow = c (2,2), mar = c (4,4,3,3))
plot.separation (rf1, main = "bez stratifikace") 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 $ hlasů [, 1], faktor (1 * (rf1 $ y == 0))), hlavní = "ROC křivky pro čtyři modely předpovídající třídu 0") graf (roc (rf2 $ hlasy [, 1], faktor (1 * (rf1 $ y == 0))), col = 2, add = T) graf (roc (rf3 $ hlasy [, 1], faktor (1 * (rf1 $ y == 0))), col = 3, add = T) plot (roc (rf4 $ hlasy [, 1], faktor (1 * (rf1 $ y == 0))), col = 4, add = T)  
oups jeden údaj titulek říká 1: 5: 5 namísto 1: 2: 2
moc děkuji za vaši podrobnou odpověď, která mi určitě hodně pomůže v mé každodenní práci.Existuje jedna věta, které nerozumím: „Hlavní, zatímco počet vzorků inbagů (včetně překreslení) v každém stromu bude 5 000, 1050, 250 a 150“. Mohl byste mi prosím vysvětlit, odkud čísla pocházejí?
Moje potěšení ;) v tomto příkladu měla vzácná třída 50 členů.Pokud bychom stratifikovali 1:10:10, museli bychom specifikovat sampsize = c (50 500 500).50 + 500 + 500 = 1050. Plně dospělý strom 1050 vzorků bude mít celkem 1050 x 2 uzly.
Omlouvám se, pokud je moje otázka idiot, ale co zde znamená stratifikace 1:10:10, 1: 2: 2 a 1: 1: 1? A když jste řekli „hlasy ve vzácných třídách mohly být váženy 10krát“.Která část kódu to představuje?Je to 1:10:10? Děkuji mnohokrát!
1:10:10 jsou pomìry mezi třídami.Soubor simulovaných dat byl navržen tak, aby měl poměry 1:49:50.Tyto poměry byly změněny odebráním vzorků dvou větších tříd.Výběrem např.sampsize = c (50 500 500) stejné jako c (1,10,10) * 50 změníte poměry tříd ve stromech.50 je počet vzorků vzácné třídy.Pokud dále nastavíte keep.inbag = TRUE a zkontrolujete rf $ inbag, uvidíte, že vzorky vzácných tříd jsou inbag ve ~ 2/3 stromech, zatímco každý vzácný vzorek třídy je zahrnut do velmi málo stromů kvůli vzorkování dolů.
Pokud tedy dobře rozumím, je to technika „vzorkování dolů“, nikoli vážený náhodný les?
... jak je uvedeno ve třetí větě odpovědi.
Dobře, perfektní.Moc děkuji za laskavou odpověď :)
Myslíte si, že převzorkování je problematické, když cílem náhodného lesa je vypočítat pravděpodobnost?
Down / stratifikovaný výběr samozřejmě změní předchozí očekávání rozdělení tříd.Pokud trénujete model s jednotnou stratifikací podle tříd, ale chcete použít distribuci tříd tréninkové sady jako předchozí, myslím, že můžete pouze znásobit předpokládané poměry stromů dané třídy poměrem tříd v tréninkové sadě a znásobit počtem třídtaky.10 pozorování ve vlaku ze 100 je A, 40 je B a 50 je C. Pro každý strom jsou odebrány vzorky 6A, 6B, 6C.Pro daný test 400 z 500 stromů předpovídá třídu A. Chcete-li obnovit vlak před, zadní je (400/500) * (10/100) * 3 = 0,24
Vlastně si nejsem jistý, zda je možné provést podobnou korekci hmotnosti třídy.Náhodný odhad pravděpodobnosti lesa podle poměrů stromů má jemné rozlišení (schopnost rozlišovat).Avšak nemusí to být nutně velmi dobrá kalibrace (schopnost přiřadit absolutní pravděpodobnosti), model může být přehnaně nebo nedostatečně jistý.
Děkuji, opravdu ilustrativní odpověď.Obecně tedy převzorkování a vyvážení vašich tříd povede k lepší AUC?
@thc thx, ano, to je moje osobní zkušenost se zkosenými datovými sadami podobnými této simulaci.Podvzorkování nebo žádné převzorkování bych však považoval pouze za další hyperparametr a odhadl bych optimální hodnotu parametru pro jakoukoli konkrétní zkosenou datovou sadu např.křížově ověřené vyhledávání v mřížce.


Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...