基于特征迁移和实例迁移的跨项目缺陷预测方法∗

2019-06-11 07:39刘望舒黄启国
软件学报 2019年5期
关键词:集上分类器实例

倪 超,陈 翔,2,刘望舒,3,顾 庆,黄启国,李 娜

1(计算机软件新技术国家重点实验室(南京大学),江苏 南京 210023)

2(南通大学 计算机科学与技术学院,江苏 南通 226019)

3(南京工业大学 计算机科学与技术学院,江苏 南京 211816)

软件缺陷产生于开发人员的编码过程,软件需求理解不正确、软件开发过程不合理或开发人员的经验不足,均有可能引入软件缺陷.含有缺陷的软件在部署后可能会产生意料之外的结果或行为,严重时会给企业造成巨大的经济损失,甚至会威胁到人们的生命安全.在软件项目的开发生命周期中,检测出内在缺陷的时间越晚,修复该缺陷的代价也越高.尤其在软件发布后,检测和修复缺陷的代价将大幅度增加.因此,项目主管借助软件测试或代码审查等软件质量保障手段,希望能够在软件部署前尽可能多地检测出内在缺陷.但是如果关注所有的程序模块会消耗大量的人力物力,因此,软件质量保障部门主管希望能够预先识别出潜在缺陷程序模块,并随后对其分配足够的测试资源.

软件缺陷预测(software defect prediction,简称 SDP)[1-3]是其中一种可行方法,根据软件历史开发数据以及已发现的缺陷,借助机器学习等方法来预测出软件项目内的潜在缺陷程序模块.目前,大部分研究工作关注项目内的软件缺陷预测(within-project defect prediction,简称WPDP)问题,即基于同一项目的数据完成软件缺陷预测模型的构建和预测.通常,构建一个性能较好的缺陷预测模型需要大量的训练实例,但是现实中收集并标注足够多的训练数据相当困难:一方面,一些新开发项目只含有较少的训练数据;另一方面,标记数据需要耗费大量的人力和物力,且这个过程容易出错.于是,跨项目软件缺陷预测(cross-project defect prediction,简称CPDP)[4-11]问题被研究人员提出,其基于其他项目(即源项目)的历史数据来构建软件缺陷预测模型,然后在当前项目(即目标项目)上进行缺陷预测.然而,由于源项目和目标项目之间的数据分布在大部分时候都具有很大的差异性,这导致了在源项目上构建的模型在目标项目上很难具有良好的预测性能.因此,缩小源项目和目标项目之间的数据分布差异性,是设计跨项目缺陷预测方法需要重点考虑的问题.

针对该问题,本文首次同时从特征迁移和实例迁移角度出发,提出了一种两阶段跨项目缺陷预测方法FeCTrA(cross-project software defect prediction using feature clustering and TrAdaBoost).具体来说,在特征迁移阶段,该方法借助聚类分析选出源项目与目标项目之间具有高分布相似度的特征;在实例迁移阶段,该方法借助TrAdaBoost方法,基于目标项目中的少量已标注实例,从源项目中选出与这些已标注实例分布相近的实例.为了验证FeCTrA方法的有效性,我们选择具有代表性的、开源的、真实项目的Relink数据集和AEEEM数据集作为评测对象,以F1作为评测指标.首先,我们发现,FeCTrA方法的预测性能要优于仅考虑特征迁移阶段或实例迁移阶段的单阶段方法;其次,与经典的跨项目缺陷预测方法 TCA+[12]、Peters过滤法[13]、Burak过滤法[14]以及DCPDP法[15]相比,FeCTrA方法的预测性能在 Relink 数据集上可以分别提升 23%、7.2%、9.8%和 38.2%,在AEEEM数据集上可以分别提升96.5%、108.5%、103.6%和107.9%.基于上述分析我们发现,FeCTrA方法不仅可以有效移除冗余特征和无关特征,而且可以从源项目中选出与目标项目分布更为相似的实例.此外,实证研究结果也初步验证了FeCTrA方法的有效性.

本文的主要贡献可总结如下.

(1) 提出了基于特征迁移和实例迁移的跨项目软件缺陷预测方法FeCTrA,该方法可以有效地移除冗余特征和无关特征,并且可以从源项目中选出与目标项目分布相似的实例,从而有效减小源项目和目标项目之间的数据分布差异性;

(2) 在实证研究中考虑了基于实际项目的Relink和AEEEM数据集,深入分析了不同影响因素对FeCTrA方法性能的影响,为更好地使用FeCTrA方法提供了指导性建议;

(3) 通过将FeCTrA方法与Nam等人提出的TCA+[12]、Peters等人提出的Peters过滤法[13]、Turhan等人提出的Burak过滤法[14]以及Zimmermann等人提出的DCPDP法[15]进行比较,发现FeCTrA方法在预测性能上具有显著优势,这说明通过融合多种不同类型的迁移学习方法来解决CPDP问题值得关注.

本文第1节介绍软件缺陷预测的研究背景和相关研究工作.第2节介绍 FeCTrA方法及其具体实现细节.第3节介绍论文的实证研究,包括研究问题、评测对象、评测指标、显著性检验方法、实验流程及其方法参数设置.第4节对实证研究结果进行详细分析.最后总结全文,并对下一步研究工作进行展望.

1 研究背景与相关工作

1.1 软件缺陷预测

软件缺陷预测[1-3,16-21]是当前软件工程数据挖掘领域的一个研究热点[11,22-27].缺陷预测可以在软件发布之前尽可能多地预测出潜在缺陷程序模块,以便于合理分配测试资源,从而最终提高软件质量.其主要包括两个阶段:模型构建阶段和模型应用阶段.模型构建阶段主要包括如下3个步骤.

(1) 挖掘软件历史仓库.目前可供挖掘与分析的软件历史仓库包括项目所处的版本控制系统(例如CVS、SVN、Git)、缺陷跟踪系统(例如Bugzilla、Mantis、Jira、Trac)或团队开发人员间相互发送的电子邮件等.程序模块的粒度根据实际应用场景的需要,可以设置为包、文件、类、函数或代码修改等.

(2) 程序模块的度量和标记.通过分析软件代码复杂度或开发过程特征,可以设计出与软件缺陷存在相关性的度量元(metrics)[28].通过这些度量元,可以对程序模块进行度量;随后,通过分析缺陷报告可以完成对这些程序模块的标记.

(3) 模型的构建.基于搜集的缺陷预测数据集,首先进行必要的数据预处理(例如特征选择、数据取值归一化、噪音移除等)[22,29-33],随后可以基于特定的机器学习方法(例如Logisitic回归、随机森林、支持向量机等)完成模型的构建.

而在模型应用阶段,当面对新的程序模块时,在完成对该模块的软件度量后,基于已构造出的缺陷预测模型和具体度量元取值,可以完成对该模块的预测,即预测为潜在缺陷模块或无缺陷模块.

1.2 跨项目软件缺陷预测

目前,绝大部分软件缺陷预测方法基于同一项目上的数据进行模型训练和模型预测,这类方法被称为项目内缺陷预测方法,而充足的标记数据是保障这类方法取得良好预测性能的前提.然而,对于刚开发的项目或者历史遗留项目,可能难以获取足够多的标记数据,因此难以构建出具有良好预测性能的模型.针对这种情况,跨项目缺陷预测[5,12,15,34,35]应运而生.跨项目缺陷预测基于其他项目(即源项目)的标记数据进行模型训练,并在当前项目(即目标项目)上进行缺陷预测.然后,由于源项目和目标项目之间存在较大的数据分布差异性,因此在源项目上训练的模型在目标项目上未必能够取得良好的预测性能[15].因此,设计新颖高效的跨项目软件缺陷预测方法具有一定的研究挑战性,研究人员针对该问题提出了多种解决方法.

Zimmermann等人[15]首先针对 CPDP的可行性展开了大规模的实证研究,然而研究结果并不乐观.Turhan等人[14]提出了基于k近邻的 Burak过滤法.具体而言,该方法首先计算出目标项目中实例与候选源项目中实例之间的欧式距离;然后为目标项目中的每一个未标注实例,从源项目中选出距离其最近的k(k为 10)个实例;最后,将所有从源项目中选出的实例构成训练集.实验结果表明,Burak过滤法虽然可以提升CPDP的性能,但是仍然低于WPDP方法.不同于Turhan等人从目标项目出发进行实例选择,Peters等人[13]则认为源项目中的数据包含更多的信息,因此,他们提出了Peters过滤法.具体而言,首先针对源项目中的每个实例,从目标项目中识别出与之距离最近的实例并进行标记;随后,对于目标项目中已标记的实例,从源项目中选出与之距离最近的实例并添加到最终训练集中.Ma等人[36]则提出了TNB(transfer naive bayes)方法,他们认为,应该为源项目中与目标项目中实例相似的实例赋予更高的权重.Wang等人[37]则基于深度学习,从模块代码中自动学出语义表示.Chen等人[38]提出的方法则考虑从源项目中删除带有负面影响的实例.Xia等人[6]提出了两阶段框架Hydra,该框架引入了遗传算法和集成学习,以获取源项目和目标项目之间的共有信息.

一些研究人员针对异构CPDP问题展开了深入研究,该问题尝试在源项目和目标项目间具有不同特征空间的情况下进行跨项目缺陷预测.针对该问题,Turhan等人[14]提出了一种简单方法,即在构建CPDP模型时仅考虑源项目和目标项目之间共有的特征.显然,这种方法存在两点不足:首先,源项目和目标项目之间共有的特征通常较少,甚至有时候没有;其次,仅考虑共有的特征会遗漏掉大量其他有用的信息.针对上述不足,He等人[39]首先提出了 CPDP-IFS方法.该方法将每一个实例视为向量,并计算其分布特征指标的取值,从而可以将目标项目和源项目中的实例映射到一个潜在空间,该潜在空间由实例的分布特征指标构成,从而确保 CPDP可以在同一个特征空间内进行.Nam等人[40]提出了HDP(heterogeneous defect prediction)方法,该方法包含特征选择阶段和特征映射阶段.Jing等人[25]提出了 UMR(unified metric representation)表示,随后,借助典型相关分析(canonical correlation analysis)来减少源项目和目标项目间的数据分布差异性.

除此之外,一些研究人员考虑使用无监督方法来解决CPDP问题.Zhong等人[41]使用k-means和NeuralGas方法对程序模块进行聚类分析,然后,他们从每一个簇中选出典型模块,并将一些统计信息(如特征的均值、最大值、最小值等)提供给专家,最终交由专家完成对簇的标记.Nam和Kim[27]提出了一种自动方法CLA.CLA方法会依据每个特征的中位数统计该实例含有的异常特征数,然后将具有相同异常数的实例划分到同一个簇中,随后将高于一定异常特征数的实例标记为有缺陷实例,否则标记为无缺陷实例.在 CLA方法的基础上,Nam等人又通过特征选择和实例选择来移除数据集中噪声,并提出了 CLAMI方法.Zhang等人[42]借助谱聚类(spectral clustering)方法,基于程序模块间的连通性完成对数据集的划分.最近,Yang等人[43]借助代价感知的评测指标进行性能评估时意外地发现,一些简单的无监督方法比有监督方法可以取的更好的预测性能.随后,Zhou等人[44]针对无监督方法(即ManualDown和ManualUp方法)展开了更大规模的实证研究.

1.3 迁移学习

近些年来,迁移学习(transfer learning)引起了广泛的研究和关注[45-51].迁移学习是运用已存在的知识对不同但相关的领域问题进行求解的一种学习方法,该方法放宽了传统机器学习中两个基本假设:(1) 用于学习的训练样本与新的测试样本需要满足独立同分布的假设;(2) 必须有足够的已标记样本才能训练出一个好的分类模型.该方法旨在迁移已有的知识来解决目标领域中仅有少量有标记样本数据甚至有时候没有的学习问题.跨项目软件缺陷预测可以视为迁移学习在软件缺陷预测领域中的一个重要应用.

目前,迁移学习方法可以从两个角度进行分类.基于“迁移什么”角度,已有方法可以细分为4类:基于特征的迁移学习、基于实例的迁移学习、基于参数的迁移学习和基于相关知识的迁移学习.基于“如何迁移”角度,已有方法可以细分为 3类:(1) 归纳式迁移学习:目标领域中有少量标注样本;(2) 直推式迁移学习:只有源领域中有标签样本;(3) 无监督迁移学习:源领域和目标领域都没有标签样本.表1总结了传统机器学习方法和不同类型的迁移学习方法间的关系.

目前,跨项目缺陷预测主要从“迁移什么”的角度展开研究,其中,“基于特征的迁移学习”和“基于实例的迁移学习”是研究人员关注较多的方法,这也是我们主要考虑的角度.基于特征迁移学习的方法尝试寻找在源领域和目标领域之间具有相同或者相似性质的特征,从而达到从源领域将知识迁移到目标领域.一些跨项目缺陷预测法方法[7,8,12,14,25,39,40]从这个角度展开研究.而基于实例的迁移学习方法则根据目标领域中数据的部分知识从源领域中挑选有价值的实例.这类方法通常对源领域中的实例进行选择或权重设置.一些跨项目缺陷预测方法[6,13,14,36,38]从这个角度展开研究.但上述研究工作仅从单一角度将源项目中的信息迁移到目标项目中.本文将基于特征的迁移学习和基于实例的迁移学习相结合,提出了基于直推式迁移学习方式的FeCTrA方法.

Table 1 Relationship between traditional machine learning methods and different types of transfer learning methods表1 传统机器学习方法和不同类别迁移学习方法的关系

2 基于特征迁移和实例迁移的缺陷预测方法FeCTrA

本节首先介绍基于特征迁移和实例迁移的跨项目预测方法FeCTrA的研究动机,然后对FeCTrA方法的整体框架进行描述,最后对框架内的特征间相关性和特征分布相似性的度量方法进行介绍.

2.1 研究动机

软件缺陷预测基于项目的历史数据构建模型,然后对新的软件模块进行缺陷预测.但在实际软件开发过程中,新开发的项目可能没有充足的训练数据,或者一些遗留项目因为特殊原因而无法获得足够多的训练数据.因此,构建一个具有良好性能的缺陷预测模型变得异常困难.于是,迁移学习被引入到软件缺陷预测研究中,借助源项目中的历史标记数据以解决目标项目训练实例过少的问题.然而,由于源项目和目标项目之间存在较大的数据分布差异,使得在源项目数据上构建的缺陷预测模型并不能保证在目标项目上取得良好的预测性能.一方面,从特征角度而言,源项目中并不是所有的特征都与目标项目具有相似的分布,只有分布相似的特征才能辅助目标项目构建性能良好的缺陷预测模型;另一方面,从实例角度而言,源项目数据和目标项目数据本身源于不同的项目,因此通常情况下,源项目中的数据与目标项目数据的分布具有差异性.针对该问题,研究人员分别从特征迁移或者实例迁移的角度展开研究[6-8,12-14,36,38],并取得了一定成果,这充分证明了从特征迁移和实例迁移角度尝试缩小源项目与目标项目之间数据分布差异性的可行性.然而,目前取得的效果并不令人十分满意.为此,我们提出了两阶段跨项目缺陷预测方法FeCTrA,该方法通过同时考虑特征迁移和实例迁移,旨在缩小两个项目的数据分布差异性.在特征迁移阶段中,通过聚类分析,可以识别并移除无关特征和冗余特征;在实例迁移阶段中,依据目标项目中仅有的少量标记数据,借助 TrAdaBoost方法[47],从源项目中选出与目标项目数据分布更相近的实例,从而解决训练数据不足的问题.

2.2 方法框架

FeCTrA方法的框架如图1所示,该方法包含两个阶段:特征迁移阶段和实例迁移阶段.

· 在特征迁移阶段,为了能够迁移有效的特征信息,FeCTrA方法首先移除源项目数据中的类标信息,然后将源项目和目标项目数据进行合并;随后,对合并后的数据集基于特征进行聚类分析,从而把高度相关的特征聚集到同一个簇中;然后计算每一个特征在源项目数据和目标项目数据之间分布的相似性,以此作为排序依据,并对每一个簇中的特征进行降序排列;最后,从每一个簇中选取排名靠前的特征作为最终需要迁移的特征.

· 在实例迁移阶段,删除源项目和目标项目中不必要的特征,仅保留特征迁移阶段选出的特征和源项目的类标特征;然后,利用TrAdaBoost方法[47],从源项目中选出与目标项目分布相似的数据来构建训练数据集,并通过 Boost方法不断迭代,增强基分类器的分类能力,得到若干基分类器,从而构成一个基于集成学习方式的跨项目缺陷预测模型.

Fig.1 Cross-project software defect prediction framework based on feature transfer and instance transfer图1 基于特征迁移和实例迁移的跨项目软件缺陷预测框架

2.2.1 特征迁移阶段

为了更好地描述该阶段,首先给出两个定义:

定义1(特征间相关性(inter-feature correlation,简称IFC)).IFC(fi,fj)表示特征fi和特征fj之间的相关性,其中,i和j不相同.

IFC(fi,fj)的取值范围是[0,1].IFC(fi,fj)取值越高,表明fi和fj之间的相关性越高.其中,当IFC(fi,fj)=0时,表明特征fi和特征fj之间完全独立;当IFC(fi,fj)=1时,表明特征fi和特征fj之间完全相关.本文中使用的特征间相关性度量方法如第2.2.3节所述.

定义2(特征分布相似性(similarity of feature distribution,简称SFD)).SFD(fi)表明特征fi在源项目和目标项目上分布的相似性.

SFD(fi)的取值范围是[0,+∞).SFD(fi)取值越大,表明该特征在两个数据集上分布越相似.显然,SFD(fi)取值越大越好.其中,SFD(fi)=0表明该特征在两个数据集上分布完全不相似.本文中使用的特征分布相似性度量方法如第2.2.4节所述.

算法1中给出了特征迁移阶段的详细描述.该算法是对K-medoids算法的扩展,主要目标是找出K个最具有代表性的特征,这K个特征能够使得各个簇之间的距离最大化并且簇内特征之间的距离最小化.在算法1中,其输入是源项目数据S、目标项目数据T、需要选出的特征数m以及簇的个数k.算法的输出是最终需要迁移的特征集合FS.

算法1.Feature Transfer Phase.

在算法1中,首先移除源项目和目标项目数据中的类标特征(第1行).然后,将过滤掉类标特征的源项目数据和目标项目数据进行合并,形成一个完整的数据集(第2行).随后计算任意两个不同特征之间的相关性IFC(fi,fj)以及同一个特征在两个项目之间的分布相似性SFD(fi)(第3行、第4行).计算完这两项指标之后,执行特征聚类、特征排序和特征选择过程.在特征聚类过程中(第5行),IFC(fi,fj)指标被用来完成特征聚类,特征聚类的目的就是将初始的特征集合分配到k个簇中.在这些簇中,每一个簇里的任意两个特征fi和fj(i≠j)都是高度相关的,但是两个不同簇之间的特征相关度却很低.整个聚类过程如下:首先,SFD(fi)指标将被用于完成k个簇中心的初始化.在此过程中,为了避免选择不相关的特征作为初始化阶段中的簇中心并提高聚类过程的收敛速度,我们首先选择在源项目和目标项目中分布相似度最高的前k个特征,然后根据特征与这k个簇中心之间的相关度,依次指派每一个特征到与之相关度最高的簇中,直至所有特征都属于一个特定的簇.接着重新计算各个簇的中心,按照相同的操作过程更新簇中心并重新指派各个特征到最相关的簇中.重复此过程,直至簇中心不在发生变化为止.在特征排序和特征选择过程中(第6行、第7行),仅使用SFD(fi)指标完成.在该过程中,对于每一个簇中的所有特征进行排序后,从各个簇中选取特定的特征作为最终需要保留的特征,即最终需要迁移的特征.由于每一个簇的大小不尽相同,因此我们考虑了每一个簇的规模,并根据簇的大小从对应的簇中选出相应比例的特征.也就是说,从含有特征越多的簇中选取越多的特征,反之则越少.因此,将每个簇中特征根据SFD(fi)取值进行降序排序后,从每个簇中选取个特征.其中,m表示最终需要选择的特征个数,n表示除类标以外的所有特征个数,|Ci|表示某个簇中含有的特征的个数.最后,汇集从所有簇中选择的特征到FS中(第8行、第9行).

2.2.2 实例迁移阶段

在实例迁移阶段,FeCTrA方法使用 TrAdaBoost[47]来完成,即从源项目数据中挑选实例,以便有足够多的数据用于构建在目标项目上具有良好预测性能的模型.TrAdaBoost尝试从源项目中选出与目标项目中已经标注实例分布相近的实例,从而完成实例的迁移.TrAdaBoost是对Adaboost的一个改进,它是一个用于对源项目中的训练实例设置权重的框架,与目标项目中实例分布相近的实例会被赋予更高的权重,反之则更小,从而可以在源项目中找到与目标项目中实例分布相似的数据.

算法2中给出了实例迁移的详细描述.算法的输入是经过特征迁移过滤后的源项目数据FSource、经过特征迁移过滤后的目标项目数据FTarget、基分类器Learner以及最大迭代次数N.算法的输出是含有多个分类器的集成预测模型.

在算法2中,主要借助TrAdaBoost完成实例的迁移.TrAdaBoost需要使用目标项目中少量的标记实例,为了操作和表述方便,将经过特征过滤后的FSource记为Td,经过特征过滤后的FTargetlabeled记为Ts,经过特征过滤后的Ftargetunlabeled为S(第1行).其中,|Td|=n并且|Ts|=m.然后,为每一个已经标注的实例赋予初始权重(第2行).随后进入TrAdaBoost的循环阶段(第3行~第10行).在循环内部,设当前迭代的轮次为t,首先对Td和Ts中实例的权重wt做归一化操作(第4行).其次,在Td和Ts数据上,调用分类器Learner构建一个分类假设ht(第5行).然后,用当前得到的分类假设去预测目标项目中已经标注的实例Ts,并计算预测错误率(第6行、第7行).当用得到的分类假设ht去预测实例Ts时,如果实例被预测正确的话,这意味着这个实例和目标项目中的实例具有相同的分布,否则表明它们有不同的分布.随后,在 TrAdaboost中,根据错误率来更新调整训练实例权重的因子(第 8行).最后,分别更新源项目数据和目标项目数据中已标注的实例的权重.这个方式可以减小分类错误的实例对训练模型的影响,从而可以构建一个具有良好性能的跨项目缺陷预测模型.重复此过程N次,可以得到多个分类假设并进行集成.因此,该模型充分利用了所有基分类器的分类能力来对未知的实例进行预测(第11行).

算法2.Instance Transfer Phase.

2.2.3 特征之间相关性的度量方法

特征相关性度量是用来度量两个特征fi和fj之间的关联性.定义1中的IFC(fi,fj)是用于衡量两个特征之间的关联性.已有研究[52]表明,特征之间并不一定满足线性关系.因此,使用非线性的度量方法来衡量两个特征之间的关系更加合理.对称不确定性(symmetric uncertainty,简称SU)是非线性度量中的一种典型的方法[53],本文在实验中使用SU来计算两个特征之间的关联性的,即IFC(fi,fj)=SU(fi,fj).值得注意的是,本文提出的框架适用于可以计算两个特征之间相关性的任何方法,因此具有可扩展性.

SU借助信息论中的熵,通过计算特征fi和fj之间的分布差异性来衡量彼此之间的关联性.通过计算特征fi和fj的互信息,然后进行归一化,可得到SU.计算公式如下所示:

其中,

(1)H(fi)表示特征的不确定度(即熵),其定义如下:

p(fi′)表示特征fi取一个特定值的先验概率.

(2)IG(fi|fj)表示信息增益率.表示在给定特征fj的情况下,特征fi减少的量.其计算公式如下所示:

H(fi|fj)表示特征fj确定的情况下,特征fi的熵.其计算公式如下:

p(fj′)表示fj取一个特定值的先验概率.由上述公式可知,信息增益率具有对称性,即两个特征在公式中出现的顺序不会影响它们之间的信息增益率的计算结果.

2.2.4 特征之间分布相似性的度量方法

特征分布的相似性是用来度量一个具体的特征fi在两个不同的数据集上的分布的相似性程度.定义2中的SFD(fi)用于衡量一个具体特征在源项目和目标项目数据集上的分布相似度.我们使用 K-S(Kolmogorov-Smirnov)检验来验证两组数据分布是否相似.这两组数据是指两个不同的数据集上相同特征对应的数据.K-S检验是一种非参检验,主要通过计算两组数据之间是否具有显著的差异来反映特征分布的相似度.在本方法中,我们将 K-S检验出来没有显著差异的情况定义为某特征在源项目和目标项目数据上分布相似程度.值得注意的是,本文提出的框架适用于可以计算一个具体特征在两组数据上分布相似性的任何方法,因此具有可扩展性.

K-S检验是一种拟合度检验,用来判断样本的实际分布值与指定理论的分布是否吻合.当然,K-S也可以用来检测两个样本分布是否具有显著差异,也就是说两样本的分布是否相同.该方法通过两个样本的累计频次数分布是否相当接近来判断原假设H0是否为真.假如两个样本间的累计概率具有较大的分布差异,那么可以肯定两个样本取自不同的总体,则拒绝H0.

K-S检验首先提出两个假设:H0:S1(x)=S2(x),H1:S1(x)≠S2(x).如果令S1(x),S2(x)分别表示第1个和第2个样本观察值的累计概率分布函数,那么得到K-S两个样本的双尾检测统计量为D=max|S1(x)-S2(x)|.如果对于每一对样本值,S1(x)和S2(x)都能十分接近的话,则表明两个分数的拟合程度很高,则有理由认为两个样本数据来自于相同的分布函数.这里,通常将显著性水平p-value设置为0.05.因此,当计算出来的值大于0.05时则接受原假设H0,否则拒绝.

3 实验设计

本节将对FeCTra方法的有效性展开实证研究,首先提出研究问题,从不同角度来探讨FeCTrA方法在各类场景下的性能优劣,然后介绍实证研究中使用的数据集、性能评测指标和显著性检验方法,最后介绍实验流程及其方法参数设定.

3.1 研究问题

FeCTrA方法的目的是在目标项目内没有足够多训练数据的前提下完成缺陷预测的任务.FeCTrA方法从分布的差异性入手,结合特征迁移和实例迁移来构造出对目标项目有用的训练数据.一方面,特征迁移主要从源项目中选择与目标项目中分布相似的特征,从特征角度降低分布差异较大对数据集质量的影响;另一方面,实例迁移主要使用TrAdaBoost方法,尝试从源项目中选出与目标项目数据服从相似分布的实例,从实例角度降低分布差异较大对数据集质量的影响.为了验证FeCTrA方法的有效性,本文提出如下4个研究问题.

· RQ1:FeCTrA方法是否优于已有的经典的跨项目缺陷预测方法?

目前,研究人员针对跨项目缺陷预测问题已经提出了多种方法,我们重点考虑TCA+[12]、Peters过滤法[13]、Burak过滤法[14]和Zimmermann等人[15]提出的方法.除此之外,我们还同时考虑了仅基于特征迁移的FeCTrA方法和仅基于实例迁移的FeCTrA方法.在FeCTrA方法中会存在很多影响因素,例如特征迁移阶段的特征选择比例、实例迁移阶段的目标项目中标记实例比例以及方法考虑的分类器.在该研究问题中,我们基于RQ2到RQ4的分析结果,为这些影响因素设置最优取值.

· RQ2:在FeCTrA方法的特征迁移阶段,特征选择比例对FeCTrA方法的性能影响如何?

在特征迁移阶段,FeCTrA方法尝试通过聚类分析,从源项目中迁移与目标项目分布相似的特征.因此在该RQ中,我们想分析不同的特征选择比例是否会对FeCTrA方法的性能产生影响.

· RQ3:在FeCTrA方法的实例迁移阶段,目标项目中标记实例比例对FeCTrA方法的性能影响如何?

在实例迁移阶段,FeCTrA方法需要使用少量目标项目中已经标注的实例.因此在该RQ中,我们想分析使用不同目标项目中的标记实例比例是否会对FeCTrA方法的性能产生影响.

· RQ4:使用不同的分类器对FeCTrA方法的性能影响如何?

FeCTrA方法内部需要提供分类器以完成预测模型的构建.在软件缺陷预测领域中,被广泛使用的分类器主要包括如下类型:基于概率的分类器、基于决策树的分类器、基于函数式的分类器以及基于集成学习的分类器等.不同类型的分类器在不同数据集上的预测性能并不相同.因此,我们想分析不同类型的分类器是否会对FeCTrA方法的性能产生影响.

3.2 评测对象

在我们的实证研究中,使用了在软件缺陷预测领域中被研究人员广泛使用的数据集(即 Relink数据集和AEEEM数据集)[12,54-56].表2和表3列出了这两个数据集的统计特征.

Table 2 Statistical characteristics of Relink datasets表2 Relink数据集的统计特征

Table 3 Statistical characteristics of AEEEM datasets表3 AEEEM数据集的统计特征

Relink数据集是由 Wu等人[56]搜集整理的,并且借助手工方式对数据集中的缺陷信息进行了确认.他们使用Understand工具(https://scitools.com)分析3个项目(例如Apache、Safe和ZXing),从源代码中抽取出重要的软件特征指标.Relink数据集有26个复杂度特征,这些特征主要基于代码的复杂度和抽象语法树,总体可以分为两个大类:基于程序复杂度的特征和基于数量的特征.表4仅仅列举了这26个特征中的7个特征并对其含义进行描述.Understand网站可以查询到每个特征的具体含义.

AEEEM数据集是由D’Ambros等人搜集整理[57].AEEEM中的每一个项目都包含61个特征,其中,17个属于与源代码相关的特征,5个属于与之前预测相关的特征,5个属于与代码变更熵相关的特征,17个属于与源代码熵相关的特征以及17个属于与源代码衰退相关的特征.更具体地说,AEEEM数据集包含线性衰减熵(LDHH)和权值衰退(WCHU).LDHH和WCHU已经被证实了对于缺陷预测是非常有用的.表5仅仅列出了AEEEM中的部分特征及其具体含义.

Table 4 Description of some feactures in Relink dataset表4 Relink数据集中部分特征的描述

Table 5 Description of some feactures in AEEEM dataset表5 AEEEM数据集中部分特征的描述

本文仅考虑同构类型的跨项目缺陷预测问题,即源项目和目标项目考虑了相同的特征集合.因此,FeCTrA方法仅在同一个数据集内部的项目间进行跨项目预测研究.例如在 Relink数据集中,FeCTrA方法可以使用Apache作为源项目,使用Safe或者ZXing作为目标项目,即Apache→Safe或者Apache→ZXing.但是对于Relink数据集中任一项目做源项目,AEEEM数据集中任意一项目的做目标项目这种情况,FeCTrA方法无法处理.例如,以Apache为例,Apache→{EQ,JDT,LC,ML,PDE}在FeCTrA方法中是不支持的.

3.3 评测指标

对于目标项目中任一实例经缺陷预测模型后会有 4种可能的输出结果:当一个含有缺陷的实例被预测为有缺陷实例,记为TP(true positive);当一个不含有缺陷的实例被预测为有缺陷实例,记为FP(false positive);当一个含有缺陷的实例被预测为无缺陷的实例,记为 FN(false negative);当一个不含有缺陷的实例被预测为无缺陷的实例,记为 TN(true negative).基于以上这些可能的输出结果,可以定义查准率(precision)、查全率(recall)以及F1度量(F1-measure).

· 查准率:在所有被预测为有缺陷的实例中,真正含有缺陷的实例所占的比例.

· 查全率:在所有真正含有缺陷的实例中,被正确预测为有预测的实例所占的比例.

·F1度量又称为F1-Score,是综合考虑查准率和查全率两个指标的指标,其定义如下.

通常,在查准率和查全率之间有一个折中,一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低.然而,折中的方案很难与仅使用查准率或者查全率作为评价指标的预测模型进行比较.而F1是通过查准率和查全率的调和平均数计算而来,其综合考量各方法在查全率和查准率上的整体性能表现,可以全面地反映方法实际性能的优劣.鉴于此,本文使用F1评价各方法的性能.

3.4 显著性检验方法和反向差异的排名.

3.5 假设两个分类器在特定的实验方案下产

为了检验不同方法之间的性能差异是否显著,本文考虑了被广泛使用的Wilcoxon符号秩检验[58].该检验是无参的统计假设检验,也是t-检验的替代方案,其核心是忽略数据的符号,对两个不同分类器在每一个数据集上取得的性能结果之间的差异进行排序,同时比较正向差异生了N组实验数据,以di表示这两个分类器在第i组数据上的性能差异,这N组差异将会根据差异的绝对值进行排序.如果两者无差异,即di=0,则将它们两者差异排名的平均值作为它们各自的排名.使用R+表明第2种算法优于第1种算法对应数据的排名总和,那么R-表示第2种算法劣于第1种算法对应数据的排名总和.当di=0时,则取所有di为0的数据对应的排名之和的一半.如果它们的个数是奇数,那么其中一个数据将会被忽略掉.R+,R-的定义如下.

记T为R+,R-这两者的最小值,即T=min(R+,R-).对于数据量大于25的数据集,下面的统计公式表示分布是接近于正态分布的.

当给定的显著因子α=0.05时,如果z<-1.96,则空假设将被拒绝,即表明被比较的两个分类器的性能是存在显著差异的.关于Wilcoxon的更加详细的描述,可参考文献[58,59].

为了进一步比较两种方法之间的性能,我们使用“Win/Draw/Loss”分析.在特定评价指标上,“方法 1vs方法2”的“Win/Draw/Loss”结果分析共有3种情况,即“方法1”的性能显著好于、相似或者显著差于“方法 2”的性能的次数.

3.6 实验流程及其方法参数设定

为了评价 FeCTrA方法在跨项目缺陷预测中的性能,我们比较了 6种经典的跨项目软件缺陷预测方法:(1) 只包含特征迁移阶段的 FeCTrA 方法,记为 FeCTrA(FT);(2) 只包含实例迁移阶段的 FeCTrA 方法,记为FeCTrA(IT);(3) Nam等人[12]提出的TCA+方法;(4) Peters等人[13]提出的Peters过滤法;(5) Turhan等人[14]提出的Burak过滤法;(6) Zimmermann等人[15]提出的方法,为了后续描述的方便,将其记为DCPDP(directly cross-project defect prediction)方法.

FeCTrA方法主要包括特征迁移和实例迁移两个阶段.在特征迁移阶段,需要对特征进行聚类.而簇的个数和选择的特征个数会对预测性能产生重要影响.已有的研究工作[60,61]表明,比较理想的簇的个数为,其中,M表示原始特征的个数.缺省情况下,迁移的特征个数为 40%×M.在实例迁移阶段,需要目标项目中提供部分已标记的数据.缺省情况下,FeCTrA方法从目标项目中选出 10%的实例作为已经标注的实例.除此之外,TrAdaboost是一个不断迭代的过程.研究表明[47],100次迭代可以使得模型的性能收敛.因此,FeCTrA方法将实例迁移阶段的迭代次数设置为100.为了减少随机性对实验结果造成的影响,本文重复执行FeCTrA方法100次,并取均值作为最终结果.此外,当计算两个特征的分布相似度时,本文使用R语言提供的K-S检验.

TCA+方法是对 TCA方法的一个扩展,主要包含两个阶段:正规化方法自动选择阶段和 TCA应用阶段.DCPDP方法直接在源项目上构建缺陷预测模型,然后在目标项目上进行预测.Peters过滤法和Burak过滤法都是经典的基于实例迁移的跨项目缺陷预测方法.此外,在分类器的选择上,本文使用软件缺陷预测领域中被广泛使用的Naive Bayes[7,60,62]作为默认分类器.FeCTrA方法和所有基准方法均基于weka软件包编程实现.

在跨项目缺陷预测的实验中,采取“一对一”的方式,即每次只选择 1个项目作为源项目,选择另一个项目作为目标项目.以Relink数据集中的Apache项目为例,其对应的源项目可以是Safe,或者是ZXing,但并不允许是两个项目的融合.此外,对于 FeCTrA方法,需要同时使用源项目数据和目标项目中少量已经标注的数据作为训练集.本文采用反转的十折交叉检验处理方式.对于某一折划分,采用如下的处理方法:使用源项目的所有标记数据和目标项目中一折(即 10%)已标记数据作为最终的训练集,然后,在此数据集上构建一个跨项目的缺陷预测模型,最后对目标项目中未标记的九折(即 90%)数据进行预测.依次与目标项目中每一折数据结合构建训练集,预测剩下的九折,从而得到十次结果.重复该过程10次,即可得到100次实验结果.此外,为了确保所有项目的在相同的测试集上进行性能的公平评估,对于其他基准方法采取了相同的反转十折处理方法.但是不同于FeCTrA方法,基准方法构建的训练集并不包含目标项目中少量的标记数据(缺省10%),直接在把源项目数据作为其总体训练集,然后预测目标项目中的未标记数据(缺省90%).

本文实验在以下配置的台式机上运行:操作系统:Windows 7,64位;CPU:Intel(R) Core(TM) i5-4590CPU@3.30GHz×2;内存:16G.

4 实证研究结果的分析

4.1 针对RQ1的结果分析

本文在 Relink数据集和 AEEEM 数据集上分别对 FeCTrA方法的整体性能进行了实证研究,使用 Naïve Bayes作为基分类器,迁移的特征比例为 40%,选择目标项目中标注的实例比例为 10%,并将 FeCTrA方法与 6种基准方法进行了比较.表6和表7分别给出了这些方法在两个数据集上取得的F1均值.

Table 6 Comparison ofF1 among FeCTrA and six baseline methods on Relink表6 基于F1评价指标,FeCTrA与6种基准方法在Relink数据集上的平均性能比较

Table 7 Comparison ofF1 among FeCTrA and six baseline methods on AEEEM表7 基于F1评价指标,FeCTrA与6种基准方法在AEEEM数据集上的平均性能比较

在表6和表7中,第1列表示跨项目缺陷预测的具体场景,比如在表7中,JDT⇒EQ表示使用JDT作为源项目,EQ作为目标项目.接下来的3列表示本文提出的FeCTrA方法,由于FeCTrA方法包含两个阶段,因此我们使用FeCTrA,FeCTrA(FT)和FeCTrA(IT)分别表示同时使用特征迁移和实例迁移、仅使用特征迁移和仅使用实例迁移.最后 4列表示跨项目缺陷预测研究中已有的经典基准方法,即 TCA+、Peters过滤法、Burak过滤法和DCPDP.两个表格的最后一行给出了每一种方法的整体平均性能.表格中每一行的最大值进行加粗表示.

从两个表格的最后一行可以看出,基于Relink和AEEEM两个数据集,与基准方法相比,本文提出的FeCTrA方法能够取得更好的预测性能.

与FeCTrA(FT)方法和FeCTrA(IT)方法相比,FeCTrA方法在绝大部分的跨项目缺陷预测场景中都能取得更好的预测性能.例如,对于Relink数据集上的Safe⇒Apache,FeCTrA方法取得的F1均值为0.672,而FeCTrA(FT)方法和FeCTrA(IT)方法分别获得了0.646和0.583,因此,FeCTrA方法与这两种方法相比,其性能提升分别为4%和 15.3%.对于 AEEEM 数据集上的 LC⇒EQ,FeCTrA 方法取得的F1均值为 0.724,相对于 FeCTrA(FT)方法(0.532)和 FeCTrA(IT)方法(0.593),其性能提升分别为 36.1%和 22.1%.实验结果表明,在跨项目缺陷预测中,将特征迁移和实例迁移进行结合,与仅考虑单个阶段的方法相比,其能够获得更好的预测性能.

与 TCA+方法相比,在两个数据集上,FeCTrA方法的性能要好于 TCA+方法.TCA+方法借助特征映射完成特征迁移,这与FeCTrA方法的第1阶段比较相似,即与FeCTrA(FT)方法相类似.从实验结果可以看出,绝大部分情况下,本文提出的特征迁移方法 FeCTrA(FT)要好于 TCA+方法.例如,在 Relink和 AEEEM 数据集上,FeCTrA(FT)方法分别获得了0.630和0.693的性能,而TCA+方法仅获得了0.518和0.400.这充分体现了在跨项目缺陷预测中特征迁移阶段的重要性,有利于排除无关特征对实验结果产生的影响.此外,相对于 TCA+方法,FeCTrA(FT)方法的性能更为稳定.例如在 Apapche⇒Safe场景中,TCA+方法能够获得令人满意的性能(即0.727),而在LC⇒ML场景中,TCA+方法则难以获得令人满意的性能(仅0.266).因此在不同的场景下,TCA+方法的性能波动较大.

与Peters过滤法和Burak过滤法相比,在AEEEM数据集上,FeCTrA方法在所有的跨项目缺陷预测场景中都取得了最好的性能.而在 Relink数据集上,Peters过滤法和 Burak过滤法在部分场景下表现较好,如 Safe⇒Apache,Apache⇒Safe和Safe⇒ZXing这3个场景上.其可能原因如下:在Relink数据集上,各个项目的实例普遍偏少,而FeCTrA方法仅仅借助了目标项目中10%的实例,因此可用的信息较少;而Peters过滤法和Burak过滤法选出的实例较多,因此包含的信息也更多.但从整理来说,FeCTrA方法相对于 Peters过滤法和 Burak过滤法,其性能分别提高了7.2%和9.8%.

与 DCPDP方法相比,FeCTrA方法在两个数据集上也几乎取得更好的预测性能.总体而言,FeCTrA方法在Relink数据集上,其性能提升了38.2%;在AEEEM数据集上,其获得的性能是DCPDP方法的两倍.这些结果表明,在跨项目缺陷预测中,直接使用源项目数据中的所有特征和实例并不能保证可以得到更好的预测效果,而移除冗余特征、无关特征以及分布不相似的实例会显著提升模型的性能.然而在Apache⇒ZXing场景下,DCPDP能够获得更好的预测结果.这可能是因为Apache和Zxing这两个项目本身分布较为相似,所以DCPDP方法能够取得更好的性能.

表8列出了FeCTrA方法与6种基准方法之间的Win/Draw/Loss比较结果.表格分为上下两个部分,分别表示 Relink数据集中的项目和AEEEM数据集中的项目.表中的每一行表示以当前项目作为目标项目,其他的项目为源项目.例如,以EQ为例,则表示将EQ设置为目标项目,由剩下项目(即JDT,LC,ML和PDE)中可以选一个作为源项目.因为AEEEM数据集总共含有5个项目,因此会总共产生20个跨项目缺陷预测场景.从表8中不难看出,在Relink数据集上,FeCTrA方法最低可以取得33.3%(2/6)的胜算,即与Peters过滤法比较;在AEEEM数据集上,FeCTrA方法最低可以取得90%(18/20)的胜算.在大部分数据集上,FeCTrA方法优于仅考虑特征迁移或仅考虑实例迁移的方法.

此外,为了验证 FeCTrA方法与基准方法间的性能差异是否具有显著性,本文对实验结果进行了 Wilcoxon符号秩检验,并设置显著性水平α为0.05,具体结果见表9.基于表9可以发现,“FeCTrA vs FeCTrA(FT)”、“FeCTrA vs FeCTrA(IT)”、“FeCTrA vs TCA+”、“FeCTrA vs Peters过滤法”、“FeCTrA vs Burak 过滤法”和“FeCTrA vs DCPDP”的p值都小于0.05.这表明,基于显著性分析,FeCTrA方法的预测性能要显著优于其他6种基准方法.

Table 8 Win/Draw/Loss of FeCTrA compared with six baselines on both datasets表8 FeCTrA方法与6种基准方法在两个数据集上的WIN/DRAW/LOSS比较结果

Table 9 p-value of the wilconxon signed-rank test among baseline methods and FeCTrA表9 FeCTrA和基准方法间的显著性检验结果

基于上述分析,在跨项目缺陷预测中,冗余特征、无关特征以及分布不同的实例均会影响跨项目缺陷预测模型的性能,而本文提出的FeCTrA方法通过同时考虑特征迁移和实例迁移,可以取得更好的预测性能.

4.2 针对RQ2的结果分析

为了分析特征迁移阶段中特征选择比例对FeCTrA方法性能的影响,我们将特征选择比例从10%逐步增长到 100%,步长设置为 10%.图2和图3分别显示了基于 Relink数据集和 AEEEM 数据集上,特征选择比例对FeCTrA方法性能的影响.

在图2和图3中,x轴表示从源项目中迁移的特征数量占所有特征数量的比例,其取值从 10%逐步增长到100%,y轴表示FeCTrA方法基于该特征选择比例取得的F1均值.我们对数据折线做了平滑处理.图中每一条曲线表示一个具体的项目,为了便于区分,使用了不同颜色对曲线进行绘制.

Fig.2 Impact on FeCTra by varying feature transfer ratio on Relink图2 在Relink数据集上,迁移不同比例的特征对FeCTrA性能的影响

Fig.3 Impact on FeCTra by varying feature transfer ratio on AEEEM图3 在AEEEM数据集上,迁移不同比例的特征对FeCTrA性能的影响

从图2中可以发现,当特征选择比例从10%增长到20%时,FeCTrA在各个项目上取得的预测性能在不断提高;但是当特征选择比例从 20%增加到 30%时,FeCTrA方法在各个项目上的预测性能都出现了不同程度的下降,其中在 Safe项目上,性能下降最为严重.这可能是由于选出的这些特征在目标项目上并不起到重要作用,而这些特征被挑选中可能仅仅是因为在数据分布上与源项目更接近而已;当特征选择比例从 30%增加到 40%时,FeCTrA方法在各个项目上的预测性能又开始提升;随后,当特征选择比例不断提高时,FeCTrA方法的预测性能并没有持续提高,而是趋于稳定;甚至当选择全部特征时,FeCTrA方法的预测性能反而出现下降.这说明:(1)从源项目中迁移所有的特征,并不能保证在目标项目上具有很好的泛化能力,这可能是冗余特征和无关特征的存在所引起,因此在迁移特征时,识别并移除上述两类特征很有必要;(2) 迁移40%的特征能够使得FeCTrA方法在Relink数据集上可以达到较高的预测性能.

从图3中可以发现,随着特征选择比例的变化,FeCTrA在各个项目上的性能表现也在不断变化.例如在EQ和 JDT项目上,FeCTrA方法的预测性能随着特征选择比例的增加而不断提高,但是提高的幅度不大.这说明在这两个项目上,当迁移的特征比例为20%~40%时,FeCTrA方法已经能够挑选出最重要的特征.在LC项目上,当迁移的特征比例为10%时,FeCTrA方法取得的预测性能最高;随着迁移特征比例的增加,FeCTrA方法开始出现下降,直至迁移的特征比例为40%时,FeCTrA方法的性能才趋于稳定.而对于ML和PDE项目,随着迁移的特征比例不断增加,FeCTrA方法的性能出现波动现象.具体来说,在 PDE项目上,FeCTrA方法在迁移的特征比例为30%时首次达到了最优效果,而在迁移的特征比例为 40%以后,其最好性能与最差性能的波动情况趋于稳定;在ML项目上,当迁移的特征比例大于20%时,FeCTrA方法的最好性能与最差性能几乎保持不变,并且在迁移的特征比例为40%时首次达到最优性能.因此在AEEEM项目上,迁移的特征比例设置为40%是理想的选择.

基于上述分析,在FeCTrA方法的特征迁移阶段,从源项目中迁移40%的特征比较理想.

4.3 针对RQ3的结果分析

为了分析目标项目中标注实例比例对 FeCTrA方法预测性能的影响,本文主要假设目标项目中存在 5%,10%和20%的标注实例.选择以上3种不同的标注实例比例主要有以下两个原因.

(1) 标注实例是一个耗时耗力、成本高昂并且容易出错的工作,但是使用有限的成本去标注少部分的实例是切实可行的,这也是本文研究FeCTrA方法的前提.但在目标项目中,标注的实例不宜过多,本文在实验中将标注实例的比例上限设置为20%.

(2) 本文在模型性能评估时基于交叉验证的方式,因此,选择以上 3种标注实例的比例可以保证更好地进行交叉检验(即20折交叉验证、10折交叉验证以及5折交叉验证).

图4和图5展示了不同的标注实例比例对FeCTrA方法预测性能的影响.

Fig.4 Impact on FeCTrA by varying labeled instance ratio in target project on Relink图4 在Relink数据集上,目标项目中不同标注实例比例对FeCTrA方法预测性能的影响

Fig.5 Impact on FeCTrA by varying labeled instance ratio in target project on AEEEM图5 在AEEEM数据集上,目标项目中不同标注实例比例对FeCTrA方法预测性能的影响

在图4和图5中,横轴表示不同的项目,纵轴表示以某一项目为目标项目时,所有跨项目缺陷预测场景下得到的F1性能均值和标准差.为了便于区分,使用不同颜色表示目标项目中不同的标注实例比例.以Apache项目为例,当选择目标项目中5%的实例作为已标注实例时,Apache可以被等分成20份,即可以执行20折交叉验证.当选择目标项目中 20%的实例作为已标注实例时,Apache可以被等分成 5份,即可以执行 5折交叉验证.因此,每一个实验结果是基于个数据所获得.其中,P表示目标项目中标注实例的比例(例如P=5%),M表示可以作为源项目的个数(例如,当Apache为目标项目时,M=2),最后的10表示该交叉检验会重复执行10次.

从图4中可以看出,在Apache和Safe项目上,随着目标项目中标记数据的增加,FeCTrA方法性能的均值在不断提高;然后,增加的幅度并不是很大.其原因可能是,在 Relink数据集上,各个项目内含有的实例数目普遍较少.例如,Apache项目仅有194个实例,Safe项目仅有56个实例,ZXing项目仅有399个实例.因此,增加5%~10%的实例比例并不会增加太多的标注信息.所以,FeCTrA在各个项目的性能表现相对稳定.而在 ZXing项目上:当标注实例的比例是10%时,FeCTrA方法获得了最好的预测性能;当比例增加到20%时,性能反而有所下降.从图5中可以看出,在JDT、ML和PDE项目上,随着目标项目中标注实例的增加,FeCTrA方法的性能也逐渐提高.这主要是因为JDT、LC和ML这3个项目里含有的实例数较多.例如,JDT项目含有997个实例,ML项目含有1 862个实例,PDE项目含有1 497实例.因此,随着标注实例比例的增加,可以被FeCTrA方法利用的实例信息就越多,性能自然越来越高.而EQ项目中含有的实例数较少,因此性能几乎保持不变.在 LC项目中,当标注实例的比例为10%时,FeCTrA方法获得了最好的性能;当比例增加到20%时,性能也有所下降.其原因一方面是数据集本身含有的实例较少(仅399个实例),另一方面可能是由于数据集本身质量不高所导致的.

基于上述分析,在FeCTrA方法的实例迁移阶段,从目标项目中的选择10%的标注实例比较理想.

4.4 针对RQ4的结果分析

为了研究不同类型的分类器对 FeCTrA方法的影响,本文考虑了软件缺陷预测研究经常使用的分类器.其中,J48属于基于决策树的分类器,LR(logistic regression)和SVM(support vector machine)属于基于函数式的分类器,NB(Naive Bayes)属于基于概率的分类器,RF(random forest)属于基于集成学习的分类器.图6和图7显示了不同分类器对FeCTrA方法的影响.

Fig.6 Impact on FeCTrA by using different basic classifier on Relink图6 在Relink数据集上,不同分类器对FeCTrA方法性能的影响

Fig.7 Impact on FeCTrA by using different basic classifier on AEEEM图7 在AEEEM数据集上,不同分类器对FeCTrA方法性能的影响

在图6和图7中,横轴表示数据集中不同项目的名称,纵轴表示FeCTrA方法使用不同分类器后得到的F1值.为了便于区分,本文使用不同的颜色填充盒图以表示不同的分类器.

从图6中可以看出,在Relink数据集中的3个项目上,J48和SVM分类器的预测性能较差,在Apapche和Safe项目上,使用J48作为分类器得到的F1都小于0.5;而使用LR、NB和RF作为分类器得到的F1值相对较好,其中,NB分类可以取的最好的F1值.例如在Apache和Safe项目上,使用NB作为分类器得到的性能最高.

从图7中也可以看出,除了 EQ项目,使用不同的分类器在不同的项目上得到的性能都相对较好,且性能也比较稳定.例如,除了LR在LC、ML和PDE上表现波动较大,其他分类器在各个项目上表现都比较稳定.此外,NB在EQ、JDT、LC和ML中表现最好;其次,RF也能获得比较好的结果.

基于上述分析,不同类型的分类器对FeCTrA方法的性能会造成一定的影响,其中,NB分类器整体性能表现更好.

4.5 有效性影响因素分析

这一节主要分析可能影响到本文实证研究结论有效性的影响因素.具体来说,有以下几个方面.

(1) 内部有效性主要涉及可能影响实验结果正确性的内部因素,最主要的有效性影响因素是实验代码的实现是否正确.为减少重新实现各种基准方法过程中引入的人为因素的影响,我们使用了第三方提供的成熟框架,例如来自Weka中的机器学习包.此外,我们采用了跨项目缺陷预测开源工具CrossPare[63]提供的代码,该工具已经实现了当前跨项目缺陷预测领域的一些经典方法.

(2) 外部有效性主要涉及实验研究得到的结论是否具有一般性.为确保实证研究结论的一般性,我们选择了软件缺陷预测问题研究中经常使用的Relink数据集和AEEEM数据集.这两个数据集累计包含了8个具有一定代表性的开源项目;同时,这些项目也覆盖了不同类型的应用领域,可以确保研究结论具有一定的代表性.

(3) 结论有效性主要涉及使用的评测指标是否合理.本文重点考虑了F1指标,该指标是Precision和Recall指标的综合衡量,在软件缺陷预测领域被广泛使用[6,7,64,65],因此可以更好地评估模型的综合性能.

5 总结与展望

本文提出一种新颖的基于特征迁移和实例迁移的跨项目软件缺陷预测方法 FeCTrA.该方法主要包含特征迁移和实例迁移两个阶段.在特征迁移阶段,基于特征之间的关联性,将已有特征进行聚类分析;随后,基于特征在源项目和目标项目之间的分布相似性,将每个簇中的特征从高到低进行排序,并选出指定数量的特征,从而可以有效地移除无关特征和冗余特征.在实例迁移阶段,使用 TrAdaboost技术,依据目标项目中少量的已标注实例,从源项目中挑选出大量与目标项目分布相同的实例构建训练集,从而可以有效地缩小源项目和目标项目之间的分布差异.此外,本文基于Relink和AEEEM数据集对该方法展开了实证研究,并验证了该方法的有效性.

本文仍存在很多值得探讨的下一步工作.首先,FeCTrA方法在进行特征迁移时采用了聚类分析方式.在初始簇中心挑选不理想的情况下,可能需要花费很长的时间才能达到簇中心的收敛.本文在该阶段挑选了在两个数据集中分布最相似的前几个特征作为初始簇中心.后续的研究需要分析考虑不同初始簇中心的选择对整个方法性能的影响;其次,本文在特征迁移阶段仅考虑了迁移特征的比例对方法性能的影响,下一步工作可以从特征的类别角度出发考虑特征迁移,即迁移何种类别的特征最有效;最后,需要将本文方法应用到实际的软件测试过程中,如针对安卓应用的测试[66-68].部分研究工作[69]表明,有超过 90%的开发人员愿意采用缺陷预测工具.但是将缺陷预测应用于实际项目仍然存在一定的挑战性:首先,大部分研究仅预测软件模块内部是否存在缺陷,而没有提供相应的预测依据和修复建议;其次,大部分研究将程序模块的粒度设置为类/文件,因此,即便能准确预测到软件模块内含有缺陷,仍然需要花费大量的时间去定位和修复这些缺陷.因此在实际的项目应用中,如果想得到开发人员的积极反馈,需要进一步完善缺陷预测工具,给出预测结果及理由、缺陷位置和修复建议等.

猜你喜欢
集上分类器实例
学贯中西(6):阐述ML分类器的工作流程
关于短文本匹配的泛化性和迁移性的研究分析
基于朴素Bayes组合的简易集成分类器①
基于互信息的多级特征选择算法
一种自适应子融合集成多分类器方法
师如明灯,清凉温润
浅谈多分类器动态集成技术
完形填空Ⅱ
完形填空Ⅰ
几道导数题引发的解题思考