এই থ্রেডটি এই বিষয়ে আরও দুটি থ্রেড এবং সূক্ষ্ম নিবন্ধকে বোঝায়। মনে হচ্ছে ক্লাস ওয়েইটিং এবং ডাউনসাম্পলিংও সমানভাবে ভাল। আমি নীচে বর্ণিত হিসাবে ডাউনস্যাম্পলিং ব্যবহার করি।
মনে রাখবেন প্রশিক্ষণ সেটটি অবশ্যই বড় হতে হবে কারণ কেবল 1% বিরল শ্রেণীর বৈশিষ্ট্যযুক্ত। এই শ্রেণীর 25 ~ 50 এরও কম নমুনা সম্ভবত সমস্যাযুক্ত হবে। শ্রেণীর বৈশিষ্ট্যযুক্ত কয়েকটি নমুনা অনিবার্যভাবে শিখে নেওয়া প্যাটার্নকে অশোধিত এবং কম পুনরুত্পাদনযোগ্য করে তুলবে।
আরএফ ডিফল্ট হিসাবে সংখ্যাগরিষ্ঠ ভোটদান ব্যবহার করে। প্রশিক্ষণের সেটটির শ্রেণি ব্যাপ্তিগুলি একরকম কার্যকর পূর্বের হিসাবে কাজ করবে। সুতরাং দুর্লভ শ্রেণি পুরোপুরি বিচ্ছিন্ন না হলে ভবিষ্যদ্বাণী করার সময় এই বিরল শ্রেণীর সংখ্যাগরিষ্ঠ ভোটে জয়লাভের সম্ভাবনা কম। সংখ্যাগরিষ্ঠ ভোটে একত্রিত করার পরিবর্তে, আপনি ভোটের ভগ্নাংশকে একত্রিত করতে পারেন।
বিরল শ্রেণীর প্রভাব বাড়াতে স্তূপিত নমুনা ব্যবহার করা যেতে পারে। এটি অন্যান্য ক্লাসগুলি ডাউনস্যাম্পলিংয়ের জন্য ব্যয় করে করা হয়। জন্মেছে এমন গাছগুলি আরও গভীর হয়ে উঠবে যেহেতু খুব কম নমুনাগুলি বিভক্ত হওয়া দরকার যার ফলে শেখা সম্ভাব্য নিদর্শনগুলির জটিলতা সীমাবদ্ধ করে। জন্মানো গাছের সংখ্যা বড় হওয়া উচিত যেমন 4000 এমন যে সর্বাধিক পর্যবেক্ষণগুলি বেশ কয়েকটি গাছে অংশ নেয়।
নীচের উদাহরণে, আমি যথাক্রমে 1%, 49% এবং 50% সহ 3 শ্রেণীর সহ 5000 টি নমুনার একটি প্রশিক্ষণ ডেটা সেট সিমুলেটেড করেছি। সুতরাং ক্লাস 0 এর 50 টি নমুনা থাকবে প্রথম চিত্রটি দুটি ভেরিয়েবল x1 এবং x2 এর ফাংশন হিসাবে সেট প্রশিক্ষণের প্রকৃত শ্রেণিকে দেখায়।
চারটি মডেলকে প্রশিক্ষণ দেওয়া হয়েছিল: একটি ডিফল্ট মডেল এবং 1:10:10 1: 2: 2 এবং 1: 1: 1 ক্লাসের স্তরায়ন সহ তিনটি স্তরযুক্ত মডেল। প্রধানত প্রতিটি গাছে ইনব্যাগের নমুনার সংখ্যা (পুনরায় আঁকানো) হবে 5000, 1050, 250 এবং 150. আমি সংখ্যাগরিষ্ঠ ভোটদানের ব্যবহার না করায় আমাকে পুরোপুরি সুষম স্তরবিন্যাস করার দরকার নেই। পরিবর্তে বিরল শ্রেণীর ভোটগুলি 10 বার বা অন্য কোনও সিদ্ধান্তের নিয়মকে ওজন করা যেতে পারে। আপনার মিথ্যা নেতিবাচক এবং মিথ্যা ধনাত্মকগুলির ব্যয় এই নিয়মকে প্রভাবিত করবে।
পরবর্তী চিত্রটি দেখায় যে স্তরবিন্যাস কীভাবে ভোট-ভগ্নাংশকে প্রভাবিত করে। লক্ষ্য করুন স্তরের শ্রেণিবদ্ধ অনুপাত সর্বদা ভবিষ্যদ্বাণীগুলির সেন্ট্রয়েড।
সর্বশেষে আপনি কোনও ভোটদানের নিয়ম খুঁজে পেতে একটি আরওসি-কার্ভ ব্যবহার করতে পারেন যা আপনাকে নির্দিষ্টতা এবং সংবেদনশীলতার মধ্যে একটি ভাল বাণিজ্য-অফ দেয়। কালো রেখাটি কোনও স্তরবিন্যাস নয়, লাল 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)