Một rừng ngẫu nhiên có thể được sử dụng để lựa chọn tính năng trong hồi quy tuyến tính nhiều không?


50

Vì RF có thể xử lý phi tuyến tính nhưng không thể cung cấp các hệ số, nên sử dụng rừng ngẫu nhiên để thu thập các tính năng quan trọng nhất và sau đó cắm các tính năng đó vào mô hình hồi quy tuyến tính để có được hệ số của chúng?


@ user777 ý bạn là, bạn đang đọc "giải thích" là "có được" hay đại loại như thế?
Shadowtalker

1
Vì dường như có một mối quan tâm đáng kể về những gì câu hỏi này có thể đang cố gắng hỏi, bạn có thể vui lòng chỉnh sửa nó để giải tỏa sự nhầm lẫn?
whuber

Câu trả lời:


71

Vì RF có thể xử lý phi tuyến tính nhưng không thể cung cấp các hệ số, nên sử dụng Random Forest để thu thập các Tính năng quan trọng nhất và sau đó cắm các tính năng đó vào mô hình Hồi quy tuyến tính để giải thích các dấu hiệu của chúng?

Tôi giải thích câu hỏi một câu của OP có nghĩa là OP muốn hiểu tính mong muốn của đường ống phân tích sau:

  1. Phù hợp với một khu rừng ngẫu nhiên với một số dữ liệu
  2. Theo một số số liệu có tầm quan trọng khác nhau từ (1), hãy chọn một tập hợp con các tính năng chất lượng cao.
  3. Sử dụng các biến từ (2), ước tính mô hình hồi quy tuyến tính. Điều này sẽ cung cấp cho OP quyền truy cập vào các hệ số mà OP lưu ý RF không thể cung cấp.
  4. Từ mô hình tuyến tính trong (3), diễn giải định tính các dấu hiệu của ước tính hệ số.

Tôi không nghĩ đường ống này sẽ thực hiện những gì bạn muốn. Các biến quan trọng trong rừng ngẫu nhiên không nhất thiết phải có bất kỳ mối quan hệ cộng gộp tuyến tính nào với kết quả. Nhận xét này không đáng ngạc nhiên: đó là điều làm cho rừng ngẫu nhiên rất hiệu quả trong việc khám phá các mối quan hệ phi tuyến tính.

Đây là một ví dụ. Tôi đã tạo ra một vấn đề phân loại với 10 tính năng nhiễu, hai tính năng "tín hiệu" và ranh giới quyết định tròn.

set.seed(1)
N  <- 500
x1 <- rnorm(N, sd=1.5)
x2 <- rnorm(N, sd=1.5)

y  <- apply(cbind(x1, x2), 1, function(x) (x%*%x)<1)

plot(x1, x2, col=ifelse(y, "red", "blue"))
lines(cos(seq(0, 2*pi, len=1000)), sin(seq(0, 2*pi, len=1000))) 

nhập mô tả hình ảnh ở đây

Và khi chúng tôi áp dụng mô hình RF, chúng tôi không ngạc nhiên khi thấy rằng các tính năng này dễ dàng được chọn bởi mô hình. (NB: Mô hình này không được điều chỉnh ở tất cả .)

x_junk   <- matrix(rnorm(N*10, sd=1.5), ncol=10)
x        <- cbind(x1, x2, x_junk)
names(x) <- paste("V", 1:ncol(x), sep="")

rf <- randomForest(as.factor(y)~., data=x, mtry=4)
importance(rf)

    MeanDecreaseGini
x1         49.762104
x2         54.980725
V3          5.715863
V4          5.010281
V5          4.193836
V6          7.147988
V7          5.897283
V8          5.338241
V9          5.338689
V10         5.198862
V11         4.731412
V12         5.221611

Nhưng khi chúng ta chọn xuống chỉ hai tính năng này, các tính năng hữu ích, mô hình tuyến tính kết quả là khủng khiếp.

summary(badmodel <- glm(y~., data=data.frame(x1,x2), family="binomial"))

Phần quan trọng của bản tóm tắt là so sánh độ lệch còn lại và độ lệch null. Chúng ta có thể thấy rằng mô hình về cơ bản không có gì để "di chuyển" sự lệch lạc. Hơn nữa, các ước tính hệ số về cơ bản là bằng không.

Call:
glm(formula = as.factor(y) ~ ., family = "binomial", data = data.frame(x1, 
    x2))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.6914  -0.6710  -0.6600  -0.6481   1.8079  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -1.398378   0.112271 -12.455   <2e-16 ***
x1          -0.020090   0.076518  -0.263    0.793    
x2          -0.004902   0.071711  -0.068    0.946    
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 497.62  on 499  degrees of freedom
Residual deviance: 497.54  on 497  degrees of freedom
AIC: 503.54

Number of Fisher Scoring iterations: 4

Điều gì cho sự khác biệt hoang dã giữa hai mô hình? Chà, rõ ràng ranh giới quyết định mà chúng ta đang cố gắng học không phải là một hàm tuyến tính của hai tính năng "tín hiệu". Rõ ràng nếu bạn biết dạng chức năng của ranh giới quyết định trước khi ước tính hồi quy, bạn có thể áp dụng một số phép biến đổi để mã hóa dữ liệu theo cách mà hồi quy có thể phát hiện ra ... (Nhưng tôi chưa bao giờ biết dạng ranh giới phía trước về thời gian trong bất kỳ vấn đề nào trong thế giới thực.) Vì chúng ta chỉ làm việc với hai tính năng tín hiệu trong trường hợp này, một bộ dữ liệu tổng hợp không có nhiễu trong nhãn lớp, ranh giới giữa các lớp là rất rõ ràng trong âm mưu của chúng ta. Nhưng nó ít rõ ràng hơn khi làm việc với dữ liệu thực trong một số chiều thực tế.

Hơn nữa, nói chung, rừng ngẫu nhiên có thể phù hợp với các mô hình khác nhau cho các tập hợp con khác nhau của dữ liệu. Trong một ví dụ phức tạp hơn, sẽ không rõ ràng những gì đang diễn ra từ một cốt truyện duy nhất, và việc xây dựng một mô hình tuyến tính có sức mạnh dự đoán tương tự sẽ còn khó hơn.

Bởi vì chúng tôi chỉ quan tâm đến hai chiều, chúng tôi có thể tạo ra một bề mặt dự đoán. Như mong đợi, mô hình ngẫu nhiên biết rằng vùng lân cận xung quanh nguồn gốc là quan trọng.

M                 <- 100
x_new             <- seq(-4,4, len=M)
x_new_grid        <- expand.grid(x_new, x_new)
names(x_new_grid) <- c("x1", "x2")
x_pred            <- data.frame(x_new_grid, matrix(nrow(x_new_grid)*10, ncol=10))
names(x_pred)     <- names(x)

y_hat             <- predict(object=rf, newdata=x_pred, "vote")[,2]

library(fields)
y_hat_mat         <- as.matrix(unstack(data.frame(y_hat, x_new_grid), y_hat~x1))

image.plot(z=y_hat_mat, x=x_new, y=x_new, zlim=c(0,1), col=tim.colors(255), 
           main="RF Prediction surface", xlab="x1", ylab="x2")

nhập mô tả hình ảnh ở đây

Theo ngụ ý của đầu ra mô hình abysmal của chúng tôi, bề mặt dự đoán cho mô hình hồi quy logistic biến giảm về cơ bản là bằng phẳng.

nhập mô tả hình ảnh ở đây

bad_y_hat     <- predict(object=badmodel, newdata=x_new_grid, type="response")
bad_y_hat_mat <- as.matrix(unstack(data.frame(bad_y_hat, x_new_grid), bad_y_hat~x1))
image.plot(z=bad_y_hat_mat, x=x_new, y=x_new, zlim=c(0,1), col=tim.colors(255), 
           main="Logistic regression prediction surface", xlab="x1", ylab="x2")

1=x12+x22,


1
Tôi nghĩ rằng, trong khi tốt đẹp, nó bỏ lỡ toàn bộ điểm. Hãy thử một mô hình phức tạp hơn một chút - một mô hình tôi sẽ gọi đủ tầm thường không đủ tầm thường để có nhiều thông tin. Hãy xem xét điều này ( people.kyb.tuebingen.mpg.de/spider/demo_dec_vs_svm_2.jpg ) với một số tiếng ồn muối và hạt tiêu. Bây giờ phù hợp với nó với RF. Bây giờ sử dụng RF làm "bộ lọc" để loại bỏ các hiện tượng "giả" và huấn luyện mô hình thay thế của bạn trên các đầu ra của RF, chứ không phải các hệ số của nó. OP chỉ định "tính năng" không phải là hệ số. OP không nói "rừng ngẫu nhiên giảm" mà là "rừng ngẫu nhiên". Hàm ý dành cho đầu ra của khu rừng hoàn chỉnh.
EngrStudent - Phục hồi Monica

3
y=x12+x22x1x2

3
@ user777, tôi đã sử dụng các khu rừng ngẫu nhiên để giảm kích thước chống lại các vấn đề phức tạp trong nhiều năm. Chủ nhân trước đây của tôi, Intel S bán dẫn, có các quy trình sản xuất có 20k cột và 20 nghìn bước và đối với các lỗi dưới 10, sử dụng phần này như một phần của bộ công cụ phân tích để đi từ 20k cột, đến 30 cột. Họ dạy các khóa học nội bộ, và giảng về nội dung bên ngoài. ( web.stanford.edu/ class / e392m / Lecture3Tuv.pdf ) "Khu rừng" là một công cụ mạnh mẽ đáng kinh ngạc và bạn đã đi trên một con đường xấu. Có hai cái tốt chắc chắn bạn đã bỏ lỡ.
EngrStudent - Phục hồi Monica

2
@EngrStudent "Intel sử dụng RF để đi từ nhiều cột đến ít cột hơn." Đó chính xác là những gì trình diễn của tôi làm. Nó cũng trả lời câu hỏi cụ thể của OP về việc các tính năng đó có thể được sử dụng có lợi trong mô hình tuyến tính hay không và câu trả lời của tôi là "nói chung chúng sẽ không hữu ích trực tiếp, nhưng trong ví dụ này, bạn có thể thấy chúng hữu ích khi chuyển đổi."
Phục hồi lại

12

Y


2
Cảm ơn, bác sĩ Mitchell! Trong tâm trí của tôi, nếu OP sử dụng đường ống phân tích này, OP sẽ thực hiện lựa chọn xuống RF và mô hình tuyến tính phù hợp bên trong sơ đồ xác nhận (chéo) của chúng. Điều đó có đủ để giảm thiểu sự thiên vị mà bạn mô tả hay có vấn đề nào khác đang ẩn giấu ở đây không?
Tái lập lại

2
Tôi không biết làm thế nào để thực hiện một mô hình tuyến tính thích hợp "bên trong" sơ đồ. Tôi không biết làm thế nào để giảm thiểu sai lệch quá mức / ước tính sẽ dẫn đến. Có lẽ một cách tiếp cận tốt hơn là xấp xỉ mô hình, đôi khi được gọi là tiền điều hòa. Ở đây bạn sử dụng các mô hình truyền thống hoặc các cây đơn lẻ (sẽ cần một tấn nút) để xấp xỉ đầu ra của hộp đen, kế thừa độ co của hộp đen.
Frank Harrell

8

Một khu rừng ngẫu nhiên được thực hiện đúng áp dụng cho một vấn đề "phù hợp với rừng ngẫu nhiên" hơn có thể hoạt động như một bộ lọc để loại bỏ nhiễu và tạo ra kết quả hữu ích hơn khi làm đầu vào cho các công cụ phân tích khác.

Tuyên bố miễn trừ trách nhiệm:

  • Có phải là "viên đạn bạc"? Không đời nào. Số dặm sẽ thay đổi. Nó hoạt động ở nơi nó hoạt động, và không phải nơi nào khác.
  • Có những cách nào bạn có thể sử dụng nó một cách sai lầm và nhận được câu trả lời trong miền rác-to-voodoo? youbetcha. Giống như mọi công cụ phân tích, nó có giới hạn.
  • Nếu bạn liếm một con ếch, hơi thở của bạn sẽ có mùi như ếch? có khả năng Tôi không có kinh nghiệm ở đó.

Tôi phải "hét to" với "peeps" của mình, người đã tạo ra "Spider". ( liên kết ) Vấn đề ví dụ của họ thông báo cách tiếp cận của tôi. ( link ) Tôi cũng thích những người ước tính Theil-Sen và ước gì tôi có thể tặng đạo cụ cho Theil và Sen.

Câu trả lời của tôi không phải là về cách làm cho nó sai, mà là về cách nó có thể hoạt động nếu bạn hiểu đúng. Trong khi tôi sử dụng tiếng ồn "tầm thường", tôi muốn bạn nghĩ về tiếng ồn "không tầm thường" hoặc "có cấu trúc".

Một trong những điểm mạnh của một khu rừng ngẫu nhiên là nó áp dụng tốt như thế nào cho các vấn đề chiều cao. Tôi không thể hiển thị các cột 20k (còn gọi là không gian 20k) theo cách trực quan rõ ràng. Đó không phải một công việc dễ. Tuy nhiên, nếu bạn gặp vấn đề 20 chiều, một khu rừng ngẫu nhiên có thể là một công cụ tốt ở đó khi hầu hết những người khác nằm thẳng trên "khuôn mặt" của họ.

Đây là một ví dụ về loại bỏ nhiễu khỏi tín hiệu bằng cách sử dụng một khu rừng ngẫu nhiên.

#housekeeping
rm(list=ls())

#library
library(randomForest)

#for reproducibility
set.seed(08012015)

#basic
n <- 1:2000
r <- 0.05*n +1 
th <- n*(4*pi)/max(n)

#polar to cartesian
x1=r*cos(th) 
y1=r*sin(th)

#add noise
x2 <- x1+0.1*r*runif(min = -1,max = 1,n=length(n))
y2 <- y1+0.1*r*runif(min = -1,max = 1,n=length(n))

#append salt and pepper
x3 <- runif(min = min(x2),max = max(x2),n=length(n)/2)
y3 <- runif(min = min(y2),max = max(y2),n=length(n)/2)

x4 <- c(x2,x3)
y4 <- c(y2,y3)
z4 <- as.vector(matrix(1,nrow=length(x4)))

#plot class "A" derivation
plot(x1,y1,pch=18,type="l",col="Red", lwd=2)
points(x2,y2)
points(x3,y3,pch=18,col="Blue")
legend(x = 65,y=65,legend = c("true","sampled","false"),
col = c("Red","Black","Blue"),lty = c(1,-1,-1),pch=c(-1,1,18))

Hãy để tôi mô tả những gì đang xảy ra ở đây. Hình ảnh dưới đây cho thấy dữ liệu đào tạo cho lớp "1". Lớp "2" là thống nhất ngẫu nhiên trên cùng một miền và phạm vi. Bạn có thể thấy rằng "thông tin" của "1" chủ yếu là hình xoắn ốc, nhưng đã bị hỏng với tài liệu từ "2". Có 33% dữ liệu của bạn bị hỏng có thể là một vấn đề đối với nhiều công cụ phù hợp. Theil-Sen bắt đầu xuống cấp ở khoảng 29%. ( liên kết )

nhập mô tả hình ảnh ở đây

Bây giờ chúng tôi tách thông tin ra, chỉ có một ý tưởng về tiếng ồn là gì.

#Create "B" class of uniform noise
x5 <- runif(min = min(x4),max = max(x4),n=length(x4))
y5 <- runif(min = min(y4),max = max(y4),n=length(x4))
z5 <- 2*z4 

#assemble data into frame 
data <- data.frame(c(x4,x5),c(y4,y5),as.factor(c(z4,z5)))
names(data) <- c("x","y","z")

#train random forest - I like h2o, but this is textbook Breimann
fit.rf <- randomForest(z~.,data=data,
                       ntree = 1000, replace=TRUE, nodesize = 20)
data2 <- predict(fit.rf,newdata=data[data$z==1,c(1,2)],type="response")

#separate class "1" from training data
idx1a <- which(data[,3]==1)

#separate class "1" from the predicted data
idx1b <- which(data2==1)

#show the difference in classes before and after RF based filter
plot(data[idx1a,1],data[idx1a,2])
points(data[idx1b,1],data[idx1b,2],col="Red")

Đây là kết quả phù hợp:

nhập mô tả hình ảnh ở đây

Tôi thực sự thích điều này bởi vì nó có thể hiển thị cả điểm mạnh và điểm yếu của một phương pháp tốt cho một vấn đề khó khăn cùng một lúc. Nếu bạn nhìn gần trung tâm, bạn có thể thấy cách lọc ít hơn. Quy mô hình học của thông tin là nhỏ và rừng ngẫu nhiên bị thiếu điều đó. Nó nói điều gì đó về số lượng nút, số lượng cây và mật độ mẫu cho lớp 2. Ngoài ra còn có một "khoảng cách" gần (-50, -50) và "máy bay phản lực" ở một số vị trí. Nói chung, tuy nhiên, việc lọc là tốt.

So sánh với SVM

Đây là mã để cho phép so sánh với SVM:

#now to fit to svm
fit.svm <-  svm(z~., data=data, kernel="radial",gamma=10,type = "C")

x5 <- seq(from=min(x2),to=max(x2),by=1)
y5 <- seq(from=min(y2),to=max(y2),by=1)

count <- 1
x6 <- numeric()
y6 <- numeric()
for (i in 1:length(x5)){

     for (j in 1:length(y5)){
          x6[count]<-x5[i]
          y6[count]<-y5[j]
          count <- count+1
     }
}

data4 <- data.frame(x6,y6)
names(data4) <- c("x","y")

data4$z <- predict(fit.svm,newdata=data4)

idx4 <- which(data4$z==1,arr.ind=TRUE)


plot(data4[idx4,1],data4[idx4,2],col="Gray",pch=20)
points(data[idx1b,1],data[idx1b,2],col="Blue",pch=20)
lines(x1,y1,pch=18,col="Green", lwd=2)
grid()
legend(x = 65,y=65,
       legend = c("true","from RF","From SVM"),
       col = c("Green","Blue","Gray"),lty = c(1,-1,-1),pch=c(-1,20,15),pt.cex=c(1,1,2.25))

Nó dẫn đến hình ảnh sau đây.

nhập mô tả hình ảnh ở đây

Đây là một SVM phong nha. Màu xám là miền được liên kết với lớp "1" của SVM. Các chấm màu xanh là các mẫu được liên kết với lớp "1" của RF. Bộ lọc dựa trên RF thực hiện tương đương với SVM mà không có cơ sở áp đặt rõ ràng. Có thể thấy rằng "dữ liệu chặt chẽ" ở gần tâm xoắn ốc được "giải quyết" chặt chẽ hơn nhiều bởi RF. Ngoài ra còn có "đảo" về phía "đuôi" nơi RF tìm thấy sự liên kết mà SVM không có.

Tôi đang giải trí. Không có nền tảng, tôi đã làm một trong những điều đầu tiên cũng được thực hiện bởi một người đóng góp rất tốt trong lĩnh vực này. Tác giả ban đầu đã sử dụng "phân phối tham chiếu" ( liên kết , liên kết ).

BIÊN TẬP:

Áp dụng RỪNG ngẫu nhiên cho mô hình này:
Mặc dù user777 có suy nghĩ rất hay về GIỎI là yếu tố của một khu rừng ngẫu nhiên, tiền đề của khu rừng ngẫu nhiên là "tập hợp những người học yếu". GIỎ HÀNG là một người học yếu kém được biết đến nhưng nó không là gì xa gần một "đoàn thể". Việc "tập hợp" mặc dù trong một khu rừng ngẫu nhiên được dự định "trong giới hạn của một số lượng lớn mẫu". Câu trả lời của user777, trong biểu đồ phân tán, sử dụng ít nhất 500 mẫu và điều đó nói lên điều gì đó về khả năng đọc của con người và kích thước mẫu trong trường hợp này. Hệ thống thị giác của con người (bản thân nó là một nhóm người học) là một bộ cảm biến và bộ xử lý dữ liệu tuyệt vời và nó thấy giá trị đó là đủ để dễ xử lý.

Nếu chúng ta thực hiện ngay cả các cài đặt mặc định trên công cụ rừng ngẫu nhiên, chúng ta có thể quan sát hành vi của lỗi phân loại tăng đối với một số cây đầu tiên và không đạt đến cấp một cây cho đến khi có khoảng 10 cây. Ban đầu lỗi phát triển giảm lỗi trở nên ổn định khoảng 60 cây. Ý tôi là ổn định

x        <- cbind(x1, x2)
plot(rf,type="b",ylim=c(0,0.06))
grid()

Sản lượng nào:
nhập mô tả hình ảnh ở đây

Nếu thay vì nhìn vào "người học yếu tối thiểu", chúng ta nhìn vào "nhóm yếu tối thiểu" được đề xuất bởi một heuristic rất ngắn gọn cho cài đặt mặc định của công cụ thì kết quả có hơi khác.

Lưu ý, tôi đã sử dụng "đường" để vẽ đường tròn biểu thị cạnh trên xấp xỉ. Bạn có thể thấy rằng nó không hoàn hảo, nhưng tốt hơn nhiều so với chất lượng của một người học.

nhập mô tả hình ảnh ở đây

Mẫu ban đầu có 88 mẫu "nội thất". Nếu kích thước mẫu được tăng lên (cho phép áp dụng đồng bộ) thì chất lượng của xấp xỉ cũng được cải thiện. Cùng một số lượng người học với 20.000 mẫu làm cho phù hợp hơn đáng kinh ngạc.

nhập mô tả hình ảnh ở đây

Thông tin đầu vào chất lượng cao hơn nhiều cũng cho phép đánh giá số lượng cây thích hợp. Kiểm tra sự hội tụ cho thấy 20 cây là số lượng đủ tối thiểu trong trường hợp cụ thể này, để thể hiện tốt dữ liệu.

nhập mô tả hình ảnh ở đây


Làm thế nào điều này chứng minh / chứng minh rằng RF có thể được sử dụng để chọn các tính năng chất lượng cao cho mô hình tuyến tính? Bạn không thảo luận về lựa chọn tính năng hoặc mô hình tuyến tính trong câu trả lời của bạn.
Tái lập lại

tiền đề của người hỏi là về việc sử dụng RF làm bộ lọc trước sau đó xem xét các tham số của mô hình tuyến tính. Anh ta không nhìn vào thông số của khu rừng. Khi tôi đọc nó, vì nó không có chiều sâu hoặc tính đặc hiệu, "mô hình đa tuyến tính" dường như là thứ yếu. Đối với tôi điều này trông giống như "có thể xử lý trước RF / làm sạch dữ liệu trước khi gắn nó vào công cụ phân tích x".
EngrStudent - Phục hồi Monica

Tôi thấy đồ tạo tác ngang và dọc. Tôi muốn tạo một "dữ liệu liên hợp" trên tọa độ xoay 45 độ và nối các cột vào RF. Tôi cá rằng một biến đổi như thế sẽ làm giảm số lượng tạo tác, mặc dù tôi không chắc nó sẽ thay đổi các tham số đầu vào như thế nào.
EngrStudent - Phục hồi Monica

2
Bên cạnh đó, "rừng xoay" là một biến thể gần đây của ý tưởng này, trong đó PCA được sử dụng để xác định cơ sở mới. ncbi.nlm.nih.gov/pubmed/16986543
Tái lập lại

1
Gọn gàng: Liu, Fei Tony, Ting, Kai Ming và Zhou, Zhi-Hua. Rừng cách ly của mình. Khai thác dữ liệu, năm 2008, ICDM'08. Hội nghị quốc tế lần thứ tám về.
EngrStudent - Phục hồi Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.