Multi-stage Dynamic Selection for Cross-Project Defect Prediction
本文提出了一种用于跨项目缺陷预测的新型多阶段动态选择框架,该框架利用项目级和模块级分类器选择来缓解分布偏移,并在 82 个项目中超越了现有最先进的方法。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下你是一名试图破解谜团的侦探,但你从未见过犯罪现场。你手里只有一叠来自完全不同城市的旧案卷宗,由不同的警力编写,带有不同的俚语和习惯。你的任务是预测下一个罪犯会在你的新城镇何处出没。这正是软件工程师在努力确保程序无误时的日常挣扎。他们想要在软件崩溃之前找到“缺陷”(bug),但许多新项目就像白纸一样:它们运行的时间还不够长,无法积累足够的错误历史。因此,工程师们尝试向其他项目学习,希望在一家视频游戏公司行之有效的方法能帮助他们修复一个银行应用。这被称为跨项目缺陷预测(Cross-Project Defect Prediction)。问题在于,每个项目都是独一无二的;一个在一个项目上表现完美的模型,在另一个项目上可能会惨败,因为它们的“犯罪现场”(代码)看起来如此迥异。
于是,出现了一支名为 Multi-DES 的新数字侦探团队。与其雇佣一名单打独斗的侦探来解决新城镇的所有案件,或者强迫一个“超级侦探”试图同时理解所有的街区,这个团队使用了一种巧妙的两步走策略。首先,他们会对一大群风格各异、工具独特的侦探进行试镜,看看哪组专家在查看旧案卷宗时配合得最好。然后,当新案件到来时,他们并不只是挑选一名侦探。相反,他们会观察这个新案件的具体细节,并立即召集最适合该特定情况的专家。这就像拥有一支专家团队:交通警察处理车祸,法务会计处理欺诈案,而谈判专家处理人质劫持事件,所有这些都是根据情况即时选定的。研究人员发现,这种“在正确时刻派出正确专家”的方法,比那些试图用单一解决方案应对一切的旧方法,更能有效地在新且未知的项目中发现漏洞。
侦探事务所:Multi-DES 如何运作
在软件世界中,“缺陷”就是 bug——代码中的错误,可能导致程序崩溃或行为异常。预测这些 bug 至关重要,因为及早发现它们可以节省时间和金钱。但问题在于:要教会计算机如何识别 bug,你通常需要大量的过往 bug 案例。新项目还没有这些案例。因此,工程师们尝试借鉴其他较旧项目的知识。这就是“跨项目”的部分。
然而,有一个巨大的障碍:分布偏移(Distribution Shift)。想象一下,你试图学习如何在一个人人都靠左行驶的国家开车,但你手里只有一本为靠右行驶国家编写的手册。规则相似,但细节完全相反。在软件领域,一个项目可能使用特定的编码风格,而另一个项目则使用完全不同的风格。传统的模型试图构建一个巨大的模型,试图同时理解所有这些差异。本文作者认为,这就像试图用一张通用的地图去应对世界上所有的城市;它太宽泛了,会错过当地的小巷。
论文提出了 Multi-DES(多阶段动态集成选择),它有点像一个智能且具有适应性的软件侦探招聘机构。它分为两个主要阶段:
第一阶段:大型试镜(项目级)
在系统接触到新项目之前,它会经历一个大规模的“过度生产”阶段。想象一场选秀活动,他们尝试每一种可能的组合:
- 基类分类器(Base Classifiers): 不同类型的算法(如决策树、随机森林等)。把它们想象成不同类型的侦探(观察敏锐的、逻辑严密的、擅长找规律的)。
- 动态选择技术(Dynamic Selection Techniques): 决定信任哪位侦探的不同方式。
- 池大小(Pool Sizes): 房间里有多少名侦探。
他们在一组“训练”项目上测试所有这些组合(4 种基类算法 × 8 种选择技术 × 10 种池大小 = 320 种配置)。但他们不仅仅挑选在单项测试中得分最高的那个。相反,他们使用了一种称为**聚合排名最小化(Aggregate Rank Minimization, ARM)**的策略。
ARM 策略:“全能型”评委
想象一场选秀比赛,你必须根据唱歌、跳舞和表演来选出获胜者。如果你只选出唱歌最好的人,他们可能在表演方面表现糟糕。ARM 就像一位评委,他会对每位参赛者的各项技能进行排名,然后汇总这些排名,从而找到那位最稳健的全能选手。论文指出,通过综合考虑多个性能指标(如 F1 分数、AUC 和误报率),系统可以找到一个鲁棒性强的配置,使其在面对与旧项目不同的新项目时不会失效。
第二阶段:即时选择(模块级)
一旦选定了最佳的“试镜”配置,系统就准备好应对新项目了。但神奇之处在于:它并不对整个项目应用单一模型。软件是由许多“模块”(就像房子里的各个房间或书中的各个章节)组成的。
当系统观察新项目中的特定模块时,它会询问:“我们的哪位受训侦探最擅长识别这种特定类型的代码中的 bug?”它会动态地选择最胜任该特定代码片段的分类器。如果一个模块看起来像是一个银行应用,它就会从池中挑选“金融专家”。如果另一个模块看起来像是一个游戏引擎,它就会挑选“图形专家”。这一切都是针对每一段代码实时发生的。
他们的发现
研究人员在来自四个不同公共数据集(PROMISE, RELINK, NASA, AEEEM)的 82 个软件项目上测试了这个想法。他们使用了一种严格的测试方法,称为“留一项目法”(leave-one-project-out),即在 81 个项目上进行训练,并在第 82 个项目上进行预测,然后对每个项目重复此过程。
结果非常令人鼓舞:
- 优于顶尖水平: 在大多数场景下,Multi-DES 的表现优于或匹配了现有的顶级方法。具体而言,它在大多数数据集上都取得了最佳的 AUC(衡量模型区分 buggy 代码与洁净代码能力的指标)和 误报率(即“狼来了”的频率)指标。
- 数据表现: 在 AEEEM 数据集上,Multi-DES 的 AUC 得分为 0.755,击败了排名第二的方法 EASC-NB(得分为 0.692)。在 NASA 数据集上,它的得分是 0.737,而后者为 0.666。
- 鲁棒性: 该系统特别擅长保持低“误报率”,这意味着它不会浪费工程师的时间去检查那些实际上完全正常的代码。
- 不作弊: 至关重要的是,该系统在训练阶段完全没有查看目标项目的任何数据。它完全依赖于旧项目,证明了你不需要窥探新项目的秘密就能构建出一个优秀的预测器。
他们排除了什么
论文明确反对认为单一、静态的模型(应用于整个项目的固定规则集)是最佳解决方案的观点。他们展示了由于软件项目的不同部分具有不同的特征,试图“一刀切”的方法在面对与训练数据不同的项目时,其泛化能力很差。他们还排除了“需要预先知道目标项目的分布才能做出良好预测”这一观点;他们的这种方法即使在目标项目完全是个谜的情况下依然有效。
他们的结论有多可靠?
作者基于收集的数据对其发现充满信心。他们不仅仅是在模拟,而是利用 82 个真实世界项目进行了广泛的实验,并使用了标准且被广泛接受的指标。他们使用了统计检验(Wilcoxon 符号秩检验)来确认其结果并非偶然。论文指出,在大多数成对比较中,Multi-DES 在统计学上是“优越的”,尤其是在 AUC 和误报率方面。不过,他们也注意到一个微小的例外:在 PROMISE 数据集上,其方法在“误报率”指标上并非绝对最优,这表明虽然该方法很强大,但它并不是那种在每种场景下都能横扫一切的“灵丹妙药”。
简而言之,Multi-DES 表明,预测一个全新的、未知的项目中的 bug 的最佳方式,是准备好一支多样化的专家团队随时待命,并在合适的时刻派出最合适的专家,而不是试图强迫一个通才去做所有的工作。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。