用逻辑回归预测流失

Python 营销中的机器学习

Karolis Urbonas

Head of Analytics & Science, Amazon

逻辑回归简介

  • 二分类的统计分类模型
  • 建模目标概率的对数几率
  • 假设目标对数几率与自变量线性相关
  • 返回系数与预测概率

逻辑回归模型

Python 营销中的机器学习

建模步骤

  1. 将数据划分为训练集与测试集
  2. 初始化模型
  3. 在训练集上拟合模型
  4. 在测试集上预测
  5. 在测试集上评估性能
Python 营销中的机器学习

拟合模型

导入逻辑回归分类器

from sklearn.linear_model import LogisticRegression

初始化逻辑回归实例

logreg = LogisticRegression()

在训练集上拟合模型

logreg.fit(train_X, train_Y)
Python 营销中的机器学习

模型评估指标

关键指标:

  • 精确率(Precision):模型判为正类(此处为流失)的样本中,判对的比例
  • 召回率(Recall):所有正类样本(所有流失客户)中,被判对的比例
  • 准确率(Accuracy):所有样本中判对的比例(流失与未流失)
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...