R'de değişken / özellik seçimi yapmak için çapraz doğrulamayı kullanmanın bir yolu var mı?


10

Kesmek istediğim yaklaşık 70 değişkenli bir veri setim var. Ne yapmak istiyorum CV aşağıdaki şekilde en yararlı değişkenleri bulmak için kullanın.

1) Rastgele 20 değişkenini seçin.

2) En önemli değişkenleri seçmek için stepwise/ LASSO/ lars/ etc kullanın.

3) ~ 50x tekrarlayın ve en sık hangi değişkenlerin seçildiğini (elimine edilmediğini) görün.

Bu, a'nın ne randomForestyapacağının çizgileri boyunca , ancak rfVarSelpaket sadece faktörler / sınıflandırma için çalışıyor gibi görünüyor ve sürekli bağımlı bir değişkeni tahmin etmem gerekiyor.

Herhangi bir öneri orada ideal uygulanacak böylece R kullanıyorum.


Tüm özellikler önemli mi? Kaç örnek var? Sorunu doğru bir şekilde anlarsam, artırmanın bazı varyantlarını yapmaya çalışabilirsiniz - tekrar tekrar örneklerin alt kümesini seçin ve tüm değişkenleri bunlara uydurun ve hangilerinin daha sık pop-up olduğunu görün.
Ofelia

1
Prosedürünüzün R'deki uygulamaları (örn. Glmnet ve cezalandırılmış) varsayılan olarak "en uygun" düzenlenme parametresini bulmak için çapraz doğrulama uygulayan LASSO üzerinde gelişme olasılığı düşük olduğunu düşünüyorum. Düşünebileceğiniz bir şey, potansiyel olarak büyük çapraz doğrulama varyasyonu (tekrarlanan CV) ile başa çıkmak için LASSO aramasını bu parametre için birkaç kez tekrarlamaktır. Tabii ki, hiçbir algoritma konuya özgü ön bilginizi yenemez.
miura

Yanıtlar:


9

Açıkladığınız şeyin caretpakette zaten uygulandığına inanıyorum . Bak rfeburada fonksiyon ya skeç: http://cran.r-project.org/web/packages/caret/vignettes/caretSelection.pdf

Şimdi, bunu söyledikten sonra, özellik sayısını neden azaltmanız gerekiyor? 70'den 20'ye gerçekte bir büyüklük azalması sırası değil. Önceden sağlam ve daha önce bazı özelliklerin gerçekten önemli olmadığına inanmadan önce 70'ten fazla özelliğe ihtiyacınız olacağını düşünürüm. Ama sonra tekrar, sanırım öznel bir önceliğin devreye girdiği yer burası.


5

Değişken seçim sıklığının, ilk modeldeki değişkenlerin görünür öneminden henüz alamadığınız bilgileri sağlamasının bir nedeni yoktur. Bu aslında başlangıçtaki istatistiksel önemin bir tekrarlamasıdır. ayrıca seçim sıklığı için bir kesime karar vermeye çalışırken yeni bir keyfilik düzeyi ekliyorsunuz. Değişken seçiminin yeniden örneklenmesi, diğer sorunlara ek olarak, eşdoğrusallıktan çok zarar görmüştür.


2

Cevabımı bugün erken saatlerde gözden geçirdim. Şimdi kod çalıştırmak için bazı örnek veriler oluşturduk. Diğerleri haklı olarak kabul ettiğim caret paketini aramanızı önerdi. Ancak bazı durumlarda kendi kodunuzu yazmanız gerekebilir. Aşağıda, çapraz doğrulama katlamalarına rasgele gözlemler atamak için R'deki sample () işlevinin nasıl kullanılacağını göstermeye çalıştım. Ayrıca, on eğitim setinde değişken ön seçim (0.1 lenient p değeri kesimi ile tek değişken doğrusal regresyon kullanarak) ve model oluşturma (kademeli regresyon kullanarak) gerçekleştirmek için döngüler için de kullanıyorum. Daha sonra, sonuç modellerini doğrulama katlarına uygulamak için kendi kodunuzu yazabilirsiniz. Bu yardımcı olur umarım!

################################################################################
## 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.
################################################################################

Çapraz doğrulama yapmadan önce, doğru kullanımını okumanız önemlidir. Bu iki referans mükemmel bir çapraz geçerlilik tartışması sunmaktadır:

  1. Simon RM, Subramanian J, Li MC, Menezes S. Hayatta kalma riski sınıflandırıcılarının yüksek boyutlu verilere dayanarak tahmini doğruluğunu değerlendirmek için çapraz doğrulamayı kullanma. Kısa Biyoinform. 2011 Mayıs; 12 (3): 203-14. EPUB 2011 Şubat 15. http://bib.oxfordjournals.org/content/12/3/203.long
  2. Richard Simon, Michael D. Radmacher, Kevin Dobbin ve Lisa M. McShane. Tanısal ve Prognostik Sınıflandırma için DNA Mikroarray Verilerinin Kullanımındaki Tuzaklar. JNCI J Natl Kanser Inst (2003) 95 (1): 14-18. http://jnci.oxfordjournals.org/content/95/1/14.long

Bu makaleler biyoistatistlere yöneliktir, ancak herkes için yararlı olacaktır.

Ayrıca, aşamalı regresyon kullanmanın tehlikeli olduğunu da unutmayın (çapraz doğrulamanın kullanılması aşırı takılmayı hafifletmeye yardımcı olmalıdır). Kademeli regresyon hakkında iyi bir tartışma burada bulunabilir: http://www.stata.com/support/faqs/stat/stepwise.html .

Başka sorunuz varsa bize bildirin!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.