一种基于采样和集成学习的软件更改缺陷预测方法与流程

文档序号:11250786阅读:352来源:国知局
一种基于采样和集成学习的软件更改缺陷预测方法与流程

本发明属于软件安全技术领域,具体涉及一种基于采样和集成学习的软件更改缺陷预测方法。



背景技术:

随着计算机科学技术的快速发展,软件规模不断提高,软件开发过程也变得越来越复杂。软件开发过程可以看作是一系列的具有特定目的的代码更改行为,例如增加某些新的特性、提高软件效率、适应新的运行环境、修复程序中的缺陷或者仅仅只是为了美化代码。但在代码更改的过程中,不可避免的是某些更改会引入缺陷,这些更改将对软件造成难以预期的影响。为了避免对软件造成不良影响,需要检查软件的每一次更改以确定其是否引入了缺陷。如果发现软件的某一次更改引入了缺陷,这个缺陷就应当尽快被移除以保证软件的可靠性。如果引入的缺陷很长时间以后才被发现,那么开发人员需要重新熟悉代码,导致花费更多的时间和精力修复缺陷。因此,及时发现并修复软件更改所引入的缺陷不但可以大大降低缺陷修复所需要付出的代价,还能大大降低缺陷对软件所造成的不良影响,这对软件开发来说具有十分重要的意义。

预测软件开发过程中每一次的代码更改是否引入缺陷可以看作是数据挖掘领域中的分类问题。然而现有研究建立分类模型时往往采用标准的机器学习算法,并没有考虑到数据不均衡问题。如在《alarge-scaleempiricalstudyofjust-in-timequalityassurance》一文中,作者使用逻辑回归进行软件更改缺陷预测,并没有考虑数据不均衡问题。该方法在几个开源工程上获得的效果如表1所示。可以看出,该方法在几个开源工程上进行缺陷预测最终获得了平均71%的acc,37%的prec,67%的recall,45%的f1以及76%的auc。

表1:不使用数据不均衡处理在某些工程上获得的分类指标



技术实现要素:

本发明的目的在于提供一种基于采样和集成学习的软件更改缺陷预测方法,以克服上述背景技术所述的现有技术存在的缺陷,本发明可以解决软件更改缺陷预测中由数据不均衡导致的预测效果不理想问题。

为达到上述目的,本发明采用如下技术方案:

一种基于采样和集成学习的软件更改缺陷预测方法,包括以下步骤:

s1:从软件的版本控制库中提取分类实例集;

s2:根据s1得到的分类实例集构造分类模型;

s3:根据软件更改实例的特征以及s2得到的分类模型获取该更改实例的类标签,即可判断此次更改是否引入缺陷。

进一步地,s1具体包括:

s101:首先获取软件的版本控制库,该版本控制库中存放着软件的历史更改记录;

s102:使用开源软件项目miningit挖掘版本控制库中历史更改信息,并直接存储于mysql数据库中;

s103:根据软件历史更改信息,使用szz算法获取每个软件历史更改实例的类标签;

s104:提取软件历史更改实例的元数据属性;

s105:获取每个软件历史更改实例所对应的源文件,并使用understand软件获取该源文件的复杂度属性;

s106:使用词袋法获取每个软件历史更改实例对应文件的源码词向量属性;

s107:针对每个软件历史更改实例,将其元数据属性、文件复杂度属性、源码词向量属性以及由szz算法得到的类标签整合为一条记录,即得到完整的一条训练数据;

s108:将得到的若干训练数据整合为一个分类实例集。

进一步地,s101中所述的软件对应的版本控制库为软件对应的git库。

进一步地,s2具体包括:

s201:使用属性选择算法对分类实例集进行维度约减;

s202:采用采样的方法从在维度约减后的分类实例集上进行多次均衡采样,得到多个均衡的子分类实例集;

s203:使用每个均衡的子分类实例集分别训练基分类器得到若干基分类模型;

s204:将得到的若干基分类模型集成为一个分类模型。

进一步地,s202中子训练数据集的数目等于10。

进一步地,s202中采样的方法为过采样或欠采样。

进一步地,s203中基分类器为c4.5、naivebayes或smo。

与现有技术相比,本发明具有以下有益的技术效果:

针对软件开发过程中更改缺陷预测存在数据不均衡问题,传统的简单分类模式并不能取得很好的预测效果。采样方法可以有效缓解数据的不均衡问题,而集成学习又是优化模型的一条重要途径。如果把采样方法和集成方法简单的组合到一起,也就是先进行采样然后使用集成学习,那么就会面临着集成学习时训练集虽然是均衡的,但是数据集的分布相比采样前发生了很大的变化,影响了学习的效果。本发明将采样方法嵌入到集成学习中,也就是在集成学习中使用采样方法为每个基分类器提供均衡的训练数据集,这样不但解决了数据不均衡问题,还充分利用了数据集原始分布的信息,从而达到更好的分类效果。

附图说明

图1是本发明提供的根据软件版本控制库提取分类实例集过程的示意图;

图2是本发明提供的根据软件版本控制库提取分类实例集过程的流程图;

图3是本发明提供的根据分类实例集建立分类模型并对新的软件更改进行分类的示意图。

图4是本发明提供的根据获得的分类实例集进行模型训练的流程图;

图5是本发明提供的应用分类模型判断新的软件更改是否引入缺陷的流程图。

具体实施方式

下面结合附图对本发明作进一步详细描述:

如图1至图5所示,本发明针对git分布式管理系统下的软件开发过程,采用基于采样和集成学习的更改缺陷预测方法,共分为数据提取、模型训练和预测三个过程。

数据提取过程的输入为软件所对应的git工程,输出为提取的可以用于训练模型的分类实例集。每个实例以commit_id,file_id对为主键,唯一标识某个文件的某次更改。其中commit_id为某次提交代码行为的独一无二的id,file_id为特定软件版本下标识某个文件的独一无二的id。也就是说,对于某条训练数据,其主键的含义表示某次代码提交下更改了某个文件。

对于每个实例,该实例的其他属性部分获取过程如下:

对于每条训练数据,该实例的其他属性获取过程如下:

使用miningit软件获取分类实例的历史更改信息,并根据该信息获取分类实例集的元数据属性,该部分属性包括代码更改的时间,更改的作者,更改的代码行数,更改的时间等。

使用understand软件获取分类实例对应的文件复杂度属性,该部分属性包括训练数据对应的源码文件的代码行数,源码文件中的注释行数,源码文件中的循环复杂度等文件复杂度信息。

使用词袋法获取文件对应的词向量。

在历史更改信息上使用szz算法获取分类实例所对应的类标签,也就是某次更改的某个文件是否引入了缺陷。如果此更改引入缺陷,则类标签为1,否则为0。

将以上四部分属性结合构成分类实例的所有属性。

模型训练过程的输入是数据提取过程得到的分类实例集,输出是通过结合采样和集成学习的方法获得的分类模型,模型结构如图3所示。首先应用采样方法,获得类分布均衡的子分类实例集。之后使用每个子分类实例集在基分类器上构建一个子分类模型,最后将得到的若干个子分类模型以投票的策略集成为一个最终的分类模型,最终分类模型的预测结果根据各个子分类器的预测结果投票决定。

应用预测过程的输入是待预测的软件更改以及模型训练阶段获得的分类模型。过程是通过使用模型训练阶段获得的分类模型对待预测的软件更改进行分类,输出是通过分类获得的该更改的类标签,即是否引入缺陷。如果预测为1,则表示此次更改引入了新的缺陷,那么就建议程序开发人员对软件更改进行检查,找到缺陷并进行修复。

下面结合附图对本发明的应用原理做详细描述:

如图1和图2所示,本发明基于采样和集成学习的更改缺陷预测的数据提取阶段包括以下步骤:

s101:为了提取软件历史更改记录,首先要获取软件对应的版本控制库,该版本库中存放着软件的历史更改记录。需要说明的是,本发明针对git这种分布式版本控制系统下开发的软件进行缺陷预测,所以此处需要获取软件对应的git工程。

s102:使用开源软件项目miningit(github网站上可自由获取)挖掘版本库中的历史更改信息,相关信息将直接存储于mysql数据库中。

s103:在历史更改信息上使用szz算法获取每次更改的类标签。

s104:在历史更改信息上提取元数据属性,也就是针对每次更改,获取其提交作者,提交是星期几发生的,是何时发生的,截止当前累积发生了多少次更改,截止当前累积出现了多少个bug,changelog信息有多长,此次修改增加了多少行代码,减少了多少行代码,是否修复了某个缺陷等属性信息,并将其也存储于mysql数据库中。由于某些大型的工程可能已经发生了数以万计的更改,如此大规模的数据在训练分类器时对机器性能要求很高,所以建议此处可以根据机器的性能选取一个时间段,只提取该时间段内的更改信息,以降低训练数据的规模。

s105:获取每次更改所对应的文件,并使用understand软件获取该文件的复杂度属性,也即该更改对应的文件的复杂度属性。

s106:使用词袋法获取每次更改对应文件的源码词向量,该词向量也就是该分类实例对应的词向量属性。

s107:针对每个分类实例,将其元数据属性、文件复杂度属性、源码词向量属性以及由szz算法得到的类标签整合为一条记录,这也就是完整的一条分类实例。

s108:将得到的众多分类实例整合为一个分类实例集,也就获得了用于训练模型的分类实例集。

接下来结合图3和图4详细说明模型的训练过程。

s201:由于提取出来的分类实例集中每个分类实例往往都具有上万个属性,这在训练分类器时对机器的性能要求很高。同时,大量的属性之间难免也存在着无用属性,所以对该分类实例集进行属性选择以约减实例的属性维度。

s202:将属性维度约减后的分类实例集等量划分为若干子实例集。划分的数目可以采用weka中bagging算法的默认值,也就是10。

s203:对于每个子实例集,其依然存在着类标签上的不均衡性,即包含缺陷的更改的数量远小于不包含缺陷的更改的数量。本发明使用采样的方法,将子实例集采样为均衡的数据集。采样的方法可以选取过采样oversample和欠采样undersample两种,如果不采用采样,则为传统的集成学习。

s204:选取合适的基分类器,对于得到的每个均衡的分类实例子集在基分类器上训练分类模型。基分类器可以选取c4.5、naivebayes和smo等广泛被使用的分类器。基分类器的实现可以从weka中轻松获得。

s205:将得到的若干分类模型集成为一个总分类模型,也就是本阶段要获得的最终的分类模型。当一个分类实例到来时,其类标签的划分将由每个子分类模型按照投票的策略获得。

参见图5,最后详细介绍一下应用预测的过程,此过程的目的就是预测最近的软件修改是否引入了缺陷。

s301:针对某次软件更改,执行s101、s102、s104、s105和s106等步骤提取该次软件更改实例对应的实例及其属性。

s302:将得到的软件更改实例用于模型构建过程得到的最终的分类模型之上,因此获取该更改实例的类标签,也就是此次更改是否引入了新的缺陷。

对于表1中的工程使用本发明提出的方法所获得的分类效果如表2所示。对比表2和表1中的分类指标可以看出,使用本发明提出的方法相对于传统的分类方法能够获得更好的分类效果。

表2:使用本发明的方法在某些工程上获得的分类指标

下面结合具体实施例做进一步说明:

从github网站上获取若干开源工程,并使用图2所示过程提取每个开源工程所做更改的实例集,相关实例集信息如表3所示:

表3:提取若干开源工程得到都分类实例集的相关信息

其中,project表示工程名称,#commit表示选取的更改次数,starting-commit表示选取更改范围的起始值,#change表示范围内发生的更改的次数,#buggy表示更改中引入缺陷的次数,%buggy表示引入缺陷的次数占总更改次数的百分比,#features表示提取该工程更改实例集后每条实例的属性个数,#used-features表示属性选择后实际用于训练分类器的每条实例的属性个数。

例如对于camel工程,为了控制用于训练模型的更改实例的个数,以该工程第2501次commit为起始点,向后共选取300次的commit记录,这300次的commit记录对应661次的更改(一个commitid,fileid对应一次更改),中311次的更改是引入缺陷的,所以更改的缺陷率为47.05%。针对每个实例提取出的属性共有8754个,为了有效地练分类模型,在这些属性上进行属性选择,最后剩余的属性为40个。

获取了每个工程对应的分类实例集后就进入了模型训练阶段,以c4.5作为基分类器为例,为了显示本发明提出的结合采样方法和集成方法的有效性,实验过程中还使用仅采用采样的方法和仅采用集成学习的方法以及仅使用标准方法来训练分类器,最后通过结果的对比说明本发明提出的方法的有效性。

为了评估分类器的有效性,采取十折交叉验证获取分类实例集在分类模型上的相关评估指标,评估指标包括recall、precision、fmeasure、auc以及gmean。相关的,混淆矩阵定义如表4所示:

表4:混淆矩阵

不同方法下的分类结果如表5所示。其中指标前加以c-的表示不包含缺陷的分类实例的相关指标,指标前加以b-的表示包含缺陷的分类实例的相关指标。如b-precision表示包含bug的更改的分类精度,而c-precision表示不包含bug的更改的分类精度。表中所示的方法共有六种,其中standard方法表示训练分类器的工程既不采用分类也不采用集成学习。under和over分别表示仅采用分类中的过采样和欠采样方法来训练分类模型。bag方法表示采用标准的集成学习来训练分类器,而underbagging和overbagging是本发明提出的结合采样和集成学习的方法,underbagging对应于欠采样与集成学习相结合,overbagging对应于过采样与集成学习相结合。

表5:不同分类方法下的结果

为了更加方便的对比不同方法的优劣,针对某个评估指标,分别统计每个方法在其上的平均值和最优的次数,其数据如表6所示。其中mean表示方法在各工程上得到的均值,#win表示该方法相对其他方法在所有工程上获得过几次最优值。以standard为例,在mean对应的c-recall指标上的值0.89表示standard方法在八个工程上获得的c-recall的平均值为0.89。#win对应的standard方法下c-recall的值为1表明当采用standard方法训练分类模型时,在某1个工程上得到的c-recall值比其他五种方法下得到的c-recall都要高。

根据表6统计的各方法下的整体表现情况可以发现,采用采样方法和集成学习相结合的方式(对应于overbagging和underbagging方法)所能获得的性能指标相比其他方法要好很多。这证明了本发明提出的采用采样方式和集成学习相结合的方法的有效性。

表6:不同方法获得的性能指标情况

以上所述仅为本发明的较佳实例而已,并不用以限制本发明,凡在本发明的精神和原则之内做出的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

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