ロジスティック回帰の係数の標準誤差を計算する方法


18

Pythonのscikit-learnを使用して、ロジスティック回帰のトレーニングとテストを行っています。

scikit-learnは、独立変数の回帰係数を返しますが、係数の標準誤差は提供しません。各係数のWald統計を計算し、それらの係数を相互に比較するには、これらの標準誤差が必要です。

ロジスティック回帰の係数の標準誤差を計算する方法の1つの説明を見つけました(ここ)が、従うのはやや困難です。

これらの標準エラーを計算する方法の簡単な簡潔な説明を知っている場合、および/またはそれを私に提供できる場合は、本当に感謝しています!特定のコードを意味するわけではありませんが(役立つコードは自由に投稿してください)、むしろ手順のアルゴリズム的な説明です。


1
Pythonコードに標準エラーを取得するように求めていますか、それともSEを(数学的に/アルゴリズム的に)計算して自分で実行できるようにしていますか?前者の場合、このQはCVのトピック外ですが(ヘルプセンターを参照)、Stack Overflowのトピック上である可能性があります。後者の場合は、ここで話題になります(ただし、コードの提案が得られない場合があります)。これを明確にするためにQを編集してください。前者の場合は、SOに移行できます(ただし、クロスポストしないでください)。
GUNG -復活モニカ

1
ありがとう、Gung。私は後者を期待しているので、ここに意図的に投稿しましたが、明確にするために編集します。このソフトウェアを使用する誰かが私に特定のヒントを提供できるように、私はPythonでscikit-learnを使用していると述べました。
ギャンヴェーダ

こんにちは@GyanVeda、私は今、同じ問題に直面しています、あなたの最終的な解決策は何ですか?
zyxue

回答:


12

ソフトウェアはパラメーター共分散(または分散共分散)行列を提供しますか?その場合、標準誤差はその行列の対角の平方根です。おそらく、教科書に相談(または大学の講義ノートのためのgoogle)を取得する方法のためにしたい線形および一般化線形モデルのための行列を。Vβ


1
一般化線形モデルの場合、オンラインで何かを見つけることができませんでした(適切な検索用語がわからないかもしれません)。助けて?
ケビンH.リン14

3
グーグルで数分後に見つけたものです。私のアドバイスは、基本的な線形モデルでパラメーターの分散がどのように計算されるかを最初に理解することです。それが得られたら、GLMの拡張は簡単です。それと同じように、それを計算する方法を知っていることと、ソフトウェアパッケージでそれを取得する方法を知っていることは同じことではありません。www.sagepub.com/upm-data/21121_Chapter_15.pdf
generic_user

18

モデル係数の標準誤差は、共分散行列の対角要素の平方根です。以下を考慮してください。

  • 設計マトリックス:

X iはjはの値であり、 J i番目の観測値の予測子。X = [1x1,1x1,p1x2,1x2,p1xn,1xn,p]xi,jji

(注:これは、インターセプトのあるモデルを想定しています。)

  • ここでπ私は、観測のためのクラスメンバーシップの予測確率を表す私をV = [π^1(1π^1)000π^2(1π^2)000π^n(1π^n)]π^ii

共分散行列は次のように記述できます。

(XTVX)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を見てみたいと思うでしょう。標準エラーと一般的な統計テストが利用可能です。ロジスティック回帰の例を次に示します。


推薦してくれてありがとう!statsmodelsを調べます。scikit-learnがこの種の出力を提供しないのは残念です。
ギャンヴェーダ14年

1
うん。(頻繁な)仮説検定のためのツールを提供することは、通常、機械学習型のツールボックスの目標ではありません。statsmodelsではうまく機能せず、scikit-learnでは機能するデータサイズの制約に遭遇した場合、githubでそれらについて聞いてみたいと思います。
jseabold 14年

@jseaboldただし、ロジスティック回帰における特徴の重要性のアドホックな概念を取得したい場合は、標準誤差を考慮せずにエフェクトサイズ(係数)を読み取ることはできません。そのため、頻繁なテストを行わず、エフェクトのサイズと堅牢性の指標を必要とする場合でも、スケルンの分散出力不足は困難です。
エリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.