基于lightgbm的销售预测

举报
livingbody 发表于 2022/11/22 01:10:19 2022/11/22
【摘要】 一、基于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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。