Closed3

【Python】ロジスティック回帰で限界効果を求める

hanatahanata

定義

導出は Pr(y_i=1|x_i)を偏微分してあげれば良い。
レコードiにおけるj番目の説明変数の限界効果は、ロジスティック関数f(x)を用いて以下のように表される。

\displaystyle MPE_{ij} = f( \mathrm X_i \mathrm{\beta} )(1-f( \mathrm X_i \mathrm{\beta} )) \beta_j

全体の限界効果を出すためには、このMPE_{ij}を算出したのち以下の2通りの方法がある。

  1. レコード単位で限界効果を算出してからレコード数で平均を取る
  2. 説明変数を平均してからMPE_{ij}の式に代入する
hanatahanata

実装

Pythonでロジスティック回帰を行う場合、 statsmodelsscikit-learn が候補に上がるだろう。
それぞれの場合で限界効果を算出するコードを書いてみた。
statsmodels では限界効果を算出するメソッドが実装されており非常に楽チンなので、限界効果を算出したい際は statsmodels を利用するのが良さそうである。

statsmodels

回帰の結果である statsmodels.discrete.discrete_model.LogitResults というクラスに get_margeff というメソッドが生えており、これを利用すれば良い。
https://www.statsmodels.org/devel/generated/statsmodels.discrete.discrete_model.LogitResults.get_margeff.html

import statsmodels.api as sm

model = sm.Logit(y, X)
res = model.fit()

# 限界効果に関するSummary
print(res.get_margeff(at='overall').summary())

scikit-learn

statsmodels のような便利メソッドはないので、自力で算出する必要がある。

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()
lr.fit(X, y)

y_pred = lr.predict_proba(X)[:, 1]

for i, col in enumerate(X.columns):
    # statsmodelsの at='overall' に相当
    ampe = (y_pred * (1 - y_pred) * lr.coef_[0][i]).mean()
    print(col, ampe)
このスクラップは4ヶ月前にクローズされました