基于差分演化算法的软件缺陷预测优化方法与流程

文档序号:15492216发布日期:2018-09-21 20:50阅读:168来源:国知局

本发明属于软件质量保障领域,具体涉及一种基于差分演化算法的软件缺陷预测优化方法。



背景技术:

软件组织的有限的软件质量保证资源更多的关注软件模块中的bug,比如源代码更有可能出现缺陷。因此,缺陷检测使用统计方法或者是机器学习的方法来识别源代码中可能存在的错误。这些机器学习中的分类器需要有提前设置的超参数,这些超参数没有启发式的规则可用,很多分类器使用默认的超参数。比如说随机森林中的决策树的数目就需要提前做配置,这个超参数就无法通过数据建模方式获得。目前可用的方法就是在超参数空间中寻找与当前数据集最匹配的参数,来建立分类器的模型。

超参数空间搜索方法存在如下问题:(1)超参数空间巨大,要完成整个超参数空间的搜索几乎是不可能完成的任务;(2)超参数空间搜索无法做到自动化处理。超参数空间的搜索与模型建立有直接关联,没有成熟的方法提出如何来直接在超参数搜索空间中找到参数以后直接与现有的模型训练结合起来。(3)超参数空间在搜索过程中往往会遇到缺陷预测数据集中的类不平衡问题。如何将两者有效的结合来一起解决也没有成熟的方案可以借鉴。

目前已经有使用网格搜索(gridsearch)方法搜索超参数的空间,该方法对待搜索的参数空间进行组合,使用模型计算该组合,设定停止标准,找到最优参数解以后则停止搜索。基于差分演化算法的超参数空间搜索是一种遗传算法的变异搜索方式,这个方法能够借助遗传学中的多样性,在不同的染色体序列直接进行差分变异,快速找到最优解。在其他领域经过实践,该方法可以用于寻找最优解。

综上所述,为有效解决自动化的超参数搜索空间搜索问题和类不平衡问题,有必要设计出一种有效的基于差分演化算法的软件缺陷预测优化方法。本发明由此而生。



技术实现要素:

发明目的:本发明的目的是为了解决现有技术中的不足,提供一种基于差分演化算法的软件缺陷预测优化方法。

技术方案:本发明所述的一种基于差分演化算法的软件缺陷预测优化方法,包括如下步骤:

步骤1)缺陷预测数据集的搜集:挖掘软件项目的版本管理系统和缺陷跟踪系统,从中抽取程序模块;随后对上述每个程序模块,通过分析缺陷跟踪系统内的缺陷报告信息进行标记;最后基于软件代码复杂度或软件开发过程分析,设计出与软件缺陷存在相关性的度量元,并借助这些度量元完成对每个程序模块的度量;通过对程序模块进行类型标记和软件度量,生成缺陷预测数据集d;

步骤2)借助差分演化算法,对缺陷预测数据集使用分层抽样及少数类过采样方法创建多数类和少数类比值的数据集,确定神经网络超参数的最优取值;

步骤3)基于缺陷预测数据集,使用少数类过采样方法,使用超参数取值方案,构建出缺陷预测模型。

进一步的,步骤1)所述程序模块的粒度根据缺陷预测的目的设置为文件、包、类或函数。

进一步的,步骤2)所述多数类和少数类比值为2:1。

进一步的,步骤2)中分层抽样及少数类过采样方法,包括如下步骤::

2-1)将缺陷预测数据集按照分层抽样的方式划分,缺陷预测数据集里面多数类个数与少数类个数的比值为ir,缺陷预测数据集的个数为m,进行十折划分时候,每个子集的个数为m/10。对缺陷预测数据集按照少数类与多数类进行分组,在抽样时候,对于第i个子数据集,从多数类的样本中抽取m/10*(ir/(ir+1))个多数类,同时从少数类样本中抽取m/10*(1/(ir+1))个少数类,组合成为新的缺陷预测子集。重复以上过程九次。对于第10个子数据集,把所有抽样剩余的数据集作为第10个数据集。最终得到分层抽样的十个子数据集;

2-2)将训练数据d1到d9合并为一个训练集,在该训练集中使用少数类过采样算法来解决缺陷预测数据类不平衡问题,具体方法步骤如下:

2-2-1)从缺陷预测数据集d中选择有缺陷的少数类集合,设定为smin,smin∈d,在smin集合中选择一个样本xi;

2-2-2)根据欧式距离计算出来与样本xi距离最近的六个样本;

2-2-3)计算随机值ζ,ζ取值范围为(0,1),在离xi最近的六个样本中随机取出一个xik,k取值范围为(1,6),以此计算生成的新样本xnew,xnew=xi+ζ*(xik-xi);

2-2-4)重复以上步骤中的2-2-1),2-2-2),2-2-3),直到缺陷预测数据集中的多数类与少数类直接的比值为2:1终止循环。

进一步的,步骤2)中差分演化算法包括如下步骤:

3-1)随机初始化种群:以神经网络为缺陷预测模型的分类器,需要随机初始化学习速率learningrate,候选取值为0.1到0.4,隐藏层的层数hiddenlayers,候选取值范围为3到10,迭代次数epoch,候选取值为100到300,选择代理的规模np>=4;根据确定的np数目初始化得到一组染色体,初始化交叉因子cr,设定cr等于0.5,设定缩放因子f等于2;

3-2)计算种群中每个染色体的适应值:使用十折交叉验证法计算当前训练数据集上的相应因子的auc值,该值作为该染色体的适应值;

3-3)染色体变异:从代理候选集合里面随机选择一个染色体x,并随机选择其他三个染色体,分别为a,b,c,这三个染色体与染色体x都互不相同;

3-4)染色体交叉:设定染色体的维度为n,随机选择一个整数n作为当前染色体交叉的因子,n的取值范围为0到n-1,如果n等于0,或者均匀分布随机变量小于交叉因子cr,那么就计算分量:

y0=a0+f*(b0-c0)

如果n等于1,或者均匀分布随机变量小于交叉因子cr,那么就计算分量:

y1=a1+f*(b1-c1)

如果n等于2,或者均匀分布随机变量小于交叉因子cr,那么就计算分量:

y2=a2+f*(b2-c2)

3-5)染色体选择:当前变异交叉后产生的染色体为(y0,y1,y2),依据该染色体在神经网络中使用十折交叉验证法计算当前训练数据集上的相应因子的auc值,该值作为该染色体的函数值,将该染色体与x染色体的函数值比较,如果新产生染色体的auc值大于x染色体的auc值,则删除染色体种群的中的x染色体,添加当前染色体到种群中去;

3-6)重复执行步骤3-3,3-4)及3-5),直到满足算法的终止条件为止,算法的终止条件是或者迭代次数达到100次,或者是最大的auc值大于0.9,在一次循环过程中,步骤3-3),3-4)及3-5)重复执行染色体的规模np次,完成对所有染色体的随机变异。

进一步的,步骤3-2)的auc值具体包括如下步骤:

步骤3-2-1)将数据集借助分层抽样方法划分为10份,i=1,对缺陷预测数据集d进行切分,按照层次抽样的方式进行分割,划分为10个数据集,随机选择其中9个数据集合并作为训练数据集,剩余的1个数据集作为验证数据集,分别对训练数据集和验证数据集使用少数类过采样算法进行预处理,获得待处理数据集;

步骤3-2-2)将第i份设置为测试集,将剩余数据设置为训练集;

步骤3-2-3)在训练集上使用少数类过采样方法,使用染色体对应的超参数取值训练模型,并在测试集上得到测试结果,记为auci;

步骤3-2-4)将i取值加1,跳转到步骤2-2-2,当i取值大于10的时候,跳转到步骤2-2-5);

步骤3-2-5)将10次预测结果取均值,auc=(auc1+auc2+auc3+auc4+auc5+auc6+auc7+auc8+auc9+auc10)/10,作为该染色体对应的适应值。

有益效果:本发明可以根据数据集的不同自动化确定分类模型构建中的相应参数因子,找到最适合当前数据集与分类模型的参数组合,提升软件缺陷预测模型的性能并减少模型构建中参数寻找的工作量。

附图说明

图1是本发明的总体流程图;

图2是十折交叉验证计算染色体的适应值auc的过程图;

图3为auc具体计算过程图。

具体实施方式

为了更详尽的表述上述发明的技术路线,以下本发明人列举出具体的实施例来说明技术效果;需要强调的是,这些实施例是用于说明本发明而不限于限制本发明的范围。

实施例1

本实施例的基于差分演化算法的软件缺陷预测优化方法的总体流程图如图1所示,包含如下步骤:

(1)挖掘软件项目的业务软件系统和缺陷跟踪系统,从中抽取程序模块;所述程序模块的粒度根据缺陷预测的目的设置为文件、包、类或函数;随后对上述每个程序模块,通过分析缺陷跟踪系统内的缺陷报告信息进行标记;最后基于软件代码复杂度或软件开发过程分析,设计出与软件缺陷存在相关性的度量元,并借助这些度量元完成对每个程序模块的度量;通过对程序模块进行类型标记和软件度量,生成缺陷预测数据集d。

若将数据集存储为weka软件支持的格式,则来自某一实际项目的缺陷预测数据集的具体内容如下所示(其中//后面是注释)。

//下面列出了数据集考虑的度量元名称以及类型,最后一个是模块的类型(若取值为y表示是有缺陷模块,否则取值为n表示是无缺陷模块):

@relationeq//数据集的名称

@attributeck_oo_numberofprivatemethodsnumeric

@attributeldhh_lcomnumeric

fmethodsinheritednumeric

@attributenumberofbugsfounduntil:numeric

@attributeldhh_fanoutnumeric

......(省略)

@attributeldhh_numberofmethodsinheritednumeric

@attributeldhh_rfcnumeric

@attributeck_oo_numberofmethodsinheritednumeric

@attributeck_oo_numberofpublicmethodsnumeric

@attributeldhh_cbonumeric

@attributewchu_numberoflinesofcodenumeric

@attributecvsexpentropynumeric

@attributeldhh_numberofmethodsnumeric

@attributedefective{y,n}

@data

3,0.002547,0.002555,4,0,3.04,0.393707,0.003049,1.01,0.004091,10.1322,0,1.01,2.05,0,0,2,33,0,3.04,0.308139,0,0,3.1,5,125,0,11,1,2,0,0,55,0,36,0.004387,0.004425,0.004354,2.04,2.4,7,3.22,11,0,11,2,2.04,0,3.05,0.043005,1.01,4,0.005627,0,0.004406,8,8,0.008431,3.5,0.103594,0.003611,y

37,0.008643,0.004756,71,0,14.37,2.09375,0.001481,2.02,0.015332,38.2812,0,13.18,14.23,1,0,2,300,0.010354,11.3,1.12823,0,0,34.22,53,1217,0,48,1,1,0,0,1128,0,605,0.041329,0.015698,0.061578,16.3,23.21,54,39.75,67,4,38,11,3.03,0,16.31,0.149026,1.01,78,0.018761,0.001486,0.060301,7,7,0.021602,43.12,0.328692,0.009906,y

3,0.001479,0.009143,5,1.01,3.08,0.484675,0,6.17,0.001953,9.49506,0.00026,2.03,2.05,0,6,0,48,0.001951,2.04,0.287726,2.06,0,4.38,16,214,0,8,1,11,0,0,28,0,79,0.00466,0.002373,0.002221,3.12,2.25,26,3.64,7,0,4,1,0,0,8.28,0.043268,1.01,5,0.003117,0.001486,0.002325,7,2,0.011859,4.68,0.125841,0.001655,n

1,0.00135,0,1,1.01,1.01,0.03194,0.000876,0,0,7.55094,0.000402,1.01,2.02,1,0,0,10,0.000577,0,0.204387,0,0,2.04,1,31,1,8,2,1,0,0,28,0,12,0.001433,0.000615,0.001485,1.01,2.13,2,2.06,1,0,0,0,1.01,0,1.01,0.02254,3.05,1,0.000566,0.003017,0.001492,22,7,0.000652,2.13,0.055912,0.001572,y

0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,7,0,0,0,0,0,n

8,0.000667,0,7,0,2.04,0.748927,0,0,0.002712,7.74631,0,1.06,1.06,0,0,2,49,0,2.04,0.255544,0,0,5.32,16,198,29,13,2,0,0,0,78,4.06,118,0.008936,0.00262,0.00876,2.06,1.93,16,4.51,6,0,6,3,0,0,2.06,0.039137,1.01,7,0.008318,0,0.004431,24,2,0.008008,6.08,0.117569,0.000473,y

0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,26,0,2,1,0,0,0,1,0,18,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,9,2,0,0,0,0,n.......(省略)。

2)借助差分演化算法,对缺陷预测数据集使用分层抽样及少数类过采样方法创建多数类和少数类比值为2:1的数据集,确定神经网络超参数的最优取值。

3)基于缺陷预测数据集,使用少数类过采样方法,使用超参数取值方案,构建出缺陷预测模型。

步骤2)中分层抽样及少数类过采样方法,包括如下步骤::

2-1)将缺陷预测数据集按照分层抽样的方式划分,缺陷预测数据集里面多数类个数与少数类个数的比值为ir,缺陷预测数据集的个数为m,进行十折划分时候,每个子集的个数为m/10。对缺陷预测数据集按照少数类与多数类进行分组,在抽样时候,对于第i个子数据集,从多数类的样本中抽取m/10*(ir/(ir+1))个多数类,同时从少数类样本中抽取m/10*(1/(ir+1))个少数类,组合成为新的缺陷预测子集。重复以上过程九次。对于第10个子数据集,把所有抽样剩余的数据集作为第10个数据集。最终得到分层抽样的十个子数据集;

2-2)将训练数据d1到d9合并为一个训练集,在该训练集中使用少数类过采样算法来解决缺陷预测数据类不平衡问题,具体方法步骤如下:

2-2-1)从缺陷预测数据集d中选择有缺陷的少数类集合,设定为smin,smin∈d,在smin集合中选择一个样本xi;

2-2-2)根据欧式距离计算出来与样本xi距离最近的六个样本;

2-2-3)计算随机值ζ,ζ取值范围为(0,1),在离xi最近的六个样本中随机取出一个xik,k取值范围为(1,6),以此计算生成的新样本xnew,xnew=xi+ζ*(xik-xi);

2-2-4)重复以上步骤中的2-2-1),2-2-2),2-2-3),直到缺陷预测数据集中的多数类与少数类直接的比值为2:1终止循环。

所述步骤(2)中采用差分演化算法按照以下步骤进行:

3-1)随机初始化种群。以神经网络为缺陷预测模型的分类器,需要随机初始化学习速率learningrate,候选取值为0.1到0.4,隐藏层的层数hiddenlayers,候选取值范围为3到10。迭代次数epoch,候选取值为100到300。选择代理的规模np>=4。根据确定的np数目初始化得到一组染色体。初始化交叉因子cr,设定cr等于0.5,设定缩放因子f等于2。以(learningrate,hiddenlayers,epoch)作为神经网络的超参数向量染色体,差分演化算法过程参见图2。

3-2)计算种群中每个染色体的适应值。依据该染色体在神经网络中使用十折交叉验证法计算当前训练数据集上的相应因子的auc值,该值作为该染色体的函数值。随机初始化得到四个染色体为(0.2,5,200),(0.1,6,100),(0.4,8,300),(0.3,9,200),计算各个因子对应的验证集中的auc值分别为0.6125,0.687,0.786,0.623。适应值auc具体计算过程参见图3。

auc值具体包括如下步骤:

步骤3-2-1)将数据集借助分层抽样方法划分为10份,i=1,对缺陷预测数据集d进行切分,按照层次抽样的方式进行分割,划分为10个数据集,随机选择其中9个数据集合并作为训练数据集,剩余的1个数据集作为验证数据集,分别对训练数据集和验证数据集使用少数类过采样算法进行预处理,获得待处理数据集;

步骤3-2-2)将第i份设置为测试集,将剩余数据设置为训练集;

步骤3-2-3)在训练集上使用少数类过采样方法,使用染色体对应的超参数取值训练模型,并在测试集上得到测试结果,记为auci;

步骤3-2-4)将i取值加1,跳转到步骤2-2-2,当i取值大于10的时候,跳转到步骤2-2-5);

步骤3-2-5)将10次预测结果取均值,auc=(auc1+auc2+auc3+auc4+auc5+auc6+auc7+auc8+auc9+auc10)/10,作为该染色体对应的适应值。

3-3)染色体变异。从代理候选集合里面随机选择一个染色体x,假如说选中的是(0.1,6,100),并随机选择其他三个染色体,分别为a,b,c,这三个染色体与染色体x都互不相同,其他三个染色体则分别为a=(0.2,5,200),b=(0.4,8,300),c=(0.3,9,200)。

3-4)染色体交叉。当前染色体的维度为3,随机选择一个整数n作为当前染色体交叉的因子,n的取值范围为0到2。如果n等于0,或者均匀分布随机变量小于交叉因子cr,那么就计算分量,

y0=a0+2*(b0-c0)=0.2+2*(0.4-0.3)=0.4

如果n等于1,或者均匀分布随机变量小于交叉因子cr,那么就计算分量,

y1=a1+2*(b1-c1)=5+2*(8-9)=3

如果n等于2,或者均匀分布随机变量小于交叉因子cr,那么就计算分量,

y2=a2+2*(b2-c2)=200+2*(300-200)=400

通过染色体交叉以后,生成了新的染色体为(0.4,3,400)。

3-5)染色体选择。当前变异交叉后产生的染色体为(0.4,3,400),依据该染色体在神经网络中使用十折交叉验证法计算当前训练数据集上的相应因子的auc值,该值作为该染色体的函数值,将该染色体与x染色体的函数值比较,如果新产生染色体的auc值大于x染色体的auc值,则删除染色体种群的中的x染色体,添加当前染色体到种群中去。如果当前染色体的auc输出值为0.8,0.8大于原有的染色体x的输出值0.687,则删除x,添加染色体(0.4,3,400)到当前染色体库中去。

3-6)重复执行步骤3-3,3-4)及3-5),直到满足算法的终止条件为止。算法的终止条件是或者迭代次数达到100次,或者是最大的auc值大于0.9。在一次循环过程中,步骤3-3,3-4)及3-5)重复执行染色体的规模np次,完成对所有染色体的随机变异。

以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。

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