র্যান্ডমফরেস্ট :: getTree () থেকে আসলে কীভাবে একটি নমুনা গাছের প্লট করবেন? [বন্ধ]


62

যে কেউ আসলে কীভাবে এর থেকে বেশ কয়েকটি নমুনা গাছ প্লট করবেন সে সম্পর্কে লাইব্রেরি বা কোড পরামর্শ পেয়েছিল :

getTree(rfobj, k, labelVar=TRUE)

(হ্যাঁ আমি জানি যে আপনি এটিকে ক্রিয়াকলাপ করার কথা বলছেন না, আরএফ একটি ব্ল্যাকবক্স ইত্যাদি I আমার এনকোডযুক্ত উপাদানগুলি কতটা ভাল কাজ করছে ইত্যাদি))


শালীন উত্তর ছাড়াই পূর্ববর্তী প্রশ্নগুলি:

আমি আসলে একটি নমুনা গাছের প্লট করতে চাই । সুতরাং ইতিমধ্যে আমার সাথে তর্ক করবেন না। আমি varImpPlot(পরিবর্তনশীল গুরুত্ব প্লট) বা partialPlotবা MDSPlot, বা এই অন্যান্য প্লট সম্পর্কে জিজ্ঞাসা করছি না , আমি ইতিমধ্যে সেগুলি পেয়েছি, তবে তারা নমুনা গাছ দেখার বিকল্প নয়। হ্যাঁ আমি এর আউটপুটটি দৃশ্যত পরিদর্শন করতে পারি getTree(...,labelVar=TRUE)

(আমার অনুমান যে একটি plot.rf.tree()অবদান খুব ভালভাবে গৃহীত হবে))


6
আমি প্রিপ্রিমটিভলি যুক্তিযুক্ত হওয়ার দরকার দেখছি না, বিশেষত যদি আপনি কাউকে আপনাকে স্বেচ্ছাসেবীর জন্য বলছেন; এটা ভাল জুড়ে আসে না। সিভির একটি শিষ্টাচার নীতি রয়েছে - আপনি আমাদের প্রায়শই জিজ্ঞাসিত প্রশ্নগুলি পড়তে চাইতে পারেন ।
গুং - মনিকা পুনরায়

9
@ গুং: এই বিষয়টির প্রতিটি পূর্ববর্তী প্রশ্নগুলি লোকেদের কাছে জোর দিয়ে বলেছে যে একটি নমুনা গাছের পরিকল্পনা করা প্রয়োজন ছিল না এবং সত্যই তাত্ত্বিক ছিল। আমি দেওয়া উদ্ধৃতিগুলি পড়ুন। আমি এখানে একটি আরএফ ট্রি প্লট করার কোড কীভাবে করব তার স্কেচ খুঁজছি।
smci

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

4
আমি শূন্য উত্তর দেখতে পাচ্ছি যেখানে কেউ এক বছরেরও বেশি সময় ধরে কোনও গাছের চক্রান্ত করেছে। আমি সেই নির্দিষ্ট প্রশ্নের সুনির্দিষ্ট উত্তর খুঁজছি।
smci

1
cforest( পার্টি প্যাকেজের মধ্যে) দিয়ে নির্মিত একটি একক গাছের প্লট করা সম্ভব । অন্যথা, আপনি রূপান্তর করতে হবে data.frameদ্বারা ফিরে randomForest::getTreeএকটি থেকে tree-একটি অবজেক্ট।
chl

উত্তর:


44

প্রথম (এবং সবচেয়ে সহজ পদ্ধিতি হল) সমাধান: আপনি অ্যান্ডি 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সহায়ক ফাংশন লিখুন যা উপরের সমস্ত "প্যাচগুলি" হ্রাস করবে। তারপরে আপনি আলাদা আলাদা গাছ প্রদর্শন করতে আর এর প্লট করার পদ্ধতিগুলি বা সম্ভবত আরও ভাল, ক্লিম্ট (সরাসরি আর থেকে) ব্যবহার করতে পারেন।


40

আমি চার বছর দেরীতে আছি, তবে আপনি যদি সত্যিই randomForestপ্যাকেজটিতে আটকে থাকতে চান (এবং এটি করার জন্য কিছু ভাল কারণ রয়েছে) এবং গাছটি বাস্তবে দেখতে চান তবে আপনি পুনঃপ্রক্রিয়া প্যাকেজটি ব্যবহার করতে পারেন ।

প্যাকেজটি খুব ভাল নথিবদ্ধ নয় (আপনি এখানে ডক্সগুলি খুঁজে পেতে পারেন ) তবে সবকিছু বেশ সোজা। প্যাকেজটি ইনস্টল করতে রেপোতে আর্টালাইজ.আর পড়ুন, সুতরাং কেবল নিম্নলিখিতটি চালান:

options(repos='http://cran.rstudio.org')
have.packages <- installed.packages()
cran.packages <- c('devtools','plotrix','randomForest','tree')
to.install <- setdiff(cran.packages, have.packages[,1])
if(length(to.install)>0) install.packages(to.install)

library(devtools)
if(!('reprtree' %in% installed.packages())){
  install_github('araastat/reprtree')
}
for(p in c(cran.packages, 'reprtree')) eval(substitute(library(pkg), list(pkg=p)))

তারপরে এগিয়ে যান এবং আপনার মডেল এবং গাছটি তৈরি করুন:

library(randomForest)
library(reprtree)

model <- randomForest(Species ~ ., data=iris, importance=TRUE, ntree=500, mtry = 2, do.trace=100)

reprtree:::plot.getTree(model)

এবং সেখানে আপনি যান! সুন্দর এবং সরল।

প্লট.টেট্রি (মডেল) থেকে উত্পন্ন গাছ

প্যাকেজের অন্যান্য পদ্ধতি সম্পর্কে জানতে আপনি গিথুব রেপো পরীক্ষা করতে পারেন। প্রকৃতপক্ষে, আপনি প্লট.টেট্রি.আর পরীক্ষা করে দেখুন , আপনি খেয়াল করবেন যে লেখক তার নিজের প্রয়োগটি ব্যবহার করেছেন as.tree()যা chl- এর প্রস্তাব দিয়েছিল যে আপনি নিজের উত্তরে নিজেকে তৈরি করতে পারেন। এর অর্থ হল আপনি এটি করতে পারেন:

tree <- getTree(model, k=1, labelVar=TRUE)
realtree <- reprtree:::as.tree(tree, model)

এবং তারপর সম্ভাব্য ব্যবহার realtreeযেমন অন্যান্য গাছ চক্রান্ত প্যাকেজের সাথে গাছ


অনেক ধন্যবাদ, আমি এখনও আনন্দের সাথে উত্তরগুলি গ্রহণ করছি, এটি এমন একটি অঞ্চল বলে মনে হচ্ছে যেখানে লোকেরা নৈবেদ্য নিয়ে অসন্তুষ্ট। আমার ধারণা, নতুন নতুন জিনিসটিও সমর্থন করবে xgboost
smci

6
সমস্যা নেই. লাইব্রেরি / প্যাকেজটি খুঁজতে আমার বেশ কয়েক ঘন্টা লেগেছিল তাই আমি বুঝতে পেরেছিলাম যে আপনার পক্ষে যদি এটি কার্যকর না হয় তবে randomForestপ্যাকেজের সাথে আঁকড়ে থাকার সময় গাছ আঁকার চেষ্টা করা অন্য ব্যক্তির পক্ষে হবে ।
jgozal

2
শীতল সন্ধান। দ্রষ্টব্য: এটি প্রতিনিধিত্বমূলক গাছটিকে প্লট করে, এক অর্থে, টীকাগুলিতে যে গাছটি নকলের অন্যান্য গাছের গড় গড়ে "নিকটতম" হয়
ক্রিস

2
@ ক্রিস ফাংশনটি plot.getTree()একটি পৃথক গাছের প্লট করে। এই plot.reprtree()প্যাকেজের ফাংশনটি একটি প্রতিনিধি গাছের প্লট করে।
চুন লি

1
আমি ক্যারেট থেকে মডেল পেয়েছি এবং তার সাথে পুনঃসংশ্লিষ্ট করতে চাই reprtree:::plot.getTree(mod_rf_1$finalModel), তবে, " ডেটা.ফ্রেমে একটি ত্রুটি আছে (var = fr sp var, splits = as.character (gTree [," split point "])): যুক্তিগুলি ভিন্নভাবে বোঝায় সারিগুলির সংখ্যা: 2631, 0 "
হ্যাপি কোডিং

15

আমি একটি গাছের নিয়মগুলি বের করার জন্য কিছু ফাংশন তৈরি করেছি।

#**************************
#return the rules of a tree
#**************************
getConds<-function(tree){
  #store all conditions into a list
  conds<-list()
  #start by the terminal nodes and find previous conditions
  id.leafs<-which(tree$status==-1)
	  j<-0
	  for(i in id.leafs){
		j<-j+1
		prevConds<-prevCond(tree,i)
		conds[[j]]<-prevConds$cond
		while(prevConds$id>1){
		  prevConds<-prevCond(tree,prevConds$id)
		  conds[[j]]<-paste(conds[[j]]," & ",prevConds$cond)
        }
		if(prevConds$id==1){
			conds[[j]]<-paste(conds[[j]]," => ",tree$prediction[i])
    }
    }

  }

  return(conds)
}

#**************************
#find the previous conditions in the tree
#**************************
prevCond<-function(tree,i){
  if(i %in% tree$right_daughter){
		id<-which(tree$right_daughter==i)
		cond<-paste(tree$split_var[id],">",tree$split_point[id])
	  }
	  if(i %in% tree$left_daughter){
    id<-which(tree$left_daughter==i)
		cond<-paste(tree$split_var[id],"<",tree$split_point[id])
  }

  return(list(cond=cond,id=id))
}

#remove spaces in a word
collapse<-function(x){
  x<-sub(" ","_",x)

  return(x)
}


data(iris)
require(randomForest)
mod.rf <- randomForest(Species ~ ., data=iris)
tree<-getTree(mod.rf, k=1, labelVar=TRUE)
#rename the name of the column
colnames(tree)<-sapply(colnames(tree),collapse)
rules<-getConds(tree)
print(rules)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.