-
Notifications
You must be signed in to change notification settings - Fork 0
Progress Report 2018.12.09
继续上周的工作,使用完善One-Class SVM,分类bug图像和正常图像,结果如下:
含义:
图中的白色的点代表我最近测试得到的各种正常情况下的性能图像(435个)(正常图像训练集)。(我用这个方法^1把一个图像转化成了一个三维空间的点)
图中的紫色的点代表我最近测试得到的各种正常情况下的性能图像(48个)(正常图像测试集)。
图中的黄色的点代表我复现出的bug构建出的性能图像(2个)(bug图像测试集,包括一个指数增长的bug,一个突变点的bug)
图中的红色小点表示的实际上是几片区域,这几片区域是由模型确定的‘正常区域’,所有在这片区域中的点都会被分类为‘正常性能图像’。可以看出图中的两个bug性能图像全部分类正确。
上周进度中提到的结果不好的原因,主要的是模型核函数的选择和参数设置的问题和把一个性能图像转化成一个向量使用的方法的问题。本周经过大量的测试和交叉验证,找到了最适合我这个场景的核函数和转化向量的方法^1
在上图中,训练集中的每个正常性能图像的坐标轴是不同的,比如正常性能图A的自变量是workload1和conf1,而正常性能图B的自变量是workload2和conf2。那么这样一来,就会导致一种问题:用这些训练出来的模型无法处理‘0负载下非0消耗’、‘counterproductive’这两种性能bug。而只能单单从图像的形状上找到形状与训练集不同的bug图像。所以我又做了第二个训练集合(过程中由于所有的测试都依赖于sysbench框架,而第二个训练集合所需的测试代码sysbench里没有(sysbench里有的很少),所以我还花了点时间学习用lua写sysbench的测试代码):
在这个图中,训练集(白色)全都是自变量为sort-buffer-size和table-size的性能图像,图中的bug图像(黄色)属于‘0负载下消耗非0’类型的性能bug。这个bug在前一个训练集下就不会被模型归类为bug图像,而在这个模型中就可以。
根据上述结果以及我的直觉,如果我要采用这种OneClassSVM的方法来区分正常性能图像和异常性能图像,那么坐标轴必须要是确定的,也就是训练集和bug的图像的坐标轴必须相同。
TODO:做更多的训练集,测试更多的bug