2017-04-24 1 views
1

J'ai essayé de créer une fonction Randomized Lasso dans R mais cela ne semble pas générer les mêmes résultats que la fonction lasso aléatoire Python sklearn. J'applique la même philosophie ici mais je ne pouvais pas comprendre la différence. Le code a été modifié basé sur ce code: randomized lasso function in R.lasso randomisé dans R

Voici les données de code et de l'échantillon:

# generate synthetic data 
set.seed(100) 
size = 750 
x = matrix(runif(14*size),ncol=14) 
y = 10 * sin(pi*X[,1]*X[,2]) + 20*(X[,3]-0.5)**2 + 10*X[,4] + 5*X[,5] + runif(1,0,1) 
nbootstrap = 200 
nsteps = 20 
alpha = 0.2 

dimx <- dim(x) 
n <- dimx[1] 
p <- dimx[2] 
halfsize <- as.integer(n/2) 
freq <- matrix(0,1,p) 

for (i in seq(nbootstrap)) { 

    # Randomly reweight each variable 
    xs <- t(t(x)*runif(p,alpha,1)) 

    # Ramdomly split the sample in two sets 
    perm <- sample(dimx[1]) 
    i1 <- perm[1:halfsize] 
    i2 <- perm[(halfsize+1):n] 

    # run the randomized lasso on each sample and check which variables are selected 
    cv_lasso <- lars::cv.lars(xs[i1,],y[i1],plot.it=FALSE, mode = 'step') 
    idx <- which.max(cv_lasso$cv - cv_lasso$cv.error <= min(cv_lasso$cv)) 
    coef.lasso <- coef(lars::lars(xs[i1,],y[i1]))[idx,] 
    freq <- freq + abs(sign(coef.lasso)) 

    cv_lasso <- lars::cv.lars(xs[i2,],y[i2],plot.it=FALSE, mode = 'step') 
    idx <- which.max(cv_lasso$cv - cv_lasso$cv.error <= min(cv_lasso$cv)) 
    coef.lasso <- coef(lars::lars(xs[i1,],y[i1]))[idx,] 
    freq <- freq + abs(sign(coef.lasso)) 
    print(freq) 
} 

# normalize frequence in [0,1] 
freq <- freq/(2*nbootstrap) 

Les résultats devraient être comparables à semblables aux résultats présentés dans ce tableau (stabilité) stability in python. Cependant, cette approche et l'émission de code R d'origine dans la première référence de lien hypertexte n'a pas trouvé les caractéristiques corrélées X11 à X14. Je ne sais pas quelle partie ne fonctionne pas correctement dans mon code R.

+0

Bien sûr. Lira la ligne directrice pour les questions futures. –

Répondre

3

D'abord, merci de poster cette question. J'ai aimé apprendre à choisir la stabilité tout en regardant votre code et vos références. Deuxièmement, vous vous frapperez probablement quand vous verrez cette réponse. Je pense que votre code est valide mais vous avez oublié de créer les caractéristiques fortement corrélées du "jeu de données de régression Friedamn # 1". Le code python de votre deuxième lien est le suivant:

#"Friedamn #1” regression problem 
Y = (10 * np.sin(np.pi*X[:,0]*X[:,1]) + 20*(X[:,2] - .5)**2 + 
    10*X[:,3] + 5*X[:,4] + np.random.normal(0,1)) 
#Add 3 additional correlated variables (correlated with X1-X3) 
X[:,10:] = X[:,:4] + np.random.normal(0, .025, (size,4)) 

Votre code n'inclut pas la deuxième étape. Par conséquent, toutes les fonctionnalités sauf le premier sont du bruit et sont exclues correctement de votre algorithme de sélection de stabilité.

+0

C'est génial. Tu as sauvé ma journée. Je me donne des coups de pied maintenant. –