Lojistik regresyon katsayılarının standart hatalarını hesaplama


18

Lojistik regresyonu eğitmek ve test etmek için Python'un scikit-learn'u kullanıyorum.

scikit-learn, regresyonun bağımsız değişkenlerin katsayılarını döndürür, ancak katsayıların standart hatalarını sağlamaz. Her katsayı için Wald istatistiği hesaplamak ve bu katsayıları birbirleriyle karşılaştırmak için bu standart hatalara ihtiyacım var.

Bir lojistik regresyon katsayıları için standart hataların nasıl hesaplanacağına dair bir açıklama buldum ( burada ), ancak takip edilmesi biraz zor.

Bu standart hataların nasıl hesaplanacağına dair basit ve kısa bir açıklama biliyorsanız ve / veya bana bir tane verebilirseniz, gerçekten takdir ediyorum! (Ama lütfen yararlı olabilir herhangi bir kod göndermek için çekinmeyin) belirli bir kod demek değil, daha ziyade ilgili adımlar algoritmik bir açıklama.


1
Standart hataları almak için Python kodunu mu, yoksa SE'lerin nasıl hesaplanacağını (matematiksel / algoritmik olarak) istiyor musunuz? Birincisi, bu Q CV için konu dışı olacaktır ( yardım merkezimize bakın ), ancak Yığın Taşması ile ilgili konu üzerinde olabilir . İkincisi, burada konu üzerinde olacaktır (ancak herhangi bir kod önerisi alamayabilirsiniz). Bunu netleştirmek için lütfen Q'nuzu düzenleyin. Eğer eski ise, sizin için SO'ya taşıyabiliriz ( lütfen çapraz gönderi yapmayın ).
gung - Monica'yı eski

1
Teşekkürler, Gung. Buraya kasten gönderdim çünkü ikincisini bekliyorum, ancak açıklığa kavuşturmak için düzenleyeceğim. Bu yazılımı kullanan birinin bana özel ipuçları verebilmesi durumunda Python'da scikit-learn ile çalıştığımı belirtmiştim.
Gyan Veda

Merhaba @GyanVeda, şimdi aynı sorunla karşı karşıyayım, son çözümün nedir lütfen?
zyxue

Yanıtlar:


12

Yazılımınız size bir parametre kovaryans (veya varyans-kovaryans) matrisi veriyor mu? Eğer öyleyse, standart hatalar bu matrisin köşegeninin kare köküdür. Muhtemelen doğrusal ve genelleştirilmiş doğrusal modeller için matrisini nasıl alacağınıza dair bir ders kitabına (veya üniversite ders notları için google'a) bakmak istersiniz .Vβ


1
Genelleştirilmiş doğrusal model durumu için çevrimiçi bir şey bulamadım (belki doğru arama terimlerini bilmiyorum?). Yardım?
Kevin H. Lin

3
İşte birkaç dakika çalıştıktan sonra bulduğum. Benim tavsiyem ilk önce parametre varyansının temel doğrusal modelde nasıl hesaplandığını anlamaktır. Bunu aldıktan sonra, GLM'lerin uzantısı daha kolaydır. Aynı şekilde, nasıl hesaplanacağını bilmek ve bir yazılım paketine nasıl alacağınızı bilmek aynı şey değildir. www.sagepub.com/upm-data/21121_Chapter_15.pdf
generic_user

18

Model katsayılarının standart hataları, kovaryans matrisinin köşegen girişlerinin kare kökleridir. Aşağıdakileri göz önünde bulundur:

  • Tasarım matrisi:

, x i , j, değeridir j i için th belirleyicisiX = [1x1,1x1,p1x2,1x2,p1xn,1xn,p]xi,jji gözlemler .

(NOT: Bu, kesişen bir model olduğunu varsayar.)

  • , burada π i , gözlem i için sınıf üyeliği tahmini olasılığını temsil eder.V = [π^1(1π^1)000π^2(1π^2)000π^n(1π^n)]π^ii

Kovaryans matrisi şu şekilde yazılabilir:

(XTVX)1

Bu, aşağıdaki kodla uygulanabilir:

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)

Tüm söylenenler, statsmodelsbir çok "kutudan çıktığı" tanılamaya erişmek istiyorsanız, muhtemelen daha iyi bir paket olacaktır.


2
Bellek sorunlarını önlemek ve tekil matris durumunu hesaba katmak için kodunuzu aşağıdaki şekilde güncelleyebilirsiniz -V = np.product(predProbs, axis=1); covLogit = np.linalg.pinv(np.dot(X_design.T * V), X_design)
steadyfish

6

Çıkarım yapmakla ilgileniyorsanız, muhtemelen istatistik modellerine bir göz atmak isteyeceksiniz . Standart hatalar ve yaygın istatistiksel testler mevcuttur. İşte lojistik regresyon örneği .


Tavsiye için teşekkürler! İstatistik modellerine bakacağım. Scikit-learn'ın bu tür bir çıktı sağlamaması çok kötü.
Gyan Veda

1
Evet. Genellikle (sık kullanılan) hipotez testleri için araçlar sağlamak, makine öğrenme tipi araç kutularının amacı değildir. İstatistik modellerinde iyi çalışmayan ancak scikit-learn'da çalışan veri boyutu kısıtlamalarıyla karşılaşırsanız, github'da bunları duymak isterim.
jseabold

@jseabold Bununla birlikte, lojistik regresyonda bazı özel özellik öneme sahip olmak istiyorsanız, standart hatalarını düşünmeden etki boyutlarını (katsayıları) okuyamazsınız. Bu nedenle, sık sık bir test yapmasanız ve sadece efekt boyutları ve sağlamlığı hakkında bir gösterge isteseniz bile, sklearn varyans eksikliği eksikliği zordur.
ely
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.