支持向量机Java?

2022-09-02 10:37:56

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

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

因此,例如,如果我有一个需要812ms才能执行的方法,它将被记录为:Widget#doSomething(String)

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集群。

答案 1

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

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

此定义中隐含的是需要对数据进行重新采样(如有必要,请使用模式/中位数/平均值),以便均匀地定义每个观测值,例如秒、分钟或小时。

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

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

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

如果我们想在过去使用滞后两个区间生成一组特征,那么时间序列的前两个元素被视为烧入样本。我们不能使用与它们相关的观察结果来训练算法。

8 行 x 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,它看起来很有前途。

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


答案 2

如果您对使用支持向量机感兴趣,那么有一个非常面向初学者的指南,您可能会发现很有用(http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf)

该指南来自libsvm的同一个人,libsvm是一个非常成熟的支持向量机库(http://www.csie.ntu.edu.tw/~cjlin/libsvm/),他们确实有Java的绑定(http://www.csie.ntu.edu.tw/~cjlin/libsvm/#java)


推荐