glmnet part 03 - Logistic Regression

Glmnet Vignette


Trevor Hastie and Junyang Qian
Stanford September 13, 2016

로지스틱 회귀 (Logistic Regression)

로지스틱 회귀(Logistic regression)는 응답이 범주형(categorical)일 때 또 하나 폭넓게 사용되는 모델이다. 만약 2개의 가능한 결과가 있다면, 우리는 이항 분포(binomial distribution)를 사용한다, 또는 우리는 다항(multinomial)을 사용한다.

이항 모델 (Binomial Models)

이항 모델에서, 응답 변수가 G = {1, 2}를 가진다고 가정하자. yi = I (gi = 1)로 나타낸다. 우리는 모델을 생성한다:
이는 따라오는 형식으로 쓸 수 있다
소위 "로지스틱(log-odds)" 또는 로그-오즈(log-odds, 로그-승산) 변환로 불림.
패널티 로지스틱 회귀(penalized logistic regression)에서 목적 함수는 음 이항 로그-우도(negative binomial log-likelihood)를 사용한다, 그리고
로지스틱 회귀는 p > N 일때 퇴화(degeneracies)로 종종 연결된다 그리고 N 이 p에 가까울 때 조차 엉뚱한 행동이 나타난다; 탄력적-순 패널티(elastic-net penalty)는 이 문제를 완화시킨다, 그리고 규칙화하고 그리고 게다가 변수를 선택한다.
우리의 알고리즘은 로그-우도에 이차 근사(quadratic approximation)를 사용한다, 그리고 패널티 가중치 최소-제곱 문제 결과에서 좌표는 강하된다. 이런것은 외부 그리고 내부 루프(loop)를 구성한다.
설명 목적으로, 우리는 데이터 파일에서 전-생성된 입력 행렬 x 그리고 응답 벡터 y를 적재한다.
data(BinomialExample)
입력 행렬 x는 다른 군에서와 같다. 이항 로지스틱 회귀에서, 응답 변수 y는 2개 수준을 가지는 펙터이거나 또는 셈(counts) 또는 비율(proportion)의 2-열 행렬이여야 한다.
이항 회귀에서 glmnet의 다른 옵션 인수는 Gaussian 군의 그것들과 거의 같다.
family 옵션을 "binomial"로 설정함을 잊지 마라.
fit = glmnet(x, y, family = "binomial")
이전 처럼, 우리는 적합 객체를 print 또는 plot할 수 있다, 지정된 λ에서 계수를 추출하고 그리고 또한 예측을 생성. 플롯팅에서, xvar와 label 같은 옵션 인수는 가우시안에서와 비슷하다. 우리는 설명 편차(deviance explained)에 대해 그린다 그리고 딱지(label)를 보여준다.
plot(fit, xvar = "dev", label = TRUE)
predict 함수는 가우시안과 로지스틱에서 약간 차이가 있다, 주로 옵션 type에서. "link" 그리고 "response"은 결코 동등하지 않는다 그리고 "분류(class)"는 오직 로지스틱 회귀에서 사용 가능하다. 요약에서, *"link"는 선형 예측자를 제공한다.
  • "response"는 적합 확률을 제공한다
  • "class"는 최대 확률에 해당하는 분류 라벨을 생성한다.
  • "coefficients"는 s의 값에서 계수를 계산한다
  • "nonzero"는 s의 값에서 0이 아닌 계수의 지시자의 목록을 반환한다.
"이항(binomial)" 모델에서, 응답 ("link", "response", "coefficients", "nonzero")은 단지 펙터 응답의 두번째 수준에 해당하는 분류를 반환한다.
따라오는 예에서, 우리는 λ = 0.05, 0.01에서 분류 딱지(label)의 예측을 생성한다.
predict(fit, newx = x[1:5,], type = "class", s = c(0.05, 0.01))

##      1   2
## [1,] "0" "0"
## [2,] "1" "1"
## [3,] "1" "1"
## [4,] "0" "0"
## [5,] "1" "1"
로지스틱 회귀에서, cv.glmnet는 가우시안에서 처럼 비슷한 인수와 사용법을 가진다. nfolds, weights, lambda, parallel는 사용자가 모두 사용 가능하다. type.measure에서 약간 다르다: "deviance" 그리고 "mse"는 둘 모두 평균 제곱 손실(mean squared loss)을 수행하지 않는다 그리고 "class"는 가능하다. 그러므로, "mse"는 제곱 손실(squared loss)을 사용한다.
  • "deviance"는 실제 편차이다.
  • "mae"는 평균 제곱 에러를 사용한다.
  • "class"는 오분류 에러를 제공한다.
  • "auc"는 (오직 2-분류 로지스틱 회귀에서) ROC 곡선 아래의 면적을 제공한다.
예로,
cvfit = cv.glmnet(x, y, family = "binomial", type.measure = "class")
그것은 10-배 교차 검증의 기준에서 오분류 에러를 이용한다.
우리는 객체를 그린다 그리고 λ의 최적 값을 보여준다.
plot(cvfit)
cvfit$lambda.min
## [1] 0.0147554

cvfit$lambda.1se
## [1] 0.02578548
coef 와 predict는 가우시안 경우와 비슷하다 그리고 우리는 상세를 뺐다. 우리는 약간의 예제로 검토한다.
coef(cvfit, s = "lambda.min")

## 31 x 1 sparse Matrix of class "dgCMatrix"
##                       1
## (Intercept)  0.24371065
## V1           0.06897051
## V2           0.66252343
## V3          -0.54275157
## V4          -1.13692797
## V5          -0.19143183
## V6          -0.95852340
## V7           .
## V8          -0.56528880
## V9           0.77454157
## V10         -1.45079395
## V11         -0.04363484
## V12         -0.06893736
## V13          .
## V14          .
## V15          .
## V16          0.36685293
## V17          .
## V18         -0.04013948
## V19          .
## V20          .
## V21          .
## V22          0.20882114
## V23          0.34014021
## V24          .
## V25          0.66310204
## V26         -0.33695819
## V27         -0.10570477
## V28          0.24317817
## V29         -0.22445233
## V30          0.11091002
이전에 다룬, 여기서 반환된 결과는 단지 펙터 응답의 두번째 수준이다.
predict(cvfit, newx = x[1:10,], s = "lambda.min", type = "class")

##       1
## [1,]  "0"
## [2,]  "1"
## [3,]  "1"
## [4,]  "0"
## [5,]  "1"
## [6,]  "0"
## [7,]  "0"
## [8,]  "0"
## [9,]  "1"
## [10,] "1"
다른 GLM과 비슷하게, glmnet은 "offset"을 허용한다. 이것은 선형 예측자에 추가되는 N 수가 고정된 벡터이다. 예로, 당신은 다른 변수를(그리고 데이터) 사용하여 어떤 다른 로지스틱 회귀를 적합할 것이다, 그리고 지금 당신은 만약 표현 변수에 어떤 것을 추가한다면 확인을 원할 것이다. 그래서 당신은 offset이 있는 다른 모델에서 예측 로짓(logit)을 사용한다.

다항 모델 (Multinomial Models)

다항 모델에서, 응답 변수 K는 수준 G = {1, 2, ..., K}를 가진다고 가정하라. 여기서 우리는 모델을 구축한다:
Y를 N × K 지시자 응답 행렬로 놓자, 요소 을 가짐. 그러면 탄력적-순 패널티 음의 로그-우도 함수는(elastic-net penalized negative log-likelihood function) 다음이 된다:
여기서 우리는 실제로 표기법을 남용한다! β는 계수가 p × K 행렬이다. βk는 k번째 열을 언급한다 (출력 범주 k), 그리고 βj는 j번째 행( 변수 j의 K 계수의 벡터). 최종 패널티 조건은 ||βj||q이다, 우리는 q의 2가지 옵션을 가진다: q ∈ {1,2}. q = 1 일 때, 이것은 각 변수에서 lasso 패널티이다. q = 2 일 때, 이것은 특별한 변수의 모든 K 계수에서 grouped-lasso 패널티이다, 그들 모두 함께 0 또는 0이 아님.
표준 뉴턴 알로기즘(standard Newton algorithm)은 여기서 지루하다. 대신에, 우리는 이른바 부분 이차 근사(partial quadratic approximation)를 로그-우도로 만드는 부분 뉴턴 알고리즘(partial Newton algorithm)을 사용한다, 단지 (β0k, βk)를 한번에 단일 분류로 변화를 허용. λ의 각 값에서, 우리는 먼저 k가 가리키는 모든 분류 전체를 순환한다, 현재 분류의 변수에 대해 매 번 부분 이차 근사를 계산. 그러면 내부 프로시저는 거의 이항 경우에서 처럼 같다. 이것은 lasso (q=1) 인 경우이다. q = 2일 때, 우리는 다른 접근을 사용한다, 우리는 여기에 연연하지 않음.
다항 경우에, 사용은 로지스틱 회귀와 비슷하다, 그리고 우리는 주로 예제로 설명한다 그리고 어떤 다름을 강조한다. 우리는 생성된 데이터의 집합을 적재한다.
data(MultinomialExample)
다항 로지스틱 회귀의 glmnet에서 옵션 인수는 몇 가지 경우만 제외하고 이항 회귀와 거의 비슷하다.
응답 변수는 nc >= 2 수준 펙터가 될 수 있다, 또는 셈 또는 비률의 nc-열 행렬. 내부적으로 glmnet은 이 행렬의 행의 합이 1이 되게 만들 것이다, 그리고 그 관측의 가중치로 총 량을 없앤다.
offset은 nobs x nc 행렬이 될 것이다 만약 1 이면.
다항 회귀에서 특별한 옵션은 type.multinomial이다, grouped lasso 패널티의 사용을 허용한다 만약 type.multinomial = "grouped" 이면. 이것은 변수에서 다항 계수가 모두 내부 또는 외부에 함께 있게 보장한다, 다중-응답 가우시안에서와 닮음.
fit = glmnet(x, y, family = "multinomial", type.multinomial = "grouped")
우리는 결과 객체 "적합(fit)"을 그린다.
plot(fit, xvar = "lambda", label = TRUE, type.coef = "2norm")
옵션은 xvar, label 그리고 type.coef이 있다, 게다가 다른 보통의 그래픽 인수.
xvar 와 label는 다른 군에서와 같다 하지만 type.coef는 오직 다항 회귀와 다중응답 가우시안 모델에서만 있다. 그것은 각 응답 변수에서 계수의 그림을 그리게 할 수 있다 만약 type.coef = "coef" 이거나 또는 만약 type.coef = "2norm" 이면 하나의 그림에서 l2-노름을 보여주는 그림.
우리는 또한 교차 검증을 수행하고 그리고 반환된 객체를 plot한다.
cvfit=cv.glmnet(x, y, family="multinomial", type.multinomial = "grouped", 
                parallel = TRUE)
plot(cvfit)
비록 type.multinomial는 cv.glmnet에서 전형적인 인수가 아니지만, 사실 glmnet에 전달할 수 있는 어떤 인수는 cv.glmnet의 인수 목록에 유효함을 주목하라. 우리는 또한 계산을 가속하기 위해 병렬 컴퓨팅을 사용한다.
predict(cvfit, newx = x[1:10,], s = "lambda.min", type = "class")

##       1
##  [1,] "3"
##  [2,] "2"
##  [3,] "2"
##  [4,] "1"
##  [5,] "1"
##  [6,] "3"
##  [7,] "3"
##  [8,] "1"
##  [9,] "1"
## [10,] "2"

댓글 없음:

댓글 쓰기