本系列旨在挖掘活动、节假日、促销、优惠券、积分等营销权益因果效应评估,目前规划两个篇幅:
- 第一篇:会收集活动、节假日、促销等营销权益在做一些建模项目中,可以构造成为的特征工程方式
- 第二篇:使用各类模型、方法总结这些营销方式的几种效应评估方法
更多是文献整理,主要集中在预测类模型 - 营销方式入模的特征工程
文章目录
- 1 [竞赛] Corporación Favorita Grocery Sales Forecasting
- 2 [竞赛] 天池新人实战赛o2o优惠券使用预测
- 2.1 优惠券特征
- 2.2 用户 - 领券行为特征
- 2.3 商家 - 领券行为特征
- 2.4 用户-商家交互特征
- 2.5 其他一些技巧性特征
- 3 [竞赛] CCF2018-Top2-供应链预测
- 4 [竞赛] CCF BDCI 2019乘用车细分市场销量预测
- 5 JDATA如期而至-用户购买时间预测
- 6 利用Prophet 抽取节日特征
1 [竞赛] Corporación Favorita Grocery Sales Forecasting
Corporación Favorita Grocery Sales Forecasting
文献参考: 广告行业中那些趣事系列51:超牛的kaggle比赛Favorita Grocery Sales Forecasting冠军方案
比赛数据说明:
本篇是知乎的一个总结帖【kaggle销量预测冠军方案分析 】,还不错,可参考:
代码语言:javascript复制- 前16天与后16天的促销信息
- 前[14、60、140]天的促销次数
- 后[3、7、14]天内的促销次数
- [3, 7, 14, 30, 60, 140]
- 内促销日期时的销量均值、指数加权平均;
- 没有促销时的销量均值、加权平均
- 近[7、14、30、60、140]天内
- 促销日子的总和
- 最近促销距近的天数
- 最远促销距今天的天数
- 后16天内
- 促销次数总和
- 最近促销日子距今天数
- 最远促销日子距今天数
- 星期几
在广告行业中那些趣事系列51:超牛的kaggle比赛Favorita Grocery Sales Forecasting冠军方案文章的翻译为:
代码语言:javascript复制时间滑动窗口具体特征如下:
- 时间窗口内(最近14/60/140天):促销天数汇总;
- 时间窗口内(后3/7/14天):促销天数汇总。这里需要介绍下为什么可以使用之后的促销天数数据,因为在测试集中官方已经给出了未来一段时间某商店某商品是否会进行促销,所以我们可以用未来几天促销的数据;
时间窗口内(最近3/7/14/30/60/140天):
- 销量差值的均值,以时间窗口最近3天为例,用第二天的销量减去第一天的销量,再用第三天的销量减去第二天的销量,将两者取均值就可以得到销量差值的均值,这个特征可以理解为想查看每天的销量增长率;
- 销量每天按0.9衰减之后汇总,以时间窗口3天为例,最近一天销量不变,最近第二天的销量乘以衰减系数0.9,最近第三天的销量乘以衰减系数0.81,然后将三天衰减之后的销量相加;
- 均值、中位数、最小值、最大值和标准差;
时间窗口内(上一周最近3/7/14/30/60/140天):和前一天销量差值的均值、销量每天按0.9衰减之后汇总、均值、中位数、最小值、最大值和标准偏差。这个特征和上一个特征是一样的,只不过计算的是上一周各个特征值,作者想查看前一周的销量各个特征;
时间窗口内(最近7/14/30/60/140天):
- 有销量/促销的天数,分别查看时间窗口内有销量和促销的天数,以时间窗口3天为例,如果这三天都有销量,那么为3;
- 距离上次有销量/促销的天数,以时间窗口3天为例,上一次有销量是昨天,那么该值为1。这个特征主要是查看上一次有销量或者促销对未来商品销量的影响,以促销为例,有些商品近期才做过促销,可能未来几天的销量就会受影响;
- 距离最早有销量/促销的天数,以时间窗口3天为例,最早有销量是最近第三天,那么该值为3;
- 时间窗口内(后15天)促销的天数、距离上次促销的天数、距离最早促销的天数,这个特征和上一个特征类似,只不过查看未来15天各个特征情况;
- 时间窗口内(最近15天)当天的销量;
- 最近4周时间窗口为(每周1-每周日)的销量均值,比如最近4周每周1的销量均值;
- 最近20周时间窗口为(每周1-每周日)的销量均值,比如最近20周每周1的销量均值;
- 时间窗口内(前16到后15天)每天是否促销。
2 [竞赛] 天池新人实战赛o2o优惠券使用预测
本节参考文献: 干货 | 谈谈我是如何入门这场 AI 大赛的
比赛第一名方案: wepe/O2O-Coupon-Usage-Forecast
2.1 优惠券特征
打折率(Discount_rate)
首先,第一个想到的特征应该是优惠卷的打折率。因为很显然,一般情况下优惠得越多,用户就越有可能使用优惠券。 处理方式可以构建 4 个函数,分别提取 4 种特征,分别是:
代码语言:javascript复制- 打折类型:getDiscountType()
- 折扣率:convertRate()
- 满多少:getDiscountMan()
- 减多少:getDiscountJian()
领劵日期(Date_received)
是还有一点很重要的是领券日期,因为一般而言,周末领取优惠券去消费的可能性更大一些。因此,我们可以构建关于领券日期的一些特征:
代码语言:javascript复制- weekday : {null, 1, 2, 3, 4, 5, 6, 7}
- weekday_type : {1, 0}(周六和周日为1,其他为0)
- Weekday_1 : {1, 0, 0, 0, 0, 0, 0}
- Weekday_2 : {0, 1, 0, 0, 0, 0, 0}
- Weekday_3 : {0, 0, 1, 0, 0, 0, 0}
- Weekday_4 : {0, 0, 0, 1, 0, 0, 0}
- Weekday_5 : {0, 0, 0, 0, 1, 0, 0}
- Weekday_6 : {0, 0, 0, 0, 0, 1, 0}
- Weekday_7 : {0, 0, 0, 0, 0, 0, 1}
优惠券相关的特征
代码语言:javascript复制优惠券类型(直接优惠为0, 满减为1)
优惠券折率
满减优惠券的最低消费
历史出现次数
历史核销次数
历史核销率
历史核销时间率
领取优惠券是一周的第几天
领取优惠券是一月的第几天
历史上用户领取该优惠券次数
历史上用户消费该优惠券次数
历史上用户对该优惠券的核销率
2.2 用户 - 领券行为特征
用户线下相关的特征
代码语言:javascript复制- 用户领取优惠券次数
- 用户获得优惠券但没有消费的次数
- 用户获得优惠券并核销次数
- 用户领取优惠券后进行核销率
- 用户满050/50200/200~500 减的优惠券核销率
- 用户核销满050/50200/200~500减的优惠券占所有核销优惠券的比重
- 用户核销优惠券的平均/最低/最高消费折率
- 用户核销过优惠券的不同商家数量,及其占所有不同商家的比重
- 用户核销过的不同优惠券数量,及其占所有不同优惠券的比重
- 用户平均核销每个商家多少张优惠券
- 用户核销优惠券中的平均/最大/最小用户-商家距离
用户线上相关的特征
代码语言:javascript复制- 用户线上操作次数
- 用户线上点击率
- 用户线上购买率
- 用户线上领取率
- 用户线上不消费次数
- 用户线上优惠券核销次数
- 用户线上优惠券核销率
- 用户线下不消费次数占线上线下总的不消费次数的比重
- 用户线下的优惠券核销次数占线上线下总的优惠券核销次数的比重
- 用户线下领取的记录数量占总的记录数量的比重
2.3 商家 - 领券行为特征
商家相关的特征
代码语言:javascript复制商家优惠券被领取次数
商家优惠券被领取后不核销次数
商家优惠券被领取后核销次数
商家优惠券被领取后核销率
商家优惠券核销的平均/最小/最大消费折率
核销商家优惠券的不同用户数量,及其占领取不同的用户比重
商家优惠券平均每个用户核销多少张
商家被核销过的不同优惠券数量
商家被核销过的不同优惠券数量占所有领取过的不同优惠券数量的比重
商家平均每种优惠券核销多少张
商家被核销优惠券的平均时间率
商家被核销优惠券中的平均/最小/最大用户-商家距离
2.4 用户-商家交互特征
代码语言:javascript复制用户领取商家的优惠券次数
用户领取商家的优惠券后不核销次数
用户领取商家的优惠券后核销次数
用户领取商家的优惠券后核销率
用户对每个商家的不核销次数占用户总的不核销次数的比重
用户对每个商家的优惠券核销次数占用户总的核销次数的比重
用户对每个商家的不核销次数占商家总的不核销次数的比重
用户对每个商家的优惠券核销次数占商家总的核销次数的比重
2.5 其他一些技巧性特征
队伍名 “诗人都藏在水底”有提到利用了赛题leakage,在预测区间提取的一些特征:
代码语言:javascript复制用户领取的所有优惠券数目
用户领取的特定优惠券数目
用户此次之后/前领取的所有优惠券数目
用户此次之后/前领取的特定优惠券数目
用户上/下一次领取的时间间隔
用户领取特定商家的优惠券数目
用户领取的不同商家数目
用户当天领取的优惠券数目
用户当天领取的特定优惠券数目
用户领取的所有优惠券种类数目
商家被领取的优惠券数目
商家被领取的特定优惠券数目
商家被多少不同用户领取的数目
商家发行的所有优惠券种类数目
3 [竞赛] CCF2018-Top2-供应链预测
地址:https://www.datafountain.cn/competitions/313
赛题任务
供应链需求预测,对原问题做建模问题简化。考虑商品在制造,国际航运,海关清关,商品入仓的供应链过程,实际的产品准备时长不同。这里将问题简化,统一在45天内完成,供应链预测目标市场为沙特阿拉伯。赛题为运用平台积累最近1年多的商品数据预测45天后5周每周(week1~week5)的销量。
团队分享:https://github.com/luoda888/CCF2018-Top2-Demand-Forecast
整体活动特征是marketing表中所述全场活动,对整体销量影响极大,这部分特征由于我们数据集构造并没有连续划窗,所以我们并没有直接将其放入特征中,而是对历史销量进行平滑,平滑掉全场大促的活动对模型的偏移。
4 [竞赛] CCF BDCI 2019乘用车细分市场销量预测
答辩视频: https://www.bilibili.com/video/av843991939/ 文章: CCF BDCI 乘用车销量预测 冠军方案
活动类特征比较少,只有一个节假日,可见:
另一个方案: 特殊日期的标注,因此对春节所在月份进行了标记,还有当前月距离最近的春节间隔了几个月 注:16年春节在二月、17年春节在一月、18年春节在二月 参考:CCF BDCI 乘用车销量预测 TOP3开源
5 JDATA如期而至-用户购买时间预测
JDATA如期而至-用户购买时间预测Rank9
一些极端异常的情况,比如618,会进行销售平滑,同时训练集不考虑这个月
618,双十一和双十二的流量出现异常,因此我们做s2时去掉了一些节日
放弃了6月,因为分析数据得知618出现流量异常,同时我们也用了去除流量异常的节日,发现效果不佳。
6 利用Prophet 抽取节日特征
来源:将梯度提升模型与 Prophet 相结合可以提升时间序列预测的效果
我们特征工程的第一步非常简单。我们只需要使用Prophet 模型进行预测:
代码语言:javascript复制def prophet_features(df, horizon=24*7):
temp_df = df.reset_index()
temp_df = temp_df[['datetime', 'count']]
temp_df.rename(columns={'datetime': 'ds', 'count': 'y'}, inplace=True)
#take last week of the dataset for validation
train, test = temp_df.iloc[:-horizon,:], temp_df.iloc[-horizon:,:]
#define prophet model
m = Prophet(
growth='linear',
seasonality_mode='additive',
interval_width=0.95,
daily_seasonality=True,
weekly_seasonality=True,
yearly_seasonality=False
)
#train prophet model
m.fit(train)
#extract features from data using prophet to predict train set
predictions_train = m.predict(train.drop('y', axis=1))
#extract features from data using prophet to predict test set
predictions_test = m.predict(test.drop('y', axis=1))
#merge train and test predictions
predictions = pd.concat([predictions_train, predictions_test], axis=0)
return predictions
上面的函数将返回一个给我们的 LightGBM 模型准备的新特征的DF:
我们使用 Prophet 提取了新特征,下一步就是进行特征的合并和使用 LightGBM 进行预测 执行上述代码后,我们将合并特征df,创建滞后的lag值,训练 LightGBM 模型,然后用我们训练的模型进行预测,将我们的预测与实际结果进行比较。输出将如下所示:
如果我们仔细观察结果我们的 MAE 为 28.665。这要比一般特征工程结果有很大的提高。