यह थ्रेड दो अन्य थ्रेड्स और इस मामले पर एक ठीक लेख को संदर्भित करता है। ऐसा लगता है कि क्लास वेटिंग और डाउनसमलिंग समान रूप से अच्छे हैं। मैं नीचे वर्णित के रूप में डाउनसमलिंग का उपयोग करता हूं।
याद रखें कि प्रशिक्षण सेट बड़ा होना चाहिए क्योंकि केवल 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)