利用Uplift模型识别营销敏感用户提升转化率


上篇

1.数据基本情况探索

2.数据预处理及相关性分析

3.样本平衡性验证


下篇

1.构建营销增益模型

2.营销增益模型效果评价


继上周的内容继续分享,上周内容回顾见 https://mp.weixin.qq.com/s/BtA6JyEMQ32QgNJ8XBx3eg


Python实战:利用Uplift模型识别营销敏感用户提升市场策略(二)_数据挖掘

1

构建营销增益模型

经过上述过程的处理,数据集已经处理成营销增益模型所需的输入形式了。下面正式开始构建营销增益模型,和其他有监督模型一样,营销增益模型也需要划分训练集和验证集。我们通过如下的代码实现数据特征与数据标签的分离,同时按照7:3的比例划分训练集和测试集。

from sklearn.model_selection import train_test_split
import xgboost as xgb
def uplift_split(df_model:pd.DataFrame):
#数据集划分,按照7:3比例划分数据集
X = df_model.drop(['target','target_class'],axis=1)
y = df_model.target_class
X_train, X_test, \
y_train, y_test = train_test_split(X,
y,
test_size=0.3,
random_state=42,
stratify=df_model['treatment'])
return X_train,X_test, y_train, y_test


数据集划分完成后,我们通过xgboost构建营销增益模型。营销增益模型实现过程如下代码所示,主要可以分为三个步骤。首先,在测试数据集上,通过xgboost算法训练模型;其次,在验证数据集上计算营销增益得分,即营销增益响应率(Incremental Response Rate ,IRR);最后,绘制混淆矩阵评价模型效果。


def uplift_model(X_train:pd.DataFrame,
X_test:pd.DataFrame,
y_train:pd.DataFrame,
y_test:pd.DataFrame):
#使用XGB模型训练数据集

result = pd.DataFrame(X_test).copy()
uplift_model =xgb.XGBClassifier().fit(X_train.drop('treatment', axis=1), y_train)

# 预测测试集的结果
uplift_proba \
=uplift_model.predict_proba(X_test.drop('treatment', axis=1))
result['proba_CN'] = uplift_proba[:,0]
result['proba_CR'] = uplift_proba[:,1]
result['proba_TN'] = uplift_proba[:,2]
result['proba_TR'] = uplift_proba[:,3]
result['uplift_score'] = result.eval('、
proba_CN/(proba_CN+proba_CR) 、
+ proba_TR/(proba_TN+proba_TR) 、
- proba_TN/(proba_TN+proba_TR) 、
- proba_CR/(proba_CN+proba_CR)')

#输出绘制混淆矩阵,评判模型效果
valid_pred =uplift_model.predict(X_test.drop('treatment', axis=1))
cm = sk.metrics.confusion_matrix(y_test,valid_pred)

fig, ax= plt.subplots(figsize=(10,10))
sns.heatmap(cm, annot=True, fmt='g',cmap="YlGnBu",ax = ax); #annot=True to annotate cells

#轴标签、图名
ax.set_xlabel('Predicted labels');
ax.set_ylabel('True labels');
ax.set_title('Confusion Matrix');
ax.xaxis.set_ticklabels(['CN', 'CR','TN','TR']);
ax.yaxis.set_ticklabels(['CN', 'CR', 'TN','TR']);

result['target_class'] = y_test
return result


此处对营销增益响应率做一个说明,营销增益响应率是描述与未受到促销干预的用户相比,其购买比率提升的程度,计算公式如下所示。

Python实战:利用Uplift模型识别营销敏感用户提升市场策略(二)_数据分析_02

参考:https://www.worldscientific.com/doi/abs/10.1142/S0219622019500172

公式(1)中T表示受到干预的全部用户,即(TR + TN);C表示未受到干预的全部用户。


最后将数据集分割函数和建模函数整合到一起构建营销整合模型,实现代码如下。

def uplift(df_model:pd.DataFrame):
# 整合数据集分割函数以及建模函数
X_train, X_test, y_train, y_test =uplift_split(df_model)
result = uplift_model(X_train, X_test,y_train, y_test)
return result


2

营销增益模型效果评价

完成建模之后的工作就是评价模型效果,这一节我们通过混淆矩阵、增益值分布以及Qini曲线评价营销增益模型效果。

1.混淆矩阵

第一部分已经完成营销增益模型的构建,如下代码实现对“买一送一”营销策略的用户转化分类,并在验证集上通过混淆矩阵检验模型效果,混淆矩阵结果如图1所示。

bogo_uplift = uplift(df_model_bogo)

Python实战:利用Uplift模型识别营销敏感用户提升市场策略(二)_数据分析_03

图1 “买一送一”营销策略的混淆矩阵


同样地,对于“打折促销”策略也是用营销增益模型识别营销敏感人群,实现代码如下,混淆矩阵结果如图2所示。

discount_uplift = uplift(df_model_discount)

Python实战:利用Uplift模型识别营销敏感用户提升市场策略(二)_人工智能_04

图2 “打折促销”策略的混淆矩阵

2.增益值分布

除了混淆矩阵外,增益值也是直观衡量营销策略的指标。对于“买一送一”策略,我们通过如下代码绘制了营销增益分数的分布。

plt.figure(figsize= (10,6))
plt.xlim(-.05,.1)
plt.hist(bogo_uplift.uplift_score,bins=1000, color=['#2077B4'])
plt.xlabel('Upliftscore')
plt.ylabel('Numberof observations in bogo')
plt.title("Upliftscore of bogo")

如图3展示了实施“买一送一”带来的用户转化提升。相比于没有任何营销策略,“买一送一”策略能够对用户转化带来积极的作用,当然对于部分用户也会出现反作用。

Python实战:利用Uplift模型识别营销敏感用户提升市场策略(二)_机器学习_05

图3 “买一送一”策略增益值分布


同样地,对于“打折促销”策略我们也使用同样的方法对营销增益值进行可视化,实现代码如下所示。


plt.figure(figsize= (10,6))
plt.xlim(-.05,.1)
plt.hist(discount_uplift.uplift_score,bins=1000, color=['#2077B4'])
plt.xlabel('Upliftscore')
plt.ylabel('Numberof observations in discount')
plt.title("Upliftscore of discount")


结果如图4所示,“打折促销”策略对于用户的转化同样存在积极作用和消极作用,但是与“买一送一”策略相比,“打折促销”策略对用户转化的积极影响更胜一筹。

Python实战:利用Uplift模型识别营销敏感用户提升市场策略(二)_python_06

图4 “打折促销”策略增益值分布