前提・実現したいこと
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))
何卒よろしくお願い申し上げます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/12 06:37