APP下载

集成学习融合依赖度的软件缺陷数量预测方法

2023-06-15和萌萌

计算机技术与发展 2023年6期
关键词:软件缺陷依赖度样本

郭 峰,和萌萌

(北方工业大学 信息学院,北京 100144)

0 引 言

软件缺陷预测是软件开发和运行维护领域中关键的研究内容,是根据软件历史仓库提取软件度量元信息进而预测待测版本各模块的缺陷倾向性或者缺陷数量。软件缺陷预测可以促进软件开发和运行维护中测试资源合理分配,提高软件测试效率,有助于发现软件开发过程中存在的风险,降低开发成本,提高软件质量[1]。

目前,已有研究者提出一些使用机器学习或统计学方法的有效软件缺陷预测方法[2-5],但它们局限于将软件缺陷预测工作划分为二分类问题,即预测软件模块是否有缺陷倾向。由于软件测试资源有限且每个软件模块在软件质量管理过程中重要性不同,仅仅分析一个软件模块是否有缺陷会导致运行故障是远远不够的[6-7]。较为准确的预测软件缺陷数量能够使有限的测试资源分配给更多缺陷模块或更重要的缺陷模块。因此,软件缺陷数量预测会对软件开发、运行和维护更有帮助。

针对软件缺陷数量预测方法,2008年W. Afzal提出使用遗传编程构建缺陷数预测模型,为缺陷数预测模型的构建开辟了新道路[8];Rathore S S在2015年利用神经网络和遗传编程进行了缺陷数量的预测[9],在2016年研究了决策树回归算法预测缺陷数量的能力[10],在2017年提出使用集成学习方法构建缺陷预测模型[11]。但是软件产品大致符合二八原则,即80%的缺陷集中在20%的模块中,有缺陷的模块远少于没有缺陷的模块[12-13]。在缺陷预测中,这种现象被称为数据不平衡。数据不平衡严重影响了缺陷预测模型性能,没有缺陷的模块支配着数据样本,学习器会偏向于没有缺陷模块,因此,学习器对有缺陷模块不会产生好的预测结果[12]。

目前,调整该现象的方法可以分为两类:数据层面和算法层面,算法层面基本思想是设计适用于不平衡数据集的软件缺陷预测模型。部分研究者在构建缺陷预测模型模块考虑到了数据不平衡问题。Sun等人[14]针对数据的不平衡特性提出了基于特定编码的集成学习算法。Ryu等人[15]考虑了数据不平衡和分布特征,提出了一种基于代价敏感的迁移学习方法。Wang等人[16]提出将多核学习方法和集成学习方法相结合解决数据不平衡问题[12]。数据层面的主要策略是在数据预处理阶段,对不平衡的数据进行调整。

数据层面抽样方法是解决数据不平衡常用的方法,抽样方法分为过采样和欠采样。欠采样是随机删除含常见目标变量值的类(即多数类)以平衡数据的分布,可能会导致重要数据丢失。过采样是通过随机复制含稀有目标变量值的类(即少数类)以平衡数据的分布,可能会使学习器的决策区域变得更小、更具体,从而导致学习器出现过拟合现象。

对此,Chawla等人[17]在过采样方法的基础上,提出创建少数类以平衡数据分布的算法smote。smote算法的基本思想是对少数类样本进行分析和模拟,人工模拟合成新的少数类,以平衡数据集分布。该算法克服了过采样算法的缺点,但在选择合成少数类的目标类时存在随机性,会影响缺陷预测模型的性能。部分研究者采用抽样方法去解决数据不平衡问题。Zhang等人[18]在原始抽样算法基础上提出一种改进算法EDBC,优化了原始抽样方法,但性能上不及算法层面集成学习算法,Muhammed[19]利用不同基础抽样方法对数据集进行处理,发现不同抽样方法性能差别不大。

如何利用软件历史仓库信息准确预测出软件缺陷数量是该文研究的重点。

1 ELDDP

根据软件历史仓库信息可以提取软件度量元信息,有利于软件缺陷预测工作进行,但软件产品大多存在数据不平衡现象,会影响缺陷预测性能。针对数据不平衡,已有研究仅局限于算法层面或数据层面,并且算法层面研究仅局限于单一的回归算法,存在一定缺陷,会对软件缺陷预测精度造成一定影响。为了提高缺陷数量预测精度,该文提出一种新的软件缺陷数量预测方法ELDDP。该方法在数据层面和算法层面均考虑了不平衡数据集的影响。在数据层面将依赖度引入smote算法,对smote算法进行改进,然后使用改进smote算法进行数据预处理。在算法层面,该文提出结合集成学习Adaboost.R2算法[20]和Stacking算法优势构建缺陷预测模型,这样不仅可以减少不平衡数据集对预测结果的影响,也可以增加缺陷预测模型的鲁棒性和准确性。ELDDP总体流程如图1所示。

图1 ELDDP方法总体流程

1.1 改进smote算法

smote算法的主要策略是度量少数类之间的欧氏距离,选择少数类i(i∈{1,2,…,T})(T为不平衡数据集中少数类的总个数)最k近邻,从最k近邻中随机选择一个少数类,与少数类i合成新的少数类,重复上述过程,直到数据集达到平衡状态。smote算法示意如图2所示。

图2 smote算法示意图

smote算法能够避免过拟合的问题,通过人工合成少数类使得学习器决策区域更大,但仍存在一定的局限性。该文对从最k近邻选择目标类方法进行改进,将依赖度引入smote算法中。

1.1.1 依赖度

依赖度是指软件中各个类之间依赖关系的度量,依赖关系包括控制关系、调用关系和数据传递关系。

在软件缺陷预测中,软件每个类可看作是一个节点,类以及类之间的关系可以看作是一个网络结构。根据无标度网络特性,即在一个网络中,新增加一个节点,该节点会优先连接高度数的节点,即依赖度较大的节点,可知依赖度较大的类存在着缺陷引入的风险。因此,依赖度较大的类应是缺陷预测模型的重点研究对象。图3展示了Promise数据集中基于Java环境开发的xalans软件2.5版本部分类的依赖度和缺陷数。

图3 xalans类

从图3中可以看出,软件中依赖度较大的类存在有缺陷可能性更大的现象。

该文使用Dependency Finder分析工具从Java字节码文件中提取软件类之间依赖关系,将每个类的依赖类和被依赖类个数总结、求和,形成一个新的特征:依赖度(depedency,dep),添加于软件缺陷预测领域常用的数据集Promise中,对Promise数据集进行更新。

1.1.2 算法描述

改进smote算法的基本思想是:在原smote算法基础上,从最k近邻中选择少数类,与少数类i合成新的少数类时优先选择依赖度较大的少数类,使得人工合成少数类样本能更加满足实际需求。改进smote算法的具体描述如下:

第一步:定义少数类和多数类。基于相关性函数和用户指定的相关性阈值来定义稀有目标变量值和常见目标变量值。具有稀有目标变量值的类称为少数类,具有常见目标变量值的类称为多数类。为了预测软件缺陷的数量,基于软件历史仓库,将缺陷数为零的类定义为少数类,将缺陷数大于零的类定义为多数类。

第二步:创建合成少数类样本。

假设一个具体的少数类样本i,特征向量为xi,i∈{1,2,…,T}(T为不平衡数据集中少数类样本的总个数),计算少数类i到该数据集所有少数类的欧氏距离,找到与少数类样本i最近的k个少数类样本xi(near),near∈{1,2,…,T}。

根据依赖度dep对xi(near),进行排序得到Xi(near),near∈{1,2,…,T}。

根据数据集中少数类和多数类的不平衡比例设定需要设置的采样倍率N,然后从Xi(near),near∈{1,2,…,T}中选择排在第n(n∈{1,2,…,k})(n的初始值为1,第二次重复时选择排在第n+1个的少数类)个的少数类Xi(nn),同时随机生成一个0到1之间的数ω,最后用公式(1)插入一个新的少数类样本。

xi1=xi+ω×(Xi(nn)-xi)

(1)

这样就在两个少数类之间成功插入一个新的合成少数类。重复上述操作N次,合成了N个少数类。对于少数类样本集T中的每个少数类均重复上述操作,就会合成NT个新的少数类样本,最终达到平衡数据集的目的。

1.2 基于集成学习方法构建缺陷预测模型

集成学习的基本思想是通过某种策略将多个方法集成,最终合成一个整体的学习器模型。Adaboost.R2(Adaptive Boosting Regression)算法是集成学习用于构建回归模型的常用算法。Adaboost.R2算法[20]主要策略是基于不断调整的数据集使用某一种回归算法训练多个基学习器,然后通过某种策略将基学习器结合起来构成一个强学习器[21]。该算法可以使用不同回归算法构建学习器,非常灵活,但最终构建模型只针对某一种回归算法,并且对异常样本敏感,会影响最终强学习器的预测准确性[22]。Stacking方法的基本思想是将多个模型的结果进行融合来提高预测率。因此,该文结合集成算法Adaboost.R2和模型融合Stacking方法构建缺陷预测模型,具体描述如下:

第二步:训练弱学习器,计算弱学习器样本误差。首先,分别依据决策树回归(DTR)、贝叶斯岭回归(BRR)和线性回归(LR)训练出弱学习器ht。然后,计算弱学习器ht的学习误差率。如果εt表示弱学习器学习误差率,t的取值范围为[dj,bj,lj],j=1,2,…,T(T为基学习器的个数),则εt的计算方式如式(2):

(2)

其中,wi为当前训练集中第i个样本,ei为第i个样本的指数误差,其定义如式(3)所示:

(3)

Et表示针对弱学习器ht,训练集上样本的最大误差,其计算方式如下:

Et=max|yi-ht(xi)|,i∈{1,2,…,m}

第三步:更新训练集样本权值。首先,根据弱学习器学习误差率计算弱学习的权重系数αt,其计算方式如式(4)所示:

(4)

然后,更新训练集中样本权值wt+1,i:

第四步:将权值更新后的样本组成一个新的训练集,重复上述第二步和第三步,直到εt达到指定值为止。然后,通过线性组合的方式分别将以决策树回归(DTR)、贝叶斯岭回归(BRR)和线性回归(LR)为基学习算法训练出的弱学习器组合成强学习器(Hd,Hb,Hl)。

第五步:采用Stacking算法将Hd,Hb,Hl拟合成一个综合决策树回归、贝叶斯岭回归、线性回归算法优势的学习器。具体而言,将Hd,Hb,Hl预测结果作为训练集,对元学习器(该文采用决策树回归算法)进行训练,最终得到预测结果更为准确的模型。

2 实 验

2.1 数据集

该文使用了添加依赖度特征后的Promise数据集中5个常用且可用的软件项目,包含13个软件项目版本。这些项目的详细统计信息显示在表1中,包括项目名称、实例数目、缺陷总数、缺陷比例(有缺陷类所占百分比)、实例中最大的缺陷数。每个项目都包含了很多基于代码度量元和过程度量元的特征。

表1 实验数据集详细信息

2.2 测评指标

该文使用中位数绝对误差(Median Absolute Error,MDAE)、平均绝对误差(Average Absolute Error,AAE)和决定系数(R-square,R2)三个性能评价指标测评ELDDP在软件缺陷数预测中的准确性。

中位数绝对误差(MDAE):计算数据与它们中位数之间的偏差。对误差绝对值取中位数,降低异常值的影响。定义为:

平均绝对误差(AAE):计算预测结果与真实结果的接近程度,可以很好地反映预测结果的实际情况。该值越小说明模型拟合效果越好。其定义如下:

(5)

决定系数(R2):计算特征向量对预测结果的解释程度,正常取值范围为:[0,1],

R2值越接近1说明特征向量对预测结果的解释能力越强,该模型对数据的拟合程度越好。其定义如下:

(6)

2.3 实验设置

实验中采用10折交叉验证,具体而言,将一个项目的一个版本数据集分成大小相等的十个部分,其中九个部分用于构建缺陷数预测模型,剩余的一个部分作为测试集对构建的模型进行测试。如此操作重复十次,以便十个部分都可以作为测试数据进行一次测试。该文将10折交叉验证方法10次的运行结果取均值作为模型的最终性能。

为了评估ELDDP方法的性能,验证改进smote算法的有效性,将smote算法分别与DTR、BRR、LR结合,分别记为SDTR、SBRR和SLR,然后与ELDDP进行比较。为了减少人为因素对测评结果的影响,DTR、BRR和LR均由机器学习sklearn库提供,即对这些回归算法不做额外优化。

2.4 实验结果

在本节中,对ELDDP方法整体性能进行实证研究。表2~表4分别记录了ELDDP、SDTR、SBRR和SLR在AAE、MDAE、R2测评指标上的平均值。

表2 基于AAE测评指标,不同软件缺陷数预测模型性能

表3 基于MDAE测评指标,不同软件缺陷数预测模型性能

表4 基于R2测评指标,不同软件缺陷数预测模型性能

在表2~表4中每一行表现最好的结果都被加粗表示,最后一行为ELDDP与SDTR、SBRR、SLR的Win/Draw/Loss(W/D/L)分析,该方法表示方法1与方法2关于特定测评指标的性能比较,即在某测评指标上,方法1的性能好于、相似或差于方法2的性能次数。

在表2~表4中,ELDDP在大多数情况下均表现良好,对于AAE测评指标,ELDDP方法在ant、camel、synapse、xalan和xerces项目上均获得了最好的性能;对于MDAE测评指标,ELDDP分别在ant、camel、synapse、xalan和xerces项目上获得了3/4,2/3,1/2,2/2,2/2胜绩,SDTR取得了三次最好性能。对于R2测评指标,ELDDP方法在ant、camel、synapse、xerces和xalan项目均取得了最好性能。

为了更加直观比较四种模型(ELDDP、SDTR、SBRR、SLR)的稳定性,该文采用了箱形图描述,如图4所示,分别表示四种模型在AAE、MDAE、R2测评指标上的性能。在图4中每个箱形表示一个预测模型在一个测评指标上的性能。箱形越小说明预测模型在测评指标上表现越稳定。

图4 预测模型箱型图

比较图4各子图可以看出,相对于SDTR、SBRR、SLR预测模型,ELDDP在每一个测评指标上都具有一定稳定性。

综上所述,ELDDP方法的性能均优于SDTR、SBRR和SLR,且ELDDP具有一定稳定性,可以有效提高软件缺陷数预测效率。

2.5 有效性影响因素分析

本节主要讨论可能对研究结果产生有效性威胁的因素。具体而言:影响内部有效性因素主要涉及代码实现的正确性。为了减少人为因素对代码复现的影响,该文选择三种最经典的回归算法作为Adaboost.R2算法基学习方法,采用机器学习包sklearn和mlxtend加以实现;外部有效性影响因素主要涉及实验结果是否具有普适性。该文采用Promise数据集,该数据集包含15个不同类型、不同领域的应用项目,且该数据集已广泛应用于软件缺陷预测领域;结论有效性影响因素集中于测评指标,该文侧重于AAE、MDAE和R2指标进行评测,AAE、MDAE和R2已应用于众多领域,且具有一定表现力,可以很好地评估模型性能。

3 结束语

该文提出一种基于集成学习融合依赖度的软件缺陷数预测方法ELDDP,该方法在数据预处理时将依赖度引入smote算法,对smote算法进行改进;在构建缺陷预测模型时,提出将集成学习Adaboost算法和Stacking模型融合算法相结合,以期提高软件缺陷数预测准确性。实验结果表明,该方法有较好的表现力,能够较准确地预测软件缺陷数量。在未来工作中,需将该算法应用于真实场景中,进行进一步完善和改进,使算法在软件缺陷数预测领域更具有普适性。

猜你喜欢

软件缺陷依赖度样本
用样本估计总体复习点拨
基于源文件可疑度的静态软件缺陷检测方法研究
虚拟现实技术在装备培训中的应用研究
基于NPE-SVM的软件缺陷预测模型
推动医改的“直销样本”
基于要素报酬的农户自然资源依赖度评价研究
随机微分方程的样本Lyapunov二次型估计
开源程序的软件缺陷分布特征的量化分析研究
村企共赢的样本
基于模糊软集合的区域信息生产力效能关键因素分析