目錄
- 相關鏈接
- 1 題目
- 2 Python實作的baseline
- 2.1 資料讀取
- 2.2 溫度特征處理
- 2.3 天氣狀況特征處理
- 2.4 風向特征處理
- 2.5 天氣進行有序編碼
- 2.6 連著兩張表
- 2.7 時序特征提取(后期直接加入測驗集資料)
- 3 模型訓練
- 3.1 自定義訓練集
- 3.2 訓練
- 3.2 模型評價(MAE,RMSE)
相關鏈接
更新時間:2022年3月2日
【完整代碼】下載
1 題目
比賽官網:第十屆“泰迪杯”資料挖掘挑戰賽
一、問題背景
電力系統負荷(電力需求量,即有功功率)預測是指充分考慮歷史的系統負荷、經濟狀況、氣象條件和社會事件等因素的影響,對未來一段時間的系統負荷做出預測,負荷預測是電力系統規劃與調度的一項重要內容,短期(兩周以內)預測是電網內部機組啟停、調度和運營計劃制定的基礎;中期(未來數月)預測可為保障企業生產和社會生活用電,合理安排電網的運營與檢修決策提供支持;長期(未來數年)預測可為電網改造、擴建等計劃的制定提供參考,以提高電力系統的經濟效益和社會效益,
復雜多變的氣象條件和社會事件等不確定因素都會對電力系統負荷造成一定的影響,使得傳統負荷預測模型的應用存在一定的局限性,同時,隨著電力系統負荷結構的多元化,也使得模型應用的效果有所降低,因此電力系統負荷預測問題亟待進一步研究,
二、解決問題
1.地區負荷的中短期預測分析
根據附件中提供的某地區電網間隔15分鐘的負荷資料,建立中短期負荷預測模型:
(1)給出該地區電網未來10天間隔15分鐘的負荷預測結果,并分析其預測精度;
(2)給出該地區電網未來3個月日負荷的最大值和最小值預測結果,以及相應達到負荷最大值和最小值的時間,并分析其預測精度,
2.行業負荷的中期預測分析
對不同行業的用電負荷進行中期預測分析,能夠為電網運營與調度決策提供重要依據,特別是在新冠疫情、國家“雙碳”目標等背景下,通過對大工業、非普工業、普通工業和商業等行業的用電負荷進行預測,有助于掌握各行業的生產和經營狀況、復工復產和后續發展走勢,進而指導和輔助行業的發展決策,請根據附件中提供的各行業每天用電負荷相關資料,建立數學模型研究下面問題:
(1)挖掘分析各行業用電負荷突變的時間、量級和可能的原因,
(2)給出該地區各行業未來3個月日負荷最大值和最小值的預測結果,并對其預測精度做出分析,
(3)根據各行業的實際情況,研究國家“雙碳”目標對各行業未來用電負荷可能產生的影響,并對相關行業提出有針對性的建議,
2 Python實作的baseline
2.1 資料讀取
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.style.use('seaborn-darkgrid')
sns.set(style = 'darkgrid')
import warnings
warnings.filterwarnings("ignore")
import lightgbm as lgb
from sklearn.preprocessing import scale
import lightgbm as lgb
import xgboost as xgb
from catboost import CatBoostRegressor
import time
from tqdm import tqdm
from sklearn.preprocessing import LabelEncoder
y = pd.read_csv('./data/附件1-區域15分鐘負荷資料.csv')
indu = pd.read_csv('./data/附件2-行業日負荷資料.csv')
tianqi = pd.read_csv('./data/附件3-氣象資料.csv')
tianqi
日期 天氣狀況 最高溫度 最低溫度 白天風力風向 夜晚風力風向 Unnamed: 6 0 2018年1月1日 多云/多云 22℃ 12℃ 無持續風向<3級 無持續風向<3級 NaN 1 2018年1月1日 多云/多云 22℃ 12℃ 無持續風向<3級 無持續風向<3級 NaN 2 2018年1月2日 多云/多云 22℃ 15℃ 無持續風向<3級 無持續風向<3級 NaN 3 2018年1月3日 多云/陰 23℃ 15℃ 無持續風向<3級 無持續風向<3級 NaN 4 2018年1月4日 多云/小雨 21℃ 16℃ 無持續風向<3級 無持續風向<3級 NaN 5 2018年1月5日 陰/小雨 19℃ 13℃ 無持續風向<3級 無持續風向<3級 NaN 6 2018年1月6日 小雨-中雨/中雨-大雨 15℃ 11℃ 無持續風向<3級 無持續風向<3級 NaN 7 2018年1月7日 大雨/中雨 15℃ 7℃ 無持續風向<3級 北風4~5級 NaN 8 2018年1月8日 中雨/小雨-中雨 12℃ 5℃ 北風4~5級 北風3~4級 NaN 9 2018年1月9日 小雨/陰 9℃ 6℃ 無持續風向<3級 無持續風向<3級 NaN 10 2018年1月10日 多云/多云 14℃ 7℃ 無持續風向<3級 無持續風向<3級 NaN 11 2018年1月11日 多云/多云 15℃ 6℃ 無持續風向<3級 無持續風向<3級 NaN 12 2018年1月12日 晴/晴 16℃ 6℃ 無持續風向<3級 無持續風向<3級 NaN 13 2018年1月13日 晴/晴 17℃ 7℃ 無持續風向<3級 無持續風向<3級 NaN 14 2018年1月14日 多云/多云 20℃ 10℃ 無持續風向<3級 無持續風向<3級 NaN
del tianqi['Unnamed: 6']
2.2 溫度特征處理
tianqi['最高溫度'] = tianqi['最高溫度'].map(lambda d: d.replace('℃','')).astype(int)
tianqi['最低溫度'] = tianqi['最低溫度'].map(lambda d: d.replace('℃','')).astype(int)
2.3 天氣狀況特征處理
series = tianqi.join(tianqi['天氣狀況'].str.split('/',expand=True))
tianqi['天氣1'] = series[0]
tianqi['天氣2'] = series[1]
tianqi.info()
<class ‘pandas.core.frame.DataFrame’> RangeIndex: 15 entries, 0 to 14 Data columns (total 8 columns):
Column Non-Null Count Dtype — ------ -------------- -----
0 日期 15 non-null object
1 天氣狀況 15 non-null object
2 最高溫度 15 non-null int32
3 最低溫度 15 non-null int32
4 白天風力風向 15 non-null object
5 夜晚風力風向 15 non-null object
6 天氣1 15 non-null object 7 天氣
2 15 non-null object dtypes: int32(2), object(6)
2.4 風向特征處理
tianqi['白天風力風向'].unique()
array([‘無持續風向<3級’, ‘北風4~5級’], dtype=object)
tianqi['夜晚風力風向'].unique()
array([‘無持續風向<3級’, ‘北風4~5級’, ‘北風3~4級’], dtype=object)
dic = {'無持續風向<3級':0,
'北風3~4級':1,
'北風4~5級':2}
tianqi['白天風力風向'] = tianqi['白天風力風向'].map(dic)
tianqi['夜晚風力風向'] = tianqi['夜晚風力風向'].map(dic)
2.5 天氣進行有序編碼
tianqi['天氣1'].unique()
array([‘多云’, ‘陰’, ‘小雨-中雨’, ‘大雨’, ‘中雨’, ‘小雨’, ‘晴’], dtype=object)
tianqi['天氣2'].unique()
array([‘多云’, ‘陰’, ‘小雨’, ‘中雨-大雨’, ‘中雨’, ‘小雨-中雨’, ‘晴’], dtype=object)
dic1 = {'晴':1,
'多云':2,
'陰':3,
'小雨':4,
'小雨-中雨':5,
'中雨':6,
'中雨-大雨':7,
'大雨':8}
tianqi['天氣1'] = tianqi['天氣1'].map(dic1)
tianqi['天氣2'] = tianqi['天氣2'].map(dic1)
del tianqi['天氣狀況']
2.6 連著兩張表
y = y.rename(columns={'資料時間':'日期1'})
y['日期'] = y['日期1'].apply(lambda x: x.split(' ')[0])
tianqi.loc[:, '日期'] = pd.to_datetime(tianqi.loc[:, '日期'], format='%Y年%m月%d日', errors='coerce')
y.loc[:, '日期'] = pd.to_datetime(y.loc[:, '日期'], format='%Y/%m/%d', errors='coerce')
train = y.merge(tianqi,on='日期',how='left')
del train['日期']
2.7 時序特征提取(后期直接加入測驗集資料)
train['日期1'] = pd.to_datetime(train['日期1'])
train['月'] = train['日期1'].dt.month
train['天'] = train['日期1'].dt.day
train['小時'] = train['日期1'].dt.hour
train['一年第幾天'] = train['日期1'].dt.dayofyear
train['一年第幾周'] = train['日期1'].dt.week
# test['月'] = test['日期1'].dt.month
# test['天'] = test['日期1'].dt.day
# test['小時'] = test['日期1'].dt.hour
# test['一年第幾天'] = test['日期1'].dt.dayofyear
# test['一年第幾周'] = test['日期1'].dt.week
#####################
此處代碼略,請下載完整代碼
#####################
train['是否月末'] = [int(i) for i in train['是否月末']]
train['是否季節初'] = [int(i) for i in train['是否季節初']]
train['是否季節末'] = [int(i) for i in train['是否季節末']]
train['是否周末'] = [int(i) for i in train['是否周末']]
train['是否月初'] = [int(i) for i in train['是否月初']]
# test['是否月末'] = [int(i) for i in test['是否月末']]
# test['是否季節初'] = [int(i) for i in test['是否季節初']]
# test['是否季節末'] = [int(i) for i in test['是否季節末']]
# test['是否周末'] = [int(i) for i in test['是否周末']]
# test['是否月初'] = [int(i) for i in test['是否月初']]
3 模型訓練
y = train['總有功功率(kw)']
x_train = 略,,,,
3.1 自定義訓練集
(1)標簽歸一化
y = 略
(2)劃分訓練集和驗證集
x = x_train[:900]
y_train = y[:900]
x_val = x_train[900:]
y_val = y[900:]
3.2 訓練
model_lgb = lgb.LGBMRegressor(
learning_rate=0.01,
max_depth=-1,
n_estimators=1000,
boosting_type='gbdt',
random_state=2021,
objective='regression',
num_leaves = '32',
verbose=-1)
lgb_model = model_lgb.fit(x,y_train)
pred_val_y = lgb_model.predict(x_val)
3.2 模型評價(MAE,RMSE)
# coding=utf-8
import numpy as np
from sklearn import metrics
# MAPE需要自己實作
def mape(y_true, y_pred):
return np.mean(np.abs((y_pred - y_true) / y_true))
y_true = np.array(y_val)
y_pred = np.array(pred_val_y )
print('MSE:',metrics.mean_squared_error(y_true, y_pred))
print('RMSE:',np.sqrt(metrics.mean_squared_error(y_true, y_pred)))
print('MAE:',metrics.mean_absolute_error(y_true, y_pred))
print('MAPE:',mape(y_true, y_pred))
## R2-score
from sklearn.metrics import r2_score
print('R2-score:',r2_score(y_true, y_pred))
MSE: 0.010407552970462575
RMSE: 0.1020174150351918
MAE: 0.07714213380059706
MAPE: 0.13842409370994957
R2-score: 0.646261802505866
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/437008.html
標籤:AI
下一篇:OpenCV學習(58)
