Машинное обучение для серверов мониторинга

Я смотрю на pybrain для получения сигналов тревоги сервера и определения основной причины проблемы. Я доволен обучением, используя контролируемое обучение и обучение наборов данных обучения. Данные структурированы примерно так:

 * Server Type **A** #1
  * Alarm type 1
  * Alarm type 2
 * Server Type **A** #2
  * Alarm type 1
  * Alarm type 2
 * Server Type **B** #1
  * Alarm type **99**
  * Alarm type 2

Таким образом, существует n серверов с x аварийными сигналами, которые могут быть UP или DOWN. Оба параметра n и x являются переменными.

Если сервер A1 имеет аварийные сигналы 1 и 2 как DOWN, мы можем сказать, что служба a отключена на этом сервере и является причиной проблемы.

Если на всех серверах отключен аварийный сигнал 1, мы можем сказать, что причиной является a.

Потенциально может быть несколько вариантов причины, поэтому прямая классификация не кажется подходящей.

Я также хотел бы связать более поздние источники данных с сетью. Например, просто скрипты, которые пингоруют некоторую внешнюю службу.

Все соответствующие аварийные сигналы могут не запускаться одновременно, из-за проверки серийных услуг, поэтому он может начинаться с одного сервера вниз, а затем другого сервера через 5 минут.

Сначала я пытаюсь сделать некоторые основные вещи:

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])

Но я [m имеет сложное время, отображающее переменные числа аварийных сигналов на статические числа входов. Например, если мы добавляем сигнал тревоги на сервер или добавляем сервер, вся сеть должна быть перестроена. Если это то, что нужно сделать, я могу это сделать, но хочу знать, есть ли лучший способ.

Другая опция, о которой я пытаюсь думать, имеет другую сеть для каждого типа сервера, но я не вижу, как я могу сделать вывод об окружающей среде, поскольку он просто сделает оценки на одном хосте, вместо всех хостов одновременно.

Какой тип алгоритма я должен использовать и как мне сопоставить набор данных для вывода общих для всей среды выводов в целом с переменными входами?

Я очень открыт для любого алгоритма, который будет работать. Go даже лучше, чем python.

Ответы

Ответ 1

На самом деле это сложная проблема.

Представление меток

Трудно представить ваши целевые метки для обучения. Как вы указали,

If Server A1 has alarm 1 & 2 as DOWN, then we can say that service a is down on that server and is the cause of the problem.
If alarm 1 is down on all servers, then we can say that service a is the cause.
There can potentially be multiple options for the cause ...

Я думаю, вам нужно перечислить все возможные варианты, иначе мы не можем ожидать, что алгоритм ML будет обобщен. Чтобы сделать его простым, скажем, у вас есть только две возможные причины проблемы:

1. Service problem 
2. Server problem  

Бинарный классификатор по сайтам

Предположим, что в вашей первой модели ML это две причины. Затем вы работаете над бинарным классификатором на сайте. Вероятно, логистическая регрессия лучше начать с вас, поскольку она легко интерпретируется.

Чтобы узнать, какой сервер является проблемой или какой сервис является проблемой, это может быть ваш второй шаг. Чтобы решить второй шаг, на основе вашего примера,

  • Если это проблема с сервисом, я думаю, что некоторые правила принятия решений могут быть получены вручную, чтобы можно было точно определить имя службы. Идея состоит в том, что вы должны увидеть значительное количество серверов, которые запускают один и тот же сигнал тревоги, не так ли? Также ознакомьтесь с расширенными показаниями в конце, чтобы проверить дополнительные параметры.
  • Если это проблема сервера, вы можете построить второй бинарный классификатор (отдельный классификатор на стороне сервера), который запускается на каждом сервере, используя только функции, поступающие с этого сервера, и отвечает на вопрос: "Если у меня проблема".

Особенности бинарного классификатора сайта

Я предполагаю, что все эти сигналы тревоги являются лучшим источником ваших функций. Я думаю, используя некоторые сводные данные статистики, поскольку функции могут помочь больше для классификатора сайта. Например,

  • процент серверов, которые получают сигнал A как DOWN
  • средняя продолжительность времени для всех серверов, чей сигнал тревоги B DOWN
  • на всех серверах, сигнал тревоги которых B равен DOWN, каков процент от них, которые также имеют тревогу A вниз. ...

Функции для бинарного классификатора на стороне сервера

Вы должны явно использовать все сигналы тревоги как функции для классификатора на стороне сервера. Однако во время обучения вы должны брать все данные со всех серверов. Этикетки просто "имеют проблемы" или "не имеют проблем". Данные обучения будут выглядеть так:

  alarm A On, alarm B On, alarm C on, ..., alarm Z on, has-problem
    YES,        YES,       NO,               YES,      YES
    NO,         YES,       NO,               NO,       NO
    ?,          NO,        YES,              NO,       NO

Примечание. Я использовал "?" для указания некоторых возможных аварийных сигналов у вас могут отсутствовать данные (неизвестное состояние), которые можно использовать для описания ситуации ниже:

All the appropriate alarms may not be triggered at once, 
due to serial service checks,  so it can start with one server down and 
then another server down 5 minutes later.  

Некоторые дополнительные показания

Эта проблема связана с несколькими темами, например корреляция сигналов тревоги, корреляция событий, диагностика неисправностей.

Ответ 2

Существует несколько опций для переменных входов, но два относительно простых:

1) входы, которые отсутствуют, кодируются как 0,5, тогда как входы, которые присутствуют, кодируются как 0 или 1 2) кроме того, вы могли бы разделить вход на два, один для "настоящего" и "нет", другой для "активных" или "тихий". Затем сети нужно будет использовать взаимодействие между ними, чтобы узнать, что второй столбец важен только в том случае, если первый из них равен 1, а не первый, но 0. Если достаточно учебных случаев, возможно, это возможно.

Конечно, методы могут быть объединены.