Data2
Walmart Sales
Walmart Sales
資料名稱:Walmart Sales
總共筆數:6435
變數:8
預測目標:'Weekly_Sales' (銷售額)
資料來源:Kaggle. https://www.kaggle.com/datasets/mikhail1681/walmart-sales [7]
1. Store:
📌 意義:店鋪編號
📌 總共編號數:1~45
📌其他:每家店舖各取143週做調查(143*45=6435)
2. Date:
📌 意義:銷售週開始日
📌 開始日期: 05-02-2010 (日-月-年)
📌結束日期: 26-10-2012 (日-月-年)
3. Weekly_Sales:
📌 意義:每週的銷售額
📌Weekly_Sales 的最大值: 3818686.45(美金)
📌Weekly_Sales 的最小值:209986.25(美金)
4. Holiday_Flag:
📌 意義: 1:當週有特殊放假日
0:當週沒有特殊放假日
5. Temperature:
📌意義:該地區當週的平均溫度(單位:華氏)
6. Fuel_Price:
📌意義:該地區當週的平均油價(單位:美元/加侖)
7. CPI:
📌意義:消費者物價指數
(調查消費者購買商品或服務的價格,並以過去做比較,利用指數的形式呈現其變動的經濟指標。
主要目的是想要測定物價本身發生甚麼樣的變化(反映通膨程度)。)
8. Unemployment:
📌 意義:該地區失業率(單位:百分比)
step1: 檢查遺失值。
📍檢查後發現沒有遺失值。
step2: 改變'Date'格式:05-02-2010 -> 2010-02-05。
step3: 將年、月、日切割成三個欄位,並挑選出'month'欄位,因為月份可以反映出當週銷售額是否有受到節日的影響;
沒有挑選出日的原因是因為,每週開始的數字不同,套入模型中後所跑出來的rmse值會沒有參考性。[8]
step4: 選變數
X變數: 'Store' , 'Holiday_Flag' , 'Temperature' , 'Fuel_Price' , 'CPI' , 'Unemployment' , 'month'
Y變數: 'Weekly_Sales'
step5: 變數處理
連續型:
X變數:'Temperature', 'Fuel_Price', 'CPI','Unemployment'
Y變數: 'Weekly_Sales'
📍處理方式:標準化(StandardScaler),最後輸出的RMSE值有再還原。
類別型:
X變數: 'month', 'Store' ,'Holiday_Flag'
📍處理方式: 獨熱編碼(One-Hot Encoding),將類別型變數轉為數值型。
📍處理結果:
📌'month': 1~12月,共十二個特徵。
📌'Store' : 1~45個店家,共四十五個特徵。
📌'Holiday_Flag': 0,1,共兩個特徵。
step6: 使用ElasticNet模型,做特徵篩選,以避免過擬合(Overfitting) 的問題。
📍篩選出來的特徵數量:60(因為有做熱編碼處理,所以篩選出來的特徵數量比原本的變數數量多。)
📍篩選出來的特徵名稱: 'Store_5', 'Store_36', 'Store_3', 'Store_30', 'Store_9', 'Store_37', 'Store_4', 'Store_13', 'Store_16', 'Store_10', 'Store_43', 'Store_33', 'Store_21', 'Store_7', 'Store_25', 'Store_44', 'Store_27', 'Store_14', 'Store_8', 'Store_20', 'Store_38', 'Store_45', 'Store_29', 'Store_42', 'Store_15', 'Store_28', 'Store_2', 'Store_19', 'Store_24', 'month_12', 'Store_23', 'CPI', 'Store_11', 'Store_32', 'month_11', 'Store_17', 'Store_35', 'Store_40', 'month_2', 'Store_31', 'Store_41', 'month_4', 'month_3', 'month_6', 'Store_12', 'month_5', 'Store_39', 'month_8', 'Unemployment', 'Store_22', 'Store_34', 'month_7', 'Store_26', 'Temperature', 'Holiday_Flag_1', 'Store_18', 'month_10', 'Fuel_Price', 'Store_6', 'month_9'
step7: 使用twinning分割訓練集和測試集。
step8: 使用 Optuna 超參數調優,並且使用最佳超參數訓練基礎模型。
📍定義基礎模型列表,包含:
📌XGBoost Regressor
📌CatBoost
📌Random Forest
📌Gradient Boosting
📌Histogram-based Gradient Boosting
📌Support Vector Regression
📌Decision Tree
📌Bayesian Ridge
📌Linear Regression
step9: 訓練整合式模型,以便於做比較。
📍Stacking
📍Covariate Dependent Stacking (CDST)
📍Optimal Linear Stacked Generalization with Bias Reduction and Covariation Modification
(OPEC-Stacking)
step11:進行模型評估。
📍計算每個基礎模型以及整合式模型的訓練集和測試集 RMSE。
step12:結果可視化。
📍繪製陡坡圖 (Steep curve ) 比較不同模型的表現。
所有模型 RMSE 結果:
模型:XGBoost Regressor
測試集 RMSE: 1178405.4457
訓練集 RMSE: 1180367.0814
模型: CatBoost Regressor
測試集 RMSE: 1157489.7611
訓練集 RMSE: 1160125.1419
模型: Random Forest Regressor
測試集 RMSE: 1545336.5482
訓練集 RMSE: 1550629.1249
模型: Gradient Boosting Regressor
測試集 RMSE:1254781.9355
訓練集 RMSE: 1256517.1707
模型: Histogram-based Gradient Boosting Regressor
測試集 RMSE: 1230379.3423
訓練集 RMSE: 1233857.7766
模型:Support Vector Regression(SVR)
測試集 RMSE: 1141343.2840
訓練集 RMSE: 1136615.2396
模型: Decision Tree Regressor
測試集 RMSE: 1517298.73
訓練集 RMSE: 1516193.59
模型: Bayesian Ridge
測試集 RMSE: 1156312.9772
訓練集 RMSE: 1160664.4371
模型: Linear Regression Regressor
測試集 RMSE: 1160644.8136
訓練集 RMSE: 1156205.6650
模型: Stacking
測試集 RMSE: 1793444.3119
訓練集 RMSE: 1790978.7705
模型: CDST
測試集 RMSE: 1134418.7471
訓練集 RMSE: 1128107.8038
模型: OPEC-Stacking
測試集 RMSE: 1134529.4786
訓練集 RMSE: 1136908.3805
從上圖中可以看出:
模型性能排名:整體來看,左側的模型(如CDST、OPEC-Stacking、SVR等)表現最好,RMSE值最低;而右側的模型(特別是Decision Tree、RandomForest、Stacking)表現明顯較差。
集成學習優勢:CDST和OPEC-Stacking這兩種集成方法的RMSE最低,說明集成多個模型的預測結果確實能提高預測準確性。
個別模型表現:
HistGradientBoosting、GradientBoosting表現中等。
DecisionTree、RandomForest表現明顯較差。
相較於CDST和OPEC-Stacking這兩種集成方法,Stacking在所有模型中是表現最差的集合學習模型,推測是因為Decision Tree、RandomForest這兩個模型表現明顯較差,而影響到了Stacking模型所算出較差的RMSE值。
訓練集與測試集差異:大多數模型的訓練集RMSE(橙色線)和測試集RMSE(藍色線)非常接近,表明這些模型沒有明顯的過擬合或欠擬合問題。
選擇建議:從圖來看,CDST方法是最優選擇,其次是OPEC-Stacking和CatBoost模型。明確應避免使用DecisionTree、RandomForest模型,因其誤差過大。
參數調優方向:可以進一步優化表現較好的模型(如SVR、Bayesian Ridge等),但避免在表現極差的模型(如DecisionTree、RandomForest)上浪費時間。
總結來說,此圖清晰地展示了各模型在數據集上的表現,集成方法(尤其是CDST)效果最佳。根據您的應用場景和計算資源,可以選擇CDST或性能接近的較簡單模型(如SVR)進行實際應用。
我們篩選了 4 個結果最佳的基礎模型,重新對 3 個集成模型進行訓練:
SVR
XGBRegressor
HistGradientBoosting Regressor
Linear Regressor
模型: Stacking
測試集 RMSE: 1299144.83
訓練集 RMSE: 1303449.25
模型: CDST
測試集 RMSE: 1126621.36
訓練集 RMSE: 1133114.01
模型: OPEC-Stacking
測試集 RMSE: 1132784.08
訓練集 RMSE: 1123828.14
從上圖中可以看出:
三種模型選擇策略比較:圖表比較了三種模型選擇策略 - Stacking_Select、OPEC_Select 和 CDST_Select 的性能表現。
訓練集與測試集差異:
OPEC_Select 在訓練集上表現最佳,RMSE 值最低(約 1123828.14 ),但在測試集上的表現(約 1132784.08)略遜於 CDST_Select。
CDST_Select 在測試集上表現最佳(RMSE 約 1126621.36)。
Stacking_Select 在訓練集(約 1303449.25)和測試集(約 1299144.83)上都表現較差。
泛化能力分析:
CDST_Select 在測試集上表現最佳,而訓練集上表現比OPEC_Stacking差一些,但總體表現是最好的,顯示出良好的泛化能力。
訓練穩定性:
Stacking_Select 的訓練集和測試集 RMSE 都比較高,但OPEC_Select 的訓練集明顯較低,表明 OPEC_Select 在訓練過程中能更好地擬合訓練數據。
模型選擇建議:
如果優先考慮測試性能,CDST_Select 是最佳選擇。
如果需要在訓練和測試表現間取得平衡,OPEC_Select 可能是較好選擇。
Stacking_Select 雖然整體表現略遜,但訓練和測試差異較小,可能在某些穩定性要求高的場景有用。
結論:圖表清晰顯示 CDST_Select 在預測未見數據方面表現最佳,OPEC_Select 在訓練數據擬合上表現突出,而 Stacking_Select 則相對平穩但整體性能略遜。實際應用時可根據特定需求選擇合適的模型選擇策略。