Pythonのstatsmodelsを用いたロジスティック回帰
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 4,551
とある分析において、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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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() の部分のソースコードを見ればわかりそうな気もします。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
tiitoi
2018/10/09 00:19
sklearn.linear_model.LogisticRegression のほうを使うではダメでしょうか?
IOError
2018/10/09 00:23
ご連絡ありがとうございます。おっしゃる通りsklearn.linear_model.LogisticRegressionも試しましたが、重み・切片・p値・モデルの精度を取得することはできるんですか?