【发布时间】:2014-11-04 09:33:16
【问题描述】:
我正在使用 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 的 alarm 1 & 2 为 DOWN,那么我们可以说 service a 在该服务器上已关闭并且是问题的原因。
如果 alarm 1 在所有服务器上都关闭,那么我们可以说 service a 是原因。
原因可能有多种选择,因此直接分类似乎不合适。
我还想将以后的数据源与网络联系起来。比如只是 ping 一些外部服务的脚本。
由于串行服务检查,所有适当的警报可能不会立即触发,因此它可以从一台服务器停机开始,然后在 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])
但是我[我很难将可变数量的警报映射到静态数量的输入。比如我们给一个服务器加一个报警器,或者加一个服务器,整个网络都需要重建。如果这是需要做的事情,我可以做,但想知道是否有更好的方法。
我正在考虑的另一个选择是,为每种类型的服务器设置不同的网络,但我不知道如何得出整个环境的结论,因为它只会在单个主机上进行评估, 而不是一次所有主机。
我应该使用哪种类型的算法以及如何映射数据集以通过可变输入得出整个环境范围的结论?
我对任何可行的算法都持开放态度。 Go 比 python 还要好。
【问题讨论】:
-
也许朴素贝叶斯网络是最合适的?它肯定更简单。
-
作为一个用户,我宁愿让软件在它的电子邮件中加上一个事实的摘要,而不是宣布结论可能会指向我那里。例如,“服务器 A1 上的 4 个服务 (80%) 报告 DOWN”或“跨 12 个系统的警报类型 99 (100%)”;选择要显示的事实仍然是一个有趣的问题,这与包装一样重要。
-
对不起,如果这很幼稚,但重构您的输入可能更容易。您说“有 n 个服务器,x 个警报可以是 UP 或 DOWN。n 和 x 都是可变的。”。如果表示为“存在警报,处于 UP 或 DOWN 状态,可以是特定类型,并且来自特定服务器”,这会更好吗?这似乎使得任何随后传递给任何 ML 算法的数据树都不太可能随着警报类型或服务器的添加而发生变化。对不起,如果这根本不相关!我对 ML 了解不多,但我已经处理过一些数据结构。
标签: python go machine-learning neural-network monitor