我想用Java编写一个“智能监视器”,它在 检测到 即将出现的性能问题时会发出警报。我的Java应用正在将结构化格式的数据写入日志文件:
<datetime> | <java-method> | <seconds-to-execute>
因此,例如,如果我有一个Widget#doSomething(String)方法花费了812ms的时间执行,那么它将记录为:
Widget#doSomething(String)
2013-03-24 11:39:21 | Widget#doSomething(String) | 812
随着性能开始下降(例如,在大型采集期间,高峰负载期间,或者如果系统正缓慢地进行爬网),方法的执行时间开始变慢。因此最右边的列开始显示巨大的数字(有时需要20-40秒才能执行一个方法)。
在大学里(一次机器学习练习),我写了我的教授所说的 线性二分法 ,该 二分法 可以获取简单的测试数据(一个人的身高,体重和性别),并“学习”如何根据他们的性别将其分类为男性还是女性身高体重。然后,一旦获得所有训练数据,我们就会向其提供新数据,以查看其确定性别的准确性。
我 认为 线性二分法 的多元版本称为 支持向量机 (SVM)。如果我错了,请进行澄清,然后将问题标题更改为更合适的名称。 无论如何 ,我需要此应用执行以下操作:
java-method
seconds-to-execute
需要特别注意的是,seconds-to- execute列并不是这里唯一的重要因素,因为我已经看到在性能出色期间某些方法的时间安排很糟糕,而在服务器似乎要死的时候,其他方法的时间安排确实很糟糕并推雏菊。因此,显然, 某些 方法对性能“加权” /比其他方法更重要。
seconds-to- execute
jlibsvm
svmlearn
提前致谢!
您描述的“智能监视器”就是时间序列分类。
分类算法很多。它们基本上都采用一个矩阵,其中的行是观察值,列是以某种方式描述观察值的“特征”,以及长度为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,它看起来很有希望。
有更多特定的时间序列分类方法,这些方法明确考虑了观测值和标签的顺序性质。这是分类对时间序列的通用调整。