質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.35%

Pythonのstatsmodelsを用いたロジスティック回帰

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,551

IOError

score 25

とある分析において、pythonのstatsmodelsを用いてロジスティック回帰に挑戦しています。
最初はsklearnのlinear_modelを用いていたのですが、分析結果からp値や決定係数等の情報を確認することができませんでした。
そこで、statsmodelsに変更したところ、詳しい分析結果を確認することはできたのですが、以下の課題に直面しました。

【課題(目標)】
ロジスティック回帰の結果 (重み・切片・p値・モデルの精度) をそれぞれ取得したい

結果はsummary()で表示することはできるのですが、個々の情報を取得する方法がわかりませんでした。
ご存知の方、ご教授いただけないでしょうか。

以下に環境を記載します。
OS:macOS Sierra
Python:Python3.6.1

【現段階のコード (大まかな流れ)】

import statsmodels.formula.api as smf

# 変数の定義
X = 説明変数のデータ (pd.DataFrame型をas_matrixに変換)
Y = 被説明変数のデータ (pd.DataFrame型をas_matrixに変換)

# ロジスティック回帰
model = smf.Logit(Y,X)
result = model.fit()

# 結果を表示
print(result.summary())
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tiitoi

    2018/10/09 00:19

    sklearn.linear_model.LogisticRegression のほうを使うではダメでしょうか?

    キャンセル

  • IOError

    2018/10/09 00:23

    ご連絡ありがとうございます。おっしゃる通りsklearn.linear_model.LogisticRegressionも試しましたが、重み・切片・p値・モデルの精度を取得することはできるんですか?

    キャンセル

回答 2

checkベストアンサー

+2

こんな感じでよろしいでしょうか

# (省略)
model = smf.Logit(Y,X)
result = model.fit()
# 結果を表示
print(result.summary2())
# 回帰係数
print(result.params)
# 二乗誤差
print(result.bse)
# P値
print(result.pvalues)
# AIC
print(result.aic)
# BIC
print(result.bic)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/09 09:03

    ご回答いただきありがとうございます。
    回帰係数・誤差・P値のみならず、AIC・BICまでも教えていただきありがとうございます。
    そのように求めることができるのですね。

    一点申し上げると、上記コードにおいてモデルの精度はどこで判断するのでしょうか。
    statsmodelsの重回帰分析 (OLS()) では R-Squared がモデルの精度にあたると思うのですが、Logit() のsummaryの見方が十分に理解できていません。
    そのため、上記のコードでは精度を取得できていないように思われるのですが、いかがでしょうか。

    ご確認のほどよろしくお願いいたします。

    キャンセル

  • 2018/10/09 09:25

    おおっ!!大変失礼しました。
    一番重要な結果が抜けておりますね。

    # McFadden's pseudo-R-squared
    print(result.prsquared)

    が一般的にロジステック回帰の当てはまりを見る指標になります

    キャンセル

  • 2018/10/09 10:30

    度々すみません。

    いただいた McFaddenの疑似R-squared が、まさに私が必要としていた情報です。
    以前のものと合わせて、今回の分析に必要な情報を全て求めることができました。

    誠にありがとうございました。

    キャンセル

0

精度、重み、切片は取得できます。
sklearn では、p 値を計算する関数は用意されていないみたいです。

import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# IRIS データを取得する。
x, y = load_iris(return_X_y=True)
# 2クラス問題をやりたいのでラベル 0, 1 のみ取り出す
x = x[y <= 1]
y = y[y <= 1]

print(x.shape)  # (150, 4)
print(y.shape)  # (150,)

# 学習データ、テストデータに分割する。
x_train, x_test, y_train, y_test = \
    train_test_split(x, y, train_size=0.75)

#  学習する。
model = LogisticRegression(solver='lbfgs', multi_class='multinomial').fit(X, Y)
model.fit(x_train, y_train)

print('weight', model.coef_)  # 重み
print('intercept', model.intercept_ )  # 切片

accuracy = model.score(x_test, y_test)  # 精度
print('{:.2%}'.format(accuracy))  # 97.37%

別の方法としては、statsmodels の summary() でこれらの値を表示できているのであれば、内部的に値を保持しているはずなので、summary() の部分のソースコードを見ればわかりそうな気もします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/09 08:55

    ご回答いただきありがとうございます。
    重み・切片・精度はそれぞれ、coef_, intercept_, score() で求めることができるんですね。
    勉強になりました。

    一点申し上げると、p値を求める関数がないとのことでしたが、今回の分析では必須の情報になりますので、どうにか求めることはできないでしょうか。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る