जिसमें रैंडम फॉरेस्ट में इंटरेक्शन टर्म्स शामिल हैं


15

मान लीजिए कि हमारे पास एक प्रतिक्रिया वाई और भविष्यवाणियां X1, ...., Xn हैं। अगर हम X1, ...., Xn के रैखिक मॉडल के माध्यम से Y को फिट करने की कोशिश करते थे, और यह सिर्फ इतना हुआ कि Y और X1 के बीच का वास्तविक संबंध, ..., Xn रैखिक नहीं था, तो हम सक्षम हो सकते हैं मॉडल को ठीक करने के लिए एक्स के किसी भी तरह से रूपांतरण करके और फिर मॉडल को फिट करना। इसके अलावा, अगर यह सिर्फ इतना हुआ कि X1, ..., XN ने अन्य विशेषताओं से स्वतंत्र y को प्रभावित नहीं किया, तो हम बातचीत की शर्तों, X1 * x3 या X1 * x4 * x7 को शामिल करके मॉडल को बेहतर बनाने में सक्षम हो सकते हैं। या जैसे कुछ। तो रैखिक मामले में, इंटरैक्शन शब्द प्रतिक्रिया और सुविधाओं के बीच गैर-रैखिकता या स्वतंत्रता के उल्लंघन को ठीक करके मूल्य ला सकते हैं।

हालाँकि, रैंडम फ़ॉरेस्ट वास्तव में ये धारणाएँ नहीं बनाते हैं। क्या रैंडम फ़ॉरेस्ट को फिट करते समय इंटरैक्शन शब्द महत्वपूर्ण है? या सिर्फ व्यक्तिगत शब्दों को शामिल करने और उचित पैरामीटर चुनने से रैंडम फॉरेस्ट को इन रिश्तों को पकड़ने की अनुमति मिलेगी?

जवाबों:


15

यद्यपि वास्तविक जीवन में फीचर इंजीनियरिंग बहुत महत्वपूर्ण है, लेकिन पेड़ (और यादृच्छिक वन) फार्म की बातचीत की शर्तों को खोजने में बहुत अच्छे हैं x*y। यहाँ दो-तरफ़ा बातचीत के साथ एक प्रतिगमन का एक खिलौना उदाहरण है। एक भोले रैखिक मॉडल की तुलना एक पेड़ और पेड़ों के एक बैग के साथ की जाती है (जो एक यादृच्छिक जंगल का एक सरल विकल्प है।)

जैसा कि आप देख सकते हैं, अपने आप से पेड़ बातचीत को खोजने में बहुत अच्छा है, लेकिन रैखिक मॉडल इस उदाहरण में अच्छा नहीं है।

# fake data

x <- rnorm(1000, sd=3)
y <- rnorm(1000, sd=3)
z <- x + y + 10*x*y + rnorm(1000, 0, 0.2)
dat <- data.frame(x, y, z)

# test and train split
test <- sample(1:nrow(dat), 200)
train <- (1:1000)[-test]

# bag of trees model function
boot_tree <- function(formula, dat, N=100){
  models <- list()
  for (i in 1:N){
    models[[i]] <- rpart(formula, dat[sample(nrow(dat), nrow(dat), replace=T), ])
  }
  class(models) <- "boot_tree"
  models
}

# prediction function for bag of trees
predict.boot_tree <- function(models, newdat){
  preds <- matrix(0, nc=length(models), nr=nrow(newdat))
  for (i in 1:length(models)){
    preds[,i] <- predict(models[[i]], newdat)
  }
  apply(preds, 1, function(x) mean(x, trim=0.1))
}

## Fit models and predict:

# linear model
model1 <- lm(z ~ x + y, data=dat[train,])
pred1 <- predict(model1, dat[test,])

# tree
require(rpart)
model2 <- rpart(z ~ x + y, data=dat[train,])
pred2 <- predict(model2, dat[test,])

# bag of trees
model3 <- boot_tree("z ~ x+y", dat)
pred3 <- predict(model3, dat[test,])

ylim = range(c(pred1, pred2, pred3))

# plot predictions and true z

plot(dat$z[test], predict(model1, dat[test,]), pch=19, xlab="Actual z",
ylab="Predicted z", ylim=ylim)
points(dat$z[test], predict(model2, dat[test,]), col="green", pch=19)
points(dat$z[test], predict(model3, dat[test,]), col="blue", pch=19)

abline(0, 1, lwd=3, col="orange")

legend("topleft", pch=rep(19,3), col=c("black", "green", "blue"),
legend=c("Linear", "Tree", "Forest"))

यहाँ छवि विवरण दर्ज करें


4
बहुत अच्छा। क्या आपके पास एक पेपर है जिसे आप इस विषय पर सुझा सकते हैं? धन्यवाद
स्टीनबॉक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.