Cập nhật sự phù hợp của Lasso với những quan sát mới


12

Tôi đang điều chỉnh hồi quy tuyến tính được chuẩn hóa L1 cho một tập dữ liệu rất lớn (với n >> p.) Các biến được biết trước, nhưng các quan sát đến trong các đoạn nhỏ. Tôi muốn duy trì sự phù hợp của Lasso sau mỗi đoạn.

Tôi rõ ràng có thể lắp lại toàn bộ mô hình sau khi nhìn thấy từng bộ quan sát mới. Điều này, tuy nhiên, sẽ không hiệu quả nếu có rất nhiều dữ liệu. Số lượng mới dữ liệu đến ở mỗi bước là rất nhỏ và sự phù hợp không có khả năng thay đổi nhiều giữa các bước.

Có bất cứ điều gì tôi có thể làm để giảm gánh nặng tính toán tổng thể?

Tôi đã xem xét thuật toán LARS của Efron và cộng sự, nhưng sẽ rất vui khi xem xét bất kỳ phương pháp phù hợp nào khác nếu nó có thể được thực hiện để "khởi động ấm" theo cách được mô tả ở trên.

Ghi chú:

  1. Tôi chủ yếu tìm kiếm một thuật toán, nhưng con trỏ đến các gói phần mềm hiện có có thể làm điều này cũng có thể chứng minh sâu sắc.
  2. Ngoài các quỹ đạo Lasso hiện tại, thuật toán tất nhiên được hoan nghênh để giữ trạng thái khác.

Bradley Efron, Trevor Hastie, Iain Johnstone và Robert Tibshirani, Least Angle Regression , Annals of Statistics (with thảo luận) (2004) 32 (2), 407--499.

Câu trả lời:


7

Lasso được trang bị thông qua LARS (một quá trình lặp lại, bắt đầu từ một số ước tính ban đầu ). Theo mặc định β 0 = 0 p nhưng bạn có thể thay đổi điều này trong hầu hết các thực hiện (và thay thế nó bằng cách tối ưu β * o l d bạn đã có). Gần nhất β * o l dbeta * n e w , nhỏ hơn số lượng LARS lặp bạn sẽ phải bước để có được beta * n e w .β0β0=0pβoldβoldβnewβnew

BIÊN TẬP:

Do các ý kiến ​​từ user2763361tôi thêm chi tiết cho câu trả lời ban đầu của tôi.

Từ các bình luận bên dưới, tôi tập hợp rằng user2763361 gợi ý để bổ sung cho câu trả lời ban đầu của tôi để biến nó thành câu trả lời có thể được sử dụng trực tiếp (ngoài giá) trong khi cũng rất hiệu quả.

Để làm phần đầu tiên, tôi sẽ minh họa giải pháp tôi đề xuất từng bước trên một ví dụ về đồ chơi. Để đáp ứng phần thứ hai, tôi sẽ làm như vậy bằng cách sử dụng một bộ giải điểm nội thất chất lượng cao gần đây. Điều này là do, dễ dàng hơn để có được triển khai hiệu suất cao cho giải pháp mà tôi đề xuất bằng cách sử dụng thư viện có thể giải quyết vấn đề Lasso bằng cách tiếp cận điểm bên trong thay vì cố gắng hack thuật toán LARS hoặc Simplex để bắt đầu tối ưu hóa từ một phi điểm bắt đầu tiêu chuẩn (mặc dù địa điểm thứ hai cũng có thể).

Lưu ý rằng đôi khi người ta khẳng định (trong các sách cũ) rằng cách tiếp cận điểm bên trong để giải các chương trình tuyến tính chậm hơn so với cách tiếp cận đơn giản và điều đó có thể đúng trong một thời gian dài nhưng ngày nay nó không đúng và chắc chắn không đúng với các vấn đề quy mô lớn (đây là lý do tại sao hầu hết các thư viện chuyên nghiệp thích cplex sử dụng thuật toán điểm bên trong) và câu hỏi ít nhất là ngầm về các vấn đề quy mô lớn. Cũng lưu ý rằng bộ giải điểm bên trong tôi sử dụng xử lý đầy đủ các ma trận thưa thớt nên tôi không nghĩ sẽ có một khoảng cách hiệu suất lớn với LARS (một động lực ban đầu để sử dụng LARS là nhiều bộ giải LP phổ biến tại thời điểm đó không xử lý tốt các ma trận thưa thớt và đây là một tính năng đặc trưng của vấn đề LASSO).

Một triển khai mã nguồn mở rất tốt của thuật toán điểm bên trong là ipopttrong COIN-ORthư viện. Một lý do khác tôi sẽ sử dụng ipoptlà nó có giao diện R ipoptr,. Bạn sẽ tìm thấy hướng dẫn cài đặt đầy đủ hơn ở đây , bên dưới tôi đưa ra các lệnh tiêu chuẩn để cài đặt nó trongubuntu .

trong bash, làm:

sudo apt-get install gcc g++ gfortran subversion patch wget
svn co https://projects.coin-or.org/svn/Ipopt/stable/3.11 CoinIpopt
cd ~/CoinIpopt
./configure
make 
make install

Sau đó, với quyền root, in Rdo (tôi giả sử svnđã sao chép tệp subversion ~/theo mặc định):

install.packages("~/CoinIpopt/Ipopt/contrib/RInterface",repos=NULL,type="source")

Từ đây, tôi đưa ra một ví dụ nhỏ (chủ yếu là từ ví dụ đồ chơi do Jelmer Ypma như một phần của mình Rwraper đến ipopt):

library('ipoptr')
# Experiment parameters.
lambda <- 1                                # Level of L1 regularization.
n      <- 100                              # Number of training examples.
e      <- 1                                # Std. dev. in noise of outputs.
beta   <- c( 0, 0, 2, -4, 0, 0, -1, 3 )    # "True" regression coefficients.
# Set the random number generator seed.
ranseed <- 7
set.seed( ranseed )
# CREATE DATA SET.
# Generate the input vectors from the standard normal, and generate the
# responses from the regression with some additional noise. The variable 
# "beta" is the set of true regression coefficients.
m     <- length(beta)                           # Number of features.
A     <- matrix( rnorm(n*m), nrow=n, ncol=m )   # The n x m matrix of examples.
noise <- rnorm(n, sd=e)                         # Noise in outputs.
y     <- A %*% beta + noise                     # The outputs.
# DEFINE LASSO FUNCTIONS
# m, lambda, y, A are all defined in the ipoptr_environment
eval_f <- function(x) {
    # separate x in two parts
    w <- x[  1:m ]          # parameters
    u <- x[ (m+1):(2*m) ]

    return( sum( (y - A %*% w)^2 )/2 + lambda*sum(u) )
}
# ------------------------------------------------------------------
eval_grad_f <- function(x) {
    w <- x[ 1:m ]
    return( c( -t(A) %*% (y - A %*% w),  
               rep(lambda,m) ) )
}
# ------------------------------------------------------------------
eval_g <- function(x) {
    # separate x in two parts
    w <- x[  1:m ]          # parameters
    u <- x[ (m+1):(2*m) ]
    return( c( w + u, u - w ) )
}
eval_jac_g <- function(x) {
    # return a vector of 1 and minus 1, since those are the values of the non-zero elements
    return( c( rep( 1, 2*m ), rep( c(-1,1), m ) ) )
}
# ------------------------------------------------------------------
# rename lambda so it doesn't cause confusion with lambda in auxdata
eval_h <- function( x, obj_factor, hessian_lambda ) {
    H <- t(A) %*% A
    H <- unlist( lapply( 1:m, function(i) { H[i,1:i] } ) )
    return( obj_factor * H )
}
eval_h_structure <- c( lapply( 1:m, function(x) { return( c(1:x) ) } ),
                       lapply( 1:m, function(x) { return( c() ) } ) )
# The starting point.
x0 = c( rep(0, m), 
        rep(1, m) )
# The constraint functions are bounded from below by zero.
constraint_lb = rep(   0, 2*m )
constraint_ub = rep( Inf, 2*m )
ipoptr_opts <- list( "jac_d_constant"   = 'yes',
                     "hessian_constant" = 'yes',
                     "mu_strategy"      = 'adaptive',
                     "max_iter"         = 100,
                     "tol"              = 1e-8 )
# Set up the auxiliary data.
auxdata <- new.env()
auxdata$m <- m
    auxdata$A <- A
auxdata$y <- y
    auxdata$lambda <- lambda
# COMPUTE SOLUTION WITH IPOPT.
# Compute the L1-regularized maximum likelihood estimator.
print( ipoptr( x0=x0, 
               eval_f=eval_f, 
               eval_grad_f=eval_grad_f, 
               eval_g=eval_g, 
               eval_jac_g=eval_jac_g,
               eval_jac_g_structure=eval_jac_g_structure,
               constraint_lb=constraint_lb, 
               constraint_ub=constraint_ub,
               eval_h=eval_h,
               eval_h_structure=eval_h_structure,
               opts=ipoptr_opts,
               ipoptr_environment=auxdata ) )

Quan điểm của tôi là, nếu bạn có dữ liệu mới, bạn chỉ cần

  1. cập nhật ( không thay thế) ma trận ràng buộc và vectơ hàm mục tiêu để giải thích cho các quan sát mới.
  2. thay đổi điểm bắt đầu của điểm bên trong từ

    x0 = c (rep (0, m), rep (1, m))

    βnewβoldβinitx0

|βinitβnew|1>|βnewβold|1(1)

βnewβoldβinitnp

Đối với các điều kiện theo đó bất đẳng thức (1) giữ, chúng là:

  • λ|βOLS|1pn
  • khi các quan sát mới không có ảnh hưởng bệnh lý, ví dụ như khi chúng phù hợp với quy trình ngẫu nhiên đã tạo ra dữ liệu hiện có.
  • khi kích thước của bản cập nhật nhỏ so với kích thước của dữ liệu hiện có.

p+1ββ00p

@aix: bạn có muốn cập nhật toàn bộ đường dẫn Lasso hay chỉ là giải pháp? (tức là hình phạt thưa được cố định?).
user603

λ
β^tôimộtSSo= =argminβ{12ΣTôi= =1N(yTôi-β0-Σj= =1pxTôijβj)2+λΣj= =1p|βj|}
NPE

@aix. Có, tất cả phụ thuộc vào việc triển khai bạn sử dụng và các phương tiện bạn có quyền truy cập. Ví dụ: nếu bạn có quyền truy cập vào một bộ giải lp tốt, bạn có thể cung cấp nó với các giá trị tối ưu trước đây củaβvà nó sẽ thực hiện bước 1-2 cho giải pháp mới rất hiệu quả. Bạn nên thêm những chi tiết này vào câu hỏi của bạn.
dùng603

1
Bất kỳ thư viện nào bạn biết có thể làm điều này mà không cần chỉnh sửa mã nguồn?
dùng2763361
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.