প্রথম (এবং সবচেয়ে সহজ পদ্ধিতি হল) সমাধান: আপনি অ্যান্ডি Liaw এর বাস্তবায়িত হিসাবে, শাস্ত্রীয় আরএফ দিয়ে বিদ্ধ প্রখর না হন, তাহলে randomForest
, আপনি চেষ্টা করে দেখতে পারেন পার্টি প্যাকেজ মূল আরএফ একটি ভিন্ন বাস্তবায়ন উপলব্ধ ™ আলগোরিদিম (শর্তসাপেক্ষ গাছ এবং অ্যাগ্রিগেশন স্কিম ব্যবহার ভিত্তিক ইউনিট ওজন গড়)। তারপরে, এই আর-সহায়তা পোস্টে উল্লিখিত হিসাবে, আপনি গাছের তালিকার একক সদস্যকে প্লট করতে পারেন। এটি যতদূর আমি বলতে পারি এটি সুচারুভাবে চলতে পারে বলে মনে হয়। নীচে একটি গাছের প্লট দ্বারা উত্পাদিত হয়েছে cforest(Species ~ ., data=iris, controls=cforest_control(mtry=2, mincriterion=0))
।
দ্বিতীয়ত (প্রায় হিসাবে সহজ) সমাধান: আর গাছের ভিত্তিক কৌশল অধিকাংশই ( tree
, rpart
, TWIX
, ইত্যাদি) একটি উপলব্ধ করা হয় tree
একটি একক গাছ ষড়যন্ত্র মুদ্রণের জন্য -একটি গঠন /। ধারণাটি randomForest::getTree
হ'ল এই জাতীয় আর্টপুটটির আউটপুট রূপান্তর করা , এমনকি যদি এটি কোনও পরিসংখ্যানগত দৃষ্টিকোণ থেকে অযৌক্তিক হয়। মূলত, tree
নিচের মত দেখানো হয়েছে এমন কোনও বস্তু থেকে গাছের কাঠামো অ্যাক্সেস করা সহজ । দয়া করে নোট করুন যে এটি কার্যের ধরণের উপর নির্ভর করে সামান্য পৃথক হবে - রিগ্রেশন বনাম শ্রেণিবদ্ধকরণ - যেখানে পরবর্তী ক্ষেত্রে এটি ক্লাস-নির্দিষ্ট সম্ভাবনাগুলি শেষের কলাম হিসাবে যুক্ত করবে obj$frame
(যা এটি data.frame
)।
> library(tree)
> tr <- tree(Species ~ ., data=iris)
> tr
node), split, n, deviance, yval, (yprob)
* denotes terminal node
1) root 150 329.600 setosa ( 0.33333 0.33333 0.33333 )
2) Petal.Length < 2.45 50 0.000 setosa ( 1.00000 0.00000 0.00000 ) *
3) Petal.Length > 2.45 100 138.600 versicolor ( 0.00000 0.50000 0.50000 )
6) Petal.Width < 1.75 54 33.320 versicolor ( 0.00000 0.90741 0.09259 )
12) Petal.Length < 4.95 48 9.721 versicolor ( 0.00000 0.97917 0.02083 )
24) Sepal.Length < 5.15 5 5.004 versicolor ( 0.00000 0.80000 0.20000 ) *
25) Sepal.Length > 5.15 43 0.000 versicolor ( 0.00000 1.00000 0.00000 ) *
13) Petal.Length > 4.95 6 7.638 virginica ( 0.00000 0.33333 0.66667 ) *
7) Petal.Width > 1.75 46 9.635 virginica ( 0.00000 0.02174 0.97826 )
14) Petal.Length < 4.95 6 5.407 virginica ( 0.00000 0.16667 0.83333 ) *
15) Petal.Length > 4.95 40 0.000 virginica ( 0.00000 0.00000 1.00000 ) *
> tr$frame
var n dev yval splits.cutleft splits.cutright yprob.setosa yprob.versicolor yprob.virginica
1 Petal.Length 150 329.583687 setosa <2.45 >2.45 0.33333333 0.33333333 0.33333333
2 <leaf> 50 0.000000 setosa 1.00000000 0.00000000 0.00000000
3 Petal.Width 100 138.629436 versicolor <1.75 >1.75 0.00000000 0.50000000 0.50000000
6 Petal.Length 54 33.317509 versicolor <4.95 >4.95 0.00000000 0.90740741 0.09259259
12 Sepal.Length 48 9.721422 versicolor <5.15 >5.15 0.00000000 0.97916667 0.02083333
24 <leaf> 5 5.004024 versicolor 0.00000000 0.80000000 0.20000000
25 <leaf> 43 0.000000 versicolor 0.00000000 1.00000000 0.00000000
13 <leaf> 6 7.638170 virginica 0.00000000 0.33333333 0.66666667
7 Petal.Length 46 9.635384 virginica <4.95 >4.95 0.00000000 0.02173913 0.97826087
14 <leaf> 6 5.406735 virginica 0.00000000 0.16666667 0.83333333
15 <leaf> 40 0.000000 virginica 0.00000000 0.00000000 1.00000000
তারপরে, সেই জিনিসগুলি সুন্দর মুদ্রণ এবং প্লট করার জন্য বিভিন্ন পদ্ধতি রয়েছে। মূল ফাংশন হ'ল জেনেরিক tree:::plot.tree
পদ্ধতি (আমি একটি ট্রিপল রাখি :
যা আপনাকে সরাসরি আরে কোড দেখতে দেয়) tree:::treepl
(গ্রাফিকাল ডিসপ্লে) এবং tree:::treeco
(কম্পিউট নোডের স্থানাঙ্ক) উপর নির্ভর করে । এই ফাংশনগুলি obj$frame
গাছের প্রতিনিধিত্ব আশা করে । অন্যান্য সূক্ষ্ম সমস্যা: (১) type = c("proportional", "uniform")
ডিফল্ট প্লট করার পদ্ধতিতে যুক্তি , tree:::plot.tree
নোডের মধ্যে উল্লম্ব দূরত্ব পরিচালনা করতে সহায়তা করে (এর proportional
অর্থ এটি বিচ্যুতির সাথে সমানুপাতিক, uniform
মানে এটি স্থির); (২) নোড এবং স্প্লিটগুলিতে টেক্সট লেবেল যুক্ত plot(tr)
করার text(tr)
জন্য আপনাকে একটি কল দিয়ে পরিপূরক করা দরকার , এক্ষেত্রে আপনাকেও একবার নজর দিতে হবে tree:::text.tree
।
getTree
থেকে পদ্ধতি randomForest
আয় একটি ভিন্ন কাঠামো, যা অনলাইন সহায়তা মধ্যে নথিভুক্ত করা হয়। status
কোড (-1) দ্বারা নির্দেশিত টার্মিনাল নোড সহ একটি সাধারণ আউটপুট নীচে প্রদর্শিত হবে । (আবারও, কাজের ধরণের উপর নির্ভর করে আউটপুট পৃথক হবে তবে কেবল status
এবং prediction
কলামগুলিতে))
> library(randomForest)
> rf <- randomForest(Species ~ ., data=iris)
> getTree(rf, 1, labelVar=TRUE)
left daughter right daughter split var split point status prediction
1 2 3 Petal.Length 4.75 1 <NA>
2 4 5 Sepal.Length 5.45 1 <NA>
3 6 7 Sepal.Width 3.15 1 <NA>
4 8 9 Petal.Width 0.80 1 <NA>
5 10 11 Sepal.Width 3.60 1 <NA>
6 0 0 <NA> 0.00 -1 virginica
7 12 13 Petal.Width 1.90 1 <NA>
8 0 0 <NA> 0.00 -1 setosa
9 14 15 Petal.Width 1.55 1 <NA>
10 0 0 <NA> 0.00 -1 versicolor
11 0 0 <NA> 0.00 -1 setosa
12 16 17 Petal.Length 5.40 1 <NA>
13 0 0 <NA> 0.00 -1 virginica
14 0 0 <NA> 0.00 -1 versicolor
15 0 0 <NA> 0.00 -1 virginica
16 0 0 <NA> 0.00 -1 versicolor
17 0 0 <NA> 0.00 -1 virginica
আপনার দ্বারা উত্পন্ন এক উপরে টেবিল রূপান্তর করতে পরিচালনা করতে পারেন tree
, তাহলে সম্ভবত কাস্টমাইজ করতে সক্ষম হবে tree:::treepl
, tree:::treeco
এবং tree:::text.tree
, আপনার প্রয়োজন অনুসারে যদিও আমি এই পদ্ধতির একটি উদাহরণ হবে না। বিশেষত, আপনি সম্ভবত বিচ্যুতি, শ্রেণি সম্ভাবনা ইত্যাদির ব্যবহার থেকে মুক্তি পেতে চান যা আরএফের অর্থবহ নয়। আপনি যা চান তা হ'ল নোডের স্থানাঙ্ক এবং বিভক্ত মানগুলি সেটআপ করা। আপনি এটির fixInNamespace()
জন্য ব্যবহার করতে পারেন , তবে সত্যি কথা বলতে, আমি নিশ্চিত নই যে এটি যাওয়ার সঠিক উপায় is
তৃতীয় (এবং অবশ্যই চতুর) সমাধান: সত্যিকারের as.tree
সহায়ক ফাংশন লিখুন যা উপরের সমস্ত "প্যাচগুলি" হ্রাস করবে। তারপরে আপনি আলাদা আলাদা গাছ প্রদর্শন করতে আর এর প্লট করার পদ্ধতিগুলি বা সম্ভবত আরও ভাল, ক্লিম্ট (সরাসরি আর থেকে) ব্যবহার করতে পারেন।