猿问

用于监控服务器的机器学习

我正在寻找 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是原因。


原因可能有多种选择,因此直接分类似乎不合适。


我还想将后来的数据来源与网络联系起来。例如只是 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 还要好。


慕雪6442864
浏览 192回答 2
2回答

POPMUISE

这实际上是一个具有挑战性的问题。标签的表示很难表示您的学习目标标签。正如你所指出的,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  Site-wise 二元分类器假设在您的第一个 ML 模型中,只有以上两个原因。然后你现在正在研究一个站点明智的二元分类器。可能逻辑回归更适合让您入门,因为它很容易解释。要找出哪个服务器有问题或哪个服务有问题,这可以是您的第二步。解决第二步,根据你的例子,如果是服务问题,我觉得可以手动推导出一些决策规则,这样可以精确定位服务名称。这个想法是您应该看到大量服务器触发相同的警报,对吗?另请参阅最后的高级阅读以检查更多选项。如果是服务器问题,您可以构建第二个二元分类器(一个单独的服务器端分类器),该分类器仅使用来自该服务器的功能在每个服务器上运行并回答问题:“如果我有问题”。站点级二元分类器的功能我认为所有这些警报都是您功能的最佳来源。我想使用一些汇总统计数据作为特征可以为此处的站点分类器提供更多帮助。例如,收到警报 A 为 DOWN 的服务器的百分比警报 B 为 DOWN 的所有服务器的平均时间长度在警报 B 已关闭的所有服务器中,警报 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.  

函数式编程

变量输入有许多选项,但有两个相对简单的选项是:1) 不存在的输入被编码为 0.5,而存在的输入被编码为 0 或 1 2) 此外,您可以将输入分成两个,一个用于“存在”与“不存在”,另一个对于“主动”与“沉默”。然后,网络将不得不使用两者之间的交互来了解第二列仅在第一列为 1 时才重要,而在第一列为 0 时则不重要。但如果有足够的训练案例,它可能可以做到这一点。当然,这些方法可以组合使用。
随时随地看视频慕课网APP

相关分类

Go
我要回答