NILMTK-introducción y uso del conjunto de datos clásico REDD

Después de configurar el entorno del paquete NILMTK, quiero encontrar datos para probarlo. En API Docs del sitio web oficial de NILMTK, encontré que el módulo dataset_converters tiene una función de procesamiento de conjuntos de datos incorporada, como se muestra en la figura:

Convierta los datos en archivos HDF. Estos datos son relativamente buenos. Entre ellos, los conjuntos de datos más utilizados son REDD y UK_DALE.

1. Conjunto de datos REDD

La dirección de descarga de la versión actual es:  http://redd.csail.mit.edu , debe enviar un correo electrónico al autor para obtener el nombre de usuario y la contraseña para descargar.

论文 为 : J. Zico Kolter y Matthew J. Johnson. REDD: un conjunto de datos públicos para la investigación de desagregación de energía. En las actas del taller SustKDD sobre aplicaciones de minería de datos en sostenibilidad, 2011. [ pdf ]

Los archivos del conjunto de datos son:

El archivo contiene principalmente datos de energía de baja frecuencia y datos de voltaje y corriente de alta frecuencia

low_freq: datos de potencia de 1Hz

high_freq: datos de forma de onda de voltaje y corriente después de la calibración y la agrupación

high_freq_row: datos de forma de onda de corriente y voltaje sin procesar

(1) Directorio de archivos de low_freq

Se recopilan un total de 6 datos de hogares. Las etiquetas registran el tipo de dispositivo de cada canal y el canal registra los datos de potencia de la marca de tiempo UTC de cada canal.

etiquetas:

canal (un punto por segundo):

(2) Directorio de archivos de high_freq

Se recopilan un total de 6 datos domésticos, current_1 registra los datos actuales de la primera fuente de energía, current_1 registra los datos actuales de la segunda fuente de energía y voltaje registra los datos de voltaje.

hay que tener en cuenta es:

La marca de tiempo UTC decimal tiene el mismo formato que la marca de tiempo UTC de baja frecuencia, pero esto permite partes fraccionarias.

b) Recuento de ciclos: aunque se expresa como doble precisión en el archivo, en realidad es un número entero que indica cuántos ciclos de CA están reservados para esta forma de onda en particular.

c. En el período igualmente espaciado, 275 valores decimales representan el valor de la forma de onda

Después de descargar el conjunto de datos, los datos se pueden cambiar al formato HDF a través de la función de dataset_converters:

from nilmtk.dataset_converters import convert_redd
 
convert_redd(r'C:\Users\admin\Anaconda3\nilm_metadata\low_freq',r'C:\Users\admin\Anaconda3\nilm_metadata\low_freq\redd_low_new.h5')

2. Uso del conjunto de datos REDD

a, algoritmo de descomposición de carga

A través de la API del sitio web oficial de NILMTK, sabemos que los algoritmos para paquetes de descomposición de carga incluyen Optimización combinatoria, Factor Hidden Markov (FHMM), Hart 1985 (algoritmo Hart 1985), y CO y FHMM se utilizan comúnmente.

b. Realización de la descomposición de la carga

El siguiente ejemplo es calculado por CO y FHMM, y el archivo se obtiene en:

CO: http://nilmtk.github.io/nilmtk/master/_modules/nilmtk/disaggregate/combinatorial_optimisation.html#CombinatorialOptimisation

FHMM : el archivo fhmm_exact bajo el archivo nilmtk.legacy.disaggregate.

  • recuperar datos:
from __future__ import print_function, division
import pandas as pd
import numpy as np
from nilmtk.dataset import DataSet
#from nilmtk.metergroup import MeterGroup
#from nilmtk.datastore import HDFDataStore
#from nilmtk.timeframe import TimeFrame
from nilmtk.disaggregate.combinatorial_optimisation import CombinatorialOptimisation
from nilmtk.legacy.disaggregate.fhmm_exact import FHMM

train = DataSet('C:/Users/admin/PycharmProjects/nilmtktest/low_freq/redd_low.h5')  # 读取数据集
test = DataSet('C:/Users/admin/PycharmProjects/nilmtktest/low_freq/redd_low.h5') # 读取数据集
building = 1  ## 选择家庭house
train.set_window(end="30-4-2011")  ## 划分数据集,2011年4月20号之前的作为训练集
test.set_window(start="30-4-2011") ## 四月40号之后的作为测试集

## elec包含了这个家庭中的所有的电器信息和总功率信息,building=1-6个家庭
train_elec = train.buildings[1].elec  
test_elec = test.buildings[1].elec

top_5_train_elec = train_elec.submeters().select_top_k(k=5)  ## 选择用电量排在前5的来进行训练和测试

Se selecciona el primer hogar y el consumo de electricidad se encuentra entre los 5 principales datos de electrodomésticos para la prueba.

  • Cálculo:
def predict(clf, test_elec, sample_period, timezone):   ## 定义预测的方法
    pred = {}
    gt= {}
    #获取总的负荷数据
    for i, chunk in enumerate(test_elec.mains().load(sample_period=sample_period)):
        chunk_drop_na = chunk.dropna()   ### 丢到缺省值
        pred[i] = clf.disaggregate_chunk(chunk_drop_na)  #### 分解,disaggregate_chunk #通过调用这个方法实现分解,这部分代码在下面可以见到
        gt[i]={}  ## 这是groudtruth,即真实的单个电器的消耗功率

        for meter in test_elec.submeters().meters:
            # Only use the meters that we trained on (this saves time!)    
            gt[i][meter] = next(meter.load(sample_period=sample_period))  
        gt[i] = pd.DataFrame({k:v.squeeze() for k,v in gt[i].items()}, index=next(iter(gt[i].values())).index).dropna()   #### 上面这一块主要是为了得到pandas格式的gt数据

    # If everything can fit in memory
    gt_overall = pd.concat(gt)   
    gt_overall.index = gt_overall.index.droplevel()
    pred_overall = pd.concat(pred)
    pred_overall.index = pred_overall.index.droplevel()

    # Having the same order of columns
    gt_overall = gt_overall[pred_overall.columns]

    #Intersection of index
    gt_index_utc = gt_overall.index.tz_convert("UTC")
    pred_index_utc = pred_overall.index.tz_convert("UTC")
    common_index_utc = gt_index_utc.intersection(pred_index_utc)


    common_index_local = common_index_utc.tz_convert(timezone)
    gt_overall = gt_overall.ix[common_index_local]
    pred_overall = pred_overall.ix[common_index_local]
    appliance_labels = [m.label() for m in gt_overall.columns.values]
    gt_overall.columns = appliance_labels
    pred_overall.columns = appliance_labels
 
    return gt_overall, pred_overall

classifiers = { 'CO':CombinatorialOptimisation(),'FHMM':FHMM()}   ### 设置了两种算法,一种是CO,一种是FHMM
predictions = {}
sample_period = 120  ## 采样周期是两分钟
for clf_name, clf in classifiers.items():
    print("*"*20)
    print(clf_name)
    print("*" *20)
    clf.train(top_5_train_elec, sample_period=sample_period)  ### 训练部分
    gt, predictions[clf_name] = predict(clf, test_elec, 120, train.metadata['timezone'])

Primero use clf.train para entrenar las leyes características de estos 5 tipos de aparatos eléctricos, y luego use los datos de potencia total para descomponer las características de varios aparatos eléctricos. gt registra los datos de potencia de cada aparato eléctrico y el período de muestreo es de un punto en dos minutos Luego, de acuerdo con los tipos de aparatos eléctricos previstos, se seleccionan cinco aparatos eléctricos con las clasificaciones de consumo de energía más altas.

La variable de predicciones registra los resultados del cálculo de los dos algoritmos:

  • Evaluación:
def compute_rmse(gt, pred):   ### 评估指标 rmse
    from sklearn.metrics import mean_squared_error
    rms_error = {}
    for appliance in gt.columns:
        rms_error[appliance] = np.sqrt(mean_squared_error(gt[appliance], pred[appliance])) ## 评价指标的定义很简单,就是均方根误差
    return pd.Series(rms_error)
rmse = {}
for clf_name in classifiers.keys():
    rmse[clf_name] = compute_rmse(gt, predictions[clf_name])
rmse = pd.DataFrame(rmse)

El resultado del cálculo es:

Blog de referencia: https://blog.csdn.net/baidu_36161077/article/details/81144037

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_28409193/article/details/109490513
Recomendado
Clasificación