เนื่องจาก RF สามารถจัดการแบบไม่เป็นเชิงเส้น แต่ไม่สามารถให้ค่าสัมประสิทธิ์ได้คุณควรใช้ฟอเรสต์แบบสุ่มเพื่อรวบรวมคุณลักษณะที่สำคัญที่สุดจากนั้นจึงเสียบคุณลักษณะเหล่านั้นเข้ากับแบบจำลองการถดถอยเชิงเส้นหลายแบบเพื่อให้ได้ค่าสัมประสิทธิ์
เนื่องจาก RF สามารถจัดการแบบไม่เป็นเชิงเส้น แต่ไม่สามารถให้ค่าสัมประสิทธิ์ได้คุณควรใช้ฟอเรสต์แบบสุ่มเพื่อรวบรวมคุณลักษณะที่สำคัญที่สุดจากนั้นจึงเสียบคุณลักษณะเหล่านั้นเข้ากับแบบจำลองการถดถอยเชิงเส้นหลายแบบเพื่อให้ได้ค่าสัมประสิทธิ์
คำตอบ:
เนื่องจาก RF สามารถจัดการแบบไม่เป็นเชิงเส้น แต่ไม่สามารถให้ค่าสัมประสิทธิ์ได้ดังนั้นควรใช้ Random Forest เพื่อรวบรวมคุณลักษณะที่สำคัญที่สุดแล้วจึงนำคุณสมบัติเหล่านั้นไปใช้กับโมเดลการถดถอยเชิงเส้นหลายเชิงเส้นเพื่ออธิบายสัญญาณของพวกเขา?
ฉันตีความคำถามหนึ่งประโยคของ OP ว่าหมายความว่า OP ต้องการเข้าใจความปรารถนาของกระบวนการวิเคราะห์ต่อไปนี้:
ฉันไม่คิดว่าขั้นตอนนี้จะทำให้สำเร็จตามที่คุณต้องการ ตัวแปรที่มีความสำคัญในฟอเรสต์แบบสุ่มไม่จำเป็นต้องมีความสัมพันธ์เชิงเส้นเพิ่มเติมกับผลลัพธ์ คำพูดนี้ไม่น่าแปลกใจ: มันเป็นสิ่งที่ทำให้ป่าสุ่มมีประสิทธิภาพในการค้นหาความสัมพันธ์แบบไม่เชิงเส้น
นี่คือตัวอย่าง ฉันสร้างปัญหาการจัดหมวดหมู่ด้วยคุณสมบัติเสียงรบกวน 10 ประการคุณสมบัติ "สัญญาณ" สองรายการและขอบเขตการตัดสินใจแบบวงกลม
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)))
และเมื่อเราใช้โมเดล RF เราไม่แปลกใจที่พบว่าคุณลักษณะเหล่านี้หยิบออกมาได้อย่างง่ายดายตามความสำคัญของรุ่น (หมายเหตุ: รูปแบบนี้ไม่ได้มีการปรับจูนที่ทุกคน .)
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
แต่เมื่อเราเลือกเพียงสองคุณสมบัติที่มีประโยชน์แบบจำลองเชิงเส้นที่ได้จะน่ากลัว
summary(badmodel <- glm(y~., data=data.frame(x1,x2), family="binomial"))
ส่วนที่สำคัญของการสรุปคือการเปรียบเทียบความเบี่ยงเบนที่เหลือและการเบี่ยงเบนที่ว่างเปล่า เราจะเห็นได้ว่าแบบจำลองไม่มีส่วนใดที่จะ "เคลื่อนย้าย" ความเบี่ยงเบน ยิ่งกว่านั้นการประมาณค่าสัมประสิทธิ์เป็นศูนย์
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
สิ่งที่แตกต่างกันระหว่างสองรุ่นนี้คืออะไร? ชัดเจนขอบเขตการตัดสินใจที่เราพยายามเรียนรู้ไม่ใช่ฟังก์ชันเชิงเส้นของคุณสมบัติ "สัญญาณ" สองตัว เห็นได้ชัดว่าถ้าคุณรู้รูปแบบการทำงานของขอบเขตการตัดสินใจก่อนที่จะประเมินการถดถอยคุณสามารถใช้การแปลงบางอย่างเพื่อเข้ารหัสข้อมูลในแบบที่การถดถอยจะค้นพบ ... (แต่ฉันไม่เคยรู้จักรูปแบบของขอบเขตล่วงหน้า ของเวลาในปัญหาโลกแห่งความจริง) เนื่องจากเรากำลังทำงานกับคุณสมบัติสัญญาณสองอย่างเท่านั้นในกรณีนี้ชุดข้อมูลสังเคราะห์โดยไม่มีเสียงรบกวนในฉลากระดับชั้นนั้นขอบเขตระหว่างคลาสนั้นชัดเจนมากในโครงร่างของเรา แต่จะเห็นได้ชัดน้อยลงเมื่อทำงานกับข้อมูลจริงในมิติที่เป็นจริง
ยิ่งไปกว่านั้นโดยทั่วไปฟอเรสต์แบบสุ่มสามารถใส่โมเดลต่าง ๆ กับชุดย่อยของข้อมูลที่แตกต่างกัน ในตัวอย่างที่ซับซ้อนกว่านี้จะไม่ชัดเจนว่าเกิดอะไรขึ้นจากพล็อตเดียวเลยและการสร้างแบบจำลองเชิงเส้นของพลังการทำนายที่คล้ายกันจะยิ่งยากขึ้น
เนื่องจากเราเกี่ยวข้องกับสองมิติเท่านั้นเราจึงสามารถสร้างพื้นผิวการทำนายได้ ตามที่คาดหวังแบบจำลองแบบสุ่มเรียนรู้ว่าละแวกใกล้เคียงที่มามีความสำคัญ
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")
ตามที่แสดงโดยเอาท์พุทแบบสุดซึ้งของเราพื้นผิวการทำนายสำหรับตัวแบบการถดถอยโลจิสติกแบบลดตัวแปรนั้นค่อนข้างแบน
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")
HongOoi ตั้งข้อสังเกตว่าสมาชิกระดับไม่ได้เป็นฟังก์ชั่นเชิงเส้นของคุณสมบัติ แต่ฟังก์ชั่นเชิงเส้นอยู่ภายใต้การเปลี่ยนแปลง เนื่องจากขอบเขตการตัดสินใจคือ ถ้าเรายกกำลังสองคุณสมบัติเหล่านี้เราจะสามารถสร้างแบบจำลองเชิงเส้นที่มีประโยชน์มากขึ้น นี่คือเจตนา ในขณะที่รุ่น RF สามารถค้นหาสัญญาณในคุณสมบัติทั้งสองที่ไม่มีการแปลง แต่นักวิเคราะห์จะต้องเจาะจงมากขึ้นเพื่อให้ได้ผลลัพธ์ที่เป็นประโยชน์ในทำนองเดียวกันใน GLM บางทีนั่นก็เพียงพอแล้วสำหรับ OP: การค้นหาชุดการแปลงที่มีประโยชน์สำหรับ 2 คุณสมบัตินั้นง่ายกว่า 12 แต่ประเด็นของฉันคือแม้ว่าการแปลงจะให้รูปแบบเชิงเส้นที่มีประโยชน์ความสำคัญของคุณลักษณะ RF จะไม่แนะนำการเปลี่ยนแปลงด้วยตนเอง
คำตอบโดย @Sycorax นั้นยอดเยี่ยมมาก นอกเหนือจากแง่มุมที่อธิบายอย่างครบถ้วนของปัญหาที่เกี่ยวข้องกับโมเดลพอดีแล้วยังมีอีกเหตุผลหนึ่งที่ไม่ต้องดำเนินกระบวนการหลายขั้นตอนเช่นการใช้งานป่าสุ่ม, เชือกหรือตาข่ายยืดหยุ่นเพื่อ "เรียนรู้" ซึ่งมีคุณสมบัติในการป้อนการถดถอยแบบดั้งเดิม การถดถอยสามัญจะไม่ทราบเกี่ยวกับการปรับไหมที่ถูกต้องไปในระหว่างการพัฒนาของป่าสุ่มหรือวิธีการอื่น ๆ และจะพอดีกับผลกระทบ unpenalized ที่ไม่ดีลำเอียงที่จะปรากฏแรงเกินไปในการทำนายYสิ่งนี้จะไม่แตกต่างจากการรันการเลือกตัวแปรแบบขั้นตอนและรายงานรุ่นสุดท้ายโดยไม่คำนึงว่ามันมาถึงอย่างไร
ฟอเรสต์แบบสุ่มที่ดำเนินการอย่างถูกต้องนำไปใช้กับปัญหาที่เป็น "ฟอเรสต์แบบสุ่มที่เหมาะสม" มากกว่าสามารถใช้เป็นตัวกรองเพื่อลบเสียงรบกวนและทำให้ผลลัพธ์ที่มีประโยชน์มากขึ้นเป็นอินพุตสำหรับเครื่องมือวิเคราะห์อื่น ๆ
ปฏิเสธความรับผิดชอบ:
ฉันต้องมอบ "เสียงตะโกน" ให้กับ "เสียงแหลม" ของฉันที่สร้าง "แมงมุม" ( ลิงค์ ) ปัญหาตัวอย่างของพวกเขาแจ้งวิธีการของฉัน ( ลิงค์ ) ฉันรักตัวประเมินของ Theil-Sen และหวังว่าฉันจะมอบอุปกรณ์ประกอบฉากให้ Theil และ Sen
คำตอบของฉันไม่ได้เกี่ยวกับวิธีการทำผิด แต่เกี่ยวกับวิธีการทำงานถ้าคุณได้รับส่วนใหญ่ถูกต้อง ในขณะที่ฉันใช้เสียง "เล็กน้อย" ฉันต้องการให้คุณคิดถึงเสียงที่ "ไม่สำคัญ" หรือ "มีโครงสร้าง"
หนึ่งในจุดแข็งของป่าสุ่มคือความดีของปัญหามิติสูง ฉันไม่สามารถแสดงคอลัมน์ 20k (หรือที่รู้จักในพื้นที่มิติ 20k) ในลักษณะที่ดูสะอาดตา ไม่ใช่เรื่องง่าย อย่างไรก็ตามหากคุณมีปัญหา 20k มิติป่าสุ่มอาจเป็นเครื่องมือที่ดีที่มีเมื่อคนอื่น ๆ ส่วนใหญ่แบนบน "ใบหน้า" ของพวกเขา
นี่เป็นตัวอย่างของการลบสัญญาณรบกวนออกจากสัญญาณโดยใช้ฟอเรสต์แบบสุ่ม
#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))
ให้ฉันอธิบายสิ่งที่เกิดขึ้นที่นี่ ภาพด้านล่างนี้แสดงข้อมูลการฝึกอบรมสำหรับชั้นเรียน "1" คลาส "2" เป็นแบบสุ่มทั่วโดเมนและช่วงเดียวกัน คุณจะเห็นว่า "ข้อมูล" ของ "1" ส่วนใหญ่เป็นเกลียว แต่เกิดความเสียหายกับเนื้อหาจาก "2" มี 33% ของข้อมูลของคุณเสียหายอาจเป็นปัญหาสำหรับเครื่องมือปรับแต่งมากมาย Theil-Sen เริ่มลดลงประมาณ 29% ( ลิงก์ )
ตอนนี้เราแยกข้อมูลออกมาโดยมีความคิดว่าเสียงรบกวนคืออะไร
#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")
นี่คือผลการกระชับ:
ฉันชอบสิ่งนี้เพราะสามารถแสดงทั้งจุดแข็งและจุดอ่อนของวิธีการที่เหมาะสมในการแก้ไขปัญหาอย่างหนักในเวลาเดียวกัน หากคุณดูใกล้ศูนย์กลางคุณจะเห็นว่ามีการกรองน้อยลงอย่างไร ข้อมูลเชิงเรขาคณิตมีขนาดเล็กและป่าที่ขาดหายไปนั้น มันบอกอะไรบางอย่างเกี่ยวกับจำนวนโหนดจำนวนต้นไม้และความหนาแน่นของตัวอย่างสำหรับชั้น 2 นอกจากนี้ยังมี "ช่องว่าง" ใกล้ (-50, -50) และ "เครื่องบิน" ในหลาย ๆ สถานที่ อย่างไรก็ตามโดยทั่วไปการกรองนั้นเหมาะสม
เปรียบเทียบกับ SVM
นี่คือรหัสที่อนุญาตให้ทำการเปรียบเทียบกับ 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))
มันส่งผลให้ภาพดังต่อไปนี้
นี่เป็น SVM ที่เหมาะสม สีเทาคือโดเมนที่เกี่ยวข้องกับคลาส "1" โดย SVM จุดสีฟ้าเป็นตัวอย่างที่เกี่ยวข้องกับคลาส "1" โดย RF ตัวกรองที่ใช้คลื่นความถี่วิทยุทำงานเปรียบเทียบกับ SVM ได้โดยไม่ต้องมีหลักเกณฑ์ที่กำหนดไว้อย่างชัดเจน จะเห็นได้ว่า "ข้อมูลแน่น" ใกล้ศูนย์กลางของเกลียวนั้น "RF" แน่นมากขึ้น นอกจากนี้ยังมี "เกาะ" ไปยัง "หาง" ที่ RF พบการเชื่อมโยงที่ SVM ไม่ได้
ฉันเพลิดเพลิน โดยไม่ต้องมีพื้นหลังฉันได้ทำสิ่งหนึ่งสิ่งแรกเริ่มโดยผู้มีส่วนร่วมที่ดีมากในสนาม ผู้แต่งดั้งเดิมใช้ "การแจกจ่ายอ้างอิง" ( ลิงค์ , ลิงค์ )
แก้ไข:
ใช้ FOREST แบบสุ่มกับโมเดลนี้:
ในขณะที่ผู้ใช้ 777 มีความคิดที่ดีเกี่ยวกับรถเข็นที่เป็นองค์ประกอบของฟอเรสต์แบบสุ่มสถานที่ตั้งของฟอเรสต์แบบสุ่มคือ "การรวมกลุ่มของผู้เรียนที่อ่อนแอ" รถเข็นเป็นผู้เรียนที่อ่อนแอ แต่ไม่มีอะไรอยู่ใกล้กับ "วงดนตรี" "วงดนตรี" แม้ว่าในป่าสุ่มมีจุดประสงค์ "ในขีด จำกัด ของกลุ่มตัวอย่างจำนวนมาก" คำตอบของ user777 ใน scatterplot นั้นใช้อย่างน้อย 500 ตัวอย่างและนั่นบอกบางอย่างเกี่ยวกับความสามารถในการอ่านของมนุษย์และขนาดตัวอย่างในกรณีนี้ ระบบภาพของมนุษย์ (ตัวเองเป็นกลุ่มของผู้เรียน) เป็นเซ็นเซอร์และตัวประมวลผลข้อมูลที่น่าทึ่งและพบว่าค่านั้นเพียงพอสำหรับการประมวลผลที่ง่ายดาย
หากเราใช้การตั้งค่าเริ่มต้นแม้ในเครื่องมือสุ่มฟอเรสต์เราสามารถสังเกตพฤติกรรมของข้อผิดพลาดการจำแนกเพิ่มขึ้นสำหรับต้นไม้หลายต้นแรกและไม่ถึงระดับต้นไม้ต้นเดียวจนกว่าจะมีต้นไม้ประมาณ 10 ต้น ข้อผิดพลาดเริ่มแรกเพิ่มการลดข้อผิดพลาดจะมีเสถียรภาพประมาณ 60 ต้น โดยความมั่นคงฉันหมายถึง
x <- cbind(x1, x2)
plot(rf,type="b",ylim=c(0,0.06))
grid()
หากแทนที่จะดูที่ "ผู้เรียนขั้นต่ำที่อ่อนแอ" เรามองไปที่ "วงดนตรีที่อ่อนแอขั้นต่ำ" ซึ่งแนะนำโดยการแก้ปัญหาแบบสั้นมากสำหรับการตั้งค่าเริ่มต้นของเครื่องมือผลลัพธ์ที่ได้ค่อนข้างแตกต่างกัน
หมายเหตุฉันใช้ "เส้น" เพื่อวาดวงกลมระบุขอบเหนือการประมาณ คุณจะเห็นว่ามันไม่สมบูรณ์ แต่ดีกว่าคุณภาพของผู้เรียนเพียงคนเดียว
ตัวอย่างดั้งเดิมมีตัวอย่าง 88 "ภายใน" หากขนาดตัวอย่างเพิ่มขึ้น (อนุญาตให้ใช้วงดนตรีทั้งหมด) คุณภาพของการประมาณก็จะดีขึ้นเช่นกัน จำนวนผู้เรียนที่เท่ากันกับ 20,000 ตัวอย่างทำให้มีขนาดพอดีดีขึ้นอย่างน่าทึ่ง
ข้อมูลอินพุตคุณภาพสูงกว่ามากช่วยให้สามารถประเมินจำนวนต้นไม้ที่เหมาะสม การตรวจสอบการบรรจบกันแสดงให้เห็นว่าต้นไม้ 20 ต้นเป็นจำนวนขั้นต่ำที่เพียงพอในกรณีนี้เพื่อแสดงถึงข้อมูลที่ดี