提升¶
设置¶
pip install ydf -U
什么是提升?¶
提升建模是一种统计建模技术,用于预测某个行为对受试对象的增量影响。该行为通常被称为处理,可以选择性应用。
提升建模通常用于有针对性的营销活动,以预测某人在接收到的营销展示基础上,进行购买(或任何其他期望行为)的可能性增加。
例如,提升建模可以预测电子邮件的效果。效果被定义为条件概率 \begin{align} \text{effect}(\text{email}) = &\Pr(\text{outcome}=\text{purchase}\ \vert\ \text{treatment}=\text{with email})\\ &- \Pr(\text{outcome}=\text{purchase} \ \vert\ \text{treatment}=\text{no email}), \end{align} 其中 $\Pr(\text{outcome}=\text{purchase}\ \vert\ ...)$ 是取决于是否接收到电子邮件而发生购买的概率。
将其与分类模型进行比较:使用分类模型,可以预测购买的概率。然而,高概率的客户无论是否收到电子邮件,可能都会在商店消费。
同样,可以使用数值提升来预测接收电子邮件时的数值消费增加。相比之下,回归模型只能提高预期消费,这在许多情况下是一个较不实用的指标。
在YDF中定义提升模型¶
YDF期望提升数据集以“平坦”格式呈现。 客户数据集可能如下所示:
treatment | outcome | feature_1 | feature_2 |
---|---|---|---|
0 | 1 | 0.1 | blue |
0 | 0 | 0.2 | blue |
1 | 1 | 0.3 | blue |
1 | 1 | 0.4 | blue |
处理是一个二元变量,指示示例是否接受了处理。在上面的例子中,处理指示客户是否收到了电子邮件。结果(标签)指示在接受处理(或未接受处理)后的示例状态。TF-DF支持分类结果用于分类提升,数值结果用于数值提升。
注意:提升在医学领域也经常使用。在这里,处理可以是医疗处理(例如施用疫苗),标签可以是生活质量的指标(例如患者是否生病)。这也解释了提升建模的命名法。
训练提升模型¶
在这个例子中,我们将使用个性化治疗效果的模拟的一个实例。
# 加载库
import ydf # Yggdrasil决策森林
import pandas as pd # 我们使用Pandas加载小型数据集。
import numpy as np
# 下载并加载一个排名数据集作为Pandas的DataFrame
ds_path = "https://raw.githubusercontent.com/google/yggdrasil-decision-forests/main/yggdrasil_decision_forests/test_data/dataset"
train_ds = pd.read_csv(f"{ds_path}/sim_pte_train.csv")
test_ds = pd.read_csv(f"{ds_path}/sim_pte_test.csv")
# 打印前5个示例
train_ds.head(5)
y | treat | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | ... | X11 | X12 | X13 | X14 | X15 | X16 | X17 | X18 | X19 | X20 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 2.027911 | 0.278222 | 0.716672 | -1.092175 | -1.353849 | -0.910061 | -1.410070 | -0.150630 | ... | 1.931576 | 0.511000 | -1.618037 | -0.699228 | -0.494174 | 0.196550 | -0.150307 | -0.511604 | -0.995799 | -0.560476 |
1 | 2 | 2 | -1.494750 | -1.602538 | -0.283501 | -1.337542 | -0.579377 | 0.280663 | -1.721265 | 0.800941 | ... | -0.616475 | 1.807993 | 0.379181 | 0.996452 | 1.127593 | 0.650113 | -0.327757 | 0.236938 | -1.039955 | -0.230177 |
2 | 1 | 2 | -1.572949 | -0.320900 | -1.135464 | 1.109242 | -0.861044 | -1.035670 | 0.665445 | -1.186718 | ... | -0.562567 | -1.702615 | 1.902250 | -0.692745 | -1.146950 | 0.671004 | -1.448165 | -0.541589 | -0.017980 | 1.558708 |
3 | 1 | 2 | -0.300212 | -1.226114 | -0.632817 | 0.810701 | 0.972678 | 0.273049 | -0.430807 | 0.430636 | ... | -0.989963 | 0.287449 | 0.601874 | -0.103483 | 1.481019 | -1.284158 | -0.697285 | 1.219228 | -0.132175 | 0.070508 |
4 | 1 | 1 | -0.764373 | -0.776658 | 1.351161 | -0.875981 | 0.619146 | 0.537798 | -0.329039 | 0.216747 | ... | 2.731228 | -0.269114 | 1.732350 | 0.603866 | 0.916191 | -2.026110 | 2.598490 | 0.174136 | -2.549343 | 0.129288 |
5 rows × 22 columns
在这个数据集中,处理变量(treat
)和结果变量(y
)是二元变量,表示为 "1" 或 "2"(而不是 "0" 和 "1")
我们可以训练一个提升模型:
model = ydf.RandomForestLearner(
label="y",
uplift_treatment="treat",
task=ydf.Task.CATEGORICAL_UPLIFT).train(train_ds)
Train model on 1000 examples Model trained in 0:00:00.075023
提升模型通过 QINI 系数(Qini 曲线下的面积)和 AUUC(提升曲线下的面积)进行评估。
evaluation = model.evaluate(test_ds)
print(evaluation)
QINI: 0.106807 AUUC: 0.120807 num examples: 2000 num examples (weighted): 2000