题目: Personalized Defect Prediction
作者: Tian Jiang, Lin Tan, Sunghun Kim
单位: University of Waterloo, Hong Kong University of Science and Technology
出版: ASE, 2013
解决的问题:personalized change classification
以往的缺陷预测模型多数是以文件为单位,本文的方法以代码的change为单位,对每次change进行分类(clean or buggy)
提出代码缺陷可能与代码的开发者有关,首次为每个开发者单独构建缺陷预测模型
局限性
文中提到的局限性全部与实验有关。
本文实验所用的工程全部是开源工程,因此不能确保本文结论对不开源工程同样适用。
虽然我们选取了有高质量commit log的工程作为数据集,但其中的bug信息仍旧含有少量噪声(commit log中的bug fix条目并不是修改bug)
实验中对于开发者的选取和对每个开发者change的选取可能影响到试验结果
方法
本文的PCC(personalized change classification)方法是在传统的CC(change classification)方法的基础上进行改进。传统的CC方法过程如下:
通过挖掘工程的revision history,将代码的每次change标记为有bug(buggy)或无bug(clean)
从代码变化中抽取特征,例如词袋。为提升性能我们还添加了一种叫特性向量(characteristic vector,不知道怎么翻译)的特征。
使用分类算法构建分类模型
利用模型来预测新的改变是否含有bug
buggy change标记
首先识别出修改bug的change,通过这些change定位到bug的位置。再通过诸如git blame等命令得到最近修改含bug的代码行的change,这些change就是引入bug的change。
特征抽取
我们抽取三类特征:特性向量,词袋和元数据
特性向量:表示抽象语法树中每种结点的数量,我们用DECKARD的方法抽取引入bug前和引入bug后的特性向量,将两者的区别作为我们的特征。
词袋:因调用了错误的函数而引入的缺陷无法通过特性向量表示,因此我们添加词袋作为我们的特征。我们利用Weka和Snowball stemmer将字符串切分为词向量。我们将提交信息和源码都做此处理。
元数据:除上面两种特征之外,我们还收集了开发者,提交时间(0, 1, 2, …),提交日期(星期一, …, 星期日),change总数,引入bug的change总数,源码文件/路径名,文件“年龄”(参照Kim et al.)作为特征。
分类
我们利用ADT,朴素贝叶斯和逻辑回归进行分类。我们的目的不是得到最好的分类算法,而是将传统CC和PCC的效果进行对比。
MARS
除了CC我们还引入了另一条基准线:多元自适应回归(MARS),我们利用商业机器学习框架Orange来实现MARS。
PCC
除为每个开发者构建单独的模型外,PCC的步骤与CC严格一致,所选特征完全相同。
PCC+
为进一步提升性能,我们提出了两种集合PCC与CC的方法:加权PCC和PCC+。加权PCC是在PCC的基础上加入其他开发者的change数据,并把这些数据赋予较小的权重。PCC+是在CC,PCC和加权PCC的三个预测结果中自动抽取置信度最高的一个作为最终的预测结果,如果某条change的两个结果置信度相同,那么我们选择的优先级为PCC,加权PCC,CC。下图为PCC+的过程。
实验
我们设计实验来研究两个问题:
PCC和PCC+能够对CC和MARS的性能有多大的提升
PCC在其他实验设定上是否能够对CC的性能有所提升
实验数据
我们选择了6个开源工程作为数据,工程信息如下图所示。6个工程的共同点是都有大量的change history用来构建和评估PCC,对于Lucene和Jackrabbit,我们利用Herzig等手工验证的bug report来标注change,对于其他工程,我们利用关键字搜索的方法来标注change。
在change选取方面,考虑到bug的生命周期以及最近的change中的bug很有可能还没有被发现,我们只选取了一部分时间的change,如下图所示。
针对PCC,我们选择了每个工程中拥有最多提交次数的10个开发者,对每个开发者选取了相同数量的change作为数据集,将它们混合起来作为CC的数据集。
分类过程
为进行对比实验,我们需要统一模型参数。采取的方法是随机选择一个工程,从中随机选择一部分change来调整参数,使这一集合的F1最大的参数将用来进行后续所有实验,每种分类模型的参数分别用此方法确定。
评估标准
成本效率(cost effectiveness):成本效率指用同样开销所能得到的最大收益。在我们的工作中,开销就是待检查的代码量,收益就是能够发现的bug数量。
为评估成本效率,我们将change按照可能是bug的概率排序,检查排名前20%的change,得到以下两个指标:
- NofB20:前20%中bug的数量
- PofB20:前20%中bug数量占全部bug数的百分比
F1:F1-measure将准确度和召回率结合起来考虑,是我们的第二个重要评估标准。
实验结果
CC,MARS,PCC,PCC+的对比结果如下图所示,下图结果由模型ADT得到。图中可以看出大部分实验PCC的各项指标均优于CC,而PCC+在PCC基础上又有小幅提升。
从下图结果可以看出,采用多种模型,PCC的效果总是优于CC
对Lucene,我们改变了训练集change数量进行了几组实验,结果如下图所示,结论是在训练样本超过80个时,PCC性能优于CC。