ロジスティック回帰でチャーンを予測する

Pythonで学ぶマーケティングのための機械学習

Karolis Urbonas

Head of Analytics & Science, Amazon

ロジスティック回帰入門

  • 2値分類の統計モデル
  • 目的変数の確率の対数オッズをモデル化
  • 対数オッズと説明変数に線形関係を仮定
  • 係数と予測確率を返す

ロジスティック回帰モデル

Pythonで学ぶマーケティングのための機械学習

モデリング手順

  1. 学習用とテスト用にデータを分割
  2. モデルを初期化
  3. 学習データで学習
  4. テストデータで予測
  5. テストデータで性能を評価
Pythonで学ぶマーケティングのための機械学習

モデルの学習

ロジスティック回帰をインポート

from sklearn.linear_model import LogisticRegression

ロジスティック回帰のインスタンスを初期化

logreg = LogisticRegression()

学習データでフィット

logreg.fit(train_X, train_Y)
Pythonで学ぶマーケティングのための機械学習

モデル評価指標

主要な指標:

  • 精度(Accuracy): 予測が正しい割合(チャーン/非チャーンの両方)
  • 適合率(Precision): 予測を陽性とした中で正しかった割合(ここではチャーンと予測)
  • 再現率(Recall): 実際の陽性(全チャーン顧客)のうち正しく検出した割合
Pythonで学ぶマーケティングのための機械学習

モデル精度の測定

from sklearn.metrics import accuracy_score

pred_train_Y = logreg.predict(train_X) pred_test_Y = logreg.predict(test_X)
train_accuracy = accuracy_score(train_Y, pred_train_Y) test_accuracy = accuracy_score(test_Y, pred_test_Y)
print('Training accuracy:', round(train_accuracy,4)) print('Test accuracy:', round(test_accuracy, 4))
Training accuracy: 0.8108
Test accuracy: 0.8009
Pythonで学ぶマーケティングのための機械学習

適合率と再現率を測る

from sklearn.metrics import precision_score, recall_score

train_precision = round(precision_score(train_Y, pred_train_Y), 4) test_precision = round(precision_score(test_Y, pred_test_Y), 4)
train_recall = round(recall_score(train_Y, pred_train_Y), 4) test_recall = round(recall_score(test_Y, pred_test_Y), 4)
print('Training precision: {}, Training recall: {}'.format(train_precision, train_recall)) print('Test precision: {}, Test recall: {}'.format(train_recall, test_recall))
Training precision: 0.6725, Training recall: 0.5736
Test precision: 0.5736, Test recall: 0.4835
Pythonで学ぶマーケティングのための機械学習

正則化

  • モデル構築時に罰則係数を導入
  • 過学習(パターンを「記憶」してしまう)への対処
  • 一部の正則化は特徴選択も実施(例:L1)
  • 未知データへの汎化性能を向上
Pythonで学ぶマーケティングのための機械学習

L1 正則化と特徴選択

  • sklearnLogisticRegression は既定で L2 正則化
  • L1 正則化(LASSO)は明示指定。係数の一部を0に縮小し、特徴選択を行う
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression(penalty='l1', C=0.1, solver='liblinear')
logreg.fit(train_X, train_Y)
  • 最適化には C パラメータの調整が必要
Pythonで学ぶマーケティングのための機械学習

L1 正則化のチューニング

C = [1, .5, .25, .1, .05, .025, .01, .005, .0025]
l1_metrics = np.zeros((len(C), 5))
l1_metrics[:,0] = C

for index in range(0, len(C)): logreg = LogisticRegression(penalty='l1', C=C[index], solver='liblinear') logreg.fit(train_X, train_Y) pred_test_Y = logreg.predict(test_X)
l1_metrics[index,1] = np.count_nonzero(logreg.coef_) l1_metrics[index,2] = accuracy_score(test_Y, pred_test_Y) l1_metrics[index,3] = precision_score(test_Y, pred_test_Y) l1_metrics[index,4] = recall_score(test_Y, pred_test_Y)
col_names = ['C','Non-Zero Coeffs','Accuracy','Precision','Recall'] print(pd.DataFrame(l1_metrics, columns=col_names)
Pythonで学ぶマーケティングのための機械学習

最適な C 値の選択

L1 正則化の C パラメータ調整

Pythonで学ぶマーケティングのための機械学習

最適な C 値の選択

L1 正則化の C パラメータ調整(注釈付き)

Pythonで学ぶマーケティングのための機械学習

ロジスティック回帰を実行してみましょう!

Pythonで学ぶマーケティングのための機械学習

Preparing Video For Download...