সিদ্ধান্ত গাছগুলিতে বাইনারি বিভাজন বাস্তবায়নে পার্থক্য


12

আমি একটা সিদ্ধান্ত গাছ একটি বাইনারি বিভক্ত ব্যবহারিক বাস্তবায়ন সম্পর্কে জানতে আগ্রহী am - যেমন একটি শ্রেণীগত predictor মাত্রা সম্পর্কিত ।Xj

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

বলুন একটি পরিবর্তনশীল এক্স স্তর গ্রহণ করে {A,B,C,D,E}। একটি নমুনায়, সম্ভবত কেবলমাত্র স্তর {A,B,C,D}উপস্থিত রয়েছে। তারপরে, যখন ফলস্বরূপ গাছ পূর্বাভাসের জন্য ব্যবহার করা হয়, সম্পূর্ণ সেট উপস্থিত থাকতে পারে।

এই উদাহরণ থেকে অব্যাহত রেখে বলুন যে একটি গাছ এক্স-এ বিভক্ত হয় এবং {A,B}বামে এবং ডানে প্রেরণ করে {C,D}। আমি তখন বাইনারি বিভক্তির যুক্তিটি তখন নতুন ডেটার মুখোমুখি হওয়ার জন্য আশা করব: "যদি এক্স এর মান A বা B থাকে তবে বামদিকে প্রেরণ করুন, অন্যথায়, এই কেসটি ডানদিকে প্রেরণ করুন"। কিছু বাস্তবায়নে যা ঘটবে বলে মনে হচ্ছে তা হল "যদি এক্স এর মান A বা B থাকে তবে বামদিকে প্রেরণ করুন, যদি X এর মান C বা D ডানদিকে প্রেরণ থাকে"। যখন এই কেসটি E এর মান নেয়, তবে অ্যালগরিদমটি ভেঙে যায়।

বাইনারি বিভাজন পরিচালনার জন্য "সঠিক" উপায় কী? দেখে মনে হচ্ছে অনেক বেশি শক্তিশালী উপায়ে প্রায়শই প্রয়োগ করা হয়, তবে সবসময় নয় (নীচে আরপার্ট দেখুন)।

এখানে কয়েকটি উদাহরণ দেওয়া হল:

Rpart ব্যর্থ, অন্যদের ঠিক আছে।

#test trees and missing values

summary(solder)
table(solder$PadType)

# create train and validation
set.seed(12345)
t_rows<-sample(1:nrow(solder),size=360, replace=FALSE)
train_solder<-solder[t_rows,]
val_solder<-solder[-t_rows,]

#look at PadType
table(train_solder$PadType)
table(val_solder$PadType)
#set a bunch to missing
levels(train_solder$PadType)[train_solder$PadType %in% c('L8','L9','W4','W9')] <- 'MISSING'


#Fit several trees, may have to play with the parameters to get them to split on the variable

####RPART
mod_rpart<-rpart(Solder~PadType,data=train_solder)
predict(mod_rpart,val_solder)
#Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = attr(object,  : 
#factor 'PadType' has new level(s) D6, L6, L7, L8, L9, W4

####TREE
mod_tree<-tree(Solder~PadType,data=train_solder,split="gini")
predict(mod_tree,val_solder) #works fine

####ctree
mod_ctree<-ctree(Solder~PadType,data=train_solder,control = ctree_control(mincriterion = 0.05))
predict(mod_ctree,val_solder) #works fine

উত্তর:


9

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

  1. ত্রুটি নিক্ষেপ
  2. ধরে নিন যে অদেখা ক্লাসটি আপনার প্রিয় শাখায় চলে গেছে
  3. এটিকে এনএ হিসাবে গণ্য করুন এবং আরও কম এলোমেলোভাবে শাখা নির্বাচন করুন।

এখন, অর্র্ডারড ফ্যাক্টরগুলির সরাসরি চিকিত্সা করা জটিল কারণ এতগুলি অ্যালগোরিদমগুলি "প্রতারণা" এবং আদেশযুক্ত হিসাবে অযৌক্তিক কারণগুলির দাবি করে, তাই তারা এই সমস্যাটিকেও স্পর্শ করে না *। বাকিরা সাধারণত ইন মাস্ক ব্যবহার করে, অর্থাত্ থেকে একটি পূর্ণসংখ্যার নম্বরটি অনুকূল করে এবং একটি ফ্যাক্টর স্তর জন্য একটি শাখা নির্বাচন হিসাবে বিবেচনা করে । (কখনও কখনও ভাবলেন কেন 32 স্তরের ঘন ঘন সীমা থাকে?) এই সেটিংয়ে, অদৃশ্য স্তরগুলি নিঃশব্দে "0" শাখায় চলে যাওয়ার বিষয়টি খুব স্বাভাবিক। তবুও এটি খুব "সঠিক" বলে মনে হচ্ছে না, কারণ কেন আমাদের সত্যই এটি করা উচিত? এবং অ্যাট্রিবিউট সিলেকশন এন্ট্রপাইজ লিভারেজের প্রয়োজনীয় স্তরের সংখ্যা সম্পর্কে কী?2 # বিভাগ - 1 - 1 i i12#categories11ii

আমি বলব যে সর্বাধিক বুদ্ধিমান ধারণাটি হ'ল ব্যবহারকারীর সম্পূর্ণ সেট সংজ্ঞায়িত করা (উদাহরণস্বরূপ আর এইটি জৈবিকভাবে করেন, সাবসেট ক্রিয়াকলাপগুলির মাধ্যমে স্তরগুলি সংরক্ষণ করে) এবং ঘোষিত বিষয়গুলির জন্য বিকল্প 1 টি ব্যবহার করুন declared । বিকল্প ৩. আপনার যদি ইতিমধ্যে কিছু এনএ হ্যান্ডলিং পরিকাঠামো থাকে তবে তা বোধগম্য হবে।

*) সংখ্যায় কিছু অ-তুচ্ছ পুনরায় কোডিং করার পক্ষে পাশের কৌশলও রয়েছে যেমন উদাহরণস্বরূপ ব্রেইমান এনকোডিং - তবুও এটি আরও বেশি সমস্যা সৃষ্টি করে।


1
আপনি কি বলছেন যে আমার উদাহরণস্বরূপ গাছ বা গাছটি এই অর্ডারড ফ্যাক্টরটিকে আসলে একটি আদেশযুক্ত ফ্যাক্টর হিসাবে বিবেচনা করে এবং এভাবে এটি "0" শাখায় প্রেরণ করে?
বি_মিনার

@ এমএমকিউ আপনি দয়া করে ব্যাখ্যা করতে পারেন যে আপনি কীভাবে বিভাজন করতে পারেন তার মোট সংখ্যা 2 is (# বিভাগ + 1) - 2. কেন আমি "-2" অংশটি বেশ বুঝতে পারছি না।
মধুবাজার 6

হুম, মনে হচ্ছে আমি এই সূত্রটি ভুল করেছি; 2 ^ n এন-বিট শব্দের মতো রয়েছে, তবে আমরা শব্দ a এবং ~ a, তাই 2 ^ (n-1) উভয়ই গণনা করি না, এবং আমরা এমন বিভাজনগুলি পছন্দ করি না যা মোটেও ছড়িয়ে যায় না, তাই 2 n (n-1) -1 (অন্য কথায়, আমরা 1 থেকে গণনা করি)। n = 1 তখন একটি বিশেষ কেস is
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.