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?
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?
Câu trả lời:
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:
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)))
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")
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.
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")
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:
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 )
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:
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.
Đâ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()
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.
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.
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.