铛铛!小秘籍来咯!
小秘籍希望大家都能轻松建模呀,mathorcup比赛也会持续给大家放松思路滴~
抓紧小秘籍,我们出发吧~
来看看 MathorCup大数据竞赛的B题
完整版内容在文末领取噢~
问题重述
问题一:需求量预测
- 问题描述:根据历史六个月的需求量数据,预测各商家在各仓库的商品在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,bHW,bY
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(t−1)+Ssmooth(t−1))
其中:
- 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天的需求
#见完整代码
完整内容点击下方名片详细了解噢~
一起来关注数学建模小秘籍 冲刺mathorcup大奖!