能源大数据分析理论与实践 课件 11.油气大数据分析案例;12.电力大数据分析_第1页
能源大数据分析理论与实践 课件 11.油气大数据分析案例;12.电力大数据分析_第2页
能源大数据分析理论与实践 课件 11.油气大数据分析案例;12.电力大数据分析_第3页
能源大数据分析理论与实践 课件 11.油气大数据分析案例;12.电力大数据分析_第4页
能源大数据分析理论与实践 课件 11.油气大数据分析案例;12.电力大数据分析_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

油气大数据分析案例11TheCaseofOilandGasBigData11.1油气消费量的影响因素分析石油和天然气是经济发展的重要驱动因素,分析油气消费量的影响因素和影响效果对政府决策具有重要意义。影响油气消费量的因素较多,本案例选取经济发展、经济结构、科技发展及人口规模4种因素,研究其对油气消费量的影响,从而介绍回归分析的应用方法。其中,油气消费量用符号OGC表示;经济发展使用GDP指标量化,用符号ED表示;经济结构使用第三产业产值占GDP比值来量化,用符号ES表示;科技发展通过研究与试验发展经费支出来量化,用符号TD表示;人口规模使用年末总人口数来量化,用符号PS表示。1.案例描述11.1油气消费量的影响因素分析2.回归分析(1)数据采集与处理本案例以2001年—2020年全国数据为例,探究各因素对油气消费量的影响,数据来源于《中国统计年鉴》。采集数据之后,需要将数据文件保存为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中的统计分析库,提供了多种用于统计建模和分析的函数和类,用于拟合多种统计模型,执行统计测试及数据探索和可视化。首先使用iloc()函数定位数据所在列,并将数据类型转换成浮点型;然后使用sm.add_constant()函数在“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,表明模型的拟合度较好,自变量经济发展(ED)的回归系数为0.0207,P值为0.446,说明经济发展对油气消费量有正向促进作用,但显著性不高;经济结构(ES)的回归系数为-0.6158,P值为0.104,虽未低于0.1,但基本说明了经济结构的优化对降低油气消费量产生了正向促进作用;科技发展(TD)的回归系数为0.1668,通过了5%的显著性检验,表明当科技发展水平较高时,会促进油气消费量的增加,说明科技发展的方向主要是拉动经济增长,在降低能耗方面未得到体现;人口规模(PS)的回归系数为3.5771,通过了1%的显著性检验,表明人口规模越大,油气消费量越高。图3回归分析模型输出结果11.2石油管线损失预测石油管线事故是指在石油管线系统中发生的意外事件,导致石油或石油产品的泄漏、溢出或其他不良后果,造成巨大的损失。本案例针对石油管线事故损失进行预测,通过搜集到的数据集和机器学习算法(随机森林)建立模型来预测石油管线事故可能导致的损失,包括人员伤亡、环境破坏、财务成本等。本案例主要展示如何基于机器学习算法建立一个有效的预测系统,帮助石油公司更好地管理风险和进行资源分配,以提高石油管线安全性,降低损失。1.案例描述11.2石油管线损失预测步骤1:采集数据并准备数据集。需要准备用于训练和测试模型的数据集,数据集应包含特征和对应的目标变量。特征是用于预测目标变量的特征或指标,目标变量是需要进行预测的值。通常,需要将数据集划分为训练集和测试集,其中训练集用于训练模型,测试集用于评估模型的性能。2.随机森林回归的步骤11.2石油管线损失预测步骤2:模型训练与预测。在sklearn库中,可以使用RandomForestRegressor类来构建随机森林回归模型。可以设置一些参数来控制随机森林的行为,例如决策树的数量、特征选择的方式、决策树的生长方式等,可以根据实际问题和需求进行参数的调整。使用训练集对随机森林回归模型进行训练,模型将根据训练集中的样本和目标变量的值来构建多棵决策树,并在每棵树上进行特征选择和划分。使用训练好的随机森林回归模型对测试集中的样本进行预测,模型将对每棵决策树的预测结果进行平均或加权平均,从而得到最终的回归预测结果。2.随机森林回归的步骤11.2石油管线损失预测步骤3:模型评估与调优。通过与真实目标变量的比较,评估模型的性能。可以使用各种回归性能指标,如均方误差(MeanSquaredError,MSE)、平均绝对误差(MeanAbsoluteError,MAE)、决定系数(R2)等,来评估模型的准确性和泛化能力。根据评估结果可以对随机森林回归模型进行调优,尝试调整随机森林回归模型的参数,从而提高模型的性能。步骤4:模型应用。模型评估与调优后,可以将训练好的随机森林回归模型保存为文件,在使用时读取文件并进行实际预测。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列,将其拆分为年、月、日三个特征,来表示事故发生时间的特征,对于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_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,说明模型的准确率较好。可尝试调整其他参数,这里仅对n_estimator进行了简单调优。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列的数据。首先对缺失数据进行检查,查看各列缺失数据的情况并用均值进行填充,以保证数据的统计特性,并提高分析的准确性。代码如下。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模型进行预测之前,考虑特征之间的相关性是非常重要的。特征之间的相关性可能会影响模型的性能和预测结果,因此需要进行一些数据分析和处理来确保模型的有效性和稳定性。在使用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]区间,并使用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模型建立和拟合首先创建一个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方法的家庭用电量预测模型在训练集和测试集上的损失变化情况如图所示,可以看出训练集和测试集上的误差都呈现了收敛的状态。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方法的家庭用电量预测由于数据进行了归一化操作,因此需要将数据还原后重新计算均方根误差。对模型预测结果进行逆处理,将预测值恢复到原始的数据范围。通过这些步骤,可以获得模型在测试集上的实际预测结果,并进行后续的分析和比较。代码如下。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融合方法单个模型难以拟合复杂数据,且抗干扰能力较低,而集成多个模型可以结合不同模型的优点,提高泛化能力。集成学习主要有两种方法:Boosting和Bagging。Boosting采用串行方式,逐步优化基学习器以构造强学习器;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)进行特征选择。创建VarianceThreshold对象variance_selector并使用训练集中的特征进行拟合。使用get_support()方法获取经过方差阈值筛选后的特征列,更新feature变量,将其设置为经过方差阈值筛选后的特征,将训练集中的特征和标签分开。接着,初始化两个MinMaxScaler对象feature_scaler和label_scaler,用于对特征和标签进行归一化处理。对训练集中的特征和标签执行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层的循环神经网络模型。构造函数__init__中初始化了3个LSTM层和1个Dense层,每个LSTM层的输入维度和隐藏层维度逐渐减小,这个模型用于接收输入序列数据并输出回归值。forward方法定义了模型的前向传播逻辑,首先初始化LSTM层的初始隐藏状态和神经元状态(这里都初始化为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),然后进行多轮训练。在每个训练轮次中,模型首先前向传播,计算损失,然后反向传播和优化参数。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. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论