Что не так с этой реализацией лассо регрессии в R? - PullRequest
3 голосов
/ 20 сентября 2019

Я пытаюсь с нуля закодировать функцию, которая оценивает коэффициенты регрессии, используя LASSO с координированным спуском (Gauss-Seidel) и мягким порогом.

Мой код следующий:

library(MASS)
set.seed(1)
n = 200
p = 200
V = matrix(0.2, p, p)
diag(V) = 1
X = as.matrix(mvrnorm(n, mu = rep(0, p), Sigma = V))
y = X[, 1] + 0.5*X[, 2] + 0.25*X[, 3] + rnorm(n)
X = scale(X)
y = scale(y)

soft_th <- function(b, lambda){
  if (b > lambda){
    return (b - lambda)
  }
  else if (b < -lambda){
    return(b + lambda)
  }
  else {
    return (0)
  }
}

myLasso <- function(X,y, lambda=0.3,tol=1e-5,maxitr=100){
  beta_old <- rep(0,p)
  beta_new <- rep(0,p)
  for(i in 1:maxitr){
    beta_old <- beta_new
    for (j in (1:ncol(X)))
      {
      X_j <- X[,j]
      y_pred <- t(X)%*%beta_old
      rho <- t(X_j)%*%(y - y_pred + beta_old[j]*X_j)
      beta_new[j] <- soft_th(rho,0.7)
    }

    l1 <- sum(abs(beta_old-beta_new))
    print(l1)
    r <-  y - t(X)%*%beta_old

    if (l1<tol){
      print('Convergence reached')
      break
  }
  }

}
myLasso(X,y)

Проблема, с которой я столкнулся, заключается в том, что норма L1 между beta_old и beta_new увеличивается (много!) Между каждой итерацией.Я следую тому, что сказано в этом посте:

https://stats.stackexchange.com/questions/123672/coordinate-descent-soft-thresholding-update-operator-for-lasso/351134#351134

Я думаю, что в некоторой степени я не правильно реализую правило обновления спуска.

Любая помощь будетбыть оцененнымЗаранее спасибо.

1 Ответ

0 голосов
/ 20 сентября 2019

Я проводил дополнительные исследования, и, похоже, я не нормализовал X-матрицу.После добавления X <- X / norm (X, type = '2') после определения X проблема решена. </p>

Теперь у меня возникла новая проблема - эта новая функция не копирует результатыGlmnet реализация регрессии LASSO.Что бы это могло быть?Я получил RMSE 0,6 с glmnet и 0,997 с моей реализацией.Я был бы рад, если бы кто-нибудь помог мне улучшить мои функции.

Заранее спасибо.

...