R: Tôi thấy gì trong các lô phụ thuộc một phần của gbm và RandomForest?


14

Trên thực tế, tôi nghĩ rằng tôi đã hiểu những gì người ta có thể thể hiện với cốt truyện phụ thuộc một phần, nhưng sử dụng một ví dụ giả thuyết rất đơn giản, tôi đã khá bối rối. Trong đoạn mã sau tôi tạo ba biến độc lập ( a , b , c ) và một biến phụ thuộc ( y ) với c hiển thị mối quan hệ tuyến tính chặt chẽ với y , trong khi ab không tương thích với y . Tôi thực hiện phân tích hồi quy với cây hồi quy được tăng cường bằng cách sử dụng gói R gbm:

a <- runif(100, 1, 100)
b <- runif(100, 1, 100)
c <- 1:100 + rnorm(100, mean = 0, sd = 5)
y <- 1:100 + rnorm(100, mean = 0, sd = 5)
par(mfrow = c(2,2))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")
library(gbm)
gbm.gaus <- gbm(y ~ a + b + c, data = Data, distribution = "gaussian")
par(mfrow = c(2,2))
plot(gbm.gaus, i.var = 1)
plot(gbm.gaus, i.var = 2)
plot(gbm.gaus, i.var = 3)

Không có gì đáng ngạc nhiên, đối với các biến ab, các ô phụ thuộc một phần tạo ra các đường nằm ngang xung quanh giá trị trung bình của a . Những gì tôi đố là cốt truyện cho biến c . Tôi nhận được các đường ngang cho các phạm vi c <40 và c > 60 và trục y bị giới hạn ở các giá trị gần với giá trị trung bình của y . Vì ab hoàn toàn không liên quan đến y (và do đó có tầm quan trọng thay đổi trong mô hình là 0), tôi đã dự đoán rằng csẽ cho thấy sự phụ thuộc một phần dọc theo toàn bộ phạm vi của nó thay vì hình dạng sigmoid đó cho một phạm vi rất hạn chế của các giá trị của nó. Tôi đã cố gắng tìm thông tin trong Friedman (2001) "Xấp xỉ chức năng tham lam: một máy tăng cường độ dốc" và trong Hastie et al. (2011) "Các yếu tố của học thống kê", nhưng kỹ năng toán học của tôi quá thấp để hiểu tất cả các phương trình và công thức trong đó. Vì vậy, câu hỏi của tôi: Điều gì xác định hình dạng của biểu đồ phụ thuộc một phần cho biến c ? (Vui lòng giải thích bằng từ ngữ dễ hiểu cho một người không phải là nhà toán học!)

THÊM vào ngày 17 tháng 4 năm 2014:

Trong khi chờ đợi một phản ứng, tôi đã sử dụng dữ liệu ví dụ tương tự cho một phân tích với R-gói randomForest. Các biểu đồ phụ thuộc một phần của RandomForest giống với nhiều hơn những gì tôi mong đợi từ các biểu đồ gbm: sự phụ thuộc một phần của các biến giải thích ab thay đổi ngẫu nhiên và gần nhau khoảng 50, trong khi biến giải thích c cho thấy sự phụ thuộc một phần vào toàn bộ phạm vi của nó (và gần như toàn bộ phạm vi của y ). Điều gì có thể là lý do cho những hình dạng khác nhau của các ô phụ thuộc một phần trong gbmrandomForest?

lô một phần của gbm và RandomForest

Ở đây mã sửa đổi so sánh các ô:

a <- runif(100, 1, 100)
b <- runif(100, 1, 100)
c <- 1:100 + rnorm(100, mean = 0, sd = 5)
y <- 1:100 + rnorm(100, mean = 0, sd = 5)
par(mfrow = c(2,2))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")

library(gbm)
gbm.gaus <- gbm(y ~ a + b + c, data = Data, distribution = "gaussian")

library(randomForest)
rf.model <- randomForest(y ~ a + b + c, data = Data)

x11(height = 8, width = 5)
par(mfrow = c(3,2))
par(oma = c(1,1,4,1))
plot(gbm.gaus, i.var = 1)
partialPlot(rf.model, Data[,2:4], x.var = "a")
plot(gbm.gaus, i.var = 2)
partialPlot(rf.model, Data[,2:4], x.var = "b")
plot(gbm.gaus, i.var = 3)
partialPlot(rf.model, Data[,2:4], x.var = "c")
title(main = "Boosted regression tree", outer = TRUE, adj = 0.15)
title(main = "Random forest", outer = TRUE, adj = 0.85)

1
Bạn có thể muốn thực sự điều chỉnh các siêu đường kính một chạm. Tôi không chắc số cây mặc định là bao nhiêu trong gbm, nhưng nó có thể quá nhỏ nên không có thời gian để học độ cong khỏe mạnh.
Shea Parkes

@Shea Parkes - Bạn nói đúng. Số lượng cây defaukt là 100 không đủ để tạo ra một mô hình tốt. Với 2000 cây, các ô phụ thuộc một phần của gbm và rừng ngẫu nhiên gần như giống hệt nhau.
dùng7417

Câu trả lời:


7

Tôi đã dành một chút thời gian để viết "part.factor-cốt truyện" của riêng mình trước khi tôi nhận ra nó đã được gói trong thư viện R RandomForest.

[EDIT ... nhưng sau đó tôi đã dành một năm để tạo gói CRAN ForestFloor , theo ý kiến ​​của tôi tốt hơn đáng kể so với các lô phụ thuộc một phần cổ điển]

Biểu đồ Partial.feft rất tuyệt trong các trường hợp như ví dụ mô phỏng này bạn hiển thị ở đây, trong đó biến giải thích không tương tác với các biến khác. Nếu mỗi biến giải thích đóng góp bổ sung cho mục tiêu-Y bởi một số hàm chưa biết, thì phương thức này là tuyệt vời để hiển thị hàm ẩn ước tính đó. Tôi thường thấy làm phẳng như vậy trong biên giới của các chức năng một phần.

Một số lý do: RandomForsest có một đối số được gọi là 'odesize = 5', có nghĩa là không có cây nào sẽ chia nhỏ một nhóm gồm 5 thành viên trở xuống. Do đó, mỗi cây không thể phân biệt với độ chính xác cao hơn. Lớp đóng gói / bootstrapping làm mịn màng bằng cách bỏ phiếu nhiều chức năng bước của từng cây riêng lẻ - nhưng chỉ ở giữa vùng dữ liệu. Gần biên giới của dữ liệu đại diện cho không gian, 'biên độ' của part.feft sẽ giảm. Đặt các nút kích thước = 3 và / hoặc nhận được nhiều quan sát hơn so với nhiễu có thể làm giảm hiệu ứng rung biên này ... Khi tỷ lệ tín hiệu trên nhiễu nói chung trong rừng ngẫu nhiên, các thang đo dự đoán sẽ ngưng tụ. Do đó, các dự đoán không hoàn toàn chính xác về mặt thuật ngữ, mà chỉ tương quan tuyến tính với mục tiêu. Bạn có thể xem giá trị a và b là ví dụ về tỷ lệ nhiễu và tín hiệu cực thấp, và do đó các chức năng một phần là rất phẳng. Đây là một tính năng hay của rừng ngẫu nhiên mà bạn đã có trong phạm vi dự đoán của tập huấn luyện có thể đoán mô hình hoạt động tốt như thế nào. OOB.prjecttions cũng tuyệt vời ..

làm phẳng cốt truyện một phần ở các vùng không có dữ liệu là hợp lý: Vì rừng ngẫu nhiên và GIỎ HÀNG là mô hình hướng dữ liệu, cá nhân tôi thích khái niệm rằng các mô hình này không ngoại suy. Do đó, dự đoán của c = 500 hoặc c = 1100 hoàn toàn giống với c = 100 hoặc trong hầu hết các trường hợp cũng c = 98.

Dưới đây là một ví dụ mã với việc làm phẳng đường viền được giảm:

Tôi chưa thử gói gbm ...

đây là một số mã minh họa dựa trên mẫu của bạn ...

#more observations are created...
a <- runif(5000, 1, 100)
b <- runif(5000, 1, 100)
c <- (1:5000)/50 + rnorm(100, mean = 0, sd = 0.1)
y <- (1:5000)/50 + rnorm(100, mean = 0, sd = 0.1)
par(mfrow = c(1,3))
plot(y ~ a); plot(y ~ b); plot(y ~ c)
Data <- data.frame(matrix(c(y, a, b, c), ncol = 4))
names(Data) <- c("y", "a", "b", "c")
library(randomForest)
#smaller nodesize "not as important" when there number of observartion is increased
#more tress can smooth flattening so boundery regions have best possible signal to             noise, data specific how many needed

plot.partial = function() {
partialPlot(rf.model, Data[,2:4], x.var = "a",xlim=c(1,100),ylim=c(1,100))
partialPlot(rf.model, Data[,2:4], x.var = "b",xlim=c(1,100),ylim=c(1,100))
partialPlot(rf.model, Data[,2:4], x.var = "c",xlim=c(1,100),ylim=c(1,100))
}

#worst case! : with 100 samples from Data and nodesize=30
rf.model <- randomForest(y ~ a + b + c, data = Data[sample(5000,100),],nodesize=30)
plot.partial()

#reasonble settings for least partial flattening by few observations: 100 samples and nodesize=3 and ntrees=2000
#more tress can smooth flattening so boundery regions have best possiblefidelity
rf.model <- randomForest(y ~ a + b + c, data = Data[sample(5000,100),],nodesize=5,ntress=2000)
plot.partial()

#more observations is great!
rf.model <- randomForest(y ~ a + b + c,
 data = Data[sample(5000,5000),],
 nodesize=5,ntress=2000)
plot.partial()

4

Như đã đề cập trong các ý kiến ​​trên, mô hình gbm sẽ tốt hơn với một số điều chỉnh tham số. Một cách dễ dàng để phát hiện các vấn đề trong mô hình và sự cần thiết của các tham số đó là tạo ra một số sơ đồ chẩn đoán. Ví dụ, đối với mô hình GBM trên với các thông số mặc định (và sử dụng plotmo gói để tạo ra các âm mưu), chúng tôi có

gbm.gaus <- gbm(y~., data = Data, dist = "gaussian")
library(plotmo)   # for the plotres function
plotres(gbm.gaus) # plot the error per ntrees and the residuals

cái nào cho

âm mưu

Trong biểu đồ bên trái, chúng ta thấy rằng đường cong lỗi không chạm đáy. Và trong tay phải âm mưu phần dư không phải là những gì chúng ta muốn.

Nếu chúng ta xây dựng lại mô hình với số lượng cây lớn hơn

gbm.gaus1 <- gbm(y~., data = Data, dist = "gaussian",
                 n.trees=5000, interact=3)
plotres(gbm.gaus1)

chúng tôi nhận được

âm mưu

Chúng tôi thấy đường cong lỗi từ dưới ra với một số lượng lớn cây và âm mưu còn lại là lành mạnh hơn. Chúng ta cũng có thể vẽ các ô phụ thuộc một phần cho mô hình gbm mới và mô hình rừng ngẫu nhiên

library(plotmo)
plotmo(gbm.gaus1, pmethod="partdep", all1=TRUE, all2=TRUE)
plotmo(rf.model,  pmethod="partdep", all1=TRUE, all2=TRUE)

cái nào cho

âm mưu

Các lô mô hình rừng và gbm ngẫu nhiên hiện nay tương tự nhau, như mong đợi.


3

Bạn cần cập nhật interaction.depththông số của mình khi xây dựng mô hình tăng cường. Nó mặc định là 1 và điều đó sẽ khiến tất cả các cây mà gbmthuật toán xây dựng chỉ phân tách một lần mỗi cây. Điều này có nghĩa là mỗi cây chỉ đang phân tách trên biến cvà tùy thuộc vào mẫu quan sát mà nó sử dụng, nó sẽ phân chia ở đâu đó khoảng 40 - 60.

Dưới đây là các ô một phần với interaction.depth = 3

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


điểm tốt, đó là
Soren Havelund Welling
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.