目标和工作计划
目标
大家都听过美国计算机科学家Peter Norvig 的2句经典名言:
基于大量数据的简单模型优于基于少量数据的复杂模型。这句说明了数据量的重要性。
所以,工程化之前很重要的一个任务就是,如何构建优质的训练样本集合,包括“迁移源“source 和target的样本集合,以便从训练集得到的模型可以更好的预测新品。
TrAdaBoost算法用,选择何种范围的source样本,target样本,还是有很多种可能性的,需要先行验证哪种“构建样本”的策略,可以获得最好的预测效果(缺货率、mape等)。
因此近期工作有如下目标,分成两类,一类是“从业务逻辑的角度看,找到合适的训练集构建的业务逻辑“的尝试,第二类是”提高模型性能“的尝试。
目标1:从下面选项中,验证发现:source样本选什么商品作为iphone13的“迁移源sku”?
- 和新品价位相同的同品类的老品
- 历史上新开卖日销量,和和新品开卖的日销量接近的老品(TOP 10?)
- 波动系数和“新品开卖前N周的波动系数”最接近的老品(TOP 10?)
- 去年同期上线/开卖的同品牌的老品
- 品类规格“高中低档次”接近的老品(比如,手机来说今年的256G配置相当于去年的128G配置)
- 线上老品中,当前LGBM模型预测已经预测较好的老品(因为TrAdaBoost的算法使用的base_regression=LGBMRegressor),所以选LGBM预测效果好的老品作为迁移源sku也是一个思路。
- 以上的其中某几个的组合
如果是全新品也就是完全没有历史销售数据、完全还没有开卖的新品的话,那么target样本也需要以上述规则提取销售数据来构建。
目标2:验证:source样本选取多少SKU合适?(并不一定sku个数越多越好)
- 10个(考虑到跑数资源,试的时候先不用太多个源sku)
- 3个
目标3:验证“source样本要不要加上人造样本?”
- 选取预测日期当日,的去年同期的这4周,同品类品牌的老品的销售记录,销量求平均,作为人造样本
- 同上一条,只是取销量中位数
目标4:从下面选项中,验证发现:source样本选哪些时间段的销售历史数据?
- 迁移源sku,也就是“类似老品“的,预测日之前的52周(也就是一年)里每周的销售数据
- 迁移源sku,也就是“类似老品“的,历史上起初开卖的13周的销售数据
目标5:从下面选项中,验证发现:开卖第几周的时候,迁移学习预测效果最好?1周?2周?3周?4周?
工作计划
- 获取预测需要的商品特征数据:品类特征(价位,内存,屏幕尺寸,GPU等等),品牌。
- 获取历史销售数据:包括预测所需要的特征:各周促销力度,各周节假日天数,当周天气情况(因为会影响门店客流量),历史当周销量,成交单价
- 用前面《目标》中提到的样本构建策略,轮流用各种策略,遍历尝试。寻找合适的源sku,构建训练集之source样本;分成3个source样本集合,比如集合A,集合B,集合C
- 构建训练集之target样本,比如集合T
- 进行10轮迭代,在每一轮迭代中:
- 用(A T)作为训练集,训练得到模型
- 用(B T)作为训练集,训练得到模型
- 用(C T)作为训练集,训练得到模型
- 对三个模型,根据预测效果偏差,加权(公式见《算法描述》部分),给出这一轮的预测;以及更新样本权重。
6. 记录每一轮的预测效果,包括如下参数:
- source样本选什么商品作为iphone13的“迁移源sku”?
- source样本选取多少SKU合适?
- source样本要不要加上人造样本?
- source样本选哪些时间段的销售历史数据?
- 开卖第几周的时候,迁移学习预测效果最好?1周?2周?3周?4周?
7. 打印日志,统计分析,得到《目标》中所设立的验证目标。
数据处理的步骤
1.获取预测需要的商品特征数据:品类特征(价位,内存,屏幕尺寸,GPU等等),品牌。
注意:这些特征,需要是目前生产系统已经在使用的特征,而不要引入新特征。否则,等side by side 对比迁移学习的预测效果,和生产系统的预测效果,哪个更好的时候,不能确定是新特征的作用还是新算法的作用。
2.获取历史销售数据:包括预测所需要的特征:各周促销力度,各周节假日天数,当周天气情况(因为会影响门店客流量),历史当周销量,成交单价
其中需要考虑,剔除一些不希望干涉的历史销售数据。
这里就需要一些业务常识和业务经验,比如,批发渠道的销售,清仓处理的价格异常的销售,等等。
3.构建训练集之source样本;分成3个source样本集合,比如集合A,集合B,集合C
- 和待预测新品的,四级品类,品牌,都相同
- Sku状态是“正常”。因为不希望处于“预备下市、下市“阶段的老品的销售样本干扰模型的学习。
- “最早周销量大于0的日期”,“最近周销量大于0的日期”,二者相差52周以上;并且非零周数大于14周。因为希望选取“迁移源”的SKU是有充足的销售历史样本可供模型学习的。那种销售曲线断点太多太异常的sku就不想拿来作为学习样本。
尝试用以下几种条件,圈定source样本的SKU:
- 和新品价位相同的同品类的老品
- 历史上新开卖日销量,和和新品开卖的日销量接近的老品(TOP 10?)
- 波动系数和“新品开卖前N周的波动系数”最接近的老品(TOP 10?)
- 去年同期上线/开卖的同品牌的老品
- 品类规格“高中低档次”接近的老品(比如,手机来说今年的256G配置相当于去年的128G配置)
- 线上老品中,当前LGBM模型预测已经预测较好的老品(因为TrAdaBoost的算法使用的base_regression=LGBMRegressor),所以选LGBM预测效果好的老品作为迁移源sku也是一个思路。
- 以上的其中某几个条件的组合
4.构建训练集之target样本,比如集合T
5.进行10轮迭代,在每一轮迭代中:
- 用(A T)作为训练集,训练得到模型
- 用(B T)作为训练集,训练得到模型
- 用(C T)作为训练集,训练得到模型
- 对三个模型,根据预测效果偏差,加权(公式见《算法描述》部分),给出这一轮的预测;以及更新样本权重。
6.记录每一轮的预测效果,包括如下参数:
- 每轮模型的销量预测的偏差率。通过这个日志可以观察到,10轮迭代中偏差率是不是一直在变好?否则可以考虑迭代20轮,或者减少为迭代5轮即可。
即model =TrAdaboostRegression(base_regression=LGBMRegressor(boosting_type=dart
, random_state=666, n_estimators=400,max_depth=1, learning_rate=0.11), N= 10)
里面的N=10的参数设置。
- source样本选什么商品作为iphone13的“迁移源sku”?
- source样本选取多少SKU合适?
- source样本要不要加上人造样本?
- source样本选哪些时间段的销售历史数据?
- 开卖第几周的时候,迁移学习预测效果最好?1周?2周?3周?4周?
7.打印日志,统计分析,得到《目标》中所设立的验证目标。
log_df = pd.DataFrame({
目标_sku:[target_sku],
源sku个数:[len(each_source_set)],
源sku集合:[each_source_set],
使用源sku同期数据or开卖数据:[tongqi_or_kaimai],
forecast_date:[forecast_date], ###预测日期
源sku的优选规则:[each_source_sku_selection_criteria],
是否加人工样本:[shifou_rengong_yangben],
各个源sku训练样本量周数:[[a.shape[0] for a inx_sources]],
target_sku训练样本量_开卖第几周:[x_target.shape[0]],
target_sku测试集周数:[x_test.shape[0]],
real_sales:[y_test],
prd_fcst:[[np.round(a,2) for a in prd_predict]],
迁移学习fcst:[[np.round(a,2) for a in h_hat]],
训练集_每次迭代epsilon_t:[[np.round(a,3) for a intrain_epsilon_t_list]], ##每轮模型的销量预测的偏差率
训练集_每次迭代效果mape:[[np.round(a,3) for a intrain_mape_list]],
测试集_每次迭代mape:[test_mape],
时光机中现状mape:[np.round(prd_mape,3)]
})
备注:
epsilon_t =self._calculate_error_rate(y_target, final_predict, weight_target) ##每轮模型的销量预测的偏差率
train_epsilon_t_list.append(epsilon_t) ###打印到日志中。
- 验证结论:总体结论
维度:
销量预测是在“SKU 仓网大区”的组合维度上;促销力度是“品类 大区”维度、天气等特征也可以在大区的维度上聚集统计。
指标:
迁移算法 vs 老算法的以下指标:
缺货数量
过剩数量
Mape
品类断货率( 发生断货的SKU个数 /SKU总个数)
总结:
迁移学习预测结果,在source样本sku选择合适的情况下,缺断货的情况比现状线上的模型表现要更好,mape更小。
存疑分析
- 对于一些小品牌,按照“同四级品类 同品牌”的要求找source sku,符合条件的sku个数过少。需要验证一下是不是要放宽到三级品类、或者二级品类;或者干脆不要限制品牌、只找价位近似的同品类老品SKU。
- 第几周开卖的时候,用迁移学习的效果最好?这个问题的答案,在不同品类和品牌上不够稳定。有的在第2,3周最好,有的在7,8周最好。还没有看到规律。
个例展示
后续思路
考虑工程化后大批量验证。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至123456@qq.com 举报,一经查实,本站将立刻删除。