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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1108閲覧

ロジスティック回帰分析の結果を元データに反映させたいが結果が全て0になる?

Pablito

総合スコア71

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/08 07:11

編集2020/10/09 06:27

前提・実現したいこと

PythonのScikit Learnで行ったロジスティック回帰分析の結果を
元データに反映させてID(列)ごとにスコアを出したいと考えております。

しかし、計算式を正しく打ったつもりが結果が全て0で出てしまいます。

元データ

Amount Profit Quantity Frequency Order ID B-25601 1429.0 -1218.0 19 8 B-25602 3889.0 975.0 22 10 B-25603 2025.0 -180.0 25 16 B-25604 222.0 22.0 11 4 B-25605 75.0 0.0 7 2 ... ... ... ... ... B-26096 1091.0 121.0 18 6 B-26097 1688.0 -504.0 23 7 B-26098 1189.0 350.0 21 6 B-26099 3417.0 859.0 15 4 B-26100 934.0 256.0 6 3

回帰係数と切片

回帰係数: [[ -4.35516166 490.43789796 -1.42371766 1.0599378 ]] 切片: [69.30989536]

コード

Python

1#元データ 2*** 3 Amount Profit Quantity Frequency 4Order ID 5B-25601 1429.0 -1218.0 19 8 6B-25602 3889.0 975.0 22 10 7B-25603 2025.0 -180.0 25 16 8B-25604 222.0 22.0 11 4 9B-25605 75.0 0.0 7 2 10... ... ... ... ... 11B-26096 1091.0 121.0 18 6 12B-26097 1688.0 -504.0 23 7 13B-26098 1189.0 350.0 21 6 14B-26099 3417.0 859.0 15 4 15B-26100 934.0 256.0 6 3 16*** 17 18#優良/休眠顧客情報を追加 19def Dormant(x): 20 if x > 0: 21 return 1 22 else: 23 return 0 24 25datrum['Customer Type'] = datrum['Profit'].apply(Dormant) 26datrum.head(10) 27 28*** 29 Amount Profit Quantity Frequency Customer Type 30Order ID 31B-25601 1429.0 -1218.0 19 8 0 32B-25602 3889.0 975.0 22 10 1 33B-25603 2025.0 -180.0 25 16 0 34B-25604 222.0 22.0 11 4 1 35B-25605 75.0 0.0 7 2 0 36B-25606 87.0 4.0 2 2 1 37B-25607 50.0 15.0 4 2 1 38B-25608 2953.0 -1456.0 19 8 0 39B-25609 510.0 24.0 8 4 1 40B-25610 2105.0 -746.0 24 12 0 41*** 42 43#テストデータをテスト用と訓練用に分ける 44x_train, x_test, y_train, y_test = train_test_split( 45 datrum.iloc[:, 0:4], 46 datrum.iloc[:, 4], 47 test_size=0.3, 48 random_state=1 49) 50 51#データを標準化 52scl = StandardScaler() 53scl.fit(x_train) #学習用データで標準化 54x_train_std = scl.transform(x_train) 55x_test_std = scl.transform(x_test) 56 57clf = LogisticRegression(C=1e5) 58clf.fit(x_train_std, y_train)#訓練データから学習を行う 59print( "正解率:{:.2f}%".format(accuracy_score(y_test, clf.predict(x_test_std)) * 100 )) 60 61*** 62正解率:100.00% 63*** 64 65print('回帰係数:', clf.coef_) 66*** 67回帰係数: [[ -4.35525949 490.44187802 -1.42342501 1.0620863 ]] 68*** 69print('切片:', clf.intercept_) 70*** 71切片: [69.31399488] 72*** 73 74x = datrum[['Amount', 'Profit', 'Quantity', 'Frequency']] 75y = datrum['Customer Type'] 76print('決定係数:', clf.score(x, y)) 77 78*** 79決定係数: 0.998 80*** 81 82#学習効果の検証 83X_test = datrum.iloc[:, 0:4] 84y_predict = clf.predict(X_test) 85 86print('検証結果:', y_predict) 87 88*** 89検証結果: [0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 90 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 91 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 92 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 93 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 94 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 95 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 96 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 97 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 0 0 98 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 99 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 101 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 102 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1] 103*** 104 105#Create an empty column 106import numpy as np 107datrum['Score'] = np.nan 108print(datrum['Score']) 109 110*** 111Order ID 112B-25601 NaN 113B-25602 NaN 114B-25603 NaN 115B-25604 NaN 116B-25605 NaN 117 .. 118B-26096 NaN 119B-26097 NaN 120B-26098 NaN 121B-26099 NaN 122B-26100 NaN 123Name: Score, Length: 500, dtype: float64 124*** 125 126 127#create a function to apply the output to data 128def predict_score(x): 129 return 1 / (1 + np.exp(-(x.iloc[1] * -4.4 + x.iloc[2] * 490.4 + x.iloc[3] * -1.4 + x.iloc[4] * 1.1 + 69.3))) 130 131datrum["Score"] = datrum.apply(predict_score, axis=1) 132datrum.head(10) 133#出てきたメッセージ 134#<ipython-input-26-b3ac908bb86f>:4: RuntimeWarning: overflow encountered in double_scalars 135#return 1 / (1 + math.e ** (x.iloc[1] * -4.35516166 + x.iloc[2] * 490.43789796 + x.iloc[3] * -1.42371766 + x.iloc[4] * 1.0599378 + 69.30989536)) 136 137*** 138 Amount Profit Quantity Frequency Customer Type Score 139Order ID 140B-25601 1429.0 -1218.0 19 8 0 0.0 141B-25602 3889.0 975.0 22 10 1 0.0 142B-25603 2025.0 -180.0 25 16 0 0.0 143B-25604 222.0 22.0 11 4 1 0.0 144B-25605 75.0 0.0 7 2 0 0.0 145B-25606 87.0 4.0 2 2 1 0.0 146B-25607 50.0 15.0 4 2 1 0.0 147B-25608 2953.0 -1456.0 19 8 0 0.0 148B-25609 510.0 24.0 8 4 1 0.0 149B-25610 2105.0 -746.0 24 12 0 0.0 150*** 151

ロジスティック回帰分析の式

p=1 / 1+exp(−(a1x1+a2x2+⋯+anxn+b))

何卒よろしくお願い申し上げます。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

最終的にNaNとなった要因ですがprobをpd.Series()した際に生成されたindexと
datrumのindexが異なることかと思ます。
また、predict_probaの戻り値がそれぞれのクラスへ分類される確率の2次元配列なので
1に分類される確率を元のデータに反映するのは以下のコードで実現できるのではないでしょうか。

python3

1y_predict_proba = clf.predict_proba(X_test) 2datrum['Score'] = y_predict_proba[:,1] 3

投稿2020/10/12 03:05

EM1206

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Pablito

2020/10/12 06:37

できました! ご教示頂きまして、誠にありがとうございました。
guest

0

RuntimeWarningのメッセージから推測するに浮動小数点の制限を超えているのかなと思います。
参考サイト:stackoverflow

1に分類される確率が求めたいなら以下のコードで実現できないでしょうか。

python3

1y_predict_proba = clf.predict_proba(X_test)

投稿2020/10/09 22:50

EM1206

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Pablito

2020/10/12 01:35

ご回答ありがとうございます! 頂いたご回答を基に実行をしてみると2列の配列でスコアが確率が返って来ました。 本来の目的としてはこのスコアをOrder IDごとにはめてたいので、元のDataFrameに新たなcolumnを作って代入したく、下記のコードを書きました。 ``` y_predict_proba = clf.predict_proba(X_test) y_predict_proba prob = y_predict_proba.tolist() prob prob = pd.Series(prob) prob datrum['Score'] = prob datrum ***結果 Amount Profit Quantity Frequency Customer Type Score Order ID B-25601 1429.0 -1218.0 19 8 0 NaN B-25602 3889.0 975.0 22 10 1 NaN B-25603 2025.0 -180.0 25 16 0 NaN B-25604 222.0 22.0 11 4 1 NaN B-25605 75.0 0.0 7 2 0 NaN ... ... ... ... ... ... ... B-26096 1091.0 121.0 18 6 1 NaN B-26097 1688.0 -504.0 23 7 0 NaN B-26098 1189.0 350.0 21 6 1 NaN B-26099 3417.0 859.0 15 4 1 NaN B-26100 934.0 256.0 6 3 1 NaN 500 rows × 6 columns *** ``` 結果、欠損値として返ってきてしまったのですが、求めた確率を元のIDに反映させる良い方法はありますでしょうか? 何卒宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問