Estoy mirando pybrain para tomar alarmas del monitor del servidor y determinar la causa raíz de un problema. Estoy contento con entrenarlo mediante el aprendizaje supervisado y curar los conjuntos de datos de capacitación. Los datos están estructurados de manera similar a esto:
- Servidor tipo A # 1
- Alarma tipo 1
- Alarma tipo 2
- Servidor tipo A # 2
- Alarma tipo 1
- Alarma tipo 2
- Servidor tipo B # 1
- Tipo de alarma 99
- Alarma tipo 2
Entonces hay n servidores, con x alarmas que pueden ser UP
o DOWN
. Ambos n
y x
son variables.
Si el Servidor A1 tiene la alarma 1 y 2 como DOWN
, entonces podemos decir que el servicio a está inactivo en ese servidor y es la causa del problema.
Si la alarma 1 está inactiva en todos los servidores, entonces podemos decir que el servicio a es la causa.
Potencialmente puede haber múltiples opciones para la causa, por lo que la clasificación directa no parece apropiada.
También me gustaría vincular las fuentes de datos posteriores a la red. Tales como solo scripts que hacen ping a algún servicio externo.
Es posible que no se activen todas las alarmas apropiadas de una vez, debido a las comprobaciones del servicio en serie, por lo que puede comenzar con un servidor inactivo y luego otro servidor inactivo 5 minutos más tarde.
Estoy tratando de hacer algunas cosas básicas al principio:
from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet
from pybrain.supervised.trainers import BackpropTrainer
INPUTS = 2
OUTPUTS = 1
# Build network
# 2 inputs, 3 hidden, 1 output neurons
net = buildNetwork(INPUTS, 3, OUTPUTS)
# Build dataset
# Dataset with 2 inputs and 1 output
ds = SupervisedDataSet(INPUTS, OUTPUTS)
# Add one sample, iterable of inputs and iterable of outputs
ds.addSample((0, 0), (0,))
# Train the network with the dataset
trainer = BackpropTrainer(net, ds)
# Train 1000 epochs
for x in xrange(10):
trainer.train()
# Train infinite epochs until the error rate is low
trainer.trainUntilConvergence()
# Run an input over the network
result = net.activate([2, 1])
Pero estoy teniendo dificultades para asignar números variables de alarmas a números estáticos de entradas. Por ejemplo, si agregamos una alarma a un servidor, o agregamos un servidor, toda la red necesita ser reconstruida. Si eso es algo que hay que hacer, puedo hacerlo, pero quiero saber si hay una mejor manera.
Otra opción en la que estoy tratando de pensar es tener una red diferente para cada tipo de servidor, pero no veo cómo puedo sacar una conclusión para todo el entorno, ya que solo realizará evaluaciones en un solo host, en lugar de Todos los anfitriones a la vez.
¿Qué tipo de algoritmo debo usar y cómo mapeo el conjunto de datos para sacar conclusiones de todo el entorno en su conjunto con entradas variables?