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


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)000π^2(1π^2)000π^(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.