能源大數據分析理論與實踐 課件 11.油氣大數據分析案例;12.電力大數據分析_第1頁
能源大數據分析理論與實踐 課件 11.油氣大數據分析案例;12.電力大數據分析_第2頁
能源大數據分析理論與實踐 課件 11.油氣大數據分析案例;12.電力大數據分析_第3頁
能源大數據分析理論與實踐 課件 11.油氣大數據分析案例;12.電力大數據分析_第4頁
能源大數據分析理論與實踐 課件 11.油氣大數據分析案例;12.電力大數據分析_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

油氣大數據分析案例11TheCaseofOilandGasBigData11.1油氣消費量的影響因素分析石油和天然氣是經濟發(fā)展的重要驅動因素,分析油氣消費量的影響因素和影響效果對政府決策具有重要意義。影響油氣消費量的因素較多,本案例選取經濟發(fā)展、經濟結構、科技發(fā)展及人口規(guī)模4種因素,研究其對油氣消費量的影響,從而介紹回歸分析的應用方法。其中,油氣消費量用符號OGC表示;經濟發(fā)展使用GDP指標量化,用符號ED表示;經濟結構使用第三產業(yè)產值占GDP比值來量化,用符號ES表示;科技發(fā)展通過研究與試驗發(fā)展經費支出來量化,用符號TD表示;人口規(guī)模使用年末總人口數來量化,用符號PS表示。1.案例描述11.1油氣消費量的影響因素分析2.回歸分析(1)數據采集與處理本案例以2001年—2020年全國數據為例,探究各因素對油氣消費量的影響,數據來源于《中國統(tǒng)計年鑒》。采集數據之后,需要將數據文件保存為CSV文件,圖1部分數據11.1油氣消費量的影響因素分析2.回歸分析(2)繪制散點圖觀察變量關系首先使用pandas庫讀取數據,使用前需要提前導入這個庫。案例中使用的數據文件名是“Oil_and_gas.csv”,然后使用read_csv()函數讀取數據文件中的數據,并用第一列作為每一行的索引。繪制自變量與目標變量之間的散點圖,即OGC關于ED、OGC關于ES、OGC關于TD、OGC關于PS的散點圖。Matplotlib庫是用于繪制可視化圖像的2D繪圖庫,該部分使用Matplotlib庫的子庫matplotlib.pyplot,直接調用plot()函數對列表數據畫圖。plot()函數默認為繪制線形(kind='line')圖形,繪制散點圖需要kind='scatter',設置好“x”和“y”等內容,最終使用show()函數進行展示。11.1油氣消費量的影響因素分析2.回歸分析importpandasaspdimportmatplotlib.pyplotaspltfilename='Oil_and_gas.csv'data=pd.read_csv(filename,index_col=0)data.plot(kind='scatter',x='ED',y='OGC',title='ED-OGC')plt.xlabel("ED")plt.ylabel("OGC")plt.show()data.plot(kind='scatter',x='ES',y='OGC',title='ES-OGC')plt.xlabel("ES")plt.ylabel("OGC")plt.show()data.plot(kind='scatter',x='TD',y='OGC',title='TD-OGC')plt.xlabel("TD")plt.ylabel("OGC")plt.show()data.plot(kind='scatter',x='PS',y='OGC',title='PS-OGC')plt.xlabel("PS")plt.ylabel("OGC")plt.show()圖2散點圖繪制結果散點圖繪制結果如圖所示,該模型所選擇的4個自變量均與目標變量存在線性相關關系,可以嘗試使用線性回歸方法進行估計。11.1油氣消費量的影響因素分析2.回歸分析(3)回歸分析模型應用建立回歸分析模型可以使用statsmodels庫,它是Python中的統(tǒng)計分析庫,提供了多種用于統(tǒng)計建模和分析的函數和類,用于擬合多種統(tǒng)計模型,執(zhí)行統(tǒng)計測試及數據探索和可視化。首先使用iloc()函數定位數據所在列,并將數據類型轉換成浮點型;然后使用sm.add_constant()函數在“X”上加入一列常數項,從而得出后續(xù)的常數項;接著使用OLS()函數建立模型,使用fit()函數獲取擬合結果,最后使用summary()函數展示擬合模型的詳細結果。importstatsmodels.apiassmX=data.iloc[:,1:5].values.astype(float)y=data.iloc[:,0].values.astype(float)X=sm.add_constant(X)model=sm.OLS(y,X)results=model.fit()print('檢驗的結果為:\n',results.summary())11.1油氣消費量的影響因素分析3.結果分析可以通過程序輸出結果觀察我國油氣消費量與影響因素之間的關系,在回歸分析模型中,R2為0.998,表明模型的擬合度較好,自變量經濟發(fā)展(ED)的回歸系數為0.0207,P值為0.446,說明經濟發(fā)展對油氣消費量有正向促進作用,但顯著性不高;經濟結構(ES)的回歸系數為-0.6158,P值為0.104,雖未低于0.1,但基本說明了經濟結構的優(yōu)化對降低油氣消費量產生了正向促進作用;科技發(fā)展(TD)的回歸系數為0.1668,通過了5%的顯著性檢驗,表明當科技發(fā)展水平較高時,會促進油氣消費量的增加,說明科技發(fā)展的方向主要是拉動經濟增長,在降低能耗方面未得到體現;人口規(guī)模(PS)的回歸系數為3.5771,通過了1%的顯著性檢驗,表明人口規(guī)模越大,油氣消費量越高。圖3回歸分析模型輸出結果11.2石油管線損失預測石油管線事故是指在石油管線系統(tǒng)中發(fā)生的意外事件,導致石油或石油產品的泄漏、溢出或其他不良后果,造成巨大的損失。本案例針對石油管線事故損失進行預測,通過搜集到的數據集和機器學習算法(隨機森林)建立模型來預測石油管線事故可能導致的損失,包括人員傷亡、環(huán)境破壞、財務成本等。本案例主要展示如何基于機器學習算法建立一個有效的預測系統(tǒng),幫助石油公司更好地管理風險和進行資源分配,以提高石油管線安全性,降低損失。1.案例描述11.2石油管線損失預測步驟1:采集數據并準備數據集。需要準備用于訓練和測試模型的數據集,數據集應包含特征和對應的目標變量。特征是用于預測目標變量的特征或指標,目標變量是需要進行預測的值。通常,需要將數據集劃分為訓練集和測試集,其中訓練集用于訓練模型,測試集用于評估模型的性能。2.隨機森林回歸的步驟11.2石油管線損失預測步驟2:模型訓練與預測。在sklearn庫中,可以使用RandomForestRegressor類來構建隨機森林回歸模型。可以設置一些參數來控制隨機森林的行為,例如決策樹的數量、特征選擇的方式、決策樹的生長方式等,可以根據實際問題和需求進行參數的調整。使用訓練集對隨機森林回歸模型進行訓練,模型將根據訓練集中的樣本和目標變量的值來構建多棵決策樹,并在每棵樹上進行特征選擇和劃分。使用訓練好的隨機森林回歸模型對測試集中的樣本進行預測,模型將對每棵決策樹的預測結果進行平均或加權平均,從而得到最終的回歸預測結果。2.隨機森林回歸的步驟11.2石油管線損失預測步驟3:模型評估與調優(yōu)。通過與真實目標變量的比較,評估模型的性能。可以使用各種回歸性能指標,如均方誤差(MeanSquaredError,MSE)、平均絕對誤差(MeanAbsoluteError,MAE)、決定系數(R2)等,來評估模型的準確性和泛化能力。根據評估結果可以對隨機森林回歸模型進行調優(yōu),嘗試調整隨機森林回歸模型的參數,從而提高模型的性能。步驟4:模型應用。模型評估與調優(yōu)后,可以將訓練好的隨機森林回歸模型保存為文件,在使用時讀取文件并進行實際預測。2.隨機森林回歸的步驟11.2石油管線損失預測3.程序實現與結果分析(1)數據預處理首先導入模型訓練需要的各個包,然后利用Python的第三方庫pandas將數據集加載到DataFrame中,可以通過直接打印輸出DataFrame查看數據集的大?。〝祿卸嗌賯€樣本及每個樣本有多少個特征),通過isnull()函數查看每列的非空值數量。對于空值超過50%以上的特征,直接刪除。圖4數據集部分內容11.2石油管線損失預測3.程序實現與結果分析(1)數據預處理

fromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportmean_squared_error,mean_absolute_error,r2_scoreimportmatplotlib.pyplotaspltimportnumpyasnpimportpandasaspdfromsklearn.ensembleimportRandomForestRegressorplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=Falsedf=pd.read_csv('data.csv')columns=df.columnslack=df.isnull().sum()/2795lack=df.isnull().sum()/2795lack=lack.apply(lambdax:format(x,'.2%'))columns_1=['LiquidSubtype','LiquidName','IntentionalRelease(Barrels)','ShutdownDate/Time','RestartDate/Time','OperatorEmployeeInjuries','OperatorContractorInjuries','EmergencyResponderInjuries','OtherInjuries','PublicInjuries','AllInjuries','OperatorEmployeeFatalities','OperatorContractorFatalities','EmergencyResponderFatalities','OtherFatalities','PublicFatalities','AllFatalities']df=df.drop(columns_1,axis=1)11.2石油管線損失預測3.程序實現與結果分析(1)數據預處理

對于剩下的特征,如AccidentDate/Time列,將其拆分為年、月、日三個特征,來表示事故發(fā)生時間的特征,對于PipelineLocation、PipelineType等列,由于其特征值為分類變量,因此用One-hot編碼進行處理,對于部分缺失值用0填充。最后根據變量的實際意義,刪除與預測事故總成本沒有關系的特征。

df['AccidentDate/Time']=pd.to_datetime(df['AccidentDate/Time'])df['AccidentMonth']=df['AccidentDate/Time'].dt.monthdf['AccidentDay']=df['AccidentDate/Time'].dt.daycolumns_2=['ReportNumber','SupplementalNumber','OperatorName','Pipeline/FacilityName','AccidentCity','AccidentCounty','AccidentState','CauseSubcategory','PublicEvacuations','OtherCosts','PropertyDamageCosts','AccidentDate/Time','OperatorID']df=df.drop(columns_2,axis=1)df.fillna(0,inplace=True)columns_3=['PipelineLocation','PipelineType','LiquidType','CauseCategory','LiquidIgnition','LiquidExplosion','PipelineShutdown']data=pd.get_dummies(df,columns=columns_3)data['AllCosts']=data.pop('AllCosts')11.2石油管線損失預測3.程序實現與結果分析(2)模型訓練與預測

首先將標簽和特征分開,并以8∶2的比例劃分訓練集和測試集,然后基于得到的訓練集數據(訓練集特征X_train和訓練集標簽y_train)來擬合決策樹模型,最后使用訓練好的模型對測試集數據進行預測。其中,使用sklearn庫中的RandomForestRegressor類來建立決策樹模型,可以設置不同的參數來調整樹的數量、深度、分裂準則等。

X=data.iloc[:,:-1]y=data.iloc[:,-1]X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=33)random_forest_regressor=RandomForestRegressor(n_estimators=20,random_state=33)random_forest_regressor.fit(X_train,y_train)y_pred=random_forest_regressor.predict(X_test)11.2石油管線損失預測3.程序實現與結果分析(3)模型評估與調優(yōu)將模型得到的測試集的預測值和真實值(測試集標簽y_test)進行比較,可以計算均方誤差(MSE)、均方根誤差(RMSE)、平均絕對誤差(MAE)、決定系數(R2)來評估模型的擬合效果。

mse=mean_squared_error(y_test,y_pred)print("均方誤差(MSE):",mse)rmse=np.sqrt(mse)print("均方根誤差(RMSE):",rmse)mae=mean_absolute_error(y_test,y_pred)print("平均絕對誤差(MAE):",mae)r_squared=r2_score(y_test,y_pred)print("決定系數(R-squared):",r_squared)通過調整隨機森林中決策樹的數量,對比預測結果,當n_estimator=20時,模型在測試集上預測結果的R2達到了0.912,說明模型的準確率較好??蓢L試調整其他參數,這里僅對n_estimator進行了簡單調優(yōu)。Thankyou!電力大數據分析12E-PowerBigDataAnalysis12.1基于LSTM方法的家庭用電量預測案例數據集來自UCI機器學習數據集,該數據集包含了2006年12月16日至2010年11月26日期間收集的1000個測量值,部分數據集如圖所示。數據集中的特征信息如下。(1)Date:日期,格式為dd/mm/yyyy。(2)Time:時間,格式為hh:mm:ss。(3)Global_active_power:全球每分鐘消耗的家用平均有功功率(千瓦)。(4)Global_reactive_power:全球每分鐘消耗的家用平均無功功率(千瓦)。(5)Voltage:每分鐘平均電壓(伏特)。(6)Global_intensity:全球每分鐘的家用平均電流強度(安培)。12.1基于LSTM方法的家庭用電量預測(7)Sub_metering_1:1號能量子計量(以瓦時為單位的有功能量),主要是指廚房中的洗碗機、烤箱和微波爐消耗的電量。(8)Sub_metering_2:2號能量子計量(以瓦時為單位的有功能量),主要是指洗衣房中洗衣機、烘干機等消耗的電量。(9)Sub_metering_3:3號能量子計量(以瓦時為單位的有功能量),主要是指電熱水器和空調消耗的電量。12.1基于LSTM方法的家庭用電量預測1)數據的導入與預處理數據集包含一些缺失值(約占行數的1.25%),數據集中存在所有日歷時間戳,但對于某些時間戳,缺少測量值,因此需要對數據進行預處理。在進行數據預處理之前,導入所需的數據,該數據集包含2075259行和7列的數據。首先對缺失數據進行檢查,查看各列缺失數據的情況并用均值進行填充,以保證數據的統(tǒng)計特性,并提高分析的準確性。代碼如下。defETL_data():df=pd.read_csv('household_power_consumption.txt',sep=';',parse_dates={'dt':['Date','Time']},low_memory=False,na_values=['nan','?'],index_col='dt',dayfirst=True)print(df.shape)print(df.isnull().sum())df=df.fillna(df.mean())print(df.isnull().sum())print(df.corr())returndf12.1基于LSTM方法的家庭用電量預測2)數據可視化為了進一步理解和分析數據,可以對現有的數據集進行可視化操作,分別繪制各列數據每月、每日、每小時的均值,代碼如下。defdata_plot(df):i=1cols=[0,1,3,4,5,6]plt.figure(figsize=(20,10))forcolincols:plt.subplot(len(cols),1,i)plt.plot(df.resample('M').mean().values[:,col])plt.title(df.columns[col]+'dataresampleovermonthformean',y=0.75,loc='left')i+=1plt.show()i=1

12.1基于LSTM方法的家庭用電量預測cols=[0,1,3,4,5,6]plt.figure(figsize=(20,10))forcolincols:plt.subplot(len(cols),1,i)plt.plot(df.resample('D').mean().values[:,col])plt.title(df.columns[col]+'dataresampleoverdayformean',y=0.75,loc='center')i+=1plt.show()i=1cols=[0,1,3,4,5,6]plt.figure(figsize=(20,10))forcolincols:plt.subplot(len(cols),1,i)plt.plot(df.resample('H').mean().values[:,col])plt.title(df.columns[col]+'dataresampleoverhourformean',y=0.75,loc='left')i+=1plt.show()12.1基于LSTM方法的家庭用電量預測各列數據的月均值、日均值、小時均值分別如圖所示。12.1基于LSTM方法的家庭用電量預測在使用LSTM模型進行預測之前,考慮特征之間的相關性是非常重要的。特征之間的相關性可能會影響模型的性能和預測結果,因此需要進行一些數據分析和處理來確保模型的有效性和穩(wěn)定性。在使用LSTM模型時,需要對數據集中的特征進行選擇。特征選擇的目標是保留重要的特征,并且避免高度相關的特征,因為這樣的特征可能會增加模型的復雜性。通常可以使用相關性分析等方法來幫助選擇高度相關的特征,相應的語句為df.corr()。12.1基于LSTM方法的家庭用電量預測3)LSTM數據準備本案例利用LSTM模型來預測Global_active_power這一變量。為了減少計算時間,并快速得到結果來測試模型,對每小時的數據進行重抽樣,將數據大小從2075259個減少到34589個(以分鐘為單位)。因此,數據包含了當前時間(以小時為單位)的7個輸入變量和1個“Global_active_power”輸出變量。將數據集劃分為訓練集和測試集,此處選擇了34589個數據中的4000個數據進行訓練,其余的將用于測試模型。代碼如下。deflstm(df):df=df[['Global_active_power','Global_reactive_power','Voltage','Global_intensity','Sub_metering_2','Sub_metering_1','Sub_metering_3']]df_resample=df.resample('h').mean()values=df_resample.valuesscaler=MinMaxScaler(feature_range=(0,1))scaled=scaler.fit_transform(values)12.1基于LSTM方法的家庭用電量預測reframed=series_to_supervised(scaled,1,1)r=list(range(df_resample.shape[1]+1,2*df_resample.shape[1]))reframed.drop(reframed.columns[r],axis=1,inplace=True)values=reframed.valuesn_train_time=4000train=values[:n_train_time,:]test=values[n_train_time:,:]train_x,train_y=train[:,:-1],train[:,-1]test_x,test_y=test[:,:-1],test[:,-1]train_x=train_x.reshape((train_x.shape[0],1,train_x.shape[1]))test_x=test_x.reshape((test_x.shape[0],1,test_x.shape[1]))12.1基于LSTM方法的家庭用電量預測上述代碼中使用MinMaxScaler函數進行歸一化處理,將數據映射到[0,1]區(qū)間,并使用fit_transform函數對values進行歸一化處理。接下來,使用series_to_supervised函數將原始數據進行滯后期處理,將滯后一期的數據作為特征來預測當前一期的Global_active_power。series_to_supervised函數的代碼如下。defseries_to_supervised(data,n_in=1,n_out=1,dropnan=True):n_vars=1iftype(data)islistelsedata.shape[1]dff=pd.DataFrame(data)cols,names=list(),list()foriinrange(n_in,0,-1):cols.append(dff.shift(-i))names+=[('var%d(t-%d)'%(j+1,i))forjinrange(n_vars)]foriinrange(0,n_out):12.1基于LSTM方法的家庭用電量預測cols.append(dff.shift(-i))ifi==0:names+=[('var%d(t)'%(j+1))forjinrange(n_vars)]else:names+=[('var%d(t+%d)'%(j+1))forjinrange(n_vars)]agg=pd.concat(cols,axis=1)agg.columns=namesifdropnan:agg.dropna(inplace=True)returnagg12.1基于LSTM方法的家庭用電量預測4)LSTM模型建立和擬合首先創(chuàng)建一個Sequential函數,該函數允許將各個神經網絡層按順序添加。然后依次添加具有100個神經元的LSTM層、Dropout層(用于在訓練過程中隨機禁用一部分神經元,以減少過擬合)、Dense層(具有一個神經元,用于輸出預測結果Global_active_power)。model=Sequential()model.add(LSTM(100,input_shape=(train_x.shape[1],train_x.shape[2])))model.add(Dropout(0.1))model.add(Dense(1))pile(loss='mean_squared_error',optimizer='adam')12.1基于LSTM方法的家庭用電量預測5)模型訓練將這樣一個LSTM模型訓練50個epoch,batch_size為70。即在訓練過程中,模型將在整個數據集上迭代訓練50次,并且在每次迭代中,都會根據70個數據樣本(數據點)更新其權重。訓練過程和損失函數的圖形繪制代碼如下。history=model.fit(train_x,train_y,epochs=50,batch_size=70,validation_data=(test_x,test_y),verbose=2,shuffle=False)plt.plot(history.history['loss'])plt.plot(history.history['val_loss'])plt.title('modelloss')plt.ylabel('loss')plt.xlabel('epoch')plt.legend(['train','test'],loc='upperright')plt.show()12.1基于LSTM方法的家庭用電量預測模型在訓練集和測試集上的損失變化情況如圖所示,可以看出訓練集和測試集上的誤差都呈現了收斂的狀態(tài)。size=df_resample.shape[1]yhat=model.predict(test_x)test_x=test_x.reshape((test_x.shape[0],size))inv_yhat=np.concatenate((yhat,test_x[:,1-size:]),axis=1)inv_yhat=scaler.inverse_transform(inv_yhat)inv_yhat=inv_yhat[:,0]test_y=test_y.reshape((len(test_y),1))inv_y=np.concatenate((test_y,test_x[:,1-size:]),axis=1)inv_y=scaler.inverse_transform(inv_y)inv_y=inv_y[:,0]rmse=np.sqrt(mean_squared_error(inv_y,inv_yhat))print('TestRMSE:%.3f'%rmse)print(model.summary())12.1基于LSTM方法的家庭用電量預測由于數據進行了歸一化操作,因此需要將數據還原后重新計算均方根誤差。對模型預測結果進行逆處理,將預測值恢復到原始的數據范圍。通過這些步驟,可以獲得模型在測試集上的實際預測結果,并進行后續(xù)的分析和比較。代碼如下。12.1基于LSTM方法的家庭用電量預測6)訓練結果與分析模型訓練完成后,可以對結果進行可視化,對比分析預測值與真實值的差異情況,此處分別比較1~500小時時段和20000~21000小時時段的預測結果,可視化代碼如下。aa=[xforxinrange(500)]plt.figure(figsize=(25,10))plt.plot(aa,inv_y[:500],marker='.',label="actual")plt.plot(aa,inv_yhat[:500],'r',label="prediction")plt.ylabel(df.columns[0],size=15)plt.xlabel('Timestepforfirst500hours',size=15)plt.legend(fontsize=15)plt.show()aa=[xforxinrange(1000)]plt.figure(figsize=(25,10))plt.plot(aa,inv_y[20000:21000],marker='.',label="actual")plt.plot(aa,inv_yhat[20000:21000],'r',label="prediction")plt.ylabel(df.columns[0],size=15)plt.xlabel('Timestepfor1000hoursfrom20,000to21,000',size=15)plt.legend(fontsize=15)plt.show()12.1基于LSTM方法的家庭用電量預測Global_active_power在1~500小時時段和20000~21000小時時段的預測值與真實值對比分別如圖所示。12.2基于Stacking融合方法的電網負荷預測Stacking融合方法單個模型難以擬合復雜數據,且抗干擾能力較低,而集成多個模型可以結合不同模型的優(yōu)點,提高泛化能力。集成學習主要有兩種方法:Boosting和Bagging。Boosting采用串行方式,逐步優(yōu)化基學習器以構造強學習器;Bagging則構造多個獨立基學習器,并通過選舉或加權方式提升整體性能。Stacking融合方法結合了Boosting和Bagging的特點,首先利用多個基學習器學習原始數據,再用第二層模型擬合這些學習器的輸出。Stacking又稱堆疊泛化,通過多個基礎模型的預測結果構建元模型,生成最終預測,提高模型的綜合性能。12.2基于Stacking融合方法的電網負荷預測Stacking模型的應用步驟如下。步驟1:數據集劃分。把原始數據集劃分成訓練集與測試集,訓練集部分用來訓練Stacking模型,測試集部分用來測試Stacking模型。步驟2:基礎模型訓練。Stacking模型是基于K折交叉驗證的,把訓練集分成K個部分(K折),訓練K次,每一次選取一個沒有選取過的部分作為驗證集,通過基礎模型得到K個預測結果,這些預測結果合并在一起變成一個新的訓練集。基礎模型1的訓練過程如圖所示。12.2基于Stacking融合方法的電網負荷預測步驟3:元模型訓練。將N個基礎模型的輸出值按照列的方式進行堆疊,就形成了新的樣本數據,將新的樣本數據作為特征,新數據的標簽仍然為原始數據的標簽,將新數據的和交給元模型進行訓練,這個模型就融合了前一輪的N個模型結果。步驟4:測試集結果輸出。在每個基礎模型訓練完成后,使用訓練后的模型對測試集進行預測(這一步在步驟

2之后完成),這樣每個基礎模型均產生一個測試集的預測結果。同樣按照列的方式進行堆疊,將測試集的真實標簽作為標簽,使用步驟

3的元模型訓練Stacking模型,輸出測試集的預測結果,從而驗證Stacking模型的學習效果。12.2基于Stacking融合方法的電網負荷預測電網負荷數據集案例數據集為西班牙2015年—2018年的電網負荷數據,其中包含每小時的電網負荷數據,共35065條記錄,可用于電網負荷的預測,數據取自Kaggle。數據集主要包含“generationbiomass”“generationfossilbrowncoal/lignite”“generationfossilgas”“generationfossilhardcoal”“generationfossiloil”“generationhydropumpedstorageconsumption”“generationhydrorun-of-riverandpoundage”“generationhydrowaterreservoir”“generationnuclear”“generationother”“generationotherrenewable”“generationsolar”“generationwaste”“generationwindonshore”共14個輸入變量,輸出變量為“totalloadactual”。基于Stacking融合方法的電網負荷預測Stacking模型的應用與實現1)數據預處理首先,導入pandas庫、sklearn庫相關模塊,其中MinMaxScaler和StandardScaler是從sklearn庫導入的類,用于特征縮放。使用pandas在讀取名為“energy_dataset.csv”的CSV文件,df.dropna用于刪除數據集中包含空值的行。split_rate=0.8說明數據集劃分比例為0.8,意味著80%的數據將用于訓練,20%的數據將用于測試。split_point用于計算將數據集分成訓練集和測試集的索引點。它使用split_rate來確定用于訓練的數據比例。在劃分數據集后,從訓練集和測試集中分離出特征和標簽。代碼如下。12.2基于Stacking融合方法的電網負荷預測importpandasaspdfromsklearn.preprocessingimportMinMaxScalerfromsklearn.preprocessingimportStandardScalerdf=pd.read_csv('energy_dataset.csv',encoding='utf-8')df=df.dropna(subset=['totalloadactual','generationbiomass','generationfossilbrowncoal/lignite','generationfossilgas','generationfossilhardcoal','generationfossiloil','generationhydropumpedstorageconsumption','generationhydrorun-of-riverandpoundage','generationhydrowaterreservoir','generationnuclear','generationother','generationotherrenewable','generationsolar','generationwaste','generationwindonshore'])label_df=dfencoder=StandardScaler()dataset=label_dfraw_data=dataset.copy()split_rate=0.8split_point=int(len(raw_data)*split_rate)train_data=raw_data[:split_point]test_data=raw_data[split_point:]feature=['generationbiomass','generationfossilbrowncoal/lignite','generationfossilgas','generationfossilhardcoal','generationfossiloil','generationhydropumpedstorageconsumption','generationhydrorun-of-riverandpoundage','generationhydrowaterreservoir','generationnuclear','generationother','generationotherrenewable','generationsolar','generationwaste','generationwindonshore',]predict_class="totalloadactual"12.2基于Stacking融合方法的電網負荷預測然后,根據方差閾值(0.5)進行特征選擇。創(chuàng)建VarianceThreshold對象variance_selector并使用訓練集中的特征進行擬合。使用get_support()方法獲取經過方差閾值篩選后的特征列,更新feature變量,將其設置為經過方差閾值篩選后的特征,將訓練集中的特征和標簽分開。接著,初始化兩個MinMaxScaler對象feature_scaler和label_scaler,用于對特征和標簽進行歸一化處理。對訓練集中的特征和標簽執(zhí)行fit_transform方法,最后,使用feature_scaler對象的transform方法對測試集中的特征進行歸一化處理。代碼如下。fromsklearn.feature_selectionimportVarianceThresholdthreshold=0.5variance_selector=VarianceThreshold(threshold=threshold)variance_selector.fit(train_data[feature])variance_support=variance_selector.get_support()variance_feature=train_data[feature].loc[:,variance_support].columns.tolist()12.2基于Stacking融合方法的電網負荷預測feature=variance_featuretrain_features=train_data[feature]train_labels=train_data[predict_class]test_features=test_data[feature]test_labels=test_data[predict_class]feature_scaler=MinMaxScaler()label_scaler=MinMaxScaler()train_features_normalized=feature_scaler.fit_transform(train_features)train_labels_normalized=label_scaler.fit_transform(train_labels.values.reshape(-1,1))test_features_normalized=feature_scaler.transform(test_features)test_labels_normalized=label_scaler.transform(test_labels.values.reshape(-1,1))12.2基于Stacking融合方法的電網負荷預測2)建立基礎模型首先從torch庫、sklearn庫等庫中導入所需的模塊,然后定義LSTMModel類和PyTorchRegressor類,LSTMModel類是一個自定義的PyTorch模型類,用于定義一個包含3個LSTM層和1個Dense層的循環(huán)神經網絡模型。構造函數__init__中初始化了3個LSTM層和1個Dense層,每個LSTM層的輸入維度和隱藏層維度逐漸減小,這個模型用于接收輸入序列數據并輸出回歸值。forward方法定義了模型的前向傳播邏輯,首先初始化LSTM層的初始隱藏狀態(tài)和神經元狀態(tài)(這里都初始化為0),然后依次經過3個LSTM層,最后通過Dense層將最終時間步的輸出轉換為回歸值。12.2基于Stacking融合方法的電網負荷預測45classLSTMModel(nn.Module):def__init__(self,input_dim):super(LSTMModel,self).__init__()self.lstm1=nn.LSTM(input_dim,100,batch_first=True)self.lstm2=nn.LSTM(100,50,batch_first=True)self.lstm3=nn.LSTM(50,25,batch_first=True)self.fc=nn.Linear(25,1)defforward(self,x):h_0=torch.zeros(1,x.size(0),100)c_0=torch.zeros(1,x.size(0),100)out,_=self.lstm1(x,(h_0,c_0))h_1=torch.zeros(1,x.size(0),50)c_1=torch.zeros(1,x.size(0),50)out,_=self.lstm2(out,(h_1,c_1))h_2=torch.zeros(1,x.size(0),25)c_2=torch.zeros(1,x.size(0),25)out,_=self.lstm3(out,(h_2,c_2))out=self.fc(out[:,-1,:])returnout12.2基于Stacking融合方法的電網負荷預測PyTorchRegressor類是一個自定義的回歸器類,它繼承自sklearn庫中的BaseEstimator類和RegressorMixin類,以便與sklearn庫的模型接口兼容。fit方法用于訓練模型,它接收輸入特征x和目標標簽y,首先將它們轉換為PyTorch張量(x_tensor和y_tensor),然后進行多輪訓練。在每個訓練輪次中,模型首先前向傳播,計算損失,然后反向傳播和優(yōu)化參數。predict方法用于進行模型預測,它首先將輸入特征x轉換為PyTorch張量,然后使用訓練好的模型進行前向傳播,得到模型的預測輸出。相關代碼如下。classPyTorchRegressor(BaseEstimator,RegressorMixin):def__init__(self,model,epochs=100,batch_size=512):self.model=modelself.epochs=epochsself.batch_size=batch_sizeself.optimizer=torch.optim.Adam(self.model.parameters())self.criterion=nn.MSELoss()

基于Stacking融合方法的電網負荷預測deffit(self,x,y):x_tensor=torch.tensor(x,dtype=torch.float32).unsqueeze(1)y_tensor=torch.tensor(y,dtype=torch.float32).view(-1,1)forepochinrange(self.epochs):self.model.train()self.optimizer.zero_grad()outputs=self.model(x_tensor)loss=self.criterion(outputs,y_tensor)print(f"Thisisepoch{epoch}/{self.epochs},Lossis{loss.item()}")loss.backward()self.optimizer.step()returnselfdefpredict(self,x):self.model.eval()withtorch.no_grad():x_tensor=torch.tensor(x,dtype=torch.float32).unsqueeze(1)outputs=self.model(x_tensor)returnoutpu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論