对 Java 异常进行分类

数据挖掘 机器学习 分类 算法
2021-09-17 01:29:37

我们有一个分类算法来对生产中的 Java 异常进行分类。该算法基于分层的人工定义规则,因此当出现一堆形成异常的文本时,它会确定什么样的异常(开发、可用性、配置等)和负责的组件(负责的最内部组件)例外)。在Java中,一个异常可以有几个引发异常,必须对整体进行分析。

例如,给定以下示例异常:

com.myapp.CustomException: Error printing ...
... (stack)
Caused by: com.foo.webservice.RemoteException: Unable to communicate ...
... (stack)
Caused by: com.acme.PrintException: PrintServer002: Timeout ....
... (stack)

首先,我们的算法将整个堆栈分成三个孤立的异常。之后,它开始从最内部的异常开始分析这些异常。在这种情况下,它确定这个异常(第二个引起的)是类型Availability的并且负责的组件是“打印服务器”。这是因为有一条规则匹配包含与Timeout该类型关联的单词Availability还有一条规则匹配com.acme.PrintException并确定负责的组件是打印服务器。由于仅使用最内部的异常来确定所需的所有信息,因此忽略了上层异常,但情况并非总是如此。

如您所见,这种近似非常复杂(且混乱),因为人类必须在出现新异常时创建新规则。此外,新规则必须与当前规则兼容,因为用于对新异常进行分类的新规则不得更改任何已分类异常的分类。

我们正在考虑使用机器学习来自动化这个过程。显然,我不是在这里寻求解决方案,因为我知道复杂性,但我非常感谢一些建议来实现我们的目标。

1个回答

首先,一些分类的基础知识(以及一般任何有监督的 ML 任务),只是为了确保我们有相同的概念集。

任何有监督的 ML 算法都至少包含 2 个组件:

  1. 要训​​练和测试的数据集。
  2. 处理这些数据的算法。

训练数据集由一组对组成(x, y),其中x特征向量,y预测变量预测变量正是您想知道的,即在您的情况下它是异常类型。功能更棘手。您不能只将原始文本放入算法中,您需要先提取其中有意义的部分并将它们组织为特征向量。您已经提到了几个有用的特性——异常类名称(例如com.acme.PrintException)和包含的单词(“Timeout”)。您只需将行异常(和人工分类的异常类型)转换为合适的数据集,例如:

ex_class                  contains_timeout  ...   | ex_type
-----------------------------------------------------------
[com.acme.PrintException, 1                , ...] | Availability
[java.lang.Exception    , 0                , ...] | Network
 ...

这种表示对于 ML 算法来说已经好得多了。但是拿哪一个呢?

考虑到任务的性质和您当前的方法,自然选择使用决策树此类算法将为您的所有异常类型计算最佳决策标准并打印出结果树。这特别有用,因为您将有可能手动检查决策是如何做出的,并查看它与您手动制定的规则的对应程度。

然而,一些具有完全相同特征的异常可能属于不同的异常类型。在这种情况下,概率方法可能效果很好。尽管它的名字,朴素贝叶斯分类器在大多数情况下工作得很好。但是,NB 和我们的数据集表示存在一个问题:数据集包含分类变量,而朴素贝叶斯只能使用数字属性*。克服这个问题的标准方法是使用虚拟变量简而言之,虚拟变量是简单地指示特定类别是否存在的二元变量。例如,ex_class具有值{com.acme.PrintException, java.lang.Exception, ...}等的单个变量可能会拆分为多个变量ex_class_printexceptionex_class_exception等具有值{0, 1}

ex_class_printexception  ex_class_exception  contains_timeout | ex_type
-----------------------------------------------------------------------
[1,                    , 0                 , 1              ] | Availability
[0,                    , 1                 , 0              ] | Network

最后一种尝试的算法是支持向量机 (SVM)它既不提供有用的可视化,也不提供概率,但通常会提供出色的结果。


* - 事实上,贝叶斯定理和朴素贝叶斯本身都没有说明任何关于变量类型的内容,但大多数想到的软件包都依赖于数值特征。