本发明涉及软件质量保障领域,尤其是一种基于模块选择和权重更新的跨项目缺陷预测方法。
背景技术:
:软件缺陷预测通过分析软件历史仓库,构建软件缺陷预测模型来识别被测项目内的潜在缺陷程序模块,通过将更多测试资源优先分配到这些程序模块,可达到优化测试资源分配,提高软件产品质量的目的。软件缺陷预测模型依赖于高质量的数据集,但在实际的软件预测场景中,需要执行软件缺陷预测的项目大部分都是新的项目,而对新项目进行标注是一件既耗时,又耗力的工作。跨项目缺陷预测方法是解决该问题的一种简单的解决方案。该方法直接使用其他项目已经搜集的高质量数据集来为目标项目构建软件缺陷预测模型。但是,不同的项目会因所处的应用领域、使用的编程语言或开发人员的经验等因素导致特征分布的不同。因此,源项目程序模块数据集与目标项目程序模块数据集存在很大的度量元取值分布差异,难以满足独立同分布的假设。针对该问题,大部分研究人员从减小源项目程序模块数据集和目标项目程序模块数据集中的度量元取值分布差异这个角度来设计解决方案。一种解决方法是,运用已有的知识,对具有一定相关性领域的问题进行求解。其目的是使用已有知识来解决目标领域中仅有少数已标记实例甚至没有标记的问题。但是研究表明该方案的跨项目缺陷预测方法的效果都不尽如人意。因此,如果能够通过标记目标项目的一小部分程序模块而提高软件缺陷预测模型泛化性能也是一种可行的操作。从提高缺陷预测模型泛化性能的角度出发,选择目标项目中的少部分模块进行标记是一种有效的方法。该方法不同于其他机器学习的地方在于采样策略的使用。采样策略的目的是在最少标记代价下获得能最大程度提高分类器的泛化性能的标记样本集。模块选择方法的迭代过程是:在标记样例集上训练分类器,使用分类器对未标记样例进行分类判断;根据分类结果,使用采样引擎选择部分无标记样例交由专家进行标记;将标记后的样例加入已标记样例集用于分类器的下一次训练。算法的终止条件是标记代价或者分类器的泛化精度达到一定标准为止。综上所述,减小源项目程序模块数据集和目标项目程序模块数据集中的度量元取值分布差异以及选择目标项目中的少量程序模块进行标记可提升跨项目软件缺陷预测模型的性能,因此结合这两种提升跨项目软件缺陷预测模型性能的方法设计出一种新的跨项目软件缺陷预测方法。本发明由此而生。技术实现要素:本发明所要解决的技术问题是在企业不存在任何历史标记数据集的时候,借助其他项目已经标记的数据集来为目标项目构建缺陷预测模型性能不理想的问题,旨在借助少量目标项目中的模块并结合模块选择和权重更新优化缺陷预测模型的性能。为解决上述技术问题,本发明所采用的技术方案是:一种基于模块选择和权重更新的跨项目缺陷预测方法,其特征在于,包括以下步骤:(1)抽取目标项目程序模块并进行属性度量,构建目标项目程序模块数据集u,所述目标项目程序模块数据集u中包含的程序模块数量为nu;(2)抽取源项目程序模块并进行属性度量,然后根据源项目托管的版本控制系统和缺陷跟踪系统对所抽取的源项目程序模块进行缺陷类别标注,得到具有缺陷类别标注的源项目程序模块数据集t;所述缺陷类别包括有缺陷和无缺陷;(3)采用源项目模块选择方法对源项目程序模块数据集t进行筛选,得到与目标项目程序模块数据集u分布相似的相似软件程序模块数据集t’,将相似软件程序模块数据集t’中的程序模块赋初始权重,得到带权重程序模块数据集d;(4)根据带权重程序模块数据集d中有缺陷的程序模块数量和无缺陷的程序模块数量对带权重程序模块数据集d执行权重平衡,获得权重平衡程序模块数据集d’,随后使用权重平衡程序模块数据集d’训练支持向量机,得到支持向量机模型clf;(5)预设挑选比率ratio;(6)计算所述带权重程序模块数据集d中选自于目标项目程序模块数据集u的程序模块数n,如果n≥ratio×nu,则输出支持向量机模型clf,否则执行步骤(7);(7)将目标项目程序模块数据集u输入步骤(4)所得的支持向量机模型clf,计算目标项目程序模块数据集u中各个程序模块距支持向量机模型clf中划分超平面的距离,选择k2个距离最近的程序模块进行缺陷标注后从目标项目程序模块数据集u中移除,添加到带权重程序模块数据集d中并进行权重更新,执行步骤(4)和步骤(6);(8)采用支持向量机模型clf预测目标项目程序模块数据集u中程序模块有无缺陷;进一步的,上述步骤(3)中的所述源项目模块选择方法包括如下步骤:2-1)将源项目程序模块数据集t的属性度量值部分视为矩阵normt,目标项目程序模块数据集u的属性度量值部分视为矩阵normu,记矩阵normt的行数为rt,记矩阵normu的行数为ru=nu,新建行数为rt,列数为ru的矩阵normt’并初始为0;2-2)令aij表示矩阵normt’里第i行第j列的元素,bij表示矩阵normt中第i行第j列的元素,cij表示矩阵normu中第i行第j列的元素,根据计算公式获得所述矩阵normt’中每一个元素amn,其中m,n∈n*且m∈[1,rt],n∈[1,ru],k3为normt的列数,得到矩阵normt’;2-3)对所述矩阵normt’,将每列数据从小到大排序,每列取出k4个最小的值,保存他们的行号,可得到ru×k4个行号,将不重复的所述行号存入集合rset中,保留矩阵normt中第j行元素,其中j为集合rset中的每一个元素,得到相似软件程序模块数据集t’;进一步的,上述步骤(4)中执行权重平衡,包括如下步骤:3-1)令npos表示带权重程序模块数据集d中有缺陷程序模块的数目,nneg表示带权重程序模块数据集d中无缺陷程序模块的数目,nsample表示带权重程序模块数据集d中所有程序模块的数目,nclass表示带权重程序模块数据集d中程序模块缺陷情况的类别数,nclass=2,带权重程序模块数据集d中程序模块的权重v;3-2)计算带权重程序模块数据集d中不同类别程序模块的权重vs,其中所述有缺陷程序模块的权重为所述无缺陷程序模块的权重为3-3)根据所述程序模块的权重vs,更新带权重程序模块数据集d中程序模块的权重υ’=υ×υs,得到权重为v’的权重平衡程序模块数据集d’;进一步的,上述步骤(7)中使用的权重更新方法包括如下步骤:4-1)将带权重程序模块数据集d分为从目标项目程序模块数据集u中所有选择的程序模块集合dselect和源项目程序模块集合dold,集合dselect的程序模块数记作nselect,集合dselect所有程序模块的缺陷类别标签记作yselect,集合dselect程序模块权重记作vselect,集合dold的程序模块数记作nold,集合dold所有程序模块的缺陷类别标签记作yold,源项目程序模块集合dold中程序模块的权重记作vold,初始化带权重程序模块数据集d中程序模块的权重v;4-2)记需要迭代的次数为n,当前迭代次数为round,设源项目程序模块权重更新系数4-3)使用带权重程序模块数据集d训练支持向量机,得到支持向量机模型clftmp;4-4)使用支持向量机模型clftmp对集合dold进行预测,得到预测的标签值为y1,使用支持向量机模型clftmp对集合dselect进行预测,得到的标签值为y2,此时,计算支持向量机模型clftmp在集合dselect上的错误率:其中,i表示集合dselect第i个样本;4-5)如果错误率ε=0,则终止迭代,直接输出此时的权重v,如果错误率ε>0.5,此时设置错误率ε=0.5,将目标项目程序模块权重更新系数βt设置为1,如果错误率0<ε<0.5,此时目标项目程序模块权重更新系数4-6)更新集合dold权重为集合dselect权重为更新带权重程序模块数据集d中程序模块的权重v=vold′∪vselect′,此时round=round+1;4-7)若round<n,执行步骤4-3)至4-6),更新带权重程序模块数据集d中程序模块的权重v,当round=n结束循环。本发明与现有技术相比,具有以下优点和效果:本发明首先使用源项目模块选择方法构建与目标项目程序模块分布相似的程序模块数据集,保证模型的泛化性能;使用权重平衡方法解决程序模块数据集内部的数据不平衡问题,进一步提升模型的泛化性能;从目标项目程序模块数据集中选择距离最近的程序模块进行标注,可帮助模型分类更准确;最后使用权重更新方法通过调整程序模块的权重增强模型的泛化性能。与传统的跨项目缺陷预测模型相比,本发明预测模型的泛化性能更优。附图说明图1是本发明的总体流程图;图2是本发明源项目模块选择方法的流程图;图3是本发明权重平衡的流程图;图4是本发明权重更新的流程图;图5是使用本发明的方法(使用目标项目模块选择方法挑选出的数据量为5%)和用传统的跨项目缺陷预测在auc指标上的效果对比图;图6是使用本发明的方法(使用目标项目模块选择方法挑选出的数据量为5%)和用传统的跨项目缺陷预测在f1指标上的效果对比图。具体实施方式为了进一步理解本发明,下面结合实施例对本发明优选实施方案进行描述,但是应当理解,这些描述只是为了进一步说明本发明的特征和优点,而不是对本发明权利要求的限制。本发明所使用的数据,对其来源没有特别限制,使用开源数据、联系相关机构进行购买或使用软件缺陷预测领域技术人员熟知的工具抽取模块度量元进行标记均可。实施例本实施例的基于模块选择和权重更新的跨项目软件缺陷预测的总体流程图如说明书附图中的图1所示,包含如下步骤:(1)抽取目标项目程序模块并进行属性度量,构建目标项目程序模块数据集u,所述目标项目程序模块数据集u中包含的程序模块数量为nu;(2)抽取源项目程序模块并进行属性度量,然后根据源项目托管的版本控制系统和缺陷跟踪系统对所抽取的源项目程序模块进行缺陷类别标注,得到具有缺陷类别标注的源项目程序模块数据集t;所述缺陷类别包括有缺陷和无缺陷;使用understand工具对抽取的程序模块进行属性度量,发明人以某个实际项目的源项目程序模块数据集作为示例,部分数据如下表所示:程序模块编号wmcditnoccbo…cbmamcmax_ccavg_ccbug18106…03.510.75022404…11710.503561049…08.82142951.1964044510…0400053203…0223106161238…043.25151.9375173100…00110810303…110.131093202…08.666667310103205…07.66666710.33330该数据集共考虑了20种属性度量指标,即特征,bug这一列表示所抽取的源项目程序模块所对应的缺陷类别,其中0表示无缺陷,1表示有缺陷,累计抽取了859个程序模块,由于篇幅所限,这里仅列举了部分数据。(3)采用源项目模块选择方法对源项目程序模块数据集t进行筛选,得到与目标项目程序模块数据集u分布相似的相似软件程序模块数据集t’,将相似软件程序模块数据集t’中的程序模块赋初始权重,得到带权重程序模块数据集d,其中源项目模块选择方法的流程图如图2所示;将源项目程序模块数据集t的特征部分视为矩阵normt。假设源项目程序模块数据集t如下表所示,其含有5个程序模块,v1-v5代表不同的属性度量指标(即特征)。程序模块编号特征v1特征v2特征v3特征v4特征v50-0.01879-1.28905-0.25789-0.50344-1.239691-0.35747-1.27782-0.17461-0.3307-1.233872-0.35747-1.289050.022636-0.58982-1.2396930.022530.8271110.0752340.878531.0673734-0.174820.736203-0.27542-0.41707-0.12028normt可表示为:将目标项目程序模块数据集u视为矩阵normu。假设目标项目程序模块数据集u如下表所示。程序模块编号特征v1特征v2特征v3特征v4特征v50-0.214050.755101-0.26665-0.33070.1055631-0.24623-1.26688-0.314870.705784-1.123072-0.35747-1.28905-0.3587-0.58982-1.239693-0.153810.8186140.0577010.5330372.0580464-0.30156-1.27196-0.2272-0.58982-1.20435normu可表示为:记normt的行数为rt,记normu的行数为ru=nu,新建零矩阵normt’,该矩阵的行数为rt,列数为ru。在此例中,ru=5,rt=5,normt’是一个5行5列的零矩阵。令aij表示矩阵normt’里第i行,第j列的元素,bij表示矩阵normt中第i行,第j列的元素,cij表示矩阵normu中第i行第j列的元素。任取normt’中的一个元素amn,则amn的计算方法为其中,m,n∈n*且m∈[1,rt],n∈[1,ru],k3为normt的列数。amn的意义表示normt中第m行向量和normu中第n行向量的欧几里得距离。如:计算normt’中第1行第1列的元素(即a11),即计算normt中第一行向量和normu中第一行向量的欧几里得距离,计算过程如下:normt’的其他元素同样依据这种方式计算,最终得到的normt’结果为(所有元素均保留三位小数):随后,对normt’中的每一列从小到大排序,取前k4个最小值,保存每一列k4个值的行号,将这些行号存入到集合rset中。假设k4=2,在normt’的第一列中,值最小的两个行号为4和3,第二列中值最小的两个行号为1和0,第三列中值最小的两个行号为1和0,第四列中值最小的两个行号为3和4,第五列中值最小的两个行号为2和1。将不重复的行号存入集合rset中,因此rset={0,1,2,3,4},保留矩阵normt中第j行元素,其中j为集合rset中的每一个元素,得到相似软件程序模块数据集t’。将相似软件程序模块数据集t’中的程序模块赋初始权重v,本例中,v=(1,1,1,1…1),得到程序模块权重为v的带权重程序模块数据集d;(4)根据带权重程序模块数据集d中有缺陷的程序模块数量和无缺陷的程序模块数量对带权重程序模块数据集d执行权重平衡,获得权重平衡程序模块数据集d’,随后使用权重平衡程序模块数据集d’训练支持向量机,得到支持向量机模型clf,其中权重平衡的流程图如图3所示;令npos表示带权重程序模块数据集d中有缺陷程序模块的数目,nneg表示带权重程序模块数据集d中无缺陷程序模块的数目,nsample表示带权重程序模块数据集d中所有程序模块的数目,nclass表示带权重程序模块数据集d中程序模块缺陷情况的类别数,nclass=2,带权重程序模块数据集d中程序模块的权重v。假设现有带权重程序模块数据集d,其中有缺陷的程序模块的数目为9,无缺陷的程序模块的数目为2,则npos=9,nneg=2,nsample=11。计算带权重程序模块数据集d中不同类别程序模块的权重vs,其中所述有缺陷程序模块的权重计算公式为所述无缺陷程序模块的权重计算公式为本例中,有缺陷程序模块的权重为无缺陷程序模块的权重为根据所述程序模块的权重vs,更新带权重程序模块数据集d中程序模块的权重υ’=υ×υs,得到权重为v’的权重平衡程序模块数据集d’;(5)预设挑选比率ratio;(6)计算所述带权重程序模块数据集d中选自于目标项目程序模块数据集u的程序模块数n,如果n≥ratio×nu,则输出支持向量机模型clf,否则执行步骤(7);首次执行该步骤时,带权重程序模块数据集d中选自于目标项目程序模块数据集u的程序模块数n=0,以后每次迭代更新的带权重程序模块数据集d中从目标项目程序模块数据集u挑选的程序模块数n逐步增加,直至满足终止条件,终止该步骤并输出支持向量机模型clf。(7)将目标项目程序模块数据集u输入步骤(4)所得的支持向量机模型clf,计算目标项目程序模块数据集u中各个程序模块距支持向量机模型clf中划分超平面的距离,选择k2个距离最近的程序模块进行缺陷标注后从目标项目程序模块数据集u中移除,添加到带权重程序模块数据集d中并进行权重更新,执行步骤(4)和步骤(6),其中权重更新的流程图如图4所示;其中权重更新方法具体步骤如下(只演示一次迭代):为了便于演示,抽取4个特征和10个模块以及标签形成带权重程序模块数据集d,将前7个程序模块视作dold,后3个程序模块视作dselect,v1-v5代表不同的度量元(即特征)。演示数据集如下:程序模块编号特征v1特征v2特征v3特征v4标签081060124040256104903451004320305161238163100071030308320209320507-1)将带权重程序模块数据集d分为从目标项目程序模块数据集u中所有选择的程序模块集合dselect和源项目程序模块集合dold,集合dselect的程序模块数记作nselect,集合dselect所有程序模块的缺陷类别标签记作yselect,集合dselect程序模块权重记作vselect,集合dold的程序模块数记作nold,集合dold所有程序模块的缺陷类别标签记作yold,集合dold程序模块的权重记作vold,初始化带权重程序模块数据集d中程序模块的权重v为1,其中vselect=(1,1,1),vold=(1,1,1,1,1,1,1)。7-2)记需要迭代的轮数为n,设源项目程序模块权重更新系数当前迭代轮数round=1。在本例中n=5,nold=7,nselect=3,源项目程序模块权重更新系数β=0.549。7-3)使用带权重程序模块数据集d训练支持向量机,得到支持向量机模型clftmp;7-4)使用支持向量机模型clftmp对集合dold进行预测,得到预测的标签值为y1=(0,0,1,0,0,1,0),使用支持向量机模型clftmp对集合dselect进行预测,得到的标签值为y2=(0,1,0),此时,计算支持向量机模型clftmp在集合dselect上的错误率,计算公式如下:其中,i表示集合dselect第i个样本;依据此公式计算出错误率ε=0.33。7-5)如果错误率ε=0,则终止迭代,直接输出此时的权重v,这么做的目的是为了防止得到的模型过拟合。如果错误率ε>0.5,此时设置错误率ε=0.5,并且将目标项目程序模块权重更新系数βt设置为1,如果错误率0<ε<0.5,此时目标项目程序模块权重更新系数本例得到的错误率ε满足第三个条件,此时,βt=0.50。7-6)分别对集合dselect和集合dold进行权重更新。更新集合dold权重为本例中vold'=(1,1,1,1,1,1,1)×0.549|y1-yold|=(1,1,0.549,1,1,1,1),集合dselect权重为本例中,vselect'=(1,1,1)×0.5-|y2-yselect|=(1,2,1),更新带权重程序模块数据集d中程序模块的权重v=vold′∪vselect′,此时round=round+1。7-7)若round<n,执行步骤7-3)至7-6),更新带权重程序模块数据集d中程序模块的权重v,当round=n结束循环。在本例的第一次迭代结束后,round=2,v=vold′∪vselect′=(1,1,0.549,1,1,1,1,1,2,1)。(8)采用支持向量机模型clf预测目标项目程序模块数据集u中程序模块有无缺陷;最后基于promise数据集中的10个实际项目(ant,camel,ivy,jedit,log4j,lucene,poi,prop,tomcat,xalan)来评估专利所提方法的有效性。将专利提出的方法命名为altra。比较的7种基准方法camargocruz,turhan,menzies,nam,ma,codep,amasaki。分别将这7种方法命名为baseline1~baseline7。为了使这8种方法公平比较,采用10次2折交叉验证。其中2折交叉验证是指将目标项目程序模块数据集u划分为2个大小相近的互斥子集u1和u2。其中u1∪u2=u,u1和u2在划分时,借助分层采样来确保这两个子集的数据分布与目标项目程序模块数据集u的分布保持一致。但将数据集划分为2个子集存在很多划分方式,为了减少因样本划分不同而引入的差别,实验时将2折交叉验证重复10次。将2折数据中的其中1折(u1或u2)作为辅助域,当需要挑选数据时,在辅助域中选择数据,在另1折数据上评估模型的性能。模型性能的评估,选择f1和auc作为性能度量指标,其中tp,fp,tn,fn经由混淆矩阵得到,混淆矩阵如下:模块真实情况是正例(有缺陷程序模块),被预测为正例(有缺陷程序模块),该模块则为tp,其他定义依此类推。auc的计算基于roc图,roc图的纵轴为tpr(真正例率),roc的横轴为fpr(假正例率),其中,auc为roc的曲线下的面积。将所有得到的跨项目实验的指标值合并在一起综合考虑。在auc指标上的实际效果如说明书附图5所示,图中横坐标表示方法名称,altra表示本发明名称,basline1~7表示7种基准方法;纵坐标表示auc值。所画的图结合了盒图还有scott-knott检验图,其中虚线代表scott-knott图的分层设置。从图中可以看出,在auc指标上,altra优于另外7种基准方法,并且,在scott-knott检验中位于第一层,优于另外7种基准方法。在f1指标上的实际效果如说明书附图6所示,altra的效果同样优于另外7种基准方法,和auc指标评估的结论相似。以上显示和描述了本发明的基本原理和主要特征和本发明的优点,对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。当前第1页12