ピープルアナリティクス・ケーススタディ:ロジスティック回帰分析で離職リスク分析に挑戦!②
検証データでモデルの確からしさを計測する方法
前回のブログでロジスティック回帰を用いて離職リスク分析を行いました。
ただ、実際にこの回帰分析がどれだけ正確に離職者を導き出してくれるのでしょうか?
Pythonでは作成したモデルに対する検証を行うことができます!
今回は前回のブログでご紹介した、Scikit-learnのLogistic Regression関数で作成したモデルの評価を1)カテゴリーの分類精度、2)予測確率の正確さという2点の観点で行いたいと思います。
モデル評価までの下準備はこんな感じです。
1.データを学習データセットとテストデータセットに分類=>Scikit-learnのmodel_selectionモジュールのtrain_test_split関数を利用します。式はこんな感じですね。(注意:xは独立変数(Numpy配列もしくはDataFrame), yは従属変数を表すNumpy配列が入っています
from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test=train_test_split(x, y, train_size=0.67)
2. 学習データセットを用いて分類モデル(ロジスティック回帰分s系)を構築=>これは前回ご紹介したScikit-learnでロジスティック回帰分析を行うと同じです。
from sklearn.linear_model import LogisticRegression
log_model=LogisticRegression()
result= log_model.fit(x_train, y_train)
3. 予測=>テストデータセットで指定した独立変数(x_test)から従属変数を予測従属変数の予測の出し方には、そのものずばりを予測するpredict関数と確率を予測するpredict_proba関数があります。前者は従属変数と同様に0(このケースだと会社にとどまる)か1(退職する)で予測データが算出されるのに対し、後者は0と1それぞれの確率を算出します。ですので、Y_probaの方は1の方の確率を出すように[:,1]をつけることが必要になります。
Y_pred =log_model.predict(x_test)
Y_proba=log_model.predict_proba(x_test)[:,1]
こうした分析を行うにあたってぶち当たるといろいろブログなどをググるほかに、「Python 3 エンジニア認定データ分析試験」の教科書として指定されている「Pythonによる新しいデータ分析の教科書」をいつも参考にしています。
今回の評価でもお世話になったのでご紹介させていただきますね。
カテゴリーの分類精度を抽出!
こちらは上記の予測で出したY_predを利用します。Scikit-learnのmetricsモジュールのclassification_reportという関数を使うと一気に出ます。
from sklearn.metrics import classification_report
print(classification_report(y_test, Y_pred))
結果はこんな感じです。
正解率(正例(このケースでは退職した:記号では1)、負例(このケースでは退職していない:記号では0)どちらにおいても予測が正しかった)は69%、正例(退職者のみに限った正答率)は64%ということですね。
辞める人の3分の2くらいが推測できるというのは、全体の離職率が38%くらいだと考えるとそこそこ予測できているということなのでしょうか。
予測確率の正確さ(ROC曲線、AUC)を出す
こちらは予測確率ですのでY_probaの方を利用します。ROC(Receiver Operating Characteristic)曲線や、そこから算出するAUC(Area Under the Curve)は、各データが正例(今回のケースだと退職する)確率を算出し、確率の大きい順にデータを並べた時にその順序がどのくらい性格であるかを定量化するというものです。
ROC, AUCの詳細を説明するのがこのブログの目的ではないので、とりあえずPythonでどう出すかをご紹介しますね。太字がそのための数式で、それ以降は可視化するためのものになります。
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
fpr,tpr, threshholds= roc_curve(y_true=y_test, y_score=Y_proba)
plt.plot(fpr, tpr, label='roc curve (area = %0.3f)' % auc(fpr, tpr))
plt.plot([0, 1], [0, 1], linestyle='--', label='random')
plt.plot([0, 0, 1], [0, 1, 1], linestyle='--', label='ideal')
plt.legend()
plt.xlabel('false positive rate')
plt.ylabel('true positive rate')
plt.show()
結果はこんな感じです。本来予測が100%的中しているなら緑、でたらめに予測すればオレンジ、今回の予測モデルは青のカーブで表されています。
AUCスコアは凡例に書いてある通り0.72です。このスコアについては退職者分析の解析で紹介されていた参照資料によると以下の通りなので、「まあそこそこ」という感じでしょうか。
- 90-1 = excellent
- 80-.90 = good
- 70-.80 = fair
- 60-.70 = poor
- 50-.60 = fail
次は同じ退職者分析を決定木を使って分析を行いたいと思います。