Có cách nào để sử dụng xác thực chéo để thực hiện lựa chọn biến / tính năng trong R không?


10

Tôi có một bộ dữ liệu với khoảng 70 biến mà tôi muốn cắt giảm. Những gì tôi đang làm là sử dụng CV để tìm hầu hết các biến hữu ích theo cách sau.

1) Chọn ngẫu nhiên nói 20 biến.

2) Sử dụng stepwise/ LASSO/ lars/ etc để chọn hầu hết các biến quan trọng.

3) Lặp lại ~ 50x và xem biến nào được chọn (không bị loại bỏ) thường xuyên nhất.

Điều này nằm dọc theo những gì a randomForestsẽ làm, nhưng rfVarSelgói dường như chỉ hoạt động cho các yếu tố / phân loại và tôi cần dự đoán một biến phụ thuộc liên tục.

Tôi đang sử dụng R vì vậy mọi đề xuất sẽ được thực hiện ở đó.


Có phải tất cả các tính năng quan trọng? Bạn có bao nhiêu mẫu? Nếu tôi hiểu chính xác vấn đề, bạn có thể thử thực hiện một số biến thể của việc tăng cường - liên tục chọn tập hợp con của mẫu và điều chỉnh tất cả các biến cho chúng và xem cái nào bật lên thường xuyên hơn.
Ofelia

1
Tôi nghĩ rằng quy trình của bạn không có khả năng cải thiện LASSO, việc triển khai trong R (ví dụ như glmnet và bị phạt) mặc định sử dụng xác thực chéo để tìm tham số chính quy "tối ưu". Một điều bạn có thể cân nhắc là lặp lại tìm kiếm LASSO cho tham số này nhiều lần để đối phó với phương sai xác thực chéo lớn (CV lặp lại). Tất nhiên, không có thuật toán nào có thể đánh bại kiến ​​thức chuyên môn trước đó của bạn.
miura

Câu trả lời:


9

Tôi tin rằng những gì bạn mô tả đã được thực hiện trong caretgói. Xem rfechức năng hoặc họa tiết ở đây: http://cran.r-project.org/web/packages/caret/vignettes/caretSelection.pdf

Bây giờ, đã nói rằng, tại sao bạn cần phải giảm số lượng các tính năng? Từ 70 đến 20 không thực sự là một mức giảm độ lớn. Tôi nghĩ rằng bạn cần nhiều hơn 70 tính năng trước khi bạn có một công ty trước đó tin rằng một số tính năng thực sự và thực sự không quan trọng. Nhưng sau đó, một lần nữa, đó là nơi mà trước đó tôi chủ quan đến.


5

Không có lý do tại sao tần số lựa chọn biến cung cấp bất kỳ thông tin nào mà bạn chưa nhận được từ tầm quan trọng rõ ràng của các biến trong mô hình ban đầu. Đây thực chất là một phát lại có ý nghĩa thống kê ban đầu. bạn cũng đang thêm một mức độ độc đoán mới khi cố gắng quyết định cắt giảm tần suất lựa chọn. Lấy mẫu lại lựa chọn biến bị hư hỏng nặng do cộng tuyến ngoài các vấn đề khác.


2

Tôi đã sửa đổi câu trả lời của tôi từ đầu ngày hôm nay. Bây giờ tôi đã tạo một số dữ liệu ví dụ để chạy mã. Những người khác đã đúng khi đề nghị bạn xem xét việc sử dụng gói caret mà tôi đồng ý. Tuy nhiên, trong một số trường hợp, bạn có thể thấy cần phải viết mã của riêng mình. Dưới đây tôi đã cố gắng chứng minh cách sử dụng hàm sample () trong R để gán ngẫu nhiên các quan sát cho các nếp gấp xác thực chéo. Tôi cũng sử dụng các vòng lặp để thực hiện lựa chọn trước biến (sử dụng hồi quy tuyến tính đơn biến với mức cắt giá trị p nhẹ nhàng là 0,1) và xây dựng mô hình (sử dụng hồi quy từng bước) trên mười tập huấn luyện. Sau đó, bạn có thể viết mã của riêng mình để áp dụng các mô hình kết quả cho các nếp gấp xác thực. Hi vọng điêu nay co ich!

################################################################################
## Load the MASS library, which contains the "stepAIC" function for performing
## stepwise regression, to be used later in this script
library(MASS)
################################################################################


################################################################################
## Generate example data, with 100 observations (rows), 70 variables (columns 1
## to 70), and a continuous dependent variable (column 71)
Data <- NULL
Data <- as.data.frame(Data)

for (i in 1:71) {
for (j in 1:100) {
Data[j,i]  <- rnorm(1) }}

names(Data)[71] <- "Dependent"
################################################################################


################################################################################
## Create ten folds for cross-validation. Each observation in your data will
## randomly be assigned to one of ten folds.
Data$Fold <- sample(c(rep(1:10,10)))

## Each fold will have the same number of observations assigned to it. You can
## double check this by typing the following:
table(Data$Fold)

## Note: If you were to have 105 observations instead of 100, you could instead
## write: Data$Fold <- sample(c(rep(1:10,10),rep(1:5,1)))
################################################################################


################################################################################
## I like to use a "for loop" for cross-validation. Here, prior to beginning my
## "for loop", I will define the variables I plan to use in it. You have to do
## this first or R will give you an error code.
fit <- NULL
stepw <- NULL
training <- NULL
testing <- NULL
Preselection <- NULL
Selected <- NULL
variables <- NULL
################################################################################


################################################################################
## Now we can begin the ten-fold cross validation. First, we open the "for loop"
for (CV in 1:10) {

## Now we define your training and testing folds. I like to store these data in
## a list, so at the end of the script, if I want to, I can go back and look at
## the observations in each individual fold
training[[CV]] <- Data[which(Data$Fold != CV),]
testing[[CV]]  <- Data[which(Data$Fold == CV),]

## We can preselect variables by analyzing each variable separately using
## univariate linear regression and then ranking them by p value. First we will
## define the container object to which we plan to output these data.
Preselection[[CV]] <- as.data.frame(Preselection[CV])

## Now we will run a separate linear regression for each of our 70 variables.
## We will store the variable name and the coefficient p value in our object
## called "Preselection".
for (i in 1:70) {
Preselection[[CV]][i,1]  <- i
Preselection[[CV]][i,2]  <- summary(lm(Dependent ~ training[[CV]][,i] , data = training[[CV]]))$coefficients[2,4]
}

## Now we will remove "i" and also we will name the columns of our new object.
rm(i)
names(Preselection[[CV]]) <- c("Variable", "pValue")

## Now we will make note of those variables whose p values were less than 0.1.
Selected[[CV]] <- Preselection[[CV]][which(Preselection[[CV]]$pValue <= 0.1),] ; row.names(Selected[[CV]]) <- NULL

## Fit a model using the pre-selected variables to the training fold
## First we must save the variable names as a character string
temp <- NULL
for (k in 1:(as.numeric(length(Selected[[CV]]$Variable)))) {
temp[k] <- paste("training[[CV]]$V",Selected[[CV]]$Variable[k]," + ",sep="")}
variables[[CV]] <- paste(temp, collapse = "")
variables[[CV]] <- substr(variables[[CV]],1,(nchar(variables[[CV]])-3))

## Now we can use this string as the independent variables list in our model
y <- training[[CV]][,"Dependent"]
form <- as.formula(paste("y ~", variables[[CV]]))

## We can build a model using all of the pre-selected variables
fit[[CV]] <- lm(form, training[[CV]])

## Then we can build new models using stepwise removal of these variables using
## the MASS package
stepw[[CV]] <- stepAIC(fit[[CV]], direction="both")

## End for loop
}

## Now you have your ten training and validation sets saved as training[[CV]]
## and testing[[CV]]. You also have results from your univariate pre-selection
## analyses saved as Preselection[[CV]]. Those variables that had p values less
## than 0.1 are saved in Selected[[CV]]. Models built using these variables are
## saved in fit[[CV]]. Reduced versions of these models (by stepwise selection)
## are saved in stepw[[CV]].

## Now you might consider using the predict.lm function from the stats package
## to apply your ten models to their corresponding validation folds. You then
## could look at the performance of the ten models and average their performance
## statistics together to get an overall idea of how well your data predict the
## outcome.
################################################################################

Trước khi thực hiện xác nhận chéo, điều quan trọng là bạn phải đọc về cách sử dụng hợp lý của nó. Hai tài liệu tham khảo này cung cấp các cuộc thảo luận tuyệt vời về xác nhận chéo:

  1. Simon RM, Subramanian J, Li MC, Menezes S. Sử dụng xác nhận chéo để đánh giá độ chính xác dự đoán của các phân loại rủi ro sống sót dựa trên dữ liệu chiều cao. Tóm tắt Bioinform. 2011 tháng 5; 12 (3): 203-14. Epub 2011 Feb 15. http://bib.oxfordjournals.org/content/12/3/203.long
  2. Richard Simon, Michael D. Radmacher, Kevin Dobbin và Lisa M. McShane. Cạm bẫy trong việc sử dụng dữ liệu DNA Microarray để phân loại chẩn đoán và tiên lượng. JNCI J Natl Ung thư Inst (2003) 95 (1): 14-18. http://jnci.oxfordjournals.org/content/95/1/14.long

Những bài báo này hướng tới các nhà sinh học, nhưng sẽ hữu ích cho bất cứ ai.

Ngoài ra, hãy luôn nhớ rằng sử dụng hồi quy từng bước là nguy hiểm (mặc dù sử dụng xác thực chéo sẽ giúp giảm bớt tình trạng thừa chất). Một cuộc thảo luận tốt về hồi quy từng bước có sẵn tại đây: http://www.stata.com/support/faqs/stat/stepwise.html .

Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nào!


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.