鐺鐺!小秘籍來(lái)咯!
小秘籍希望大家都能輕松建模呀,mathorcup比賽也會(huì)持續(xù)給大家放松思路滴~
抓緊小秘籍,我們出發(fā)吧~
來(lái)看看 MathorCup大數(shù)據(jù)競(jìng)賽的B題
完整版內(nèi)容在文末領(lǐng)取噢~
問(wèn)題重述
問(wèn)題一:需求量預(yù)測(cè)
- 問(wèn)題描述:根據(jù)歷史六個(gè)月的需求量數(shù)據(jù),預(yù)測(cè)各商家在各倉(cāng)庫(kù)的商品在2023年5月16日至2023年5月30日期間的需求量。需求量是商家、倉(cāng)庫(kù)和商品的組合,預(yù)測(cè)需要考慮不同組合的需求。
- 數(shù)據(jù):歷史需求量數(shù)據(jù)(附件1)、商家信息(附件3)、倉(cāng)庫(kù)信息(附件4)。
- 輸出:預(yù)測(cè)結(jié)果表1。
問(wèn)題二:新維度的需求量預(yù)測(cè)
- 問(wèn)題描述:針對(duì)一些新出現(xiàn)的商家+倉(cāng)庫(kù)+商品維度,預(yù)測(cè)它們?cè)?023年5月16日至2023年5月30日期間的需求量。新維度可能是新上市的商品或改變了某些商品所存放的倉(cāng)庫(kù)。
- 數(shù)據(jù):歷史需求量數(shù)據(jù)(附件1)、商家信息(附件3)、倉(cāng)庫(kù)信息(附件4)、新維度數(shù)據(jù)(附件5)。
- 輸出:預(yù)測(cè)結(jié)果表2。
問(wèn)題三:大型促銷期需求預(yù)測(cè)
- 問(wèn)題描述:每年6月會(huì)出現(xiàn)規(guī)律性的大型促銷,需要精確預(yù)測(cè)商家+倉(cāng)庫(kù)+商品維度在2023年6月1日至2023年6月20日期間的需求量,以應(yīng)對(duì)挑戰(zhàn)。
- 數(shù)據(jù):歷史需求量數(shù)據(jù)(附件1)、歷年6月大型促銷期需求數(shù)據(jù)(附件6)。
- 輸出:預(yù)測(cè)結(jié)果表3。
問(wèn)題思路
問(wèn)題一
問(wèn)題一是一個(gè)需求預(yù)測(cè)問(wèn)題,可以使用神經(jīng)網(wǎng)絡(luò)來(lái)建模。以下是問(wèn)題一的具體建模思路,包括神經(jīng)網(wǎng)絡(luò)的一般結(jié)構(gòu)和公式:
步驟1:數(shù)據(jù)準(zhǔn)備
- 從附件1-4中讀取歷史數(shù)據(jù),包括商家、倉(cāng)庫(kù)、商品的信息以及需求量數(shù)據(jù)。
步驟2:數(shù)據(jù)預(yù)處理
- 對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,包括數(shù)據(jù)清洗、缺失值處理和特征工程。將需要的特征提取出來(lái),如商家信息、倉(cāng)庫(kù)信息、商品信息,以及時(shí)間信息(日期)。
步驟3:神經(jīng)網(wǎng)絡(luò)模型建立
- 使用神經(jīng)網(wǎng)絡(luò)來(lái)建立需求預(yù)測(cè)模型。一種常見(jiàn)的結(jié)構(gòu)是循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)或長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)(LSTM),因?yàn)樗鼈冞m用于時(shí)間序列數(shù)據(jù)。
步驟4:特征編碼
- 對(duì)商家、倉(cāng)庫(kù)、商品等分類特征進(jìn)行編碼,可以使用獨(dú)熱編碼(One-Hot Encoding)等方法,將分類信息轉(zhuǎn)化為數(shù)值形式。
步驟5:神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
- 神經(jīng)網(wǎng)絡(luò)的輸入層包括編碼后的商家、倉(cāng)庫(kù)、商品信息和時(shí)間信息。中間層可以包含多個(gè)神經(jīng)元,用于學(xué)習(xí)數(shù)據(jù)中的復(fù)雜模式。輸出層通常只有一個(gè)神經(jīng)元,用于預(yù)測(cè)需求量。
步驟6:損失函數(shù)和優(yōu)化器
- 定義損失函數(shù),通常是均方誤差(Mean Squared Error,MSE),用于衡量模型的預(yù)測(cè)誤差。選擇合適的優(yōu)化器,如隨機(jī)梯度下降(SGD)或Adam,來(lái)最小化損失函數(shù)。
步驟7:訓(xùn)練模型
- 使用歷史數(shù)據(jù)進(jìn)行模型訓(xùn)練。將數(shù)據(jù)分為訓(xùn)練集和驗(yàn)證集,以便評(píng)估模型性能。通過(guò)反向傳播算法來(lái)更新神經(jīng)網(wǎng)絡(luò)的權(quán)重和偏差,使模型適應(yīng)歷史數(shù)據(jù)。
步驟8:模型評(píng)估
- 使用驗(yàn)證集數(shù)據(jù)來(lái)評(píng)估模型的性能,包括計(jì)算預(yù)測(cè)準(zhǔn)確度、均方根誤差(RMSE)等指標(biāo)。根據(jù)評(píng)估結(jié)果來(lái)調(diào)整模型的超參數(shù)。
步驟9:預(yù)測(cè)需求
- 使用訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)模型來(lái)預(yù)測(cè)商家在各倉(cāng)庫(kù)的各商品的需求量,針對(duì)2023-05-16至2023-05-30的時(shí)間段。
下面是一個(gè)簡(jiǎn)化的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的示例,其中 (X) 表示輸入特征,(W) 和 (b) 表示權(quán)重和偏差,(H) 表示隱藏層,(Y) 表示需求預(yù)測(cè):
神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)公式:
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
# 讀取數(shù)據(jù)
data = pd.read_csv('附件1.csv')
# 數(shù)據(jù)預(yù)處理
# 假設(shè)商家、倉(cāng)庫(kù)、商品等分類信息已編碼為數(shù)值
# 將日期轉(zhuǎn)換為日期時(shí)間對(duì)象
data['date'] = pd.to_datetime(data['date'])
# 將數(shù)據(jù)按商家、倉(cāng)庫(kù)、商品分組,以準(zhǔn)備進(jìn)行預(yù)測(cè)
grouped = data.groupby(['seller_no', 'warehouse_no', 'product_no'])
# 存儲(chǔ)預(yù)測(cè)結(jié)果
result_table_1 = pd.DataFrame(columns=['seller_no', 'warehouse_no', 'product_no', 'date', 'predicted_demand'])
# 循環(huán)處理每個(gè)組
for group, group_data in grouped:
seller, warehouse, product = group
# 特征選擇:這里可以根據(jù)實(shí)際情況選擇需要的特征
features = group_data[['date', 'qty']].copy()
# 將日期設(shè)置為索引
features.set_index('date', inplace=True)
# 數(shù)據(jù)標(biāo)準(zhǔn)化
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)
# 劃分訓(xùn)練集和測(cè)試集
train_size = int(len(scaled_features) * 0.8)
train_data, test_data = scaled_features[:train_size], scaled_features[train_size:]
# 創(chuàng)建時(shí)間窗口數(shù)據(jù)
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 # 可以根據(jù)數(shù)據(jù)和問(wèn)題調(diào)整
train_sequences = create_sequences(train_data, seq_length)
test_sequences = create_sequences(test_data, seq_length)
# 分割特征和標(biāo)簽
X_train, y_train = train_sequences[:, :-1], train_sequences[:, -1]
X_test, y_test = test_sequences[:, :-1], test_sequences[:, -1]
# 構(gòu)建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))
# 訓(xùn)練模型
model.fit(X_train, y_train, epochs=100, batch_size=32, verbose=0)
# 使用模型進(jìn)行預(yù)測(cè)
問(wèn)題二
解決問(wèn)題二,即針對(duì)新出現(xiàn)的商家+倉(cāng)庫(kù)+商品維度進(jìn)行需求預(yù)測(cè),可以使用神經(jīng)網(wǎng)絡(luò)模型。以下是問(wèn)題二的具體建模思路:
步驟1:數(shù)據(jù)準(zhǔn)備
- 從附件1-4中讀取歷史數(shù)據(jù),包括商家、倉(cāng)庫(kù)、商品的信息以及需求量數(shù)據(jù)。
- 從附件5中讀取新出現(xiàn)的商家+倉(cāng)庫(kù)+商品維度數(shù)據(jù)。
步驟2:數(shù)據(jù)預(yù)處理
- 對(duì)歷史數(shù)據(jù)進(jìn)行預(yù)處理,包括數(shù)據(jù)清洗、缺失值處理和特征工程。
- 對(duì)新出現(xiàn)的維度數(shù)據(jù)進(jìn)行編碼,以便用于模型訓(xùn)練和預(yù)測(cè)。
- 將日期字段轉(zhuǎn)換為日期時(shí)間對(duì)象。
步驟3:特征選擇
- 選擇需要的特征,這可能包括商家信息、倉(cāng)庫(kù)信息、商品信息、時(shí)間信息等。
- 對(duì)分類特征進(jìn)行編碼,如獨(dú)熱編碼。
步驟4:模型選擇
- 選擇合適的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),可以使用前饋神經(jīng)網(wǎng)絡(luò)(Feedforward Neural Network)、循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)或長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)(Long Short-Term Memory,LSTM)等。
- 確定網(wǎng)絡(luò)的層數(shù)和每一層的神經(jīng)元數(shù)量。
步驟5:模型訓(xùn)練
- 使用歷史數(shù)據(jù)來(lái)訓(xùn)練模型,將新出現(xiàn)的商家+倉(cāng)庫(kù)+商品維度數(shù)據(jù)作為訓(xùn)練集。
- 定義損失函數(shù),通常是均方誤差(Mean Squared Error,MSE),用于衡量模型的預(yù)測(cè)誤差。
- 選擇優(yōu)化器,如隨機(jī)梯度下降(Stochastic Gradient Descent,SGD)或Adam,來(lái)最小化損失函數(shù)。
- 訓(xùn)練模型,迭代多輪直到損失函數(shù)收斂。
步驟6:模型預(yù)測(cè)
- 使用訓(xùn)練好的模型對(duì)2023-05-16至2023-05-30的需求進(jìn)行預(yù)測(cè),將新出現(xiàn)的商家+倉(cāng)庫(kù)+商品維度數(shù)據(jù)作為輸入。
- 得到預(yù)測(cè)值作為問(wèn)題二的答案。
步驟7:結(jié)果記錄文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-713867.html
- 將預(yù)測(cè)結(jié)果填寫在結(jié)果表2中,并上傳至平臺(tái)。
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
# 讀取歷史數(shù)據(jù)
historical_data = pd.read_csv('附件1.csv')
# 讀取新維度數(shù)據(jù)
new_dimension_data = pd.read_csv('附件5.csv')
# 數(shù)據(jù)預(yù)處理
# 對(duì)歷史數(shù)據(jù)進(jìn)行預(yù)處理,包括數(shù)據(jù)清洗和特征工程
# 對(duì)新維度數(shù)據(jù)進(jìn)行編碼,以便用于模型訓(xùn)練和預(yù)測(cè)
# 假設(shè)商家、倉(cāng)庫(kù)、商品等分類信息已編碼為數(shù)值
# 創(chuàng)建訓(xùn)練集和測(cè)試集
train_data, test_data = train_test_split(historical_data, test_size=0.2, random_state=42)
# 特征選擇
# 選擇需要的特征,這可能包括商家信息、倉(cāng)庫(kù)信息、商品信息、時(shí)間信息等
# 對(duì)分類特征進(jìn)行編碼,如獨(dú)熱編碼
# 數(shù)據(jù)標(biāo)準(zhǔn)化
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])
# 超參數(shù)設(shè)置
lstm_neurons = 64 # LSTM層中的神經(jīng)元數(shù)量
learning_rate = 0.001
# 構(gòu)建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ùn)練模型
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)
# 使用模型進(jìn)行預(yù)測(cè)
predictions = model.predict(X_test)
mse = mean_squared_error(y_test, predictions)
# 針對(duì)新維度數(shù)據(jù)進(jìn)行預(yù)測(cè)
new_dimension_X = new_dimension_data[features] # 選擇需要的特征
new_dimension_predictions = model.predict(new_dimension_X)
# 將新維度數(shù)據(jù)的預(yù)測(cè)結(jié)果添加到新維度數(shù)據(jù)框中
# 保存結(jié)果表2到CSV文件
new_dimension_data.to_csv('結(jié)果表2.csv', index=False)
#見(jiàn)完整代碼
問(wèn)題三
問(wèn)題三的建模思路是對(duì)每年6月的大型促銷期的需求精確預(yù)測(cè)。我們可以采用時(shí)間序列分析方法,具體來(lái)說(shuō),使用季節(jié)性分解和指數(shù)平滑法來(lái)建立預(yù)測(cè)模型。以下是具體步驟和公式:
步驟1:數(shù)據(jù)準(zhǔn)備
- 從附件1中讀取歷史數(shù)據(jù),包括每年6月的需求量數(shù)據(jù)。
- 從附件6中讀取去年雙十一期間的需求量數(shù)據(jù),作為訓(xùn)練數(shù)據(jù)。
步驟2:數(shù)據(jù)預(yù)處理
- 對(duì)歷史數(shù)據(jù)進(jìn)行預(yù)處理,包括數(shù)據(jù)清洗和日期處理。
- 將數(shù)據(jù)按日期排序,確保時(shí)間序列的連續(xù)性。
步驟3:時(shí)間序列分解
- 首先,對(duì)歷史數(shù)據(jù)進(jìn)行時(shí)間序列分解,以拆分成趨勢(shì)、季節(jié)和殘差三個(gè)部分。時(shí)間序列分解通常使用加法模型,表示為:
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)) 是在時(shí)間 (t) 的觀測(cè)值(需求量)。
- (T(t)) 是趨勢(shì)成分。
- (S(t)) 是季節(jié)成分。
- (R(t)) 是殘差成分。
步驟4:季節(jié)性平滑
- 對(duì)季節(jié)成分 (S(t)) 進(jìn)行平滑,以便更好地捕捉季節(jié)性變化。這可以使用指數(shù)平滑法來(lái)實(shí)現(xiàn),其中 (S(t)) 被平滑為 (S_{smooth}(t))。
步驟5:預(yù)測(cè)建模
- 使用經(jīng)過(guò)季節(jié)性平滑的季節(jié)成分 (S_{smooth}(t)) 來(lái)建立預(yù)測(cè)模型,例如指數(shù)平滑法。模型可以表示為:
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) 是在時(shí)間 (t) 的預(yù)測(cè)值。
- α \alpha α是平滑參數(shù),通常在0和1之間選擇。
步驟6:模型訓(xùn)練和預(yù)測(cè)
- 使用歷史數(shù)據(jù)(去年雙十一期間的數(shù)據(jù))來(lái)訓(xùn)練模型,估計(jì)參數(shù) α \alpha α。
- 使用模型對(duì)2023年6月1日至2023年6月20日的需求進(jìn)行預(yù)測(cè)。
步驟7:結(jié)果記錄
- 將預(yù)測(cè)結(jié)果填寫在結(jié)果表3中,并上傳至競(jìng)賽平臺(tái)。
import pandas as pd
import numpy as np
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.holtwinters import ExponentialSmoothing
# 讀取歷史數(shù)據(jù)
historical_data = pd.read_csv('附件1.csv')
# 讀取去年雙十一期間的數(shù)據(jù)
last_year_data = pd.read_csv('附件6.csv')
# 數(shù)據(jù)預(yù)處理
historical_data['日期'] = pd.to_datetime(historical_data['日期'])
historical_data.set_index('日期', inplace=True)
# 時(shí)間序列分解
result = seasonal_decompose(historical_data['需求量'], model='additive', period=12)
trend = result.trend
seasonal = result.seasonal
residual = result.resid
# 指數(shù)平滑法
alpha = 0.2 # 平滑參數(shù),根據(jù)數(shù)據(jù)調(diào)整
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) # 預(yù)測(cè)未來(lái)20天的需求
#見(jiàn)完整代碼
完整內(nèi)容點(diǎn)擊下方名片詳細(xì)了解噢~
一起來(lái)關(guān)注數(shù)學(xué)建模小秘籍 沖刺mathorcup大獎(jiǎng)!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-713867.html
到了這里,關(guān)于2023 年 MathorCup 高校數(shù)學(xué)建模挑戰(zhàn)賽大數(shù)據(jù)競(jìng)賽(B題)|電商零售商家需求預(yù)測(cè)及庫(kù)存優(yōu)化問(wèn)題|建模秘籍&文章代碼思路大全的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!