로지스틱 회귀 계수의 표준 오차를 계산하는 방법


18

파이썬의 scikit-learn을 사용하여 로지스틱 회귀를 훈련하고 테스트합니다.

scikit-learn은 독립 변수의 회귀 계수를 반환하지만 계수의 표준 오차는 제공하지 않습니다. 각 계수에 대한 Wald 통계량을 계산하고 이러한 계수를 서로 비교하려면 이러한 표준 오류가 필요합니다.

로지스틱 회귀 계수 ( here ) 의 표준 오차를 계산하는 방법에 대한 설명을 찾았 지만 따르기가 다소 어렵습니다.

이러한 표준 오류를 계산하는 방법에 대한 간단하고 간결한 설명을 알고 있거나 오류를 제공 할 수 있다면 정말 감사하겠습니다! 나는 특정 코드를 의미하지는 않지만 (유용한 코드를 자유롭게 게시하십시오) 오히려 관련된 단계에 대한 알고리즘 설명을 의미합니다.


1
표준 오류를 얻기 위해 Python 코드를 요청하거나 SE가 계산 (수학적 / 알고리즘 적으로)되어 직접 수행 할 수 있습니까? 전자의 경우이 Q는 CV에 대해 주제를 벗어 났지만 ( 도움말 센터 참조 ) Stack Overflow에 대해서는 주제 일 수 있습니다 . 후자의 경우 여기에서 주제가 될 것입니다 (그러나 코드 제안이 없을 수도 있습니다). 이를 명확히하려면 Q를 편집하십시오. 전자 인 경우이를 SO로 마이그레이션 할 수 있습니다 ( 하지만 교차 게시하지 마십시오 ).
— gung-복직 모니카

1
고마워요 나는 후자를 기대하기 때문에 의도적으로 여기에 게시했지만 명확히하기 위해 편집 할 것입니다. 이 소프트웨어를 사용하는 사람이 나에게 특정 팁을 줄 수있는 경우 scikit-learn으로 Python에서 작업하고 있다고 언급했습니다.
— Gyan Veda

안녕하세요 @ GyanVeda, 나는 지금 같은 문제에 직면하고 있습니다. 최종 해결책은 무엇입니까?
— zyxue

답변:


12

소프트웨어가 매개 변수 공분산 (또는 분산 공분산) 행렬을 제공합니까? 그렇다면 표준 오차는 해당 행렬의 대각선의 제곱근입니다. 선형 및 일반 선형 모델 의 행렬 을 얻는 방법에 대해서는 교과서 (또는 대학 강의 노트의 경우 Google)를 참조하십시오 .Vβ


1
일반화 된 선형 모델 사례에 대해 온라인에서 아무것도 찾을 수 없었습니다 (올바른 검색어를 모르십니까?). 도움?
— Kevin H. Lin

3
몇 분의 인터넷 검색 후 찾은 것이 있습니다. 내 조언은 먼저 기본 선형 모델에서 매개 변수 분산이 계산되는 방법을 이해하는 것입니다. 일단 그것을 얻으면 GLM으로의 확장이 더 쉽습니다. 계산 방법과 소프트웨어 패키지로 얻는 방법은 모두 다릅니다. www.sagepub.com/upm-data/21121_Chapter_15.pdf
— generic_user

18

모형 계수의 표준 오차는 공분산 행렬의 대각선 항목의 제곱근입니다. 다음을 고려하세요:

  • 디자인 매트릭스 :

x i , j j iX = [1엑스1,1…엑스1,피1엑스2,1…엑스2,피⋮⋮⋱⋮1엑스엔,1…엑스엔,피] 여기서 는 번째 관측치에 대한 번째 예측 변수 .엑스나는,제이제이나는

(참고 : 이것은 인터셉트가있는 모델을 가정합니다.)

  • π I 나는V = [π^1(1−π^1)0…00π^2(1−π^2)…0⋮⋮⋱⋮00…π^엔(1−π^엔)] , 관찰 클래스 멤버십의 예측 확률 나타내는 .π^나는나는

공분산 행렬은 다음과 같이 쓸 수 있습니다.

(엑스티V엑스)−1

다음 코드로 구현할 수 있습니다.

import numpy as np
from sklearn import linear_model

# Initiate logistic regression object
logit = linear_model.LogisticRegression()

# Fit model. Let X_train = matrix of predictors, y_train = matrix of variable.
# NOTE: Do not include a column for the intercept when fitting the model.
resLogit = logit.fit(X_train, y_train)

# Calculate matrix of predicted class probabilities.
# Check resLogit.classes_ to make sure that sklearn ordered your classes as expected
predProbs = resLogit.predict_proba(X_train)

# Design matrix -- add column of 1's at the beginning of your X_train matrix
X_design = np.hstack([np.ones((X_train.shape[0], 1)), X_train])

# Initiate matrix of 0's, fill diagonal with each predicted observation's variance
V = np.diagflat(np.product(predProbs, axis=1))

# Covariance matrix
# Note that the @-operater does matrix multiplication in Python 3.5+, so if you're running
# Python 3.5+, you can replace the covLogit-line below with the more readable:
# covLogit = np.linalg.inv(X_design.T @ V @ X_design)
covLogit = np.linalg.inv(np.dot(np.dot(X_design.T, V), X_design))
print("Covariance matrix: ", covLogit)

# Standard errors
print("Standard errors: ", np.sqrt(np.diag(covLogit)))

# Wald statistic (coefficient / s.e.) ^ 2
logitParams = np.insert(resLogit.coef_, 0, resLogit.intercept_)
print("Wald statistics: ", (logitParams / np.sqrt(np.diag(covLogit))) ** 2)

모든 statsmodels"즉석"진단에 액세스하려는 경우 더 나은 패키지가 될 것입니다.


2
메모리 문제를 피하고 단일 행렬의 경우를 설명하기 위해 다음과 같이 코드를 업데이트 할 수 있습니다.V = np.product(predProbs, axis=1); covLogit = np.linalg.pinv(np.dot(X_design.T * V), X_design)
— steadyfish

6

추론에 관심이 있다면 statsmodels를 살펴보고 싶을 것입니다 . 표준 오차 및 일반적인 통계 테스트가 가능합니다. 로지스틱 회귀 예제 입니다.


추천 해 주셔서 감사합니다! statsmodel을 살펴 보겠습니다. scikit-learn이 이러한 종류의 출력을 제공하지 않는다는 것이 너무 나쁩니다.
— Gyan Veda

1
네. 일반적으로 기계 학습 유형 도구 상자의 목표는 (자주적인) 가설 테스트를위한 도구를 제공하는 것이 아닙니다. statsmodels에서는 잘 작동하지 않지만 scikit-learn에서는 작동하는 데이터 크기 제약 조건이 발생하면 github에서 이에 대해 듣고 싶습니다.
— jseabold

@jseabold 그러나 로지스틱 회귀 분석에서 기능 중요도에 대한 임시 개념을 원한다면 표준 오류에 대한 생각없이 효과 크기 (계수)를 읽을 수 없습니다. 따라서 빈번한 테스트를 수행하지 않고 효과 크기와 견고성을 나타내는 표시를 원하더라도 분산 출력의 부족이 부족합니다.
— ely
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.