一种基于数据欠采样和集成学习的软件缺陷数目预测方法与流程

文档序号:13004579阅读:343来源:国知局

本发明属于软件缺陷预测领域,特别是涉及一种基于数据欠采样和集成学习的软件缺陷数目预测方法。



背景技术:

(1)软件缺陷预测技术:软件缺陷是计算机软件或程序中存在的某个破坏正常运行能力的问题、错误以及隐藏的功能缺陷。随着软件系统在工程应用中的不断扩大,软件缺陷导致的经济损失日益增加。据美国国家标准与技术所的一项研究表明,软件缺陷给美国每年造成的损失高达几百亿元,而其中超过三分之一的损失,如果提前稍加测试,即可避免。除了经济领域,还有一些软件是飞行控制系统软件和医疗设备软件,这些和人命相关的软件,一旦出现软件缺陷问题,就会给人民生命财产安全带来无端灾难,因此软件缺陷预测技术意义重大。软件缺陷预测技术是软件质量保证中的一项重要技术。软件缺陷预测通过分析软件历史数据,建立缺陷预测模型,对新的软件模块进行缺陷预测。对预测出潜在缺陷的新的软件模块分配更多的测试资源,可以达到合理分配测试和维护资源的目的。目前为止,已有很多高效的软件缺陷方法被提出。

但这些预测通常只给出有缺陷或无缺陷的二分类结果。现有技术表明,如果只按照有无缺陷来分配有限的测试资源,可能会造成资源分配的浪费。如果我们能够准确的预测出缺陷数目,使软件测试人员主要关注那些拥有更多缺陷的软件模块,就可使软件测试工作更为有效。因此,预测软件缺陷数目相比于单纯的预测软件模块是否有缺陷更利于优化软件测试资源的分配。软件缺陷数目预测过程分为四个阶段:(a)挖掘软件历史数据,从中抽取出有用的程序模块。程序模块粒度可根据实际应用场景,可设置为文件、包、类或函数。(b)提取出与软件缺陷有关的特征,并构建出软件缺陷数据集。(c)借助特定的建模方法在软件缺陷数据集上构建出软件缺陷数目预测模型。不同于单纯的预测新的软件模块是否存在缺陷时采用的是分类模型,软件缺陷数目建模方法采用的是回归模型。(d)在对新的软件模块提取出特征后,利用步骤(b)中训练出的软件缺陷数目预测模型,预测该模块存在多少个缺陷。构建软件缺陷数目预测模型时最常用的是线性回归模型。线性回归模型是一种用于对因变量与一个或多个独立变量之间的线性关系进行建模的统计方法。一个线性回归模型如下式所示:

y=b0+b1x1+b2x2+…+bnxn

其中y是因变量,对应于软件缺陷数目预测时即为软件模块的缺陷数目,x1,x2,...,xn是独立变量,对应于软件缺陷数目预测时即为软件模块的特征,b1,b2,...,bn是独立变量的回归系数,b0是误差项。

在缺陷数据集中,大多数软件模块的缺陷数目为零,只有少数软件模块有缺陷。当在这样的数据集上建立缺陷数目预测模型后,预测模型极易预测新的软件模块的缺陷数目为零。因此,数据不平衡会对缺陷预测结果产生一定的影响,同时对缺陷数目预测模型的有效性也提出了新的挑战。

(2)不平衡数据学习技术:处理不平衡数据问题的方法有很多种:第一类是采样法,包括过采样和欠采样两种,它们分别通过增加少数类样本和减少多数类样本得到分类相对平衡的新数据集。第二类是代价敏感学习,在分类不平衡问题中,正确识别少数类比正确识别多数类更有价值,即错分少数类比错分多数类要付出更大的代价,但传统的分类模型认为所有类别的错分类代价是相同的。因此,代价敏感学习通过为不同类别赋予不同的错分类代价来提高少数类的分类性能。第三类是集成学习,通过聚集多个模型的预测结果来提高分类性能。一般地,集成模型的性能要优于单个模型的性能。上述三种方法已经在解决预测软件模块是否有缺陷时得到了成功的应用,然而目前在软件缺陷数目预测领域还没有相应的处理不平衡数据的方法被提出。



技术实现要素:

本发明针对软件缺陷数据集中数据极度不平衡会降低软件缺陷数目预测模型的性能的问题,提出了一种基于数据欠采样和集成学习的软件缺陷数目预测方法。

本发明提供的技术方案是一种基于数据欠采样和集成学习的软件缺陷数目预测方法,包括以下步骤:

步骤1,挖掘软件历史数据,从中抽取出有用的软件模块。软件模块粒度可根据实际应用场景,可设置为文件、包、类或函数。然后标记这些软件模块的缺陷数目。

步骤2,提取软件模块中与软件缺陷有关的特征,提取了19个特征:加权方法数(wmc),继承树深度(dit),孩子数(noc),对象类之间的耦合度(cbo),类的响应(rfc),内聚缺乏度(lcom),传入耦合(ca),传出耦合(ce),公开方法数(npm),代码行数(loc),数据访问度量(dam),聚合度量(moa),功能抽象度量(mfa),方法间的内聚度(cam),继承耦合(ic),方法间耦合(cbm),平均方法复杂度(amc),最大mccabe环形复杂度(max_cc),平均mccabe环形复杂度(avg_cc)。

在经过了步骤1和步骤2后,抽取了n个软件模块后,形成了包含有n个软件模块数据的软件缺陷数据集s,每个软件模块数据由一个19维的特征向量和该模块的缺陷数目组成。

步骤3,利用集成学习的思想,进行t次迭代,在每一次迭代时,首先利用随机下采样方法处理原始软件缺陷数据集s使其达到数据分布平衡,然后基于处理后的数据集训练出一个弱回归模型,最后集成t次迭代产生的t个弱回归模型形成一个强回归模型,具体包括:

步骤3.1,设置当前迭代次数t=1,错误率εt=0,原始软件缺陷数据集s中每个软件模块的所具有的权值分布为

步骤3.2,由于软件缺陷数据集中数据有着不平衡的问题,即只有少数的软件模块的缺陷数目大于0,多数的软件模块的缺陷数目为0。为了使得在每次训练弱回归模型时,弱回归模型的学习效果不受到不平衡数据集的影响,在这一步骤中对原始缺陷数据集s进行随机下采样,即随机地删除缺陷数目为0的软件模块直至缺陷数目大于0的软件模块的数量和缺陷数目等于0的软件模块的数量相同。

步骤3.3,对步骤3.2中经过了随机下采样处理后的软件缺陷数据集进行有权重的有放回抽样,形成训练集。即具有更高权重的软件模块更容易被抽到加入到训练集中。然后基于该训练集训练出在第t次迭代时的线性回归模型y=ft(x),其中x表示软件模块19维的特征向量。

步骤3.4,利用步骤3.3中训练得出的线性回归模型预测原始的软件缺陷数据集s中的n个软件模块的缺陷数目,由于缺陷数目必须是非负整数,因此本发明对预测的缺陷数目进行适当的调整:若预测的缺陷数目为负,则设置为零;若预测的缺陷数目为小数,则四舍五入为整数。然后计算每一个软件模块的相对误差其中f(xi)表示软件模块xi的缺陷数目的预测值,yi表示软件模块xi的缺陷数目的真实值。并计算步骤3.3中训练得出的线性回归模型的错误率其中dt为第t次迭代时原始软件缺陷数据集s中n个软件模块所具有的权值分布。

步骤3.5,更新原始软件缺陷数据集s中的n个软件模块所具有的权重分布为dt+1(i)。其中zt是归一化因子,βt=εt2

步骤3.6,重复步骤3.2至3.5,直到当前迭代次数t=t,迭代停止,得到了t个弱回归模型。

步骤3.7,将t次迭代训练出的t个弱回归模型进行集成,输出最终的强回归模型

步骤4,利用步骤3中训练出的强回归模型f(x),预测待预测的软件模块的缺陷数目,具体包括:

步骤4.1,提取待预测的软件模块的同步骤2中提取的19个特征,形成这个软件模块的19维特征向量x。

步骤4.2,将步骤4.1中得到的待预测的软件模块的特征向量x带入到步骤3中训练出的强回归模型f(x)中,求得该软件模块的缺陷数目。由于缺陷数目必须是非负整数,因此本发明对预测的缺陷数目进行适当的调整:若预测的缺陷数目为负,则设置为零;若预测的缺陷数目为小数,则四舍五入为整数。

本发明具有如下优点:首先利用随机欠采样技术通过删除缺陷数据集中缺陷数目为零的软件模块得到相对平衡的新数据集,然后利用这个相对平衡的缺陷数据集训练出若干个弱的软件缺陷数目预测模型,最后集成这些弱的软件缺陷数目预测模型来预测待预测的软件模块的缺陷数目。本发明的技术方案既能够解决缺陷数据集中数据不平衡的问题,又能够结合多个弱的预测模型来提高软件缺陷数目预测模型的性能。

附图说明

图1本发明的流程图。

具体实施方式

为了便于本领域普通技术人员理解和实施本发明,下面结合附图及实施例对本发明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解释本发明,并不用于限定本发明。

本发明设计的基于数据欠采样和集成学习的软件缺陷数目预测方法的流程见附图1,所有步骤可由本领域技术人员采用计算机软件技术实现流程自动运行。实施例具体实现过程如下:

步骤1,挖掘软件历史数据,从中抽取出有用的软件模块。软件模块粒度可根据实际应用场景,可设置为文件、包、类或函数。然后标记这些软件模块的缺陷数目。

步骤2,提取软件模块中与软件缺陷有关的特征,提取了19个特征:加权方法数(wmc),继承树深度(dit),孩子数(noc),对象类之间的耦合度(cbo),类的响应(rfc),内聚缺乏度(lcom),传入耦合(ca),传出耦合(ce),公开方法数(npm),代码行数(loc),数据访问度量(dam),聚合度量(moa),功能抽象度量(mfa),方法间的内聚度(cam),继承耦合(ic),方法间耦合(cbm),平均方法复杂度(amc),最大mccabe环形复杂度(max_cc),平均mccabe环形复杂度(avg_cc)。

在经过了步骤1和步骤2后,本实施例假设抽取了15个软件模块后,形成了如下包含有15个软件模块数据的软件缺陷数据集s,每个软件模块数据由一个19维的特征向量和该模块的缺陷数目组成。

x1={(13,2,0,18,112,76,3,17,1,0.88,1000,1,1,0.4,0.3,1,1,75.8,10),“1”},

x2={(10,3,0,11,17,33,3,11,9,0.56,79,1,0,0.67,0.267,1,1,6.7,3),“0”},

x3={(13,1,0,66,13,78,66,1,13,2,13,0,0,0,0.369,0,0,0,1),“4”},

x4={(17,1,0,84,17,136,80,7,17,2,17,0,0,0,0.222,0,0,0,1),“0”},

x5={(0,1,0,27,0,0,26,1,0,2,0,0,0,0,0,0,0,0,0),“0”},

x6={(2,3,0,3,7,1,0,3,1,2,24,0,0,0.833333333,0.667,1,1,11,1),“0”},

x7={(5,3,0,8,31,2,1,8,3,0.5,122,1,1,0.8,0.4,0,0,23,3),“0”},

x8={(26,1,1,10,47,0,5,5,24,0.08,236,1,1,0,0.258,0,0,8.038,2),“0”}

x9={(3,1,0,8,14,3,3,5,3,2,85,0,0,0,0.5,0,0,27.33333333,9),“3”},

x10={(13,1,0,1,17,64,0,1,12,0.917,117,1,0,0,0.462,0,0,7.462,3),“0”},

x11={(4,1,0,4,4,6,2,2,4,2,4,0,0,0,1,0,0,0,1),“7”},

x12={(10,1,0,6,31,1,0,6,9,0.5,156,1,1,0,0.355555556,0,0,14.4,1),“3”},

x13={(7,1,0,6,19,7,0,6,6,0.75,117.0,1,2,0,0.367,0,0,15.143,3),“0”},

x14={(38,1,0,30,155,485,0,30,34,0.9,1564,1,7,0,0.14,0,0,39.6,7),“0”},

x15={(25,1,0,13,74,0,0,13,23,0.444,901,1,2,0,0.2,0,0,34.92,1),“0”},

步骤3,利用集成学习的思想,进行t次迭代,在每一次迭代时,首先利用随机下采样方法处理原始软件缺陷数据集s使其达到数据分布平衡,然后基于处理后的数据集训练出一个弱回归模型,最后集成t次迭代产生的t个弱回归模型形成一个强回归模型,具体包括:

步骤3.1,设置当前迭代次数t=1,错误率εt=0,原始软件缺陷数据集s中每个软件模块的所具有的权值分布为

步骤3.2,由于软件缺陷数据集中数据有着不平衡的问题,即只有少数的软件模块的缺陷数目大于0,多数的软件模块的缺陷数目为0。为了使得在每次训练弱回归模型时,弱回归模型的学习效果不受到不平衡数据集的影响,在这一步骤中对原始缺陷数据集s进行随机下采样,即随机地删除缺陷数目为0的软件模块直至缺陷数目大于0的软件模块的数量和缺陷数目等于0的软件模块的数量相同。

步骤3.3,对步骤3.2中经过了随机下采样处理后的软件缺陷数据集进行有权重的有放回抽样,形成训练集。即具有更高权重的软件模块更容易被抽到加入到训练集中。然后基于该训练集训练出在第t次迭代时的线性回归模型y=ft(x),其中x表示软件模块19维的特征向量。

步骤3.4,利用步骤3.3中训练得出的线性回归模型预测原始的软件缺陷数据集s中的n个软件模块的缺陷数目,由于缺陷数目必须是非负整数,因此本发明对预测的缺陷数目进行适当的调整:若预测的缺陷数目为负,则设置为零;若预测的缺陷数目为小数,则四舍五入为整数。然后计算每一个软件模块的相对误差其中f(xi)表示软件模块xi的缺陷数目的预测值,yi表示软件模块xi的缺陷数目的真实值。并计算步骤3.3中训练得出的线性回归模型的错误率其中dt为第t次迭代时原始软件缺陷数据集s中n个软件模块所具有的权值分布。

步骤3.5,更新原始软件缺陷数据集s中的n个软件模块所具有的权重分布为dt+1(i)。其中zt是归一化因子,βt=εt2

步骤3.6,重复步骤3.2至3.5,直到当前迭代次数t=t,迭代停止,得到了t个弱回归模型。

步骤3.7,将t次迭代训练出的t个弱回归模型进行集成,输出最终的强回归模型

本实施例中包含有15个软件模块数据的原始软件缺陷数据集s中,可以发现有5个软件模块的缺陷数目是大于0的,10个软件模块的缺陷数目等于0。本实施例在步骤3.1中,设置当前迭代次数t=1,错误率ε1=0,原始软件缺陷数据集s中15个软件模块的每个软件模块所具有的权值分布为本实施例假设进行了3次迭代。

在第一次迭代时,为了使缺陷数目大于0的软件模块的数量和缺陷数目等于0的软件模块的数量相同,假设在步骤3.2中本实施例随机删除了x5、x6、x8、x13、x14这五个软件模块,形成了新的软件缺陷数据集s1={x1、x2、x3、x4、x7、x9、x10、x11、x12、x15},这10个软件模块的权重均为然后根据步骤3.3,对缺陷数据集s1进行带权重的有放回抽样后形成了训练集s1’={x1、x1、x3、x4、x4、x9、x10、x12、x12、x15},以s1’为训练集训练出线性回归模型为y=f1(x)。利用y=f1(x)预测原始软件缺陷数据集s中15个软件模块,预测软件模块x1的缺陷数目为1,are1(x1)=0;预测软件模块x2的缺陷数目为2,are1(x2)=+∞;预测软件模块x3的缺陷数目为4,are1(x3)=0;预测软件模块x4的缺陷数目为0,are1(x4)=0;预测软件模块x5的缺陷数目为0,are1(x5)=0;预测软件模块x6的缺陷数目为0,are1(x6)=0;预测软件模块x7的缺陷数目为1,are1(x7)=+∞;预测软件模块x8的缺陷数目为1,are1(x8)=+∞;预测软件模块x9的缺陷数目为3,are1(x9)=0;预测软件模块x10的缺陷数目为1,are1(x10)=+∞;预测软件模块x11的缺陷数目为7,are1(x11)=0;预测软件模块x12的缺陷数目为3,are1(x12)=0;预测软件模块x13的缺陷数目为2,are1(x13)=+∞;预测软件模块x14的缺陷数目为0,are1(x14)=0;预测软件模块x15的缺陷数目为0,are1(x15)=0。计算训练得出的线性回归模型对原始缺陷数据集s进行预测时的错误率原始软件缺陷数据集s中15个软件模块的所具有的权值分布更新为d2={0.018,0.164,0.018,0.018,0.018,0.018,0.164,0.164,0.018,0.164,0.018,0.018,0.164,0.018,0.018}。

在第二次迭代时,随机删除了x2、x5、x6、x10、x15这五个软件模块,形成了新的软件缺陷数据集s2={x1、x3、x4、x7、x8、x9、x11、x12、x13、x14},这10个软件模块的权重为{0.018,0.018,0.018,0.164,0.164,0.018,0.018,0.018,0.164,0.018}。对缺陷数据集s2进行带权重的有放回抽样后形成了训练集s2’={x1、x3、x3、x4、x7、x8、x9、x9、x12、x14},以s2’为训练集训练出线性回归模型为y=f2(x)。利用y=f2(x)预测原始软件缺陷数据集s中15个软件模块,预测软件模块x1的缺陷数目为1,are1(x1)=0;预测软件模块x2的缺陷数目为0,are1(x2)=0;预测软件模块x3的缺陷数目为3,are1(x3)=0.25;预测软件模块x4的缺陷数目为1,are1(x4)=+∞;预测软件模块x5的缺陷数目为0,are1(x5)=0;预测软件模块x6的缺陷数目为0,are1(x6)=0;预测软件模块x7的缺陷数目为0,are1(x7)=0;预测软件模块x8的缺陷数目为1,are1(x8)=+∞;预测软件模块x9的缺陷数目为3,are1(x9)=0;预测软件模块x10的缺陷数目为1,are1(x10)=+∞;预测软件模块x11的缺陷数目为5,are1(x11)=2/7;预测软件模块x12的缺陷数目为3,are1(x12)=0;预测软件模块x13的缺陷数目为0,are1(x13)=0;预测软件模块x14的缺陷数目为0,are1(x14)=0;预测软件模块x15的缺陷数目为0,are1(x15)=0。计算训练得出的线性回归模型对原始缺陷数据集s进行预测时的错误率β2=(0.218)2=0.0475,z2=0.018×0.0475×7+0.164×0.0475×4+0.018×1×3+0.164=0.2551,原始软件缺陷数据集s中15个软件模块的权值分布更新为d3={0.0034,0.0305,0.0706,0.0706,0.0034,0.0034,0.0305,0.643,0.0034,0.0305,0.0706,0.0034,0.0305,0.0034,0.0034}。

在第三次迭代时,随机删除了x3、x5、x7、x8、x10这五个软件模块,形成了新的软件缺陷数据集s3={x1、x2、x4、x6、x9、x11、x12、x13、x14、x15},这10个软件模块的权重为{0.0034,0.0305,0.0706,0.0034,0.0034,0.0706,0.0034,0.0305,0.0034,0.0034}。然后对缺陷数据集s3进行带权重的有放回抽样后形成了训练集s3’={x1、x2、x4、x5、x7、x8、x11、x11、x12、x12},以s3’为训练集训练出线性回归模型为y=f3(x)。利用y=f3(x)预测原始软件缺陷数据集s中15个软件模块,预测软件模块x1的缺陷数目为0,are1(x1)=1;预测软件模块x2的缺陷数目为0,are1(x2)=0;预测软件模块x3的缺陷数目为3,are1(x3)=0.25;预测软件模块x4的缺陷数目为0,are1(x4)=0;预测软件模块x5的缺陷数目为0,are1(x5)=0;预测软件模块x6的缺陷数目为0,are1(x6)=0;预测软件模块x7的缺陷数目为0,are1(x7)=0;预测软件模块x8的缺陷数目为0,are1(x8)=0;预测软件模块x9的缺陷数目为3,are1(x9)=0;预测软件模块x10的缺陷数目为0,are1(x10)=0;预测软件模块x11的缺陷数目为6,are1(x11)=1/7;预测软件模块x12的缺陷数目为3,are1(x12)=0;预测软件模块x13的缺陷数目为1,are1(x13)=+∞;预测软件模块x14的缺陷数目为0,are1(x14)=0;预测软件模块x15的缺陷数目为0,are1(x15)=0。计算训练得出的线性回归模型对原始缺陷数据集s进行预测时的错误率ε3=σd3(xi)β2=(0.1751)2=0.0307,z3=0.0307×0.0307×3+0.0034×0.0307×6+0.0706×0.0307×6+0.0706×0.0307+0.643×0.0307+0.0034+0.0305+0.0706+0.0305=0.20007,原始软件缺陷数据集s中15个软件模块所具有的权值分布更新为d3={0.0152,0.00468,0.353,0.0108,0.0005,0.00005,0.00468,0.0987,0.00005,0.00468,0.353,0.00005,0.1525,0.00005,0.00005}。

将3次迭代训练出的3个弱回归模型进行集成,输出最终的强回归模型f(x)=(log9×f1(x)+log(21)×f2(x)+log(32.5)×f3(x))/(log9+log(21)+log(32.5))。

步骤4,利用步骤3中训练出的强回归模型f(x),预测待预测的软件模块的缺陷数目。

步骤4.1,提取待预测的软件模块的同步骤2中提取的19个特征,形成这个软件模块的19维特征向量x。本实施例提取待预测的软件模块的19个特征后形成特征向量x=(2.7,1,0,7,12,3,3,4,3,2,79,1,0,0,0.5,0,0,27,7)。

步骤4.2,将步骤4.1中得到的待预测的软件模块的特征向量x带入到步骤3中训练出的强回归模型f(x)中,求得该软件模块的缺陷数目为3.21。由于缺陷数目必须是非负整数,因此本发明对预测的缺陷数目进行适当的调整:若预测的缺陷数目为负,则设置为零;若预测的缺陷数目为小数,则四舍五入为整数,因此最终预测该软件模块的缺陷数目为3。

本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1