1. 首页
  2. > 代理记账 >

销量预测模型(销量预测模型 xgboost)

目标和工作计划





目标

大家都听过美国计算机科学家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周?





工作计划

  1. 获取预测需要的商品特征数据:品类特征(价位,内存,屏幕尺寸,GPU等等),品牌。
  2. 获取历史销售数据:包括预测所需要的特征:各周促销力度,各周节假日天数,当周天气情况(因为会影响门店客流量),历史当周销量,成交单价
  3. 用前面《目标》中提到的样本构建策略,轮流用各种策略,遍历尝试。寻找合适的源sku,构建训练集之source样本;分成3个source样本集合,比如集合A,集合B,集合C
  4. 构建训练集之target样本,比如集合T
  5. 进行10轮迭代,在每一轮迭代中:
  1. 用(A T)作为训练集,训练得到模型
  2. 用(B T)作为训练集,训练得到模型
  3. 用(C T)作为训练集,训练得到模型
  4. 对三个模型,根据预测效果偏差,加权(公式见《算法描述》部分),给出这一轮的预测;以及更新样本权重。

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 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息