一尘不染

支持Java的Vector Machine吗?

java

我想用Java编写一个“智能监视器”,它在 检测到 即将出现的性能问题时会发出警报。我的Java应用正在将结构化格式的数据写入日志文件:

<datetime> | <java-method> | <seconds-to-execute>

因此,例如,如果我有一个Widget#doSomething(String)方法花费了812ms的时间执行,那么它将记录为:

2013-03-24 11:39:21 | Widget#doSomething(String) | 812

随着性能开始下降(例如,在大型采集期间,高峰负载期间,或者如果系统正缓慢地进行爬网),方法的执行时间开始变慢。因此最右边的列开始显示巨大的数字(有时需要20-40秒才能执行一个方法)。

在大学里(一次机器学习练习),我写了我的教授所说的 线性二分法 ,该 二分法
可以获取简单的测试数据(一个人的身高,体重和性别),并“学习”如何根据他们的性别将其分类为男性还是女性身高体重。然后,一旦获得所有训练数据,我们就会向其提供新数据,以查看其确定性别的准确性。

认为 线性二分法 的多元版本称为 支持向量机
(SVM)
。如果我错了,请进行澄清,然后将问题标题更改为更合适的名称。
无论如何 ,我需要此应用执行以下操作:

  • 在“测试模式”下运行,在该模式下,我从我的主Java应用程序(希望监视的应用程序)中获取结构化日志文件,并获取每个日志条目(如上所示)并将其用于 测试数据
    • 只有java-methodseconds-to-execute列作为输入/测试数据很重要;我不在乎约会时间
  • 在“监视模式”下运行,在该模式下,它将主动从日志文件中读取新的日志数据,并使用类似的“机器学习”技术来确定性能下降是否迫在眉睫

需要特别注意的是,seconds-to- execute列并不是这里唯一的重要因素,因为我已经看到在性能出色期间某些方法的时间安排很糟糕,而在服务器似乎要死的时候,其他方法的时间安排确实很糟糕并推雏菊。因此,显然,
某些 方法对性能“加权” /比其他方法更重要。

我的问题

  • 搜寻“线性二分法”或“支持向量机”会发现一些非常可怕的,高度学术性的,超大脑的白皮书,我只是没有精神能量(也没有时间)消耗掉,除非它们确实是我唯一的选项; 因此,我想问一下 这些东西是否有外行介绍,或者有很好的网站/文章/教程来用Java构建这样的系统
  • 是否有任何可靠/稳定的开源Java库?我只能找到jlibsvmsvmlearn但前者看起来处于纯beta状态,而后者似乎仅支持二进制决策(例如我的旧线性二分频器)。我知道这里有 Mahout, 但是它位于Hadoop之上,而且我认为我没有足够的数据来确保建立自己的Hadoop集群所需的时间和精力。

提前致谢!


阅读 195

收藏
2020-12-03

共1个答案

一尘不染

您描述的“智能监视器”就是时间序列分类。

分类算法很多。它们基本上都采用一个矩阵,其中的行是观察值,列是以某种方式描述观察值的“特征”,以及长度为0或1的长度行的标签矢量。在您的问题中,观察值可能是一分钟的样本,则在遇到性能问题的时间段内,标签向量的值为1,否则为0。

在此定义中隐含了需要对数据进行重新采样(必要时使用模式/中位数/平均值),以使每个观察值均被均匀定义,例如秒,分钟或小时。

生成特征是至关重要的部分。我可能会从2个功能开始,即 原始值 和观测 x_i和x_i-1之间的(一次) 差值
。我们将这些定义为2的滞后时间。每个功能都无法展望未来。对于每个观察,每个特征都必须代表相同的事物。

例如,考虑长度为10的时间序列:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

如果我们要使用过去两个间隔的滞后来生成一组要素,则时间序列的前两个元素被视为老化样本。我们不能使用与它们相关的观察结果来训练算法。

8行2列的 原始值

[[ 1.,  0.]
 [ 2.,  1.],
 [ 3.,  2.],
 [ 4.,  3.],
 [ 5.,  4.],
 [ 6.,  5.],
 [ 7.,  6.],
 [ 8.,  7.]]

求差值

[[ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.]])

这些将列堆叠。您可以探索许多其他功能。滚动平均将是我的下一个选择。

如果您想在未来做进一步的预测,那么您的训练数据应该与标签向量相距较远。

如果性能不令人满意,请尝试通过在更大的窗口上选择滚动平均值来添加更多功能,或者将来再添加更多功能。改善时间序列算法性能的一个聪明技巧是包括前一个时间间隔的预测值。

使分类器适合数据的某些早期部分,然后在数据的后续部分中观察其准确性。您可以使用许多分类指标。如果您选择使用输出概率而不是硬1/0的分类器,那么您的选择甚至会扩大。(分类器的用法也是如此。)

精度和召回率是分类器的直观性能指标。

训练数据的前半部分(后半部分)并测试后半部分(后半部分)。

就算法而言,我将研究逻辑回归。如果性能不令人满意,并且您已经用尽了特征提取选项,我只会在别处查找。

Mallet似乎是完成此任务的良好库。请参阅此文档。

我最近发现了JSAT,它看起来很有希望。

有更多特定的时间序列分类方法,这些方法明确考虑了观测值和标签的顺序性质。这是分类对时间序列的通用调整。

2020-12-03