ক্যারেট এবং বেসিক র্যান্ডমফোরস্ট প্যাকেজের মাধ্যমে র্যান্ডমফরেস্ট থেকে আলাদা ফলাফল


14

আমি কিছুটা বিভ্রান্ত: কীভাবে ক্যারেটের মাধ্যমে প্রশিক্ষিত মডেলের ফলাফলগুলি মূল প্যাকেজের মডেল থেকে আলাদা হতে পারে? আমি পড়েছি ক্যারেট প্যাকেজ সহ র‌্যান্ডমফোরেস্টের ফাইনালমোডেল ব্যবহারের পূর্বাভাসের পূর্বে প্রিপ্রোসেসিং প্রয়োজন কিনা? তবে আমি এখানে কোনও প্রাকপ্রসেসিং ব্যবহার করি না।

আমি ক্রেট প্যাকেজ ব্যবহার করে এবং বিভিন্ন মাতুর মানগুলির জন্য টিউন করে বিভিন্ন র্যান্ডম অরণ্যকে প্রশিক্ষণ দিয়েছি।

> cvCtrl = trainControl(method = "repeatedcv",number = 10, repeats = 3, classProbs = TRUE, summaryFunction = twoClassSummary)
> newGrid = expand.grid(mtry = c(2,4,8,15))
> classifierRandomForest = train(case_success ~ ., data = train_data, trControl = cvCtrl, method = "rf", metric="ROC", tuneGrid = newGrid)
> curClassifier = classifierRandomForest

আমি ট্রেনিং_ডাটাতে মাত্রি = 15 সেরা প্যারামিটার হিসাবে পেয়েছি:

> curClassifier
 ...
Resampling results across tuning parameters:

mtry  ROC    Sens   Spec   ROC SD   Sens SD  Spec SD
 4    0.950  0.768  0.957  0.00413  0.0170   0.00285
 5    0.951  0.778  0.957  0.00364  0.0148   0.00306
 8    0.953  0.792  0.956  0.00395  0.0152   0.00389
10    0.954  0.797  0.955  0.00384  0.0146   0.00369
15    0.956  0.803  0.951  0.00369  0.0155   0.00472

ROC was used to select the optimal model using  the largest value.
The final value used for the model was mtry = 15. 

আমি একটি আরওসি কার্ভ এবং একটি বিভ্রান্তির ম্যাট্রিক্স দিয়ে মডেলটি মূল্যায়ন করেছি:

##ROC-Curve
predRoc = predict(curClassifier, test_data, type = "prob")
myroc = pROC::roc(test_data$case_success, as.vector(predRoc[,2]))
plot(myroc, print.thres = "best")

##adjust optimal cut-off threshold for class probabilities
threshold = coords(myroc,x="best",best.method = "closest.topleft")[[1]] #get optimal cutoff threshold
predCut = factor( ifelse(predRoc[, "Yes"] > threshold, "Yes", "No") )


##Confusion Matrix (Accuracy, Spec, Sens etc.)
curConfusionMatrix = confusionMatrix(predCut, test_data$case_success, positive = "Yes")

ফলাফল বিভ্রান্তির ম্যাট্রিক্স এবং যথার্থতা:

Confusion Matrix and Statistics
      Reference
Prediction   No  Yes
   No  2757  693
   Yes  375 6684

           Accuracy : 0.8984
 ....

এখন আমি বেসিক র্যান্ডমফোরস্ট প্যাকেজটি ব্যবহার করে একই পরামিতি এবং একই প্রশিক্ষণ_ডাটা সহ একটি র্যান্ডম রোরেস্ট প্রশিক্ষণ দিয়েছি:

randomForestManual <- randomForest(case_success ~ ., data=train_data, mtry = 15, ntree=500,keep.forest=TRUE)
curClassifier = randomForestManual

আবার আমি উপরের মতো খুব একই টেস্ট_ডাটার জন্য পূর্বাভাস তৈরি করেছি এবং উপরের মত একই কোড দিয়ে বিভ্রান্তির ম্যাট্রিক্সকে মূল্যায়ন করেছি। তবে এখন আমি বিভিন্ন ব্যবস্থা পেয়েছি:

Confusion Matrix and Statistics

      Reference
Prediction   No  Yes
       No  2702  897
       Yes  430 6480

           Accuracy : 0.8737 
           ....

কারণ কি? আমি কী মিস করছি?


3
আপনি উভয় মডেলের জন্য এলোমেলো বীজের জন্য একই মান ব্যবহার করেছেন?
মিমি মিমম্ম্ম্ম্ম্ম্ম্ম্ম্ম মিম্ম্

আমি তাই মনে করি. আমি প্রশিক্ষণ এবং পরীক্ষার ডেটাতে ডেটা সেটটি বিভক্ত করার পরে কোডটিতে আগে বীজ সেট করেছিলাম, তারপরে ক্যারেট মডেলকে প্রশিক্ষণ দিয়েছিলাম, তারপরে "মূল" আরএফ-মডেলকে প্রশিক্ষণ দিয়েছি। সুতরাং বীজের শুরুতে একবার সেট করে রাখা উচিত, তাই না?
মাল্টে

"আসল" আরএফ-মডেলটি প্রশিক্ষণের আগে আমি অন্য সেট.সীড সরাসরি toোকানোর চেষ্টা করেছি। দুর্ভাগ্যক্রমে সমস্যাটি সমাধান করে না।
মাল্টে

3
আপনি seedstrainControl
টেপপো

উত্তর:


4

আমি মনে করি যে প্রশ্নটি প্রথমে কিছুটা তুচ্ছ এবং "প্রোগ্রাম্যাটিক" পড়ার সময় দুটি প্রধান বিষয়কে স্পর্শ করে যা আধুনিক পরিসংখ্যানগুলিতে অত্যন্ত গুরুত্বপূর্ণ:

  1. ফলাফলের পুনরুত্পাদনযোগ্যতা এবং
  2. অ-ডিস্ট্রিমেন্টিক অ্যালগোরিদম।

বিভিন্ন ফলাফলের কারণ হ'ল দুটি পদ্ধতিটি বিভিন্ন এলোমেলো বীজ ব্যবহার করে প্রশিক্ষিত হয়। মডেলটির ভেরিয়েন্স হ্রাস করার জন্য র্যান্ডম অরণ্যগুলি প্রতিটি বিভক্ত প্রার্থীর (পুরো mtryযুক্তি এবং এটি র্যান্ডম সাবস্পেস পদ্ধতির সাথে সম্পর্কিত ) হিসাবে পূর্ণ-ডেটাসেটের ভেরিয়েবলগুলি থেকে এলোমেলো উপসেট ব্যবহার করে bags এই দুটি অভ্যন্তরীণ এলোমেলো নমুনা পদ্ধতি চিন্তাধারা অ্যালগোরিদমের বিভিন্ন রানের মধ্যে নির্ধারক নয়। স্যাম্পলিংটি করা এলোমেলো ক্রমটি ব্যবহৃত এলোমেলো বীজ দ্বারা নিয়ন্ত্রিত হয়। যদি একই বীজ ব্যবহার করা হত তবে randomForestরুটিন বলা হয় এমন ক্ষেত্রে উভয় ক্ষেত্রেই একই ফলাফল পাওয়া যায় ; উভয় অভ্যন্তরীণcaret::trainপাশাপাশি বাহ্যিকভাবে যখন ম্যানুয়ালি এলোমেলো বন জোরদার। এটি শো-কেস করার জন্য আমি একটি সাধারণ কোড স্নিপেট সংযুক্ত করি। দয়া করে মনে রাখবেন যে ntreeপ্রশিক্ষণটি দ্রুত রাখতে আমি খুব অল্প সংখ্যক গাছ (যুক্তি :) ব্যবহার করি , এটি সাধারণত আরও বড় হওয়া উচিত।

library(caret)

set.seed(321)
trainData <- twoClassSim(5000, linearVars = 3, noiseVars = 9)
testData  <- twoClassSim(5000, linearVars = 3, noiseVars = 9)

set.seed(432)
mySeeds <- sapply(simplify = FALSE, 1:26, function(u) sample(10^4, 3))
cvCtrl = trainControl(method = "repeatedcv", number = 5, repeats = 5, 
                      classProbs = TRUE, summaryFunction = twoClassSummary, 
                      seeds = mySeeds)

fitRFcaret = train(Class ~ ., data = trainData, trControl = cvCtrl, 
                   ntree = 33, method = "rf", metric="ROC")

set.seed( unlist(tail(mySeeds,1))[1])
fitRFmanual <- randomForest(Class ~ ., data=trainData, 
                            mtry = fitRFcaret$bestTune$mtry, ntree=33) 

এই মুহুর্তে caret.trainঅবজেক্টের fitRFcaretপাশাপাশি ম্যানুয়ালি সংজ্ঞায়িত randomForestঅবজেক্ট উভয়কে fitRFmanualএকই ডেটা ব্যবহার করে প্রশিক্ষণ দেওয়া হয়েছে তবে গুরুত্বপূর্ণভাবে একই চূড়ান্ত মডেলটি ফিট করার সময় একই এলোমেলো বীজ ব্যবহার করে। যেমন যখন আমরা এই বিষয়গুলি ব্যবহার করে ভবিষ্যদ্বাণী করার চেষ্টা করব এবং যেহেতু আমরা আমাদের ডেটা প্রিপ্রোসেসিং না করি আমরা একই সঠিক উত্তরগুলি পেয়ে যাব।

all.equal(current =  as.vector(predict(fitRFcaret, testData)), 
          target = as.vector(predict(fitRFmanual, testData)))
# TRUE

শুধু নির্মল পরে আরও একটু পয়েন্ট: predict(xx$finalModel, testData)এবং predict(xx, testData)যদি এক সেট ভিন্ন হবে preProcessবিকল্পটি ব্যবহার train। অন্যদিকে, finalModelসরাসরি ব্যবহার করার সময় এটি পরিবর্তিত predictমডেল ( predict.randomForestএখানে) পরিবর্তে ফাংশনটি ব্যবহার করে সমান predict.train; কোনও প্রাক-অনুমান সংঘটিত হয় না। স্পষ্টতই মূল প্রশ্নে বর্ণিত দৃশ্যে যেখানে কোনও প্রাক-প্রসেসিং করা হয় না finalModel, ম্যানুয়ালি লাগানো randomForestবস্তু বা বস্তুটি ব্যবহার করার পরে ফলাফলগুলি একই হবে caret.train

all.equal(current =  as.vector(predict(fitRFcaret$finalModel, testData)), 
          target = as.vector(predict(fitRFmanual, testData)))
 # TRUE

all.equal(current =  as.vector(predict(fitRFcaret$finalModel, testData)),
          target = as.vector(predict(fitRFcaret, testData)))
# TRUE

আমি দৃ strongly়ভাবে পরামর্শ দেব যে আপনি সর্বদা আর, ম্যাটল্যাব বা অন্য কোনও প্রোগ্রাম ব্যবহৃত ব্যবহৃত এলোমেলো বীজ সেট করুন। অন্যথায়, আপনি ফলাফলগুলির পুনরুত্পাদনযোগ্যতা যাচাই করতে পারবেন না (যা ঠিক আছে, এটি বিশ্বের শেষ নাও হতে পারে) বা কোনও মডেলিং পদ্ধতির কার্যকারিতা (যা হ্যাঁ, এটি এক ধরণের সফল হয়) এর কার্যকারিতা প্রভাবিত কোনও বাগ বা বাহ্যিক উপাদানকে বাদ দিতে পারে না। নেতৃস্থানীয় এমএল অ্যালগরিদমগুলি (উদাহরণস্বরূপ গ্রেডিয়েন্ট বুস্টিং, এলোমেলো বন, চরম নিউরাল নেটওয়ার্ক) তাদের প্রশিক্ষণের সময়কালে কিছু অভ্যন্তরীণ পুনর্নির্মাণ প্রক্রিয়া নিয়োগ করে, এলোমেলো বীজ রাজ্যগুলির পূর্ব নির্ধারণ (বা কখনও কখনও এমনকি এর ভিতরেও) তাদের প্রশিক্ষণের পর্ব গুরুত্বপূর্ণ হতে পারে।


গুরুত্বপূর্ণ অংশটি ছিল "বীজ" যুক্তি ব্যবহার করে স্পষ্টভাবে "ট্রেনকন্ট্রোল" তে বীজের যুক্তি সেট করা
মাল্টে

হ্যা অবশ্যই. আমি এটি নিশ্চিত করতে চেয়েছিলাম যে এটি কেন প্রয়োজন তা ইস্যুটি পুরোপুরি স্পষ্ট করা হয়েছিল।
usεr11852 বলছেন পুনর্নির্মাণ মনিক

আমি কীভাবে চালাব trainযাতে এটি ঠিক সমান হয় randomForest? আমি চেষ্টা করেছিলাম method="none"তবে নিশ্চিত না যে কীভাবে একক মানের বীজ সেট করতে হয়। ধন্যবাদ।
সাইমন উডওয়ার্ড

ক্ষমা চাই তবে এটি স্পষ্ট নয় যে আপনার কাছে preProcessকীভাবে randomForestশুরু করার প্রশিক্ষণ দেওয়া হয়েছে trained সাধারণভাবে, ধরে নিলাম আমাদের প্রাক-প্রক্রিয়াজাতকরণের কোনও পদক্ষেপ নেই আমাদের এটি নিশ্চিত করা দরকার যে বীজ এবং হাইপারপ্যারামিটার (এখানে কেবলমাত্র mtryব্যবহৃত) উভয়ই একই রকম।
usεr11852

0

থেকে প্রাপ্ত curClassifierভবিষ্যদ্বাণীগুলি curClassifier$finalModel লিঙ্কের পূর্বাভাসের মতো নয় । আপনি পুনরুত্পাদন করেছেন finalModelএবং এটি predict.trainবস্তুর সাথে তুলনা করছেন ।


1
আপনি যা বলছেন তা সত্য, যদিও ওপি দ্বারা কোনও প্রাক-প্রসেসিং করা হয়নি বলে দুর্ভাগ্যক্রমে বর্তমান সেটিংটিতে এটি কিছুটা বিভ্রান্তিকর। predictওপি অন্বেষণের ক্ষেত্রে উভয়েরই একই ভবিষ্যদ্বাণী করা উচিত (এবং আসলে করা উচিত)। আমি আমার পোস্টে এই বিষয়টিকে আরও কিছুটা পরিষ্কার করছি y
usεr11852
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.