2023 年 MathorCup 高校数学建模挑战赛大数据竞赛(B题)|电商零售商家需求预测及库存优化问题|建模秘籍&文章代码思路大全

铛铛!小秘籍来咯!

小秘籍希望大家都能轻松建模呀,mathorcup比赛也会持续给大家放松思路滴~

抓紧小秘籍,我们出发吧~
来看看 MathorCup大数据竞赛的B题
2023 年 MathorCup 高校数学建模挑战赛大数据竞赛(B题)|电商零售商家需求预测及库存优化问题|建模秘籍&文章代码思路大全_第1张图片

问题重述

问题一:需求量预测

  • 问题描述:根据历史六个月的需求量数据,预测各商家在各仓库的商品在2023年5月16日至2023年5月30日期间的需求量。需求量是商家、仓库和商品的组合,预测需要考虑不同组合的需求。
  • 数据:历史需求量数据(附件1)、商家信息(附件3)、仓库信息(附件4)。
  • 输出:预测结果表1。

问题二:新维度的需求量预测

  • 问题描述:针对一些新出现的商家+仓库+商品维度,预测它们在2023年5月16日至2023年5月30日期间的需求量。新维度可能是新上市的商品或改变了某些商品所存放的仓库。
  • 数据:历史需求量数据(附件1)、商家信息(附件3)、仓库信息(附件4)、新维度数据(附件5)。
  • 输出:预测结果表2。

问题三:大型促销期需求预测

  • 问题描述:每年6月会出现规律性的大型促销,需要精确预测商家+仓库+商品维度在2023年6月1日至2023年6月20日期间的需求量,以应对挑战。
  • 数据:历史需求量数据(附件1)、历年6月大型促销期需求数据(附件6)。
  • 输出:预测结果表3。

问题思路

问题一

问题一是一个需求预测问题,可以使用神经网络来建模。以下是问题一的具体建模思路,包括神经网络的一般结构和公式:

步骤1:数据准备

  • 从附件1-4中读取历史数据,包括商家、仓库、商品的信息以及需求量数据。

步骤2:数据预处理

  • 对数据进行预处理,包括数据清洗、缺失值处理和特征工程。将需要的特征提取出来,如商家信息、仓库信息、商品信息,以及时间信息(日期)。

步骤3:神经网络模型建立

  • 使用神经网络来建立需求预测模型。一种常见的结构是循环神经网络(RNN)或长短时记忆网络(LSTM),因为它们适用于时间序列数据。

步骤4:特征编码

  • 对商家、仓库、商品等分类特征进行编码,可以使用独热编码(One-Hot Encoding)等方法,将分类信息转化为数值形式。

步骤5:神经网络结构

  • 神经网络的输入层包括编码后的商家、仓库、商品信息和时间信息。中间层可以包含多个神经元,用于学习数据中的复杂模式。输出层通常只有一个神经元,用于预测需求量。

步骤6:损失函数和优化器

  • 定义损失函数,通常是均方误差(Mean Squared Error,MSE),用于衡量模型的预测误差。选择合适的优化器,如随机梯度下降(SGD)或Adam,来最小化损失函数。

步骤7:训练模型

  • 使用历史数据进行模型训练。将数据分为训练集和验证集,以便评估模型性能。通过反向传播算法来更新神经网络的权重和偏差,使模型适应历史数据。

步骤8:模型评估

  • 使用验证集数据来评估模型的性能,包括计算预测准确度、均方根误差(RMSE)等指标。根据评估结果来调整模型的超参数。

步骤9:预测需求

  • 使用训练好的神经网络模型来预测商家在各仓库的各商品的需求量,针对2023-05-16至2023-05-30的时间段。

下面是一个简化的神经网络结构的示例,其中 (X) 表示输入特征,(W) 和 (b) 表示权重和偏差,(H) 表示隐藏层,(Y) 表示需求预测:

神经网络的结构公式:

X → W , b H → W , b Y X \xrightarrow{W, b} H \xrightarrow{W, b} Y XW,b HW,b Y

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.optimizers import Adam
from sklearn.metrics import mean_squared_error

# 读取数据
data = pd.read_csv('附件1.csv')

# 数据预处理
# 假设商家、仓库、商品等分类信息已编码为数值
# 将日期转换为日期时间对象
data['date'] = pd.to_datetime(data['date'])

# 将数据按商家、仓库、商品分组,以准备进行预测
grouped = data.groupby(['seller_no', 'warehouse_no', 'product_no'])

# 存储预测结果
result_table_1 = pd.DataFrame(columns=['seller_no', 'warehouse_no', 'product_no', 'date', 'predicted_demand'])

# 循环处理每个组
for group, group_data in grouped:
    seller, warehouse, product = group

    # 特征选择:这里可以根据实际情况选择需要的特征
    features = group_data[['date', 'qty']].copy()

    # 将日期设置为索引
    features.set_index('date', inplace=True)

    # 数据标准化
    scaler = StandardScaler()
    scaled_features = scaler.fit_transform(features)

    # 划分训练集和测试集
    train_size = int(len(scaled_features) * 0.8)
    train_data, test_data = scaled_features[:train_size], scaled_features[train_size:]

    # 创建时间窗口数据
    def create_sequences(data, seq_length):
        sequences = []
        for i in range(len(data) - seq_length):
            seq = data[i:i + seq_length]
            sequences.append(seq)
        return np.array(sequences)

    seq_length = 10  # 可以根据数据和问题调整
    train_sequences = create_sequences(train_data, seq_length)
    test_sequences = create_sequences(test_data, seq_length)

    # 分割特征和标签
    X_train, y_train = train_sequences[:, :-1], train_sequences[:, -1]
    X_test, y_test = test_sequences[:, :-1], test_sequences[:, -1]

    # 构建LSTM模型
    model = Sequential()
    model.add(LSTM(64, input_shape=(X_train.shape[1], X_train.shape[2]))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer=Adam(learning_rate=0.001))

    # 训练模型
    model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=0)

    # 使用模型进行预测

问题二

解决问题二,即针对新出现的商家+仓库+商品维度进行需求预测,可以使用神经网络模型。以下是问题二的具体建模思路:

步骤1:数据准备

  • 从附件1-4中读取历史数据,包括商家、仓库、商品的信息以及需求量数据。
  • 从附件5中读取新出现的商家+仓库+商品维度数据。

步骤2:数据预处理

  • 对历史数据进行预处理,包括数据清洗、缺失值处理和特征工程。
  • 对新出现的维度数据进行编码,以便用于模型训练和预测。
  • 将日期字段转换为日期时间对象。

步骤3:特征选择

  • 选择需要的特征,这可能包括商家信息、仓库信息、商品信息、时间信息等。
  • 对分类特征进行编码,如独热编码。

步骤4:模型选择

  • 选择合适的神经网络结构,可以使用前馈神经网络(Feedforward Neural Network)、循环神经网络(Recurrent Neural Network,RNN)或长短时记忆网络(Long Short-Term Memory,LSTM)等。
  • 确定网络的层数和每一层的神经元数量。

步骤5:模型训练

  • 使用历史数据来训练模型,将新出现的商家+仓库+商品维度数据作为训练集。
  • 定义损失函数,通常是均方误差(Mean Squared Error,MSE),用于衡量模型的预测误差。
  • 选择优化器,如随机梯度下降(Stochastic Gradient Descent,SGD)或Adam,来最小化损失函数。
  • 训练模型,迭代多轮直到损失函数收敛。

步骤6:模型预测

  • 使用训练好的模型对2023-05-16至2023-05-30的需求进行预测,将新出现的商家+仓库+商品维度数据作为输入。
  • 得到预测值作为问题二的答案。

步骤7:结果记录

  • 将预测结果填写在结果表2中,并上传至平台。
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import LSTM, Dense
from keras.optimizers import Adam
from sklearn.metrics import mean_squared_error

# 读取历史数据
historical_data = pd.read_csv('附件1.csv')

# 读取新维度数据
new_dimension_data = pd.read_csv('附件5.csv')

# 数据预处理
# 对历史数据进行预处理,包括数据清洗和特征工程
# 对新维度数据进行编码,以便用于模型训练和预测
# 假设商家、仓库、商品等分类信息已编码为数值

# 创建训练集和测试集
train_data, test_data = train_test_split(historical_data, test_size=0.2, random_state=42)

# 特征选择
# 选择需要的特征,这可能包括商家信息、仓库信息、商品信息、时间信息等
# 对分类特征进行编码,如独热编码

# 数据标准化
scaler = StandardScaler()
features = ['特征1', '特征2', ...]  # 选择需要的特征
scaler.fit(train_data[features])
train_data[features] = scaler.transform(train_data[features])
test_data[features] = scaler.transform(test_data[features])

# 超参数设置
lstm_neurons = 64  # LSTM层中的神经元数量
learning_rate = 0.001

# 构建LSTM模型
model = Sequential()
model.add(LSTM(lstm_neurons, input_shape=(len(features), 1))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer=Adam(learning_rate=learning_rate))

# 训练模型
X_train, y_train = train_data[features], train_data['需求量']
X_test, y_test = test_data[features], test_data['需求量']
model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=0)

# 使用模型进行预测
predictions = model.predict(X_test)
mse = mean_squared_error(y_test, predictions)

# 针对新维度数据进行预测
new_dimension_X = new_dimension_data[features]  # 选择需要的特征
new_dimension_predictions = model.predict(new_dimension_X)

# 将新维度数据的预测结果添加到新维度数据框中

# 保存结果表2到CSV文件
new_dimension_data.to_csv('结果表2.csv', index=False)
#见完整代码


问题三

问题三的建模思路是对每年6月的大型促销期的需求精确预测。我们可以采用时间序列分析方法,具体来说,使用季节性分解和指数平滑法来建立预测模型。以下是具体步骤和公式:

步骤1:数据准备

  • 从附件1中读取历史数据,包括每年6月的需求量数据。
  • 从附件6中读取去年双十一期间的需求量数据,作为训练数据。

步骤2:数据预处理

  • 对历史数据进行预处理,包括数据清洗和日期处理。
  • 将数据按日期排序,确保时间序列的连续性。

步骤3:时间序列分解

  • 首先,对历史数据进行时间序列分解,以拆分成趋势、季节和残差三个部分。时间序列分解通常使用加法模型,表示为:

Y ( t ) = T ( t ) + S ( t ) + R ( t ) Y(t) = T(t) + S(t) + R(t) Y(t)=T(t)+S(t)+R(t)

其中:

  • (Y(t)) 是在时间 (t) 的观测值(需求量)。
  • (T(t)) 是趋势成分。
  • (S(t)) 是季节成分。
  • (R(t)) 是残差成分。

步骤4:季节性平滑

  • 对季节成分 (S(t)) 进行平滑,以便更好地捕捉季节性变化。这可以使用指数平滑法来实现,其中 (S(t)) 被平滑为 (S_{smooth}(t))。

步骤5:预测建模

  • 使用经过季节性平滑的季节成分 (S_{smooth}(t)) 来建立预测模型,例如指数平滑法。模型可以表示为:

Y ^ ( t ) = α Y ( t ) + ( 1 − α ) ( T ( t − 1 ) + S s m o o t h ( t − 1 ) ) \hat{Y}(t) = \alpha Y(t) + (1 - \alpha)(T(t-1) + S_{smooth}(t-1)) Y^(t)=αY(t)+(1α)(T(t1)+Ssmooth(t1))

其中:

  • Y ^ ( t ) \hat{Y}(t) Y^(t) 是在时间 (t) 的预测值。
  • α \alpha α是平滑参数,通常在0和1之间选择。

步骤6:模型训练和预测

  • 使用历史数据(去年双十一期间的数据)来训练模型,估计参数 α \alpha α
  • 使用模型对2023年6月1日至2023年6月20日的需求进行预测。

步骤7:结果记录

  • 将预测结果填写在结果表3中,并上传至竞赛平台。
import pandas as pd
import numpy as np
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.holtwinters import ExponentialSmoothing

# 读取历史数据
historical_data = pd.read_csv('附件1.csv')

# 读取去年双十一期间的数据
last_year_data = pd.read_csv('附件6.csv')

# 数据预处理
historical_data['日期'] = pd.to_datetime(historical_data['日期'])
historical_data.set_index('日期', inplace=True)

# 时间序列分解
result = seasonal_decompose(historical_data['需求量'], model='additive', period=12)
trend = result.trend
seasonal = result.seasonal
residual = result.resid

# 指数平滑法
alpha = 0.2  # 平滑参数,根据数据调整
train_data = last_year_data['需求量']
model = ExponentialSmoothing(train_data, seasonal='add', seasonal_periods=12)
model_fit = model.fit(smoothing_level=alpha, optimized=False)
forecast = model_fit.forecast(steps=20)  # 预测未来20天的需求
#见完整代码

完整代码+思路看这里:
2023 年 MathorCup 高校数学建模挑战赛大数据竞赛(B题)

你可能感兴趣的:(数学建模,大数据)