Nilmtk-contrib es un repositorio de contribuciones de la comunidad para NILMTK que permite agregar nuevas funcionalidades, modelos de aprendizaje automático y algoritmos de desagregación de energía. Dado que el desarrollo del NILMTK principal ha sido más lento en los últimos años, nilmtk-contrib permite a los investigadores y desarrolladores mejorar la herramienta sin depender de actualizaciones en el repositorio principal.
Características de nilmtk-contrib
- Nuevos Algoritmos de Desagregación
- Contiene implementaciones de modelos avanzados basados en redes neuronales, como Sequence-to-Sequence y Variational Autoencoders.
- Se han añadido métodos híbridos que combinan enfoques basados en descomposición de señales y aprendizaje profundo.
- Soporte para Nuevos Datasets
- Extiende la compatibilidad con bases de datos de consumo eléctrico no incluidas en NILMTK.
- Simplifica la conversión de datos desde formatos comunes como CSV a HDF5, que es el formato utilizado por NILMTK.
- Mayor Flexibilidad y Mantenibilidad
- Permite a los desarrolladores probar nuevas ideas sin modificar el código base del NILMTK original.
- Se puede instalar y utilizar junto con NILMTK sin conflictos.
Para instalar nilmtk-contrib correctamente, debes cumplir con los requisitos de versiones específicas de Python y dependencias.
Requisitos clave
| Paquete | Versión requerida | Compatibilidad con Python |
|---|---|---|
| NILMTK | >=0.4 | Python 3.7 (recomendado) |
| scikit-learn | >=0.21 | Python 3.5-3.7 |
| Keras | >=2.2.4 | Python 3.5+ |
| cvxpy | >=1.0.0 | Python >=3.7 (para cvxpy<=1.0.0) |

Guia paso a paso para instalar nilmtk-contrib sin conflictos
Los pasos ajustados para crear un entorno limpio, instalando las versiones de las librerías necesarias y evitando los errores tipicos:
1. Crear y preparar el entorno virtual
Primero, elimina cualquier entorno anterior si es necesario y luego crea uno nuevo:
# Verificar los entornos existentes
conda env list
# Eliminar el entorno 'nilm' si ya existe
conda env remove --name nilm
# Limpiar cache
conda clean --all
Python 3.7 es la versión más estable que es usada para estas dependencias y la que los creadores de NILMTK recomiendas, luego, lo ideal es crear el entorno limpio con esa versión:
# Crear el entorno 'nilm' con Python 3.7
conda create -n nilm python=3.7 -y
# Activar el entorno recién creado
conda activate nilm
2. Instalar numpy compatible
Instalar una versión específica de numpy para asegurar la compatibilidad con NILMTK:
pip install numpy==1.19.5
3. Agregar canales de Conda
Para asegurar que las dependencias necesarias se encuentren:
conda config --add channels conda-forge
conda config --add channels nilmtk
4. Instalar nilmtk
Instala la versión compatible de NILMTK:
conda install -c nilmtk nilmtk=0.4.3 -y
5. Instalar matplotlib compatible
La versión de matplotlib requerida por NILMTK 0.4.3 es algo restrictiva. Debes instalar matplotlib-base primero:
# Instalar matplotlib-base y matplotlib compatibles
conda install matplotlib-base=3.1.3 matplotlib=3.1.3 -y
6. Instalar TensorFlow compatible
Instalar una versión de TensorFlow compatible con las bibliotecas:
pip install tensorflow==1.14.0
7. Instalar nilm_metadata
Instalar el paquete nilm_metadata desde GitHub:
pip install git+https://github.com/nilmtk/nilm_metadata
8. Instalar nilmtk-contrib
La instalación de nilmtk-contrib podría fallar debido a la falta de detección de la instalación de NILMTK por parte de pip. La solución es instalar nilmtk-contrib sin depender de las bibliotecas que necesita verificar:
pip install --no-deps git+https://github.com/nilmtk/nilmtk-contrib
Alternativa (si el paso anterior no funciona ): Si el paso anterior no funciona, puedes clonar el repositorio y hacer la instalación manualmente:
git clone https://github.com/nilmtk/nilmtk-contrib.git
cd nilmtk-contrib
pip install --no-deps .
9. Instalar otras dependencias necesarias
Es posible que necesites instalar otras dependencias, como cvxpy y protobuf:
pip install protobuf==3.20.*pip install cvxpy==1.1.13
10. Crear archivo parche.py (muy importante)
Si ejecutamos algo que incluya el modulos niml_contrib con la instalacion actual, lo normal es tener con BinaryCrossentropy y MeanSquaredError. Si se presenta el error ImportError: cannot import name 'BinaryCrossentropy' from 'keras.losses', podriamos editar el archivo correspondiente (rnn_attention_classification.py) para reemplazar las importaciones incorrectas de Keras. Es decir en lugar de:
from keras.losses import BinaryCrossentropy, MeanSquaredError
Usar las funciones personalizadas para estas pérdidas:
from keras import backend as K
def BinaryCrossentropy():
def loss(y_true, y_pred):
return K.binary_crossentropy(y_true, y_pred)
return loss
def MeanSquaredError():
def loss(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
return loss
El problema es que si tocamos ficheros de la librería nos va a fallar el kernel, así que lo mejor es hacerlo lo mismo desde un parche (lo cual en el argot se llama monkey patche), que deberemos guardar en nuestro directorio de trabajo.
El contenido final del parche, por ejemplo que nombraremos como «parche.py» , es el siguiente:
import keras.losses
import keras.layers
# Parches para evitar errores de importación con versiones antiguas de Keras
if not hasattr(keras.losses, 'BinaryCrossentropy'):
def BinaryCrossentropy(*args, **kwargs): pass
keras.losses.BinaryCrossentropy = BinaryCrossentropy
if not hasattr(keras.losses, 'MeanSquaredError'):
def MeanSquaredError(*args, **kwargs): pass
keras.losses.MeanSquaredError = MeanSquaredError
if not hasattr(keras.layers, 'MultiHeadAttention'):
class MultiHeadAttention:
def __init__(self, *args, **kwargs): pass
def __call__(self, *args, **kwargs): return self
keras.layers.MultiHeadAttention = MultiHeadAttention
if not hasattr(keras.layers, 'LayerNormalization'):
class LayerNormalization:
def __init__(self, *args, **kwargs): pass
def __call__(self, *args, **kwargs): return self
keras.layers.LayerNormalization = LayerNormalization
Para usar el parche en nuestro código sin tener que tocar variables de entorno con el directorio de trabajo podemos usar este ejemplo adaptándolo a nuestra casuística particular:
import tensorflow as tf
print("TF version:", tf.__version__)
import sys
sys.path.append("D:/ruta/a/tu/directorio/del/parche") # Asegúrate de que el parche.py esté allí
import parche # Esto aplica los monkey patches
import nilmtk_contrib
print("nilmtk-contrib instalado correctamente")
- El
parche.pyse encarga de quenilmtk_contribno falle por capas o funciones modernas que no existen en Keras 2.2.4. - Si necesitas realmente usar
MultiHeadAttentionoBERT, requerirás migrar a TensorFlow 2.x (no recomendado si usas NILMTK 0.4.3).
11. Registrar el entorno en Jupyter (Muy recomndable)
Si deseas usar este entorno en Jupyter Notebook, regístralo como un nuevo kernel:
python -m ipykernel install --user --name nilm --display-name "Python (nilm)"
Para probar que todo ha ido bien, ejecuta este comando para confirmar que todo está instalado correctamente:
python -c «import nilmtk; import nilmtk_contrib; print(‘Éxito’)»
12. Salir del entorno
Cuando termines de trabajar en el entorno, puedes desactivarlo:
conda deactivate
13. Verificar el entorno
Finalmente, asegúrate de que el entorno esté configurado correctamente:
conda env list
Con estos pasos, tu entorno limpio debería estar correctamente configurado para trabajar con NILMTK, nilmtk-contrib, y otras bibliotecas necesarias. Si tienes algún problema en el proceso, seria recomendable empezar nuevamente desde el principio porque esta guia ha sido contrasatada y deberia de funcionar.
Módulos que puede que se necesite instalar si hay errores ( lo anexo simplemente por curiosidad pero no seran necesarios con los pasos anteriores):
1. Instalar Keras y TensorFlow compatibles
Para evitar conflictos con keras.optimizers, usa:
pip install tensorflow==2.5.0 keras==2.4.3 h5py==3.1.0
2. Instalar cvxpy 1.0.0 (versión compatible)
cvxpy 1.0.0 funcionaba con Python 3.7 pero ahora no es posible:
pip install cvxpy==1.0.0
El error ocurre porque CVXPY 1.0.0 no existe en PyPI, y las versiones disponibles requieren Python ≥3.8. Para resolverlo en tu entorno nilmtk-env (Python 3.7), sigue estos pasos:
3. Instalar CVXPY 1.3.4 (última versión compatible con Python 3.7):
pip install cvxpy==1.3.4 numpy==1.19.5 scipy==1.6.3
Verificar instalación:
python -c "import cvxpy; print(cvxpy.__version__)"
# Debe mostrar: 1.3.4
Resolución de otros conflictos comunes
| Error | Solución |
|---|---|
ImportError: cannot import name 'SGD' | Asegúrate de usar tensorflow.keras.optimizers en lugar de keras.optimizers. |
ModuleNotFoundError: No module named 'tensorflow' | Revisa que tensorflow==2.5.0 esté instalado. |
numpy.ufunc size changed | Fija numpy==1.19.5 y evita actualizaciones automáticas. |
Notas adicionales
- GPU: Si tienes una tarjeta NVIDIA, instala CUDA 11.2 y cuDNN 8.1.0 para acelerar el entrenamiento.
- Entornos alternativos: Si persisten errores, clona los repositorios manualmente y configura el
PYTHONPATH:bashgit clone https://github.com/nilmtk/nilm_metadata.git git clone https://github.com/nilmtk/nilmtk.git git clone https://github.com/nilmtk/nilmtk-contrib.git set PYTHONPATH=%PYTHONPATH%;C:\ruta\a\nilm_metadata;C:\ruta\a\nilmtk;C:\ruta\a\nilmtk-contrib
Con estos pasos, nilmtk-contrib debería funcionar sin conflictos en Windows.
Ejemplo de Uso
Después de instalarlo, puedes importar y utilizar algoritmos de desagregación avanzados como:
from nilmtk_contrib.disaggregate import Seq2Point
model = Seq2Point()
# Cargar datos y entrenar el modelo...
Conclusión
nilmtk-contrib es una excelente opción si trabajas en NILM y necesitas herramientas más actualizadas y flexibles que las que ofrece NILMTK por defecto. Es especialmente útil para investigadores que desean experimentar con nuevos modelos de desagregación energética.

Debe estar conectado para enviar un comentario.