Glmnet Vignette
Trevor Hastie and Junyang Qian
Stanford September 13, 2016
Introduction
Installation
Quick Start
Linear Regression
Logistic Regression
Poisson Models
Cox Models
Sparse Matrices
Appendix 0: Convergence Criteria
Appendix 1: Internal Parameters
Appendix 2: Comparison with other Packages
Installation
Quick Start
Linear Regression
Logistic Regression
Poisson Models
Cox Models
Sparse Matrices
Appendix 0: Convergence Criteria
Appendix 1: Internal Parameters
Appendix 2: Comparison with other Packages
소개(Introduction)
Glmnet은 패널티 최대 우도(penalized maximum likelihood)를 통해서 일반화 선형 모델(generalized linear model)을 적합하는 패키지이다. 정규화 경로는 정규화 변수 람다(lambda)로 그리드 값에 라소(lasso, 올가미) 또는 탄력 벌칙(elasticnet penalty)로 계산된다. 알고리즘은 극도로 빠르고, 그리고 입력 메트릭 x에 희소성을 활용할 수 있다. 그것은 선형, 로지스틱 그리고 다항, 포아송, 그리고 Cox 회귀 모델을 적합한다. 다양한 예측은 적합 모델에서 만들어 질 수 있다. 그것은 또한 다중-응답 선형 회귀를 적합할 수 있다.
glmnet의 저자는 제롬 프리드먼(Jerome Friedman), 트레버 해이스티(Trevor Hastie), 로버트 팁시라니(Rob Tibshirani) 그리고 노아 시몬(Noah Simon) 이다 그리고 R 패키지는 트레버 해이스티가 관리한다. glmnet의 매틀랩(matlab) 버전은 주니양 키안(Junyang Qian)이 관리한다. 이 비네트는 R에서 glmnet의 사용을 설명한다.
glmnet은 따라오는 문제를 해결했다
전체 범위를 포괄화는 λ의 그리드 값에서. 여기서 ℓ(y, η)는 관측 i에서 음의 로그-우도 분포(negative log-likelihood contribution)이다; e.g. 가우시안(Gaussian)의 경우에 그것은 ½ (y − η)2. 탄력-순 패널티(elastic-net penalty) α로 통제한다. 그리고 lasso(올가미) ( = 1, the default) 과 ridge(산등성이) ( = 0)의 차이를 연결한다. 조정 변수 λ는 패널티(penalty)의 전체 강도를 통제한다.
그것은 lasso가 그들 중 하나을 선택하고 다른 나머지를 버리는 경향이 있지만 ridge 불이익(penalty)은 서로를 향해 상관 예측자의 계수를 축소한다고 알려지 있다. 탄력적-순 불이익(elastic-net penalty)는 이런 두개를 혼합한다; 만약 예측자가 그룹에서 상관이면, α = 0.5는 함께 그룹에 포함 또는 배제를 선택하는 경향이 있다. 이것은 고 수준 변수이다. 그리고 사용자는 선행 값을 선택할 것이다, 또는 약간의 다른 값을 가지는 실험치. α의 사용은 수치적 안정성에 있다, ε > 0 인 어떤 작은 값을 위한 α = 1 - ε을 가지는 탄력-순(elastic net)은 lasso을 더 많이 선호하여 수행한다, 그러나 어떤 퇴화(degeneracies)와 극단의 상관으로 유발되는 엉뚱한 행동을 제거한다.
glmnet 알고리즘은 순환 좌표 강하(cyclical coordinate descent)를 사용한다, 다른 변수는 고정된 각 변수에서 목적 함수를 성공적으로 최적화함, 그리고 수렴할 때까지 반복적으로 순환한다. 패키지는 또한 활성 집합의 요과적인 제약을 위해 강한 규칙을 사용하여 만들 수 있다. 고 효율 갱신 그리고 warm starts와 active-set convergence(수렴) 같은 기술로, 우리의 알고리즘은 매우 빠르게 해결 경로를 계산할 수 있다.
코드는 희귀 입력-메트릭(sparse input-matrix) 포멧을 처리할 수 있다, 뿐만 아니라 계수의 범위 제약. glmnet의 코어는 포트란 서브루틴의 집합이다, 매우 빠른 실행을 위해 만듬.
패키지는 또한 예측 그리고 플로팅(plotting), 그리고 K-fold 교차 검증을 수행하는 함수를 위한 메서드를 포함한다.
설치 (Installation)
다른 많은 R 패키지 처럼, glmnet을 얻기 위한 단순한 방법은 그것을 CRAN에서 직접 설치한다, R 콘솔에서 다음의 명령어를 작성하라:
install.packages("glmnet", repos = "http://cran.us.r-project.org")
사용자는 그들의 위치 또는 선호로 repos 옵션을 변경할 것이다. 패키지를 설치하기위한 디렉토리 같은 다른 옵션은 명령에서 변경할 수 있다. 더 상세한 사항은, help(install.packages)을 보라.
여기에 R 패키지는 다운로드 되고 그리고 기본 디렉토리에 설치된다.
대안으로, 사용자는 http://cran.r-project.org/web/packages/glmnet/index.html 에서 패키지 소스를 다운로드할 수 있다 그리고 그것을 요구하는 위치에 설치하기 위해 Unix 명령을 작성한다.
Quick Start
이 절에서는 사용자에게 패키지에 일반적인 의미를 제공한다, 구성 요소를 포함, 그들로 무엇을 하고 그리고 기본 사용. 우리는 중요 함수로 간략하게 진행한다, 기본 동작을 보고 그리고 출력에서 확인을 한다. 사용자는 함수로 무엇이 가능한지 이 절 후에 더 좋은 아이디어를 가질 것이다, 선택하기 위한 하나, 또는 적어도 도움을 찾기 위한 곳. 더 세부 사항은 다음 절에서 주어진다.
첫번째로, 우리는 glmnet 패키지를 적재한다:
library(glmnet) ## Loading required package: Matrix ## Loading required package: foreach ## Loaded glmnet 2.0-7
이 패키지에 사용된 기본 모델은 가우시안 선형 모델(Guassian linear model) 또는 "최소 제곱(least squares)" 이다, 우리는 이 절에서 설명함. 우리는 설명을 위해 미리 생성된 데이터의 집합을 적재한다. 사용자는 그들 자신의 데이터를 적재하거나 또는 워크스페이스에 저장된 것들을 사용할 수 있다.
data(QuickStartExample)
명령어는 R 데이터 저장소에 저장된 것에서 입력 메트릭 x와 응답 벡터 y를 적재한다.
우리는 가장 기본으로 사용하는 모델을 glmnet을 호출하여 적합한다.
fit = glmnet(x, y)
"fit"은 나중에 사용하기 위해 적합 모델의 모든 관련 정보를 가지는 클래스 glmnet의 객체이다. 우리는 사용자가 직접 요소를 추출하도록 권장하지 않는다. 대신에, 다양한 메서드는 우리가 더 우아하게 이런 작업을 실행 가능하게 하는 plot, print, coef 그리고 predict 같은 잭체를 위해 제공된다.
우리는 plot 함수를 실행하여 계수를 시각화할 수 있다:
plot(fit)
각 곡선은 변수에 해당한다. 그것은 λ 변화로 전체 계수 벡터의 ℓ1-norm에 대해 그것의 계수의 경로를 보여준다. 위의 축은 현재 λ에서 0이 아닌 계수의 수를 가리킨다, lasso에서 효과 자유도(effective degrees of freedom) (df). 사용자는 아마도 곡선에 표기를 원할 것이다; 이것은 plot 명령어에 label = TRUE를 설정하여 할 수 있다.
각 단계에서 glmnet 경로의 요약은 만약 우리가 객체 이름 또는 print 함수를 사용한다면 보여진다:
print(fit) ## ## Call: glmnet(x = x, y = y) ## ## Df %Dev Lambda ## [1,] 0 0.00000 1.631000 ## [2,] 2 0.05528 1.486000 ## [3,] 2 0.14590 1.354000 ## [4,] 2 0.22110 1.234000 ## [5,] 2 0.28360 1.124000 ## [6,] 2 0.33540 1.024000 ## [7,] 4 0.39040 0.933200 ## [8,] 5 0.45600 0.850300 ## [9,] 5 0.51540 0.774700 ## [10,] 6 0.57350 0.705900 ## [11,] 6 0.62550 0.643200 ## [12,] 6 0.66870 0.586100 ## [13,] 6 0.70460 0.534000 ## [14,] 6 0.73440 0.486600 ## [15,] 7 0.76210 0.443300 ## [16,] 7 0.78570 0.404000 ## [17,] 7 0.80530 0.368100 ## [18,] 7 0.82150 0.335400 ## [19,] 7 0.83500 0.305600 ## [20,] 7 0.84620 0.278400 ## [21,] 7 0.85550 0.253700 ## [22,] 7 0.86330 0.231200 ## [23,] 8 0.87060 0.210600 ## [24,] 8 0.87690 0.191900 ## [25,] 8 0.88210 0.174900 ## [26,] 8 0.88650 0.159300 ## [27,] 8 0.89010 0.145200 ## [28,] 8 0.89310 0.132300 ## [29,] 8 0.89560 0.120500 ## [30,] 8 0.89760 0.109800 ## [31,] 9 0.89940 0.100100 ## [32,] 9 0.90100 0.091170 ## [33,] 9 0.90230 0.083070 ## [34,] 9 0.90340 0.075690 ## [35,] 10 0.90430 0.068970 ## [36,] 11 0.90530 0.062840 ## [37,] 11 0.90620 0.057260 ## [38,] 12 0.90700 0.052170 ## [39,] 15 0.90780 0.047540 ## [40,] 16 0.90860 0.043310 ## [41,] 16 0.90930 0.039470 ## [42,] 16 0.90980 0.035960 ## [43,] 17 0.91030 0.032770 ## [44,] 17 0.91070 0.029850 ## [45,] 18 0.91110 0.027200 ## [46,] 18 0.91140 0.024790 ## [47,] 19 0.91170 0.022580 ## [48,] 19 0.91200 0.020580 ## [49,] 19 0.91220 0.018750 ## [50,] 19 0.91240 0.017080 ## [51,] 19 0.91250 0.015570 ## [52,] 19 0.91260 0.014180 ## [53,] 19 0.91270 0.012920 ## [54,] 19 0.91280 0.011780 ## [55,] 19 0.91290 0.010730 ## [56,] 19 0.91290 0.009776 ## [57,] 19 0.91300 0.008908 ## [58,] 19 0.91300 0.008116 ## [59,] 19 0.91310 0.007395 ## [60,] 19 0.91310 0.006738 ## [61,] 19 0.91310 0.006140 ## [62,] 20 0.91310 0.005594 ## [63,] 20 0.91310 0.005097 ## [64,] 20 0.91310 0.004644 ## [65,] 20 0.91320 0.004232 ## [66,] 20 0.91320 0.003856 ## [67,] 20 0.91320 0.003513
그것은 0이 아닌 계수의 수(Df), 설명 (null) 편차의 백분율(%dev) 그리고 λ(Lambda)의 값을 왼쪽에서 오른쪽으로 보여진다. 비록 기본 glmnet으로 lambda의 100개 값을 위해 호출했지만 프로그램은 만약 %dev% 하나의 람다에서 다음으로 충분히 변화하지 않는다면 더 읽찍 멈춘다(전형적으로 경로의 거의 마지막에).
우리는 연속적인 범위 안에서 하나 또는 더 많은 λ의 실제 계수를 얻을 수 있다
coef(fit,s=0.1) ## 21 x 1 sparse Matrix of class "dgCMatrix" ## 1 ## (Intercept) 0.150928072 ## V1 1.320597195 ## V2 . ## V3 0.675110234 ## V4 . ## V5 -0.817411518 ## V6 0.521436671 ## V7 0.004829335 ## V8 0.319415917 ## V9 . ## V10 . ## V11 0.142498519 ## V12 . ## V13 . ## V14 -1.059978702 ## V15 . ## V16 . ## V17 . ## V18 . ## V19 . ## V20 -1.021873704
(왜 s이고 그리고 lambda가 아닌가? 나중의 경우에 우리가 다른 방법에서 모델 크기를 지정하도록 허락하기를 원한다.) 사용자는 또한 새로운 입력 데이터를 가지고 지정된 λ에서 예측을 만들 수 있다:
nx = matrix(rnorm(10*20),10,20) predict(fit,newx=nx,s=c(0.1,0.05)) ## 1 2 ## [1,] -2.9711660 -3.02789573 ## [2,] -0.1289952 -0.05492672 ## [3,] 4.5982719 4.86504579 ## [4,] 0.4800248 0.60627416 ## [5,] -3.0982791 -3.28262363 ## [6,] -2.3301500 -2.43007690 ## [7,] -3.4844096 -3.65984899 ## [8,] 1.3959784 1.32479350 ## [9,] -1.7620186 -1.82509972 ## [10,] 1.5227165 1.51418778
함수 glmnet은 사용자 선택으로 연속적인 모델을 반환한다. 많은 경우에, 사용자는 아마도 소프트웨어가 그들 중 하나를 선택하기를 선호할 것이다. 교차-검증이 아마 그 작업에서 단순하고 가장 넓게 사용되는 방법이다.
cv.glmnet은 여기서 교차-검증을 수행하는 주요 함수이다, 플로팅(plotting)이나 예측과 같은 다양한 지원 메서드를 가짐. 우리는 여전히 이전에 적재된 단순한 데이터를 활용한다.
cvfit = cv.glmnet(x, y)
cv.glmnet은 cv.glmnet 객체를 반환한다, 여기서는 cvfit, 교차-검증 적합의 모든 성분(ingredients)을 가지는 목록. glmnet에서 처럼, 우리는 사용자가 λ의 선택된 값을 보는 것을 제외하고 직접적으로 요소를 추출하는 것을 권장하지 않는다. 이 패키지는 잠재적인 작업을 위해 잘-설계된 함수를 제공한다.
우리는 객체를 그릴 수 있다
plot(cvfit)
그것은 교차-검증 곡선를 가진다(빨간 점 선), 그리고 λ의 연속을 따라 상한과 하한의 표준 편차 곡전 (error bars). 2개의 선택된 λ는 수직의 점 선으로 나타낸다 (아래를 보라).
우리는 선택된 λ와 상응하는 계수를 볼 수 있다. 예로,
cvfit$lambda.min ## [1] 0.08307327
lambda.min은 최소 평균 교차-검증 에러를 가지는 λ의 값이다. 저장된 다른 λ는 lambda.1se 이다, 에러가 1인 최소 표준에러 안에 있는 최고의 정규화 모델을 가짐. 그것을 보기 위해, 우리는 단지 위의 lambda.1se을 가지고 lambda.min 대체할 필요가 있다.
coef(cvfit, s = "lambda.min") ## 21 x 1 sparse Matrix of class "dgCMatrix" ## 1 ## (Intercept) 0.14936467 ## V1 1.32975267 ## V2 . ## V3 0.69096092 ## V4 . ## V5 -0.83122558 ## V6 0.53669611 ## V7 0.02005438 ## V8 0.33193760 ## V9 . ## V10 . ## V11 0.16239419 ## V12 . ## V13 . ## V14 -1.07081121 ## V15 . ## V16 . ## V17 . ## V18 . ## V19 . ## V20 -1.04340741
계수는 희귀 메트릭 형식(sparse matrix format)으로 표현된다는 점에 주의하라. 이유는 정규화 경로를 따라 해결책이 드문드문 있다, 그리고 그러므로 그것은 희귀 형식을 사용함으로써 시간과 공간에서 더 효율적이다. 만약 당신이 비-희귀 형식을 선호하면, as.matrix()를 통해서 출력을 연결해라.
예측은 적합된 cv.glmnet 객체를 기반으로 생성할 수 있다. 장난스런 예를 보자.
predict(cvfit, newx = x[1:5,], s = "lambda.min") ## 1 ## [1,] -1.3647490 ## [2,] 2.5686013 ## [3,] 0.5705879 ## [4,] 1.9682289 ## [5,] 1.4964211
newx는 새로은 입력 메트릭을 위함이다 그리고 s는, 이전 처럼, 예측에서 만들어진 λ의 값이다.
그것은 glmnet 101 이 마지막이다. 지금까지 소개된 툴을 가지고, 사용자는 완전한 탄력적-순 군(entire elastic net family)을 적합할 수 있다, 제곱-에러 손실(squared-error loss) 사용. 이 패키지에서, 사용자 상당한 유연성을 제공하는 더 많은 옵션이 있다. 더 배우기 위해, 다음 절로 이동해라.
댓글 없음:
댓글 쓰기