全文鏈接:tecdat.cn/?p=41810 分析師:Peng'an Chen 在數(shù)字經(jīng)濟(jì)浪潮席卷全球的當(dāng)下,電力行業(yè)正經(jīng)歷著從傳統(tǒng)運(yùn)營(yíng)模式向數(shù)據(jù)驅(qū)動(dòng)型模式的深刻變革。作為數(shù)據(jù)科學(xué)家,我們深知精準(zhǔn)的數(shù)據(jù)建模與預(yù)測(cè)是電力企業(yè)提升運(yùn)營(yíng)效率、優(yōu)化資源配置的核心競(jìng)爭(zhēng)力。此前,我們團(tuán)隊(duì)承接了中國(guó)南方電網(wǎng)相關(guān)數(shù)據(jù)建模預(yù)測(cè)的咨詢項(xiàng)目,在項(xiàng)目過(guò)程中,面對(duì)海量且復(fù)雜的數(shù)據(jù),通過(guò)運(yùn)用 SQL、Python 機(jī)器學(xué)習(xí)、時(shí)間序列分析等技術(shù),成功構(gòu)建了購(gòu)售電、現(xiàn)金流、折舊等多個(gè)關(guān)鍵模型,有效解決了數(shù)據(jù)清理篩選、模型精度優(yōu)化等難題,為企業(yè)決策提供了堅(jiān)實(shí)的數(shù)據(jù)支撐。 與此同時(shí),我們還探索了 R 語(yǔ)言在電力負(fù)荷時(shí)間序列預(yù)測(cè)中的應(yīng)用,運(yùn)用分位數(shù)回歸、GAM 樣條曲線、指數(shù)平滑和 SARIMA 等模型,深入剖析電力負(fù)荷與各類影響因素之間的關(guān)系,實(shí)現(xiàn)對(duì)電力負(fù)荷的精準(zhǔn)預(yù)測(cè)。 本專題將全面呈現(xiàn)這些研究成果與實(shí)踐經(jīng)驗(yàn),無(wú)論是南方電網(wǎng)數(shù)據(jù)建模中對(duì)業(yè)務(wù)目標(biāo)的精準(zhǔn)拆解、數(shù)據(jù)處理的細(xì)致流程,還是 R 語(yǔ)言在電力負(fù)荷預(yù)測(cè)中的多元模型構(gòu)建與分析,都將一一展開(kāi)。 分位數(shù)回歸、GAM樣條曲線、指數(shù)平滑和SARIMA對(duì)電力負(fù)荷時(shí)間序列預(yù)測(cè) 專題項(xiàng)目文件已分享在交流社群,閱讀原文進(jìn)群和 500 + 行業(yè)人士共同交流和成長(zhǎng),希望能與各位同行碰撞出更多思維火花,共同推動(dòng)電力數(shù)據(jù)領(lǐng)域的發(fā)展與創(chuàng)新。 文章脈絡(luò): 中國(guó)南方電網(wǎng)數(shù)據(jù)建模預(yù)測(cè)研究在當(dāng)今數(shù)字化時(shí)代,電力行業(yè)的數(shù)據(jù)處理和分析對(duì)于企業(yè)的運(yùn)營(yíng)和決策至關(guān)重要。中國(guó)南方電網(wǎng)廣東公司面臨著購(gòu)售電、年度現(xiàn)金流、中長(zhǎng)期現(xiàn)金流、折舊等模型的建模預(yù)測(cè)工作。這些工作涉及多種技術(shù)操作,如 SQL、Python 機(jī)器學(xué)習(xí)建模以及時(shí)間序列分析建模等。由于數(shù)據(jù)量巨大、維度多且質(zhì)量方差大,不僅需要對(duì)數(shù)據(jù)進(jìn)行清理篩選,還對(duì)建模精度有著較高的要求,需要不斷優(yōu)化模型以適應(yīng)項(xiàng)目的需求。 一、任務(wù)目標(biāo)購(gòu)電成本模型 :通過(guò)預(yù)測(cè)未來(lái)一年的購(gòu)電量和成本,為年底購(gòu)電成本預(yù)算編制提供有力輔助,從而制定合理的年度目標(biāo)。售電收入模型 :一方面,預(yù)測(cè)未來(lái)一年的售電量和收入,助力年底售電收入預(yù)算編制并制定年度目標(biāo);另一方面,當(dāng)有新數(shù)據(jù)時(shí),驗(yàn)證模型滾動(dòng)預(yù)測(cè)未來(lái)一個(gè)月售電量與收入的能力。年度現(xiàn)金流模型 :通過(guò)預(yù)測(cè)未來(lái)一年的會(huì)計(jì)科目支出,支撐年度現(xiàn)金流預(yù)測(cè),并制定年度目標(biāo)。當(dāng)有新數(shù)據(jù)時(shí),能夠滾動(dòng)預(yù)測(cè)下一個(gè)月各會(huì)計(jì)科目支出,實(shí)現(xiàn)月度現(xiàn)金流的精細(xì)化管理。中長(zhǎng)期現(xiàn)金流模型 :預(yù)測(cè)省公司/地市局未來(lái)三年的會(huì)計(jì)科目支出,支撐年度現(xiàn)金流預(yù)測(cè)并制定年度目標(biāo)。當(dāng)有新數(shù)據(jù)時(shí),考慮使用時(shí)間序列模型實(shí)現(xiàn)年度現(xiàn)金流的提前預(yù)測(cè)。折舊預(yù)測(cè)模型 :在有新數(shù)據(jù)時(shí),滾動(dòng)預(yù)測(cè)下一個(gè)月各會(huì)計(jì)科目支出,實(shí)現(xiàn)月度現(xiàn)金流的精細(xì)化管理,同時(shí)說(shuō)明折舊測(cè)算模型的背景。
二、數(shù)據(jù)源準(zhǔn)備與處理(以機(jī)器學(xué)習(xí)模型和時(shí)間序列分析模型為例)(一)售電收入(機(jī)器學(xué)習(xí)模型)的數(shù)據(jù)源處理數(shù)據(jù)收集 :研究并收集了內(nèi)、外部因素的相關(guān)數(shù)據(jù)。外部數(shù)據(jù)涵蓋宏觀經(jīng)濟(jì)、對(duì)外貿(mào)易、氣候等方面,內(nèi)部數(shù)據(jù)涵蓋電量、電價(jià)、業(yè)擴(kuò)報(bào)裝等方面,數(shù)據(jù)時(shí)間初始跨度為 2016 年 1 月至 2022 年 12 月。

2. 數(shù)據(jù)預(yù)處理 數(shù)據(jù)轉(zhuǎn)換 :工業(yè)增加值、出口總值、社會(huì)消費(fèi)品零售總額的公布口徑均為月度累計(jì)數(shù)值,需要將同年相鄰兩個(gè)月相減得到數(shù)據(jù)的當(dāng)月值;GDP 的公布口徑均為季度累計(jì)數(shù)值,需要將同年相鄰兩個(gè)季度相減得到數(shù)據(jù)的當(dāng)季值,然后平均分配在當(dāng)季月份。缺失值處理 :統(tǒng)計(jì)月報(bào) 1 月不公布,2 月公布 1-2 月的累計(jì)值,因此將 1-2 月累計(jì)值平均分?jǐn)偟?1 月和 2 月;其他缺失值用線性插值法填補(bǔ)。零值與負(fù)值處理 :由于內(nèi)部數(shù)據(jù)特征中業(yè)擴(kuò)報(bào)裝數(shù)據(jù)(實(shí)際增容、實(shí)際減容等)和內(nèi)部歷史數(shù)據(jù)躉售、稻田排灌等存在少量 0 值、負(fù)值等難以解釋的數(shù)據(jù)影響模型預(yù)測(cè)的精確度,將用均值填補(bǔ)。剔除異常值 :通過(guò)四分位差,分別計(jì)算上須、下須的值,如果月度售電量、售電收入數(shù)據(jù)僅在某一年份超出上須或者下須,我們將它視為異常值,并從歷史數(shù)據(jù)剔除后再運(yùn)行預(yù)測(cè)模型。
特征工程
特征篩選 :首先使用過(guò)濾法,篩選出特征與目標(biāo)變量的相關(guān)系數(shù)的絕對(duì)值大于 0.1 的特征量;然后使用包裹法中的遞歸特征消除 (RFE)法。
特征預(yù)測(cè)器 :經(jīng)濟(jì)數(shù)據(jù)趨勢(shì)性和季節(jié)性比較強(qiáng),采用 ETS 指數(shù)平滑時(shí)間序列模型進(jìn)行預(yù)測(cè);溫度和降雨量采用過(guò)去兩年的同期平均值;目錄電價(jià)將使用南方電網(wǎng)官網(wǎng)發(fā)布的最新電價(jià)信息。數(shù)據(jù)劃分 :模型訓(xùn)練前,將數(shù)據(jù)集劃分訓(xùn)練集、驗(yàn)證集和測(cè)試集三部分。我們將從 2016 年 1 月至 2021 年 12 月的數(shù)據(jù)作為訓(xùn)練集和驗(yàn)證集,2022 年 1 月至 2022 年 12 月作為測(cè)試集來(lái)評(píng)估模型預(yù)測(cè)能力。 AI 提示詞:請(qǐng)使用 Python 對(duì)售電收入機(jī)器學(xué)習(xí)模型的數(shù)據(jù)源進(jìn)行處理,包括數(shù)據(jù)收集、數(shù)據(jù)預(yù)處理(數(shù)據(jù)轉(zhuǎn)換、缺失值處理、零值與負(fù)值處理、剔除異常值)、特征工程(特征篩選)、特征預(yù)測(cè)器的設(shè)置以及數(shù)據(jù)劃分(劃分訓(xùn)練集、驗(yàn)證集和測(cè)試集),并考慮上述具體的處理方法和數(shù)據(jù)時(shí)間跨度。
# 假設(shè)已經(jīng)導(dǎo)入了相關(guān)的庫(kù),如 pandas、numpy 等
# 數(shù)據(jù)預(yù)處理 # 數(shù)據(jù)轉(zhuǎn)換 data['工業(yè)增加值當(dāng)月值'] = data['工業(yè)增加值月度累計(jì)值'].diff() data['GDP當(dāng)季值'] = data['GDP季度累計(jì)值'].diff() / 3 # 缺失值處理 data['統(tǒng)計(jì)月報(bào)1月值'] = data['統(tǒng)計(jì)月報(bào)2月累計(jì)值'] / 2 data = data.interpolate() # 零值與負(fù)值處理 data['業(yè)擴(kuò)報(bào)裝數(shù)據(jù)'] = data['業(yè)擴(kuò)報(bào)裝數(shù)據(jù)'].fillna(data['業(yè)擴(kuò)報(bào)裝數(shù)據(jù)'].mean()) # 剔除異常值 Q1 = data['月度售電量'].quantile(0.25) Q3 = data['月度售電量'].quantile(0.75) IQR = Q3 - Q1 data = data[(data['月度售電量'] >= Q1 - 1.5 * IQR) & (data['月度售電量'] <= Q3 + 1.5 * IQR)] # 特征工程 # 特征篩選,假設(shè)目標(biāo)變量是 '售電收入' corr = data.corr() selected_features = corr[abs(corr['售電收入']) > 0.1].index.tolist() data = data[selected_features] # 特征預(yù)測(cè)器 # 這里僅簡(jiǎn)單示例經(jīng)濟(jì)數(shù)據(jù)的預(yù)測(cè),其他類似 from statsmodels.tsa.api import ExponentialSmoothing model = ExponentialSmoothing(data['經(jīng)濟(jì)數(shù)據(jù)'], seasonal='add', seasonal_periods=12).fit() data['經(jīng)濟(jì)數(shù)據(jù)預(yù)測(cè)值'] = model.forecast(12) # 數(shù)據(jù)劃分 from sklearn.model_selection import train_test_split train_val_data, test_data = train_test_split(data, test_size=0.2, shuffle=False) train_data, val_data = train_test_split(train_val_data, test_size=0.2, shuffle=False)
(二)電費(fèi)資金收入預(yù)測(cè)(時(shí)間序列分析)的數(shù)據(jù)預(yù)處理數(shù)據(jù)輸入 :通過(guò)取數(shù)路徑獲取各地市局已推送的電費(fèi)資金收入歷史數(shù)據(jù)。該歷史數(shù)據(jù)為日度數(shù)據(jù),且每日有多筆交易。數(shù)據(jù)清洗
原始數(shù)據(jù)分類匯總 :對(duì)已推送數(shù)據(jù)根據(jù)地市局、日期、用電類別、交易方式進(jìn)行分類匯總,加總各個(gè)地市局下各分類每日的各筆交易電費(fèi),獲得單日電費(fèi)資金收入總數(shù)。然后,按照給定的分類名稱,將原始數(shù)據(jù)再次整合分類,最終得到各地市局從用電類別分類和從交易方式分類下的每日電費(fèi)資金輸入數(shù)據(jù)。數(shù)據(jù)選擇 :對(duì)各分類數(shù)據(jù),規(guī)定若一個(gè)月的數(shù)據(jù)量少于 15 天,則該月為無(wú)效數(shù)據(jù)并剔除。整合后發(fā)現(xiàn) 2019 年 11 月之前的數(shù)據(jù)殘缺不全,屬于無(wú)效數(shù)據(jù),因此,選擇 2019 年 11 月及之后的數(shù)據(jù)作為模型輸入數(shù)據(jù)。處理異常值 :由于實(shí)際輸送錯(cuò)誤、抄寫(xiě)錯(cuò)誤等原因,原始數(shù)據(jù)中實(shí)收電費(fèi)可能出現(xiàn)負(fù)值,對(duì)該類數(shù)據(jù)用 0 替換。同時(shí),對(duì)每月已推送數(shù)據(jù)中無(wú)電費(fèi)資金收入的日期,用 0 填充其收入金額,保證每月數(shù)據(jù)不出現(xiàn)缺失值。 AI 提示詞:請(qǐng)使用 Python 對(duì)電費(fèi)資金收入時(shí)間序列分析模型的數(shù)據(jù)進(jìn)行預(yù)處理,包括數(shù)據(jù)輸入、數(shù)據(jù)清洗(原始數(shù)據(jù)分類匯總、數(shù)據(jù)選擇、處理異常值),考慮數(shù)據(jù)的日度性質(zhì)、多筆交易以及上述具體的處理規(guī)則和數(shù)據(jù)時(shí)間范圍。
# 假設(shè)已經(jīng)導(dǎo)入了相關(guān)的庫(kù),如 pandas、numpy 等 # 數(shù)據(jù)輸入,這里假設(shè)已經(jīng)將數(shù)據(jù)存儲(chǔ)在一個(gè) DataFrame 中 data = pd.read_csv('electricity_fee_data.csv') # 數(shù)據(jù)清洗 # 原始數(shù)據(jù)分類匯總 data['單日電費(fèi)資金收入總數(shù)'] = data.groupby(['地市局', '日期', '用電類別', '交易方式'])['交易電費(fèi)'].sum() data = data.pivot_table(index=['地市局', '日期'], columns=['用電類別', '交易方式'], values='單日電費(fèi)資金收入總數(shù)') data = data.reset_index() # 數(shù)據(jù)選擇 monthly_counts = data['日期'].dt.to_period('M').value_counts() valid_months = monthly_counts[monthly_counts >= 15].index data = data[data['日期'].dt.to_period('M').isin(valid_months)] data = data[data['日期'].dt.year >= 2019] # 處理異常值 data['實(shí)收電費(fèi)'] = data['實(shí)收電費(fèi)'].clip(lower=0) data = data.fillna(0)
三、模型建立與訓(xùn)練模型加載 :通過(guò)大量實(shí)驗(yàn)測(cè)試和資料查詢,發(fā)現(xiàn)集成算法的表現(xiàn)優(yōu)于大部分單個(gè)機(jī)器學(xué)習(xí)算法。集成學(xué)習(xí)是通過(guò)多個(gè)模型的組合形成一個(gè)精度更高的模型,包含 Bagging 和 Boosting 兩種類別。Bagging 是 bootstrap aggregating,從總體樣本當(dāng)中隨機(jī)取一部分樣本進(jìn)行訓(xùn)練,通過(guò)多次這樣的結(jié)果,獲取平均值作為結(jié)果輸出,避免不好的樣本數(shù)據(jù),提高準(zhǔn)確度。Boosting 的基本思想是通過(guò)某種方式使得每一輪基學(xué)習(xí)器在訓(xùn)練過(guò)程中更加關(guān)注上一輪學(xué)習(xí)錯(cuò)誤的樣本。最終考慮了 20 多種不同類型的算法(stacking、MLP 等),最后保留最好的 5 種集成算法(隨機(jī)森林、梯度提升回歸(GBR)、XGBoost、Adaboost、BaggingRegressor),通過(guò)交叉驗(yàn)證 10 次選擇平均月度預(yù)測(cè)值的誤差最小表現(xiàn)最穩(wěn)定最優(yōu)的模型進(jìn)行調(diào)參優(yōu)化。模型調(diào)參 :引入機(jī)器學(xué)習(xí)中 GridSearchCV (網(wǎng)格搜索)進(jìn)行自動(dòng)調(diào)參,通過(guò)依次調(diào)整參數(shù),利用調(diào)整的參數(shù)訓(xùn)練學(xué)習(xí)器,從而在所有的參數(shù)中找到在驗(yàn)證集上精度最高的參數(shù),達(dá)到模型最佳效果。不同的集成學(xué)習(xí)模型,對(duì)不同參數(shù)進(jìn)行調(diào)參。 AI 提示詞:請(qǐng)使用 Python 進(jìn)行售電收入模型的建立與訓(xùn)練,考慮使用集成學(xué)習(xí)算法(隨機(jī)森林、梯度提升回歸、XGBoost、Adaboost、BaggingRegressor),并使用 GridSearchCV 進(jìn)行調(diào)參優(yōu)化,按照上述不同算法的參數(shù)設(shè)置范圍進(jìn)行操作。
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, BaggingRegressor from xgboost import XGBRegressor from sklearn.ensemble import AdaBoostRegressor from sklearn.model_selection import GridSearchCV # 假設(shè)已經(jīng)有訓(xùn)練集 train_data 和驗(yàn)證集 val_data,特征為 X_train, X_val,目標(biāo)變量為 y_train, y_val # 隨機(jī)森林 rf = RandomForestRegressor() rf_params = { 'n_estimators': [10, 30, 100, 500], 'max_depth': [3, 4, 5, 6], 'min_samples_leaf': [3, 4, 5, 6] } rf_grid = GridSearchCV(rf, rf_params, cv=10) rf_grid.fit(X_train, y_train) best_rf = rf_grid.best_estimator_ # 梯度提升回歸 gbr = GradientBoostingRegressor() gbr_params = { 'n_estimators': [20, 50, 100], 'max_depth': [3, 4, 5, 6] } gbr_grid = GridSearchCV(gbr, gbr_params, cv=10) gbr_grid.fit(X_train, y_train) best_gbr = gbr_grid.best_estimator_ # Xgboost xgb = XGBRegressor() xgb_params = { 'max_depth': [3, 4, 5, 6], 'n_estimators': [10, 30, 100, 500], 'learning_rate': [0.1, 0.05, 0.01] } xgb_grid = GridSearchCV(xgb, xgb_params, cv=10) xgb_grid.fit(X_train, y_train) best_xgb = xgb_grid.best_estimator_ # Adaboost ada = AdaBoostRegressor() ada_params = { 'n_estimators': [25, 50, 100], 'learning_rate': [0.1, 0.05, 0.01] } ada_grid = GridSearchCV(ada, ada_params, cv=10) ada_grid.fit(X_train, y_train) best_ada = ada_grid.best_estimator_ # Bagging bag = BaggingRegressor() bag_params = { 'n_estimators': [10, 30, 100, 500], 'max_samples': [0.1, 0.05, 0.5] } bag_grid = GridSearchCV(bag, bag_params, cv=10) bag_grid.fit(X_train, y_train) best_bag = bag_grid.best_estimator_
四、數(shù)據(jù)建模(時(shí)間序列分析)預(yù)測(cè)各分類的當(dāng)月電費(fèi)資金收入 :對(duì)輸入數(shù)據(jù)按月加總,得到各地市局各分類歷史月度實(shí)收電費(fèi)。通過(guò)畫(huà)圖觀察發(fā)現(xiàn)各分類每月電費(fèi)資金收入呈現(xiàn)一定周期性,以東莞供電局-大工業(yè)用電為例。

圖 1:東莞-大工業(yè)月度電費(fèi)資金折線圖 采用時(shí)序分解方法將數(shù)據(jù)過(guò)濾為趨勢(shì)項(xiàng)、季節(jié)項(xiàng)和余項(xiàng),由于數(shù)據(jù)樣本量較少,采用以魯棒局部加權(quán)回歸作為平滑方法的時(shí)序分解法(STL)。使用 STL 時(shí)序分解法能更好擬合局部回歸曲線,描述整體趨勢(shì)。 ???? , ????, ????, ????分別表示時(shí)間序列數(shù)據(jù)、趨勢(shì)項(xiàng)、季節(jié)項(xiàng)和余項(xiàng) 對(duì)趨勢(shì)項(xiàng)數(shù)據(jù)采用線性回歸擬合趨勢(shì),對(duì)季節(jié)項(xiàng)數(shù)據(jù)采用季節(jié) ARIMA 模型,以年為周期進(jìn)行擬合,以 mse 為標(biāo)準(zhǔn)挑選最優(yōu)模型,最終得到各分類月度數(shù)據(jù)的預(yù)測(cè)結(jié)果。
點(diǎn)擊標(biāo)題查閱往期內(nèi)容  圖 2:東莞-大工業(yè)月度電費(fèi)資金 STL 分解圖 圖 2 從上到下依次是:原數(shù)據(jù)折線圖、趨勢(shì)分量折線圖、季節(jié)分量折線圖、余項(xiàng)散點(diǎn)圖。由季節(jié)趨勢(shì)分解圖像,其趨勢(shì)項(xiàng)基本呈線性趨勢(shì),用一次回歸曲線可以較好擬合;季節(jié)項(xiàng)基本符合 T=12 時(shí)周期曲線的規(guī)律,適宜用帶季節(jié)項(xiàng)參數(shù)的模型;殘差項(xiàng)散點(diǎn)集中在零附近,誤差基本接近于 0。以上三圖可以說(shuō)明月度數(shù)據(jù)具有以年為單位的周期性,驗(yàn)證了猜想,同時(shí)其他地市局、其他分類也具有類似性質(zhì)。因此,在預(yù)測(cè)各地市局各分類前,采用 STL 方法先將月度數(shù)據(jù)分解為季節(jié)項(xiàng)與趨勢(shì)項(xiàng)。然后,對(duì)趨勢(shì)項(xiàng)數(shù)據(jù)采用線性回歸(LinearRegression)擬合趨勢(shì),對(duì)季節(jié)項(xiàng)數(shù)據(jù)采用季節(jié) ARIMA 模型,以年為周期進(jìn)行擬合,以 mse 為標(biāo)準(zhǔn)挑選最優(yōu)模型。最終得到各分類月度數(shù)據(jù)的預(yù)測(cè)結(jié)果,即趨勢(shì)項(xiàng)預(yù)測(cè)與季節(jié)項(xiàng)預(yù)測(cè)之和。 2. 預(yù)測(cè)各分類當(dāng)月每日電費(fèi)資金收入占全月的比例:由于影響每日電費(fèi)資金收入的因素難以搜集或量化,直接建立時(shí)間序列模型進(jìn)行預(yù)測(cè)。采用最近一年的數(shù)據(jù)(2020 年 8 月至 2021 年 11 月)進(jìn)行建模,模型采用滾動(dòng)預(yù)測(cè)的方式。采取三種數(shù)據(jù)處理方法作為不同模型輸入數(shù)據(jù),分別采用不同的模型(SARIMA 模型、Holt Winter 模型、ARIMA 模型、Holt 模型、移動(dòng)平均模型等)進(jìn)行擬合。根據(jù)不同模型的特點(diǎn)和數(shù)據(jù)的性質(zhì)選擇合適的模型參數(shù),依據(jù)不同的準(zhǔn)則(最小化均方誤差、赤井信息準(zhǔn)則等)挑選最優(yōu)模型。對(duì)預(yù)測(cè)的比例做相應(yīng)的預(yù)測(cè)調(diào)整,考慮特殊月份(春節(jié)假期、國(guó)慶假期)的影響。將訓(xùn)練集放入時(shí)序模型,計(jì)算模型在驗(yàn)證集上的 RMSE 和 50%回收率時(shí)的累積絕對(duì)誤差,選擇最優(yōu)的時(shí)序模型進(jìn)行預(yù)測(cè)。 數(shù)據(jù)處理 :對(duì)于數(shù)據(jù),由于電費(fèi)資金收入的規(guī)則、政策以及當(dāng)?shù)氐漠a(chǎn)業(yè)情況變動(dòng)頻繁,時(shí)間較久遠(yuǎn)的日度收入規(guī)律不具有參考性,故采用最近一年的數(shù)據(jù),即 2020 年 8 月至 2021 年 11 月的數(shù)據(jù)進(jìn)行建模,其中 2020 年 8 月至 2021 年 7 月為訓(xùn)練集,2021 年 8 - 10 月為驗(yàn)證集,2021 年 11 月為測(cè)試集。同時(shí)為了保持預(yù)測(cè)數(shù)據(jù)的實(shí)時(shí)性,模型采用滾動(dòng)預(yù)測(cè)的方式,即每次預(yù)測(cè)某月電費(fèi)占比后,將該月加入訓(xùn)練集,與歷史數(shù)據(jù)一起預(yù)測(cè)下一個(gè)月。 為了規(guī)范周期長(zhǎng)短,對(duì)各月份數(shù)據(jù)統(tǒng)一處理,方便后續(xù)建模,將每月數(shù)據(jù)調(diào)整為 30 天一個(gè)月,若該月天數(shù)大于 30 天,則將 30 號(hào)后的數(shù)據(jù)加總到 30 號(hào);否則將最后一天數(shù)據(jù)平攤到后續(xù)新增天數(shù)上。由于月尾電費(fèi)收入占全月份額較少,處理后影響不大,因此數(shù)據(jù)操作后不會(huì)影響月內(nèi)每日電費(fèi)資金收入行為的特征。模型選擇 模型輸入數(shù)據(jù) :由于每個(gè)地市局各分類每個(gè)月的收入數(shù)據(jù)波動(dòng)非常大,且每月收入峰值出現(xiàn)的時(shí)間非常不穩(wěn)定(無(wú)法非常準(zhǔn)確地預(yù)測(cè)峰值會(huì)出現(xiàn)在具體某一天),部分分類峰值出現(xiàn)存在以月為單位的周期性,部分分類峰值出現(xiàn)不固定在一定范圍內(nèi),部分分類歷史同日具有一定規(guī)律。同時(shí),為了避免數(shù)據(jù)存在過(guò)大的波動(dòng),將絕對(duì)金額轉(zhuǎn)化為各自占當(dāng)月總金額的比例,對(duì)這些比例進(jìn)行訓(xùn)練和預(yù)測(cè)。因此,本模型采取三種數(shù)據(jù)處理方法作為不同模型輸入數(shù)據(jù):- 直接計(jì)算每日電費(fèi)資金收入占全月電費(fèi)資金收入占比,將每日收入占比作為模型輸入數(shù)據(jù)進(jìn)行建模預(yù)測(cè),以東莞供電局下一般住宅用電為例,對(duì)每月每日電費(fèi)資金收入占比進(jìn)行繪圖:
 圖 3:東莞-一般住宅每日電費(fèi)資金比例折線圖 圖 3 可以看出該分類下不同月份高峰出現(xiàn)規(guī)律類似,相鄰月份收費(fèi)高峰較為集中,月末電費(fèi)資金收入占比較低,呈現(xiàn)截尾特征。采用該方法重構(gòu)數(shù)據(jù)可以更直接觀察每日電費(fèi)資金收入分布情況,對(duì)規(guī)律相似度高的數(shù)據(jù)擬合效果最佳。由于數(shù)據(jù)的周期性,這里采用 SARIMA 模型和 Holt Winter 模型,以月為周期(T = 30)作模型擬合。 - 以 5 天一單位的電費(fèi)資金收入總額占月總額的占比作為建模輸入數(shù)據(jù)。以東莞供電局下商業(yè)用電為例,對(duì)每月五天一單位的電費(fèi)資金收入占比進(jìn)行繪圖
上圖為東莞供電局商業(yè)用電各月 6 個(gè)數(shù)(比例)的波動(dòng)情況,大部分地市局的情況類似,可以看出不同的月份的規(guī)律類似,高峰集中在第二個(gè) 5 日內(nèi)(6 - 10 號(hào)),最后一個(gè) 5 日(26 號(hào) - 月末)電費(fèi)資金收入占比平均較少。采用該方法重構(gòu)數(shù)據(jù)可以減少每日數(shù)據(jù)波動(dòng)的不確定性,發(fā)現(xiàn)收費(fèi)高峰出現(xiàn)的時(shí)間范圍。與 a 相仿,這里采用 SARIMA 模型和 Holt - Winter 模型,以月為周期(T = 6)作模型擬合。 - 對(duì)每月同一日單獨(dú)建模。以東莞供電局下大工業(yè)用電為例, 對(duì)每月同一日的電費(fèi)資金收入占比進(jìn)行繪圖:
圖 5:東莞-大工業(yè)用電每月同一日電費(fèi)資金比例折線圖 由圖 5,大部分日期歷史同一天電費(fèi)收入沒(méi)有明顯的周期性,通過(guò) ADF 檢驗(yàn)和 Ljung Box 檢驗(yàn)從統(tǒng)計(jì)學(xué)上驗(yàn)證了數(shù)據(jù)滿足平穩(wěn)性(或差分后平穩(wěn))。采用該方法可以觀察每月同一日電費(fèi)資金收入規(guī)律和趨勢(shì),更突出每日以月為周期的周期規(guī)律。對(duì)于每月同一日數(shù)據(jù),可以采用 ARIMA 模型、Holt 模型、移動(dòng)平均模型擬合實(shí)收電費(fèi)趨勢(shì)。 訓(xùn)練模型 :針對(duì)上述三種模型輸入數(shù)據(jù),本模型主要采用 ARIMA、SARIMA、指數(shù)平滑、移動(dòng)平均等方法進(jìn)行模型預(yù)測(cè)。- ARIMA 模型對(duì)平穩(wěn)序列數(shù)據(jù)(或差分后平穩(wěn))具有良好的建模效果,形成 ARIMA(p,d,q)模型。該模型也稱為差分自回歸滑動(dòng)平均模型,其中 d 為差分項(xiàng),p、q 為延遲參數(shù)。因此,對(duì)于具有弱平穩(wěn)或差分后平穩(wěn)的歷史每月同一日時(shí)序數(shù)據(jù),ARIMA 模型具有良好的擬合效果。然而,對(duì)于一些既有季節(jié)效應(yīng)又有長(zhǎng)期趨勢(shì)的時(shí)間序列,ARIMA 模型不足以提取其中的季節(jié)信息,這時(shí)通常需要采用 SARIMA 模型。因此,SARIMA 模型適用于每日數(shù)據(jù)預(yù)測(cè)和每 5 日數(shù)據(jù)預(yù)測(cè),這些數(shù)據(jù)具備周期性,SARIMA 模型能更好捕獲季節(jié)性和趨勢(shì)性。
- 指數(shù)平滑模型分為 SES 模型、Holt 模型、三階 Holt - Winter 模型。對(duì)于沒(méi)有明顯趨勢(shì)或季節(jié)規(guī)律的預(yù)測(cè)數(shù)據(jù),通常采用 SES 模型,該模型預(yù)測(cè)使用加權(quán)平均計(jì)算,最大的權(quán)重與最近的觀測(cè)值相關(guān),而最小的權(quán)重與最遠(yuǎn)的觀測(cè)值相關(guān)。而 Holt 模型在 SES 基礎(chǔ)上增加了水平預(yù)測(cè)方程和趨勢(shì)預(yù)測(cè)方程,對(duì)存在趨勢(shì)量的數(shù)據(jù)更加敏感。因此,SES 和 Holt 對(duì)適用于不具有明確季節(jié)性的歷史每月同一日時(shí)序數(shù)據(jù)。而 Holt Winter 模型進(jìn)一步添加了季節(jié)性組件,可選擇趨勢(shì)項(xiàng)和季節(jié)項(xiàng)的組合方式,適用于每日數(shù)據(jù)預(yù)測(cè)和每 5 日數(shù)據(jù)預(yù)測(cè)。
模型預(yù)測(cè)與評(píng)估 模型參數(shù)范圍選擇 :根據(jù)經(jīng)驗(yàn),SARIMA 中的各個(gè)參數(shù)在實(shí)際運(yùn)用中一般小于 3,據(jù)此設(shè)定模型參數(shù)范圍運(yùn)用于模型訓(xùn)練,由最小化均方誤差(MSE)的原則挑選 SARIMA 的最優(yōu)參數(shù),即 p(自回歸階數(shù))、d(差分階數(shù))、q(移動(dòng)平均階數(shù))。 對(duì) ets 模型即指數(shù)平滑模型,調(diào)整季節(jié)性平滑參數(shù),選擇加/乘法趨勢(shì)、加/乘性季節(jié)、是否允許優(yōu)化阻尼參數(shù)等選項(xiàng),形成各個(gè)模型參數(shù),依據(jù)赤井信息準(zhǔn)則(AIC)最小化原則選擇最優(yōu)模型。 對(duì)于模型 C 采用的 ARIMA 模型、簡(jiǎn)單指數(shù)平滑模型和 Holt 模型:一般而言,ARIMA 模型的參數(shù)范圍小于 3,且不設(shè)置季節(jié)項(xiàng)參數(shù),由此設(shè)定模型參數(shù)范圍,并由最小 MSE 挑選最優(yōu)參數(shù);簡(jiǎn)單指數(shù)平滑模型用于模擬移動(dòng)平均算法,調(diào)節(jié)參數(shù)使得預(yù)測(cè)模型實(shí)時(shí)性更強(qiáng)或者平穩(wěn)性更好;而 Holt 模型在簡(jiǎn)單指數(shù)平滑模型基礎(chǔ)上加上趨勢(shì)項(xiàng)擬合,同樣調(diào)節(jié)參數(shù)使得預(yù)測(cè)模型實(shí)時(shí)性更強(qiáng)或者平穩(wěn)性更好。預(yù)測(cè)比例調(diào)整 :針對(duì)上述三種不同模型,對(duì)預(yù)測(cè)的比例做相應(yīng)的預(yù)測(cè)調(diào)整。比如,對(duì)模型 A、C 應(yīng)調(diào)整預(yù)測(cè)使得一個(gè)月內(nèi)每天電費(fèi)資金占比加總等于 1。而針對(duì)模型 B,除了調(diào)整預(yù)測(cè)使得一個(gè)月內(nèi) 6 個(gè)比例加總等于 1 外,還需要將預(yù)測(cè)的 5 天比例分配到 5 天當(dāng)中。由折線圖可知,每日電費(fèi)資金收入比例與相鄰月份收入情況比較接近,因此分配的比例依據(jù)上月同期比例。 對(duì)存在春節(jié)假期、國(guó)慶假期的特殊月份,由于上述模型只能預(yù)測(cè)月度每日電費(fèi)資金繳費(fèi)行為的一般情況,而受到假期影響用戶電費(fèi)繳納行為與往常不同,故這幾個(gè)月份應(yīng)做特別的調(diào)整。對(duì)于國(guó)慶每年固定 1 - 7 號(hào)放假,而春節(jié)時(shí)間受農(nóng)歷影響公歷并不固定,需要通過(guò)農(nóng)歷求出往后年份春節(jié)對(duì)應(yīng)的日期。在得到假期具體公歷日期后,在模型預(yù)測(cè)的基礎(chǔ)上調(diào)整預(yù)測(cè)。一般而言各年份假期電費(fèi)繳費(fèi)行為相似,因此將假期中每日的電費(fèi)資金比例調(diào)整為歷史同期平均的比例,由此依據(jù)一個(gè)月比例加總為 1 的原則相應(yīng)調(diào)整這個(gè)月內(nèi)其他日期。模型預(yù)測(cè)與評(píng)估 :將訓(xùn)練集放入上述時(shí)序模型,計(jì)算各個(gè)具體參數(shù)組合下的模型在驗(yàn)證集上的 RMSE(Root Mean Square Error, 均方根誤差),以及驗(yàn)證集該月 50%回收率時(shí)的累積絕對(duì)誤差。 驗(yàn)證集上進(jìn)行滾動(dòng)預(yù)測(cè):驗(yàn)證集中當(dāng)月模型預(yù)測(cè)完成后,將該月實(shí)際實(shí)收電費(fèi)添加入訓(xùn)練集中,并通過(guò)新的訓(xùn)練集預(yù)測(cè)下一個(gè)月每日電費(fèi)資金比例,計(jì)算 RMSE 和 50%回收率時(shí)的累積絕對(duì)誤差,以此類推。將得到的各模型各組誤差分別作平均,選擇累積絕對(duì)誤差小于 0.1 的情況下 RMSE 最小的模型作為最優(yōu)的時(shí)序模型并預(yù)測(cè); 完成測(cè)試集上的預(yù)測(cè)之后,通過(guò)乘上各分類的當(dāng)月電費(fèi)資金收入,得到各分類每日電費(fèi)資金收入。此外,實(shí)際上,從用電類別分類和從交易方式分類僅僅是同一天電費(fèi)不同維度的分類,兩者預(yù)測(cè)加總后得到的每日電費(fèi)資金收入應(yīng)該相等。因此將從用電類別和交易方式分類得到的每日電費(fèi)資金收入的均值,作為當(dāng)天電費(fèi)資金收入的預(yù)測(cè)值,并由此調(diào)整各分類當(dāng)日的預(yù)測(cè)結(jié)果。 對(duì)模型預(yù)測(cè)結(jié)果進(jìn)行評(píng)估。評(píng)估結(jié)果包括兩個(gè)部分:每個(gè)分類的每日準(zhǔn)確率和每日累積準(zhǔn)確率,以及加總后的每日電費(fèi)資金收入的準(zhǔn)確率和累積準(zhǔn)確率。
五、模型評(píng)估與應(yīng)用最終數(shù)據(jù)模型的準(zhǔn)確率超過(guò) 93%,模型通過(guò)中科院評(píng)審, 已經(jīng)應(yīng)用到廣東電網(wǎng)的實(shí)際預(yù)測(cè)工作中。通過(guò)以上一系列的數(shù)據(jù)建模預(yù)測(cè)工作,為中國(guó)南方電網(wǎng)廣東公司的購(gòu)售電、現(xiàn)金流等方面的管理提供了有力的支持和決策依據(jù)。在未來(lái),隨著數(shù)據(jù)的不斷更新和業(yè)務(wù)的發(fā)展,還需要持續(xù)對(duì)模型進(jìn)行優(yōu)化和改進(jìn),以適應(yīng)不斷變化的需求。 通過(guò)這次對(duì)中國(guó)南方電網(wǎng)數(shù)據(jù)建模預(yù)測(cè)的研究,我們深入了解了電力行業(yè)數(shù)據(jù)處理和分析的復(fù)雜性和重要性,也為其他類似的項(xiàng)目提供了寶貴的經(jīng)驗(yàn)和參考。在不斷探索和實(shí)踐中,我們相信能夠更好地利用數(shù)據(jù)驅(qū)動(dòng)的方法,為電力行業(yè)的發(fā)展做出更大的貢獻(xiàn)。 R語(yǔ)言分位數(shù)回歸、GAM樣條曲線、指數(shù)平滑和SARIMA對(duì)電力負(fù)荷時(shí)間序列預(yù)測(cè)電力負(fù)荷預(yù)測(cè)是電網(wǎng)規(guī)劃的基礎(chǔ),其水平的高低將直接影響電網(wǎng)規(guī)劃質(zhì)量的優(yōu)劣。為了準(zhǔn)確預(yù)測(cè)電力負(fù)荷,有必要進(jìn)行建模。本文在R語(yǔ)言中使用分位數(shù)回歸、GAM樣條曲線、指數(shù)平滑和SARIMA模型對(duì)電力負(fù)荷時(shí)間序列預(yù)測(cè)并比較。 用電量本文使用的數(shù)據(jù)是1996年至2010年之間的每周用電量數(shù)據(jù),序列 load("Load.RData") plot(ts( data = Load , start= 1996 , frequency = 52) )
用電量變量及其影響因素: ·星期幾(離散) ·時(shí)間小時(shí)(離散或非參數(shù)) ·年(連續(xù)) 交互影響: ·日期和時(shí)間 ·年份和時(shí)間 活動(dòng) ·公共假期 溫度對(duì)模型的影響:高溫、低溫和極冷溫度 模型: 分段線性函數(shù), GAM模型中的樣條曲線 數(shù)據(jù)探索時(shí)間對(duì)電力負(fù)荷的影響 > plot ( NumWeek , Load )
溫度對(duì)電力負(fù)荷的影響,(Tt,Yt) > plot ( Temp , Load )
負(fù)荷序列(Yt)的自相關(guān)的影響, > acf (Load )
OLS與 中位數(shù)回歸 中位數(shù)回歸通過(guò)單調(diào)變換是穩(wěn)定的。
 lm(y?x, data =df) lm(y?x, data =df , tau =.5)
現(xiàn)在,中位數(shù)回歸將始終有兩個(gè)觀察結(jié)果。 which ( predict ( fit )) 21 46
分位數(shù)回歸和指數(shù)平滑簡(jiǎn)單的指數(shù)平滑:
 經(jīng)典地,我們尋找使預(yù)測(cè)誤差最小的α,即
 X=as. numeric ( Nile ) SimpleSmooth = function (a){ for (t in 2:T{L[t=a*X[t+(1 -a)*L[t -1 }lines ( SimpleSmooth (.2) ,col =" red ")
V= function (a){ for (t in 2:T){ L[t]=a*X[t]+(1 -a)*L[t -1] erreur [t]=X[t]-L[t -1] } return ( sum ( erreur ?2) ) optim (.5 ,V)$ par [1] 0.2464844 hw= HoltWinters (X, beta =FALSE hw$ alpha [1] 0.2465579
我們可以考慮分位數(shù)誤差
 HWtau = function ( tau ){ loss = function (e) e*(tau -(e< ;=0) *1) V= function (a){ for (t in 2:T){ L[t]=a*X[t+(1 -a)*L[t -1 erreur [t=X[t-L[t -1 return ( sum ( loss ( erreur optim (.5 ,V)$ par
plot (X, type ="b",cex =.6 lines ( SimpleSmooth ( HWtau (.8,col=" blue ", lwd =2)
雙指數(shù)平滑  我們考慮分位數(shù)誤差
 其中 。 hw= HoltWinters (X, gamma =FALSE ,l. start =X[1]) hw$ alpha alpha 0.4223241 hw$ beta beta 0.05233389 DouSmo = function (a,b){ for (t in 2:T){ L[t]=a*X[t+(1 -a*(L[t -1]+ B[t -1] B[t]=b*(L[t]-L[t -1]) +(1 -b*B[t -1] return (L+B)
預(yù)測(cè)數(shù)理統(tǒng)計(jì)建立在對(duì)概率模型參數(shù)的估計(jì)和假設(shè)檢驗(yàn)的基礎(chǔ)上。 統(tǒng)計(jì)中的預(yù)測(cè):當(dāng)模型擬合觀測(cè)值時(shí),它會(huì)提供良好的預(yù)測(cè)。 相反,我們使用沒(méi)有出現(xiàn)過(guò)的場(chǎng)景,它使我們能夠評(píng)估未來(lái)的主要趨勢(shì),而不是預(yù)測(cè)極端事件的能力。 預(yù)測(cè)變量的構(gòu)造 plot (ts( data = Load $Load , start = 1996 , frequency = 52) ,col =" white "
回歸plot (ts( data = Temp , start = 1996 , frequency = 52) , lines (ts( data = train $Temp , start = 1996 , frequency = 52) ) lines (ts( data = test $Temp , start = 1996+620 /52, frequency = 52)
SARIMA模型,s = 52
 ARIMA = arima (z, order =c(1 ,0 ,0 ,seasonal =list ( order =c(0 ,1 ,0 ,period =52 plot ( forecast (ARIMA ,h =112 )
關(guān)于分析師在此對(duì) Peng'an Chen 對(duì)本文所作的貢獻(xiàn)表示誠(chéng)摯感謝,他在暨南大學(xué)獲得網(wǎng)絡(luò)工程 - 金融學(xué)雙學(xué)位。他擅長(zhǎng)軟件 SQL、Python,在深度學(xué)習(xí)、數(shù)據(jù)挖掘、數(shù)理金融、數(shù)據(jù)建模等領(lǐng)域表現(xiàn)出色。
|