用邏輯式迴歸預測流失

Python 的行銷機器學習

Karolis Urbonas

Head of Analytics & Science, Amazon

邏輯式迴歸簡介

  • 二元分類的統計模型
  • 建立目標機率之對數勝算的模型
  • 假設目標對數勝算與自變數呈線性關係
  • 輸出係數與預測機率

邏輯式迴歸模型

Python 的行銷機器學習

建模步驟

  1. 將資料切成訓練與測試
  2. 初始化模型
  3. 在訓練資料上擬合模型
  4. 在測試資料上預測
  5. 評估測試集的模型表現
Python 的行銷機器學習

模型擬合

匯入 Logistic Regression 分類器

from sklearn.linear_model import LogisticRegression

初始化 Logistic Regression 物件

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 的行銷機器學習

正規化(Regularization)

  • 在建模階段引入懲罰係數
  • 處理過度擬合(當模型「死記」樣式時)
  • 部分正規化也做特徵選擇,如 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...