铛铛!小秘籍来咯!
小秘籍希望大家都能轻松建模呀,mathorcup比赛也会持续给大家放松思路滴~
抓紧小秘籍,我们出发吧~
来看看 MathorCup大数据竞赛的B题
问题一:需求量预测
问题二:新维度的需求量预测
问题三:大型促销期需求预测
问题一是一个需求预测问题,可以使用神经网络来建模。以下是问题一的具体建模思路,包括神经网络的一般结构和公式:
步骤1:数据准备
步骤2:数据预处理
步骤3:神经网络模型建立
步骤4:特征编码
步骤5:神经网络结构
步骤6:损失函数和优化器
步骤7:训练模型
步骤8:模型评估
步骤9:预测需求
下面是一个简化的神经网络结构的示例,其中 (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:数据准备
步骤2:数据预处理
步骤3:特征选择
步骤4:模型选择
步骤5:模型训练
步骤6:模型预测
步骤7:结果记录
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:数据准备
步骤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)
其中:
步骤4:季节性平滑
步骤5:预测建模
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))
其中:
步骤6:模型训练和预测
步骤7:结果记录
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题)