基于lightgbm的销售预测
【摘要】 一、基于lightgbm的销售预测https://www.kaggle.com/c/m5-forecasting-uncertainty注意:这是共同构成 M5 预测挑战的两个互补竞赛之一。您能否尽可能准确地估计沃尔玛在美国销售的各种产品的单位销售额的不确定性分布?这种特定的比赛是同类比赛中的第一...
一、基于lightgbm的销售预测
https://www.kaggle.com/c/m5-forecasting-uncertainty
注意:这是共同构成 M5 预测挑战的两个互补竞赛之一。您能否尽可能准确地估计沃尔玛在美国销售的各种产品的单位销售额的不确定性分布?这种特定的比赛是同类比赛中的第一次,为学术研究以及如何在组织中评估和使用不确定性开辟了新的方向。如果您有兴趣为同一系列提供点(准确度)预测,请务必查看它的同伴竞争。
一年中,一家商店每个月能卖多少野营装备?对于外行来说,计算这个级别的销售额似乎和预测天气一样困难。两种类型的预测都依赖于科学和历史数据。虽然错误的天气预报可能会导致您在阳光明媚的日子随身携带雨伞,但不准确的业务预测可能会导致实际或机会损失。在本次比赛中,除了传统的预测方法外,您还面临使用机器学习来提高预测准确性的挑战。
二、环境准备
1.GluonTS时序包安装
与时间序列有关的最常见机器学习任务,包括预测、平滑处理、 侦测(例如界外值、异常点或变化点侦测)以及分类等。
借助 GluonTS,用户可以利用包含有用抽象的预构建块来构建时间序列模型。GluonTS 还利用这些构建块构建了流行模型的参考实现,这些参考实现既可以作为模型探索的出发点,也可以用于模型的比较。
https://zhuanlan.zhihu.com/p/433074172
pip install gluonts --quiet
2.导入包
import numpy as np
import pandas as pd
import os
import random
import math
from decimal import Decimal as dec
import datetime
import time
import gc
import lightgbm as lgb
import pickle
from gluonts.model.rotbaum._model import LSF
import warnings
warnings.filterwarnings("ignore", category=UserWarning)
三、训练 和预测
1.定义训练预测函数
def predict_uncertainty(end_train_day_x_list, prediction_horizon_list, min_bin_size, quantile):
store_id_set_list = ['CA_1', 'CA_2', 'CA_3', 'CA_4', 'TX_1', 'TX_2', 'TX_3', 'WI_1', 'WI_2', 'WI_3']
print(f"predicting quantile={quantile}")
pred_v_all_df = list()
for end_train_day_x in end_train_day_x_list:
previous_prediction_horizon = 0
for prediction_horizon in prediction_horizon_list:
print(f"prediction horizon=+{prediction_horizon}")
notebook_name = f"../input/m5-train-day-{end_train_day_x}-horizon-{prediction_horizon}"
pred_v_df = pd.DataFrame()
for store_index, store_id in enumerate(store_id_set_list):
model_path = str(f'{notebook_name}/lgb_model_{store_id}_{prediction_horizon}.bin')
print(f'loading {model_path}')
estimator = pickle.load(open(model_path, 'rb'))
base_test = pd.read_feather(f"{notebook_name}/test_{store_id}_{prediction_horizon}.feather")
enable_features = [col for col in base_test.columns if col not in ['id', 'd', 'sales']]
grid_full = pd.read_feather(f"{notebook_name}/grid_full_store_{store_id}_{end_train_day_x}_to_{end_train_day_x + prediction_horizon}.feather")
lsf = LSF(model=estimator, min_bin_size=min_bin_size)
lsf.fit(x_train=grid_full[enable_features], y_train=grid_full['sales'].fillna(0),
seed=0, x_train_is_dataframe=True, model_is_already_trained=True)
for predict_day in range(previous_prediction_horizon + 1, prediction_horizon + 1):
print('[{3} -> {4}] predict {0}/{1} {2} day {5}'.format(
store_index + 1, len(store_id_set_list), store_id,
previous_prediction_horizon + 1, prediction_horizon, predict_day))
mask = base_test['d'] == (end_train_day_x + predict_day)
base_test.loc[mask, 'sales'] = lsf.predict(base_test[mask][enable_features], quantile=quantile)
temp_v_df = base_test[
(base_test['d'] >= end_train_day_x + previous_prediction_horizon + 1) &
(base_test['d'] < end_train_day_x + prediction_horizon + 1)
][['id', 'd', 'sales']]
if len(pred_v_df)!=0:
pred_v_df = pd.concat([pred_v_df, temp_v_df])
else:
pred_v_df = temp_v_df.copy()
del(temp_v_df)
gc.collect()
previous_prediction_horizon = prediction_horizon
pred_v_all_df.append(pred_v_df)
pred_v_all_df = pd.concat(pred_v_all_df)
submission = pd.read_csv("../input/m5-forecasting-accuracy/sample_submission.csv")
pred_v_all_df.d = pred_v_all_df.d - end_train_day_x_list
pred_h_all_df = pred_v_all_df.pivot(index='id', columns='d', values='sales')
pred_h_all_df = pred_h_all_df.reset_index()
pred_h_all_df.columns = submission.columns
submission = submission[['id']].merge(pred_h_all_df, on=['id'], how='left').fillna(0)
submission.to_csv(f"m5_predictions_quantile={quantile}.csv", index=False)
2.预测
for quantile in [0.005, 0.025, 0.165, 0.25 , 0.5 , 0.75 , 0.835, 0.975, 0.995]:
predict_uncertainty(end_train_day_x_list=[1941],
prediction_horizon_list=[7, 14, 21, 28],
min_bin_size=300,
quantile=quantile)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)