भारित यादृच्छिक वन के लिए आर पैकेज? classwt विकल्प?


16

मैं एक अत्यंत असंतुलित डेटा सेट के परिणाम की भविष्यवाणी करने के लिए रैंडम फ़ॉरेस्ट का उपयोग करने की कोशिश कर रहा हूं (अल्पसंख्यक वर्ग की दर लगभग 1% या उससे कम है)। क्योंकि पारंपरिक रैंडम फ़ॉरेस्ट एल्गोरिथ्म अल्पसंख्यक वर्गों पर विशेष ध्यान देने के बजाय समग्र त्रुटि दर को कम करता है, यह सीधे असंतुलित डेटा पर लागू नहीं होता है। इसलिए मैं अल्पसंख्यक वर्ग (लागत संवेदनशील शिक्षा) के गर्भपात के लिए एक उच्च लागत आवंटित करना चाहता हूं।

मैंने कई स्रोतों को पढ़ा कि हम आर के विकल्प classwtका उपयोग कर सकते हैं randomForest, लेकिन मुझे नहीं पता कि इसका उपयोग कैसे करना है। और क्या हमारे पास randomForestमौज-मस्ती के लिए कोई और विकल्प है ?

जवाबों:


29

यह थ्रेड दो अन्य थ्रेड्स और इस मामले पर एक ठीक लेख को संदर्भित करता है। ऐसा लगता है कि क्लास वेटिंग और डाउनसमलिंग समान रूप से अच्छे हैं। मैं नीचे वर्णित के रूप में डाउनसमलिंग का उपयोग करता हूं।

याद रखें कि प्रशिक्षण सेट बड़ा होना चाहिए क्योंकि केवल 1% दुर्लभ वर्ग की विशेषता होगी। इस वर्ग के 25 ~ 50 से कम नमूने संभवतः समस्याग्रस्त होंगे। कक्षा को चित्रित करने वाले कुछ नमूने अनिवार्य रूप से सीखा पैटर्न को कम और कम प्रतिलिपि प्रस्तुत करने योग्य बना देंगे।

आरएफ डिफ़ॉल्ट रूप से बहुमत मतदान का उपयोग करता है। प्रशिक्षण सेट का वर्ग प्रचलन पूर्व के कुछ प्रकार के रूप में संचालित होगा। इस प्रकार जब तक कि दुर्लभ वर्ग पूरी तरह से अलग नहीं हो जाता, तब तक यह संभावना नहीं है कि यह दुर्लभ वर्ग भविष्यवाणी करते समय बहुमत मतदान जीत जाएगा। बहुसंख्यक मतों के एकत्रीकरण के बजाय, आप मतों के विभाजन को एकत्र कर सकते हैं।

स्तरीकृत नमूने का उपयोग दुर्लभ वर्ग के प्रभाव को बढ़ाने के लिए किया जा सकता है। यह अन्य वर्गों के डाउनसम्पलिंग की लागत पर किया जाता है। उगाए गए पेड़ कम गहरे हो जाएंगे क्योंकि बहुत कम नमूनों को विभाजित करने की आवश्यकता होती है इसलिए सीखे गए संभावित पैटर्न की जटिलता को सीमित करना होगा। उगाए जाने वाले वृक्षों की संख्या बड़ी होनी चाहिए जैसे कि 4000, अधिकांश अवलोकन कई पेड़ों में भाग लेते हैं।

नीचे दिए गए उदाहरण में, मैंने 5000 नमूनों के प्रशिक्षण डेटा सेट को क्रमशः 1%, 49% और 50% के साथ 3 वर्ग के साथ सेट किया है। इस प्रकार कक्षा ० के ५० नमूने होंगे। पहला आंकड़ा दो चर X1 और x2 के कार्य के रूप में निर्धारित प्रशिक्षण की सही कक्षा को दर्शाता है। यह चित्र सीखने के लिए नकली पैटर्न दिखाता है

चार मॉडलों को प्रशिक्षित किया गया था: एक डिफ़ॉल्ट मॉडल, और 1:10:10 1: 2: 2 और 1: 1: 1 वर्गों के स्तरीकरण के साथ तीन स्तरीकृत मॉडल। मुख्य जबकि प्रत्येक पेड़ में इनबॉग सैंपल (incl। Redraws) की संख्या ५०००, १०५०, २५० और १५० होगी। जैसा कि मैं बहुमत वोटिंग का उपयोग नहीं करता हूं, मुझे पूरी तरह से संतुलित स्तरीकरण करने की आवश्यकता नहीं है। इसके बजाय दुर्लभ वर्गों के वोटों का वजन 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)

ऑप्स वन फिगर कैप्शन कहता है 1: 5: 5 के बजाय 1: 2: 2
सोरेन हवेलुंड वेलिंग

आपके विस्तृत जवाब के लिए बहुत-बहुत धन्यवाद, यह निश्चित रूप से मेरे दैनिक कार्यों में बहुत मदद करेगा। एक वाक्य है जो मुझे समझ में नहीं आता है: "मुख्य जबकि प्रत्येक पेड़ में इनबॉग नमूने (incl। Redraws) की संख्या 5000,1050, 250 और 150 होगी"।
मेटेरियट

1
मेरी खुशी;) इस उदाहरण में दुर्लभ वर्ग में 50 सदस्य थे। यदि 1:10:10 के स्तरीकरण के लिए हमें नमूना = सी (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 के लिए डिज़ाइन किया गया था। इन अनुपातों को दो बड़े वर्गों के नमूने द्वारा बदल दिया गया था। उदाहरण के लिए नमूना चुनिए = c (50,500,500) c (1,10,10) * 50 के समान, आप पेड़ों में वर्ग अनुपात बदलते हैं। 50 दुर्लभ वर्ग के नमूनों की संख्या है। यदि आप इसके अलावा Keep.inbag = TRUE और rf $ इनबाग सेट करते हैं, तो आप देखेंगे कि दुर्लभ वर्गों के नमूने ~ 2/3 पेड़ों में इनबॉग हैं, जबकि प्रत्येक गैर-दुर्लभ श्रेणी का नमूना नीचे के नमूने के कारण बहुत कम पेड़ों में शामिल है।
सोरेन हवेलुंड वेलिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.