교차 검증을 사용하여 glmnet 패키지의 편차 측정에 대한 정확한 정의?


12

현재 reseach의 경우 이항 종속 변수에 대해 R의 glmnet 패키지를 통해 Lasso 방법을 사용하고 있습니다.

glmnet에서 최적의 람다는 교차 검증을 통해 발견되며 결과 모델은 다양한 분류법 (예 : 오 분류 오류 또는 편차)과 비교할 수 있습니다.

내 질문 : 이탈은 glmnet에서 정확히 어떻게 정의됩니까? 어떻게 계산 되나요?

(Friedman 등의 해당 논문 "좌표 하강을 통한 일반 선형 모형의 정규화 경로"에서 나는 cv.glmnet에 사용 된 이탈에 대한이 주석 만 발견합니다. 데이터) "(페이지. 17)).


그것은 사용 된 이탈과 동일합니다 glm(또는 적어도 알아야합니다-이탈에 대한 정의는 하나뿐입니다).
Hong Ooi

예, 그러나 첫 번째 게시물에 인용 된대로 어떤 식 으로든 확장한다고 생각합니다. 내가 이해하는 편차는 두 모델의 성능을 비교할 수 있지만 저자는 교차 검증의 왼쪽 데이터를 어떻게 포함합니까? "왼쪽 데이터에 대한 로그 가능성의 두 배 빼기"는 어떤 의미가 있습니까?
Jo Wmann

1
좋아, 고마워, 이제 나는 그것을 얻었다 고 생각한다 : 이탈은 -2 * log-likelihood 또는 오히려 (2 * log-likelihood) / (null-model의 log-likelihood)로 정의된다. 또한 람다의 다른 값에 대한 이탈도 측정 값이 간격 0.2를 초과하지 않는 이유도 설명합니다. 이 모델은 교차 검증의 k-1 배에서 추정되며 나머지 배에 적용됩니다. 나머지 접기에 적용 할 경우 로그 우도 점수가 계산됩니다. 이것을 k 회 반복하고 상기 정의 된 이탈도 측정치의 각 람다에 대한 k 결과의 평균이 반환된다.
Jo Wmann

1
예, 항상 각 람다에 대한 모든 접기 평균입니다. 나는 당신이 이탈을 직접 사용할 수도 있고 비율 wrt 대 null 모델을 사용할 수 있다고 생각합니다. 함정에는 두 가지가 있습니다. a) 접기에는 정확히 같은 수의 데이터 포인트가 없을 수 있습니다. b) 각 접기에는 다른 데이터가 포함됩니다 (자연스럽게). 수정하려면 (a) 편차를 선택한 접기의 데이터 포인트 수로 간단히 나눌 수 있습니다. (a)와 (b)를 동시에 고정하려면 비율 접근법을 사용하십시오. 이탈 모델은 각 모델에서 데이터 세트가 동일하다고 가정합니다 (분모를 무시하는 경우 MAP 추정에서 동일한 아이디어).
Cagdas Ozgenc

1
그러나 일단 접힘이 그림에 들어가면 분모가 접힘에서 동일하지 않습니다. 따라서 비율은 분모를 취소하여이를 처리합니다. 그러나 나는 당신이 주름 이상 평균했을 때 이것이 얼마나 큰 문제인지는 모른다.
Cagdas Ozgenc

답변:


9

에서 프리드먼, Hastie 및 Tibshirani (2010) , 교차 검증의 목적으로 이항 모델의 일탈은, 같이 계산된다

왼쪽 데이터에서 로그 가능성의 두 배 빼기 (17 페이지)

문서가glmnet (2 및 5 페이지 의) 문서에 인용 된 용지 인 경우 패키지에 사용 된 공식 일 수 있습니다.

실제로 function의 소스 코드 cvlognet에서 응답의 이탈 잔차는 다음과 같이 계산됩니다.

-2*((y==2)*log(predmat)+(y==1)*log(1-predmat))

predmat단순히 어디에

predict(glmnet.object,x,lambda=lambda)

그리고 encolsing cv.glmnet함수 에서 전달되었습니다 . 나는 JStatSoft 페이지에서 사용할 수있는 소스 코드를 paper 에 사용했고 그 코드가 최신인지 모른다. 이 패키지의 코드는 놀랍도록 간단하고 읽기 쉽습니다. 당신은 항상 입력하여 자신을 확인할 수 있습니다 glmnet:::cv.glmnet.


1

@shadowtalker의 답변 외에도 glmnet 패키지를 사용할 때 교차 유효성 검사의 이탈이 어떻게 든 정상화되는 것처럼 느낍니다.

library(glmnet)
data(BinomialExample)

fit = cv.glmnet(x,y, family = c("binomial"), intercept = FALSE)
head(fit$cvm) # deviance from test samples at lambda value

# >[1] 1.383916 1.359782 1.324954 1.289653 1.255509 1.223706

# deviance from (test samples? all samples?) at lambda value
head(deviance(fit$glmnet.fit))

# >[1] 138.6294 134.5861 131.1912 127.1832 122.8676 119.1637

참조 : 이탈도 R 문서

내가 분할을하면

head(deviance(fit$glmnet.fit)) / length(y))

결과는

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

fit $ cvm에 매우 가깝습니다.

이것은 @Hong Ooi의 의견 이이 질문에 대해 말한 것입니다.

/programming/43468665/poisson-deviance-glmnet

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.