首页> 中国专利> 一种基于数据过采样和集成学习的软件缺陷数目预测方法

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

摘要

本发明公开了一种基于数据过采样和集成学习的软件缺陷数目预测方法,首先利用过采样技术通过增加缺陷数据集中缺陷数目为大于零的软件模块得到相对平衡的新数据集,然后利用相对平衡的缺陷数据集训练出若干个弱的软件缺陷数目预测模型,最后集成这些弱的软件缺陷数目预测模型来预测待预测的软件模块的缺陷数目。本发明的技术方案既能够解决缺陷数据集中数据不平衡的问题,又能够结合多个弱的预测模型来提高软件缺陷数目预测模型的性能。

著录项

  • 公开/公告号CN107391370A

    专利类型发明专利

  • 公开/公告日2017-11-24

    原文格式PDF

  • 申请/专利权人 武汉大学;

    申请/专利号CN201710571131.9

  • 申请日2017-07-13

  • 分类号G06F11/36(20060101);

  • 代理机构42222 武汉科皓知识产权代理事务所(特殊普通合伙);

  • 代理人魏波

  • 地址 430072 湖北省武汉市武昌区珞珈山武汉大学

  • 入库时间 2023-06-19 03:51:20

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-06-24

    未缴年费专利权终止 IPC(主分类):G06F11/36 专利号:ZL2017105711319 申请日:20170713 授权公告日:20200512

    专利权的终止

  • 2020-05-12

    授权

    授权

  • 2017-12-22

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20170713

    实质审查的生效

  • 2017-11-24

    公开

    公开

说明书

技术领域

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

背景技术

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

但这些预测通常只给出有缺陷或无缺陷的二分类结果。文献[1-2]表明,如果只按照有无缺陷来分配有限的测试资源,可能会造成资源分配的浪费。如果我们能够准确的预测出缺陷数目,使软件测试人员主要关注那些拥有更多缺陷的软件模块,就可使软件测试工作更为有效。因此,预测软件缺陷数目相比于单纯的预测软件模块是否有缺陷更利于优化软件测试资源的分配。

软件缺陷数目预测过程分为四个阶段:

(a)挖掘软件历史数据,从中抽取出有用的程序模块。程序模块粒度可根据实际应用场景,可设置为文件、包、类或函数;

(b)提取出与软件缺陷有关的特征,并构建出软件缺陷数据集;

(c)借助特定的建模方法在软件缺陷数据集上构建出软件缺陷数目预测模型。不同于单纯的预测新的软件模块是否存在缺陷时采用的是分类模型,软件缺陷数目建模方法采用的是回归模型;

(d)在对新的软件模块提取出特征后,利用步骤(b)中训练出的软件缺陷数目预测模型,预测该模块存在多少个缺陷。

构建软件缺陷数目预测模型时最常用的是线性回归模型。线性回归模型是一种用于对因变量与一个或多个独立变量之间的线性关系进行建模的统计方法。一个线性回归模型如下式所示:

Y=b0+b1x1+b2x2+…+bnxn

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

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

处理不平衡数据问题的方法有很多种:

第一类是采样法,包括过采样和欠采样两种,它们分别通过增加少数类样本和减少多数类样本得到分类相对平衡的新数据集;

第二类是代价敏感学习,在分类不平衡问题中,正确识别少数类比正确识别多数类更有价值,即错分少数类比错分多数类要付出更大的代价,但传统的分类模型认为所有类别的错分类代价是相同的。因此,如文献[2]中提出的代价敏感学习方法通过为不同类别赋予不同的错分类代价来提高少数类的分类性能;

第三类是集成学习,如文献[4]提出的装袋方法和文献[5]提出的提升方法通过聚集多个模型的预测结果来提高分类性能。一般地,集成模型的性能要优于单个模型的性能。

上述三种方法已经在解决预测软件模块是否有缺陷时得到了成功的应用,然而目前在软件缺陷数目预测领域还没有相应的处理不平衡数据的方法被提出。文献[1]R.Malhotra.A systematic review of machine learning techniques for softwarefault prediction,Applied Soft Computing,27:504-518,2015.

文献[2]N.E.Fenton and M.Neil.A critique of software defect predictionmodels.IEEE Transactions on software engineering,25(5):675-689,1999.

文献[3]J.Zheng.Cost-sensitive boosting neural networks for softwaredefect prediction,Expert Systems with Applications,37(6):4537-4543,2010.

文献[4]L.Breiman.Bagging predictors.Machine learning,24(2):123-140,1996.

文献[5]Freund,Yoav,and E.Robert.Schapire.Experiments with a newboosting algorithm.icml,96:148-156,1996.

发明内容

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

本发明所采用的技术方案是:一种基于数据过采样和集成学习的软件缺陷数目预测方法,其特征在于,包括以下步骤:

步骤1:挖掘软件历史数据,从中抽取出n个软件模块;然后标记这些软件模块的缺陷数目;

步骤2:提取软件模块中与软件缺陷有关的l个特征,获得包含有n个软件模块数据的软件缺陷数据集S;其中,软件模块Xi的软件模块数据由一个l维的特征向量和软件模块Xi的缺陷数目yi组成;

步骤3:对软件缺陷数据集S中的软件模块数据进行过采样,形成新的分布平衡的软件缺陷数据集S’;

步骤4:利用集成学习的思想,进行T次迭代,在第t次迭代时,对步骤3中形成的新的软件缺陷数据集S’进行有放回的随机抽样形成训练集St’,然后基于训练集St’训练出一个弱回归模型,最后集成T次迭代产生的T个弱回归模型形成一个强回归模型F(x);

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

本发明设计了合理的不平衡数据处理策略,首先利用过采样技术通过增加缺陷数据集中缺陷数目为大于零的软件模块得到相对平衡的新数据集,然后利用相对平衡的缺陷数据集训练出若干个弱的软件缺陷数目预测模型,最后集成这些弱的软件缺陷数目预测模型来预测待预测的软件模块的缺陷数目。本发明的技术方案既能够解决缺陷数据集中数据不平衡的问题,又能够结合多个弱的预测模型来提高软件缺陷数目预测模型的性能。

附图说明

图1为本发明的流程图。

具体实施方式

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

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

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

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

在经过了步骤1和步骤2后,本实施例假设抽取了15个软件模块后,形成了如下包含有15个软件模块数据的软件缺陷数据集S,每个软件模块数据由一个20维的特征向量xi=(x1i,x2i,x3i,x4i,x5i,x6i,x7i,x8i,x9i,x10i,x11i,x12i,x13i,x14i,x15i,x16i,x17i,x18i,x19i,x20i)和该模块的缺陷数目yi组成。

X1={(13,2,0,18,112,76,3,17,1,0.88,1000,1,1,0.4,0.3,1,1,75.8,10,5.2),“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,1.1),“0”},

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

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

X5={(0,1,0,27,0,0,26,1,0,2,0,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.5),“0”},

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

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

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

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

X11={(4,1,0,4,4,6,2,2,4,2,4,0,0,0,1,0,0,0,1,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,0.8),“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,1.1429),“0”},

X14={(38,1,0,30,155,485,0,30,34,0.9,1564,1,7,0,0.14,0,0,39.6,7,1.5),“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.92),“0”},

步骤3:对软件缺陷数据集S中的软件模块数据进行过采样,形成新的分布平衡的软件缺陷数据集S’;

具体实现包括以下子步骤:

步骤3.1:在软件缺陷数据集中搜索缺陷数目大于0的软件模块Xi的k个缺陷数目也大于0的近邻软件模块,记为Xi(near);

本实施例令k=3,以软件模块X1为例,计算其3个缺陷数目也大于0的近邻软件模块。在软件缺陷数据集S的15个模块中,X1、X3、X9、X11、X12是缺陷数目大于0的软件模块,而X2、X4、X5、X6、X7、X8、X10、X12、X13、X14、X15是缺陷数目等于0的软件模块。所以计算软件模块X1与软件模块X3、软件模块X9、软件模块X11、软件模块X12之间的欧氏距离。

因此本实施例中,软件模块X1的3个缺陷数目也大于0的近邻软件模块为软件模块X3、软件模块X9、软件模块X12,记为X1(near)={X3,X9,X12}。

步骤3.2:设定数据集的过采样倍率m,即从Xi的k个缺陷数目也大于0的近邻软件模块Xi(near)中随机抽取m个软件模块进行插值操作合成新的软件模块。新的软件模块的20维的特征向量xinew=xi+rand(0,1)×(xi’-xi),其中,xi为Xi的20维的特征向量,rand(0,1)为0与1之间的某一随机数,xi’为从Xi的k个缺陷数目也大于0的近邻Xi(near)中随机抽取的一个软件模块Xi’的20维的特征向量。新的软件模块的缺陷数目其中,yi为软件模块Xi的缺陷数目,yi’为软件模块Xi’的缺陷数目,d1为软件模块Xi的20维的特征向量与新合成的软件模块Xinew之间的20维的特征向量之间的欧氏距离,d2为软件模块Xi’的20维的特征向量与新合成的软件模块Xinew之间的20维的特征向量之间的欧氏距离。

步骤3.3:对全部的p个缺陷数目大于0的软件模块重复步骤3.1和3.2的操作,便可合成m×p个新的软件模块,这些新的软件模块加入到原始软件缺陷数据集S中形成新的软件缺陷数据集S’。

本实施例令过采样倍率m=1,即从X1的3个缺陷数目也大于0的近邻软件模块中随机抽取1个软件模块进行插值操作合成新的软件模块,假设抽取的软件模块为X12。本实施例假设rand(0,1)函数取值为0.5,新的软件模块的20维的特征向量x1new=x1+rand(0,1)×(x1(j)-x1)=(11.5,1.5,0,12,71.5,38.5,1.5,11.5,5,0.69,578,1,1,0.2,0.327778,0.5,0.5,45.1,5.5,3),其中,x1为X1的20维的特征向量,x1’为从X1的3个缺陷数目也大于0的近邻X1(near)中随机抽取的一个软件模块X1’的20维的特征向量。新的软件模块的缺陷数目其中,y1为软件模块X1的缺陷数目,y1’为软件模块X1’的缺陷数目,d1为软件模块X1的20维的特征向量与新合成的软件模块X1new之间的20维的特征向量之间的欧氏距离,d2为软件模块X1’的20维的特征向量与新合成的软件模块X1new之间的20维的特征向量之间的欧氏距离。

同理可以得到X3、X9、X11、X12的合成模块。本实施例假设得到软件模块X3的新的合成模块为X3new={(13,1.5,0,42,62.5,77,34.5,9,7,1.44,506.5,0.5,0.5,0.2,0.33,0.5,0.5,37.9,5.5,3.1),“2.5”},软件模块X9的新的合成软件模块为X9new={(6.5,1,0,7,22.5,2,1.5,5.5,6,1.25,120.5,0.5,0.5,0,0.43,0,0,20.87,5,2.07),“3”},软件模块X11的新的合成软件模块为X11new={(3.5,1,0,6,9,4.5,2.5,3.5,3.5,2,44.5,0,0,0,0.75,0,0,13.67,5,2.17),“5”},软件模块X12的新的合成软件模块为X12new={(6.5,1,0,7,22.5,2,1.5,5.5,6,1.25,120.5,0.5,0.5,0,0.43,0,0,20.8667,5,2.07),“3”}。所以形成的新的软件缺陷数据集S’为:

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

X1new={(11.5,1.5,0,12,71.5,38.5,1.5,11.5,5,0.69,578,1,1,0.2,0.327778,0.5,0.5,45.1,5.5,3),“2”}

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

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

X3new={(13,1.5,0,42,62.5,77,34.5,9,7,1.44,506.5,0.5,0.5,0.2,0.33,0.5,0.5,37.9,5.5,3.1),“2.5”}

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

X5={(0,1,0,27,0,0,26,1,0,2,0,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.5),“0”},

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

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

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

X9new={(6.5,1,0,7,22.5,2,1.5,5.5,6,1.25,120.5,0.5,0.5,0,0.43,0,0,20.87,5,2.07),“3”}

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

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

X11new={(3.5,1,0,6,9,4.5,2.5,3.5,3.5,2,44.5,0,0,0,0.75,0,0,13.67,5,2.17),“5”}

X12={(10,1,0,6,31,1,0,6,9,0.5,156,1,1,0,0.356,0,0,14.4,1,0.8),“3”},

X12new={(6.5,1,0,7,22.5,2,1.5,5.5,6,1.25,120.5,0.5,0.5,0,0.43,0,0,20.87,5,2.07),“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,1.1429),“0”},

X14={(38,1,0,30,155,485,0,30,34,0.9,1564,1,7,0,0.14,0,0,39.6,7,1.5),“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.92),“0”},

步骤4:利用集成学习的思想,进行T次迭代,在第t次迭代时,对步骤3中形成的新的软件缺陷数据集S’进行有放回的随机抽样形成训练集St’,然后基于这个训练集训练出一个弱回归模型,最后集成T次迭代产生的T个弱回归模型形成一个强回归模型。

在第一次迭代时,对步骤3中形成的新的软件缺陷数据集S’进行有放回的随机抽样形成训练集S1’={X1、X1new、X3、X3、X4、X4、X5、X5、X6、X7、X8、X9、X9、X10、X11、X11new、X12、X14、X15、X15},以S1’为训练集训练出线性回归模型为y=f1(x)。

在第二次迭代时,对步骤3中形成的新的软件缺陷数据集S’进行有放回的随机抽样形成训练集S2’={X1、X1new、X3、X3new、X4、X5、X5、X6、X6、X7、X7、X9、X9、X10、X11、X11new、X12、X12、X15、X15},以S2’为训练集训练出线性回归模型为y=f2(x)。

在第三次迭代时,对步骤3中形成的新的软件缺陷数据集S’进行有放回的随机抽样形成训练集S3’={X1、X1、X3、X3new、X3new、X4、X5、X5、X6、X7、X8、X9、X9、X10、X11、X11new、X12、X13、X14、X15},以S3’为训练集训练出线性回归模型为y=f3(x)。

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

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

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

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

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

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号