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

下载本文档

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

文档简介

电力大数据分析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融合方法的电网负荷预测28classLSTMModel(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)returnoutputs.numpy().flatten()12.2基于Stacking融合方法的电网负荷预测3)建立Stacking模型首先初始化基础模型,包括三个模型:XGBoost模型、决策树模型及上文建立的LSTM模型,这些模型将会用来进行预测。使用线性回归模型(LinearRegression)作为元模型,元模型用来组合基础模型的预测结果。然后创建堆叠回归模型(StackingRegressor),堆叠回归模型会训练基础模型,并使用基础模型的预测结果来训练元模型。这里使用训练数据训练堆叠回归模型,其中train_features_normalized是经过归一化处理的训练特征数据,train_labels_normalized.ravel()是经过归一化处理并展平的训练标签数据。最后使用K折交叉验证来预测目标值。cross_val_predict函数会对模型进行K折交叉验证,返回K折交叉验证的预测结果。代码如下。12.2基于Stacking融合方法的电网负荷预测lstm_model=LSTMModel(train_features.shape[1])base_learners=[('xgb',xgb.XGBRegressor(n_estimators=500,max_depth=7,learning_rate=0.005)),('dt',DecisionTreeRegressor(max_depth=10,min_samples_split=2,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论