基于代价敏感半监督的软件缺陷预测方法转让专利

申请号 : CN201610513167.7

文献号 : CN106201871B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 徐玲廖胜平洪明坚葛永新杨梦宁张小洪杨丹王洪星黄晟周末

申请人 : 重庆大学

摘要 :

本发明涉及基于代价敏感半监督的软件缺陷预测方法,包括如下步骤,S1通过版本控制工具收集待预测软件的源代码文件;S2所述S1得到的源代码文件由I个模块组成,从所述源代码文件中提取度量元值;S3通过采样的方式通过度量元值选取模块得到采样结果集;S4标注后采样结果集和无标记样本集构建训练集;S5提出目标函数,求解使目标函数值最小的分类函数,S6通过分类函数对待预测集中的模块进行预测,并输出预测结果。该方法融合半监督和代价敏感思想构建软件缺陷预测模型,解决了软件缺陷预测中缺陷数据难以获取和类不平衡两个问题,极大提高了预测结果的准确性。

权利要求 :

1.基于代价敏感半监督的软件缺陷预测方法,其特征在于,包括如下步骤:S1:通过版本控制工具收集待预测软件的源代码文件;

S2:所述S1得到的源代码文件由I个模块组成,从所述源代码文件中提取度量元值,所有度量元值构成一个集合X,X={x1,1,x2,2,...xi,j,...xI,J}  (1);

xij表示第j个度量元在第i个模块上的度量元值,I表示待预测软件中源代码文件的总数,J表示提取的度量元的总数;

每个模块对应一个度量元向量,定义xi表示第i个模块的度量元向量,xi={xij|j=1,2,

3...J};

S3:采样;

S3a:Mj表示所有模块上的度量元值的中位数,确定满足xij>Mj,i=1,2,...I,j=1,

2,...J的个数;

I)令i=1;

II)令j=1;

III)令Ki=0;

IV)如果xij>Mj,则Ki=Ki+1,并令j=j+1,执行下一步;

否则,令j=j+1,并执行下一步;

V)如果j≤J,则返回Ⅳ);否则令i=i+1,并执行下一步;

VI)如果i≤I,则返回Ⅱ);否则执行下一步;

VII)输出Ki;

S3b:Ki值对应第i个模块,i=1,2…I,根据Ki值从大到小的顺序对Ki值对应的模块进行排序;

S3c:选取S3b排序后,处于前N位置的N个模块构成候选集,再从候选集中随机选取n个模块构成采样结果集,N>n;

S4:构建训练集;

S4a:对S3c得到的采样结果集中的n个模块,根据其是否存在缺陷给其打上有缺陷模块的分类标签或无缺陷模块的分类标签,分类标签y∈{±1},打上分类标签y=1的模块表示为有缺陷模块,打上分类标签y=-1的模块表示为无缺陷模块;标记后的采样结果集为有标签样本集,记为τn={(x1,y1),…(xi,yi)…,(xn,yn)},其中,xi表示第i个模块的度量元向量,yi表示第i个模块的标签;

S4b:从I个模块中踢出采样结果集中的n个模块,然后再随机选取u个模块,所述u个模块构成无标记样本集,记为τu={(x1,y1),…(xi,yi)…,(xu,yu)},其中,yi=0,i=1,2,...u;

S4c:S4a得到的有标签样本集和S4b得到的无标记样本集构成训练样本集;

S5:构建预测模型;

S5a:提出目标函数如下:

其中,H是由核函数k生成的再生核希尔伯特空间,l(yi,f(xi))和 是加权损失函数,分别见公式(3)和(4),C1和C2是正则化参数,为经验值, 表示训练过程中的预测标签;r是设定的参数,为经验值,其中, 1是全1向量,yi表示真实标签;

其中,C(-1)是错分非缺陷模块的代价,是经验值,C(+1)是错分缺陷模块的代价,为经验值;

S5b:求解目标函数,得到使目标函数值最小的分类函数f(xi);

S6:从I个模块中踢出训练样本集中的模块后剩余的模块构成待预测集,将待预测集中一个模块的度量元向量输入分类函数f(xi),如果得到值小于0,则该模块被预测为无缺陷,如果得到的值大于0,则该模块被预测为有缺陷;

按照上述方式,将预测集中每个模块对应的度量元向量输入所述分类函数,对预测集中的每个模块进行预测,并输出预测结果。

2.如权利要求1所述的基于代价敏感半监督的软件缺陷预测方法,其特征在于,还包括对S2提取的集合X的预处理步骤,具体如下:S2a:遍历集合X中的所有度量元值,查找度量元值为缺失状态的进行填充,具体步骤如下:

1)令i=1;

2)令j=1;

3)判断xij是否有值,如没有,则使用第j个度量元在所有模块上的度量元值的中位数Mj进行填充;

如有,则令j=j+1,并执行下一步;

4)如果j≤J,则返回3);否则令i=i+1,并执行下一步;

5)如果i≤I,则返回2);否则执行下一步;

6)输出新集合X’;

S2b:采用公式(5)对S2a输出的新集合X’中的所有度量元值进行对数处理;

说明书 :

基于代价敏感半监督的软件缺陷预测方法

技术领域

[0001] 本发明涉及软件预测,具体涉及基于代价敏感半监督的软件缺陷预测方法。

背景技术

[0002] 然而,随着软件规模的不断增大,复杂程度的不断提高、以及市场对软件开发周期尽可能缩短的需求,对于软件质量进行预测和控制的难度逐渐提高,成本也不断加大。而且,软件技术发展至今,无论是小程序还是大型系统,软件中的缺陷软件中的缺陷已经成为软件开发过程中必不可少的副产品,而且不存在一种检验或验证的方法能够发现并排除全部的缺陷。更糟糕的是,软件缺陷发现得越晚,修复的成本越高。因此,如何在有限的人员、时间和成本条件下,有效地对软件进行充分的测试并尽可能全面地发现软件中存在的缺陷,始终是软件质量控制学科乃至整个软件工程领域所面临的难题。
[0003] 目前已经研究出多种方式能够有效提高软件质量,但是最好的方法是“预防缺陷”。软件缺陷预测就是有效预防缺陷的一种方法。软件缺陷检测旨在软件开发过程中自动检测程序模块中是否包含缺陷而不需要真正运行程序。通过预测软件模块是否包含缺陷可以有效合理地分配有限的测试资源,提高软件开发质量。
[0004] 从近年来国内外缺陷预测领域的研究中容易发现,无论是统计学习方法,还是机器学习方法都还存在着不足和挑战,主要总结为以下几点:
[0005] 1)依赖大量历史缺陷信息,而在实际应用中难以获取甚至不能获取一定数量的标签数据进行学习,在没有足够学习样本的情况下预测精度不高。
[0006] 2)缺陷数据具有明显的类不平衡特性,这使得传统机器学习方法在缺陷预测问题上召回率不高。
[0007] 3)越来越多的软件度量引入到缺陷预测领域,容易造成维度灾难。
[0008] 目前大部分预测方法旨在获得高准确率或者低错误率,而现实应用中不同类型的错误分类往往会造成不同的代价,高准确率并不代表预测结果的代价最小,而对真实项目而言整体代价最小化往往更具有实际意义。

发明内容

[0009] 针对现有技术存在的上述问题,本发明的目的是提供一种整体代价最小化的半监督软件缺陷预测方法。
[0010] 为实现上述目的,本发明采用如下技术方案:
[0011] 基于代价敏感半监督的软件缺陷预测方法,其特征在于,包括如下步骤:
[0012] S1:通过版本控制工具收集待预测软件的源代码文件;
[0013] S2:所述S1得到的源代码文件由I个模块组成,从所述源代码文件中提取度量元值,所有度量元值构成一个集合X,
[0014] X={x1,1,x2,2,...xi,j,...xI,J}   (1);
[0015] xij表示第j个度量元在第i个模块上的度量元值,I表示待预测软件中源代码文件的总数,J表示提取的度量元的总数;
[0016] 每个模块对应一个度量元向量,定义xi表示第i个模块的度量元向量,[0017] xi={xij|j=1,2,3...J};
[0018] S3:采样;
[0019] S3a:Mj表示所有模块上的度量元值的中位数,确定满足xij>Mj,i=1,2,...I,j=1,2,...J的个数;
[0020] I)令i=1;
[0021] II)令j=1;
[0022] III)令Ki=0;
[0023] IV)如果xij>Mj,则Ki=Ki+1,并令j=j+1,执行下一步;
[0024] 否则,令j=j+1,并执行下一步;
[0025] V)如果j≤J,则返回Ⅳ);否则令i=i+1,并执行下一步;
[0026] VI)如果i≤I,则返回Ⅱ);否则执行下一步;
[0027] VII)输出Ki;
[0028] S3b:Ki值对应第i个模块,i=1,2…I,根据Ki值从大到小的顺序对Ki值对应的模块进行排序;
[0029] S3c:选取S3b排序后,处于前N位置的N个模块构成候选集,再从候选集中随机选取n个模块构成采样结果集,N>n;
[0030] S4:构建训练集;
[0031] S4a:对S3c得到的采样结果集中的n个模块,根据其是否存在缺陷给其打上有缺陷模块的分类标签或无缺陷模块的分类标签,分类标签y∈{±1},打上分类标签y=1的模块表示为有缺陷模块,打上分类标签y=-1的模块表示为无缺陷模块;标记后的采样结果集为有标签样本集,记为τn={(x1,y1),…(xi,yi)…,(xn,yn)},其中,xi表示第i个模块的度量元向量,yi表示第i个模块的标签;
[0032] S4b:从I个模块中踢出采样结果集中的n个模块,然后再随机选取u个模块,所述u个模块构成无标记样本集,记为τu={(x1,y1),…(xi,yi)…,(xu,yu)},其中,yi=0,i=1,2,...u;
[0033] S4c:S4a得到的有标签样本集和S4b得到的无标记样本集构成训练样本集;
[0034] S5:构建预测模型;
[0035] S5a:提出目标函数如下:
[0036]
[0037] 其中,H是由核函数k生成的再生核希尔伯特空间,l(yi,f(xi))和 是加权损失函数,分别见公式(3)和(4),C1和C2是正则化参数,为经验值, 表示训练过程中的预测标签;r是设定的参数,为经验值,其中, 1是全1向量,yi表示真实标签;
[0038]
[0039]
[0040] 其中,C(-1)是错分非缺陷模块的代价,是经验值,C(+1)是错分缺陷模块的代价,为经验值;
[0041] S5b:求解目标函数,得到使目标函数值最小的分类函数f(xi);
[0042] S6:从I个模块中踢出训练样本集中的模块后剩余的模块构成待预测集,将待预测集中一个模块的度量元向量输入分类函数f(xi),如果得到值小于0,则该模块被预测为无缺陷,如果得到的值大于0,则该模块被预测为有缺陷;
[0043] 按照上述方式,将预测集中每个模块对应的度量元向量输入所述分类函数,对预测集中的每个模块进行预测,并输出预测结果。
[0044] 作为优化,还包括对S2提取的集合X的预处理步骤,具体如下:
[0045] S2a:遍历集合X中的所有度量元值,查找度量元值为缺失状态的进行填充,具体步骤如下:
[0046] 1)令i=1;
[0047] 2)令j=1;
[0048] 3)判断xij是否有值,如没有,则使用第j个度量元在所有模块上的度量元值的中位数Mj进行填充;
[0049] 如有,则令j=j+1,并执行下一步;
[0050] 4)如果j≤J,则返回3);否则令i=i+1,并执行下一步;
[0051] 5)如果i≤I,则返回2);否则执行下一步;
[0052] 6)输出新集合X’;
[0053] S2b:采用公式(5)对S2a输出的新集合X’中的所有度量元值进行对数处理;
[0054]
[0055] 相对于现有技术,本发明具有如下优点:
[0056] 本发明融合半监督和代价敏感思想构建软件缺陷预测模型,同时解决了软件缺陷预测中缺陷数据难以获取和类不平衡两个问题,极大提高了预测结果的准确性。在模型训练过程中,首先采用无监督采样方法采样少量样本进行标注,构成有标签样本集,然后随机选择部分无标签样本,与有标签样本集共同组成训练样本集,这保证了训练数据集中缺陷数据不会太少,提高了预测的准确性。最后应用半监督代价敏感支持向量机算法构建预测模型,使用少量标签样本取得与有监督模型相当的预测性能,减少了收集缺陷数据的成本,同时,代价敏感思想的融入,极大提高了缺陷预测召回率,并使得整体预测代价最小。

附图说明

[0057] 图1为度量元值在缺陷数据和非缺陷数据中分布。
[0058] 图2为采样流程图。
[0059] 图3为现有方法与本发明采样方法得到的训练集中的样本的缺陷率对比图。
[0060] 图4为基于代价敏感半监督的软件缺陷预测方法流程图。
[0061] 图5为本发明方法(CS4VM+S)和三个代价敏感神经网络算法在cm1数据集上的性能对比,其中图(a)、(b)、(c)和(d)分别表示在整体错误率(MR)、非缺陷模块错分率(FPR)、缺陷模块错分率(FNR)和规范化的误分类代价期望(NECM)四个评价指标上的性能表现。
[0062] 图6为本发明方法(CS4VM+S)和三个代价敏感神经网络算法在pc1数据集上的性能对比,其中图(a)、(b)、(c)和(d)分别表示在整体错误率(MR)、非缺陷模块错分率(FPR)、缺陷模块错分率(FNR)和规范化的误分类代价期望(NECM)四个评价指标上的性能表现。
[0063] 图7为本发明方法(CS4VM+S)和三个代价敏感神经网络算法在kc1数据集上的性能对比,其中图(a)、(b)、(c)和(d)分别表示在整体错误率(MR)、非缺陷模块错分率(FPR)、缺陷模块错分率(FNR)和规范化的误分类代价期望(NECM)四个评价指标上的性能表现。
[0064] 图8为本发明方法(CS4VM+S)和三个代价敏感神经网络算法在kc2数据集上的性能对比,其中图(a)、(b)、(c)和(d)分别表示在整体错误率(MR)、非缺陷模块错分率(FPR)、缺陷模块错分率(FNR)和规范化的误分类代价期望(NECM)四个评价指标上的性能表现。
[0065] 图9为本发明方法在不同代价设置上的性能展示。
[0066] 图10为本发明方法(CS4VM+S)在不同代价设置上的性能展示。
[0067] 图11为使用本发明提出的采样方法和随机选择样本情况下本发明方法(CS4VM+S)的NECM指标对比。
[0068] 图12为使用本发明提出的采样方法和随机选择样本情况下本发明方法(CS4VM+S)的FNR指标对比。

具体实施方式

[0069] 下面对本发明作进一步详细说明。
[0070] 软件缺陷预测模型旨在通过分析静态代码将软件模块分成两类:有缺陷和无缺陷。然而,遗憾的是至今不存在一个分类器能够将所有的软件模块百分百地分类正确。那么,预测模型给软件模块错误分类势必带来一定的代价,如测试时间,人力成本,程序崩溃带来的损失等,我们将这一类代价称为错分代价。将一个无缺陷模块错分成有缺陷浪费人力、财力和时间去详细测试,而一个有缺陷模块被错分为无缺陷可能引发程序崩溃,带来巨大的损失,如电商网站暂停交易,飞机控制系统失控等。因此,对于软件缺陷预测这类二分类问题,主要有两类误分错误,一种是无缺陷模块预测成有缺陷模块,另一种是有缺陷模块预测成无缺陷模块。在实际项目中,两种错误造成的代价是不同的,一般来说,第二种误分错误造成的代价远远高于第一种。误分代价的重要性大于被误分模块个数的重要性。然而,现有的大多数研究很少关注缺陷模型误分带来的整体错误代价,更多地是使模型误分率最低。基于此,本发明结合半监督SVM和代价敏感学习提出基于代价敏感半监督SVM缺陷预测模型。该方法旨在使用少量的标签数据和部分无标签数据作为训练样本,并同时考虑了两种误分错误带来的不同代价使模型的整体误分代价最小,这样一来,该方法即解决了标签样本难以获取的问题,又使预测模型整体代价成本最小,这对软件缺陷预测实际应用与真实工程项目中更具有现实意义,更能满足实践需求。
[0071] 基于代价敏感半监督的软件缺陷预测方法,包括如下步骤:
[0072] S1:通过版本控制工具收集待预测软件的源代码文件;
[0073] 为了方便项目成员协作和代码的管理,目前大多数项目源代码都托管在代码仓库中,开发人员通过版本控制工具获得各版本源代码。当需要预测这一类项目数据时,可以通过版本控制工具收集相关数据,比如Ant项目使用GIT版本控制工具,Mylyn项目可以使用SVN和GIT。这需要根据项目数据托管平台的类型来选择相应的工具。工具的使用方法如下:
[0074] GIT工具:选择一个文件目录,在git brash窗口输入git clone“版本库地址”,输入用户名密码即可下载源代码到本地磁盘;
[0075] SVN工具:选择一个文件目录,使用svn checkout命令,输入版本库地址,用户名和密码,即可导出数据。
[0076] S2:所述S1得到的源代码文件由I个模块组成,从所述源代码文件中提取度量元值,所有度量元值构成一个集合X,
[0077] X={x1,1,x2,2,...xi,j,...xI,J}   (1);
[0078] xij表示第j个度量元在第i个模块上的度量元值,I表示待预测软件中源代码文件的总数,J表示提取的度量元的总数;
[0079] 每个模块对应一个度量元向量,定义xi表示第i个模块的度量元向量,xi={xij|j=1,2,3...J};
[0080] 度量元的提取是对源代码进行静态分析统计的过程,关于度量元的提取方法,现有技术提供了许多提取工具,主要有:Analyst4j,CCCC,Chidamber&Kemerer Java Metrics,Dependency Finder,OOMeter,Semmle,Eclipse Metrics Plug-in 3.4和Understand for Java等。使用这些静态分析工具即可完成相应度量元的提取。
[0081] 作为优化,还包括对S2提取的集合X的预处理步骤,具体如下:
[0082] S2a:遍历集合X中的所有度量元值,查找度量元值为缺失状态的进行填充,具体步骤如下:
[0083] 1)令i=1;
[0084] 2)令j=1;
[0085] 3)判断xij是否有值,如没有(则表示该在第i个模块下该度量元的值为缺失状态),则使用第j个度量元在所有模块上的度量元值的中位数Mj进行填充;
[0086] 如有,则令j=j+1,并执行下一步;
[0087] 4)如果j≤J,则返回3);否则令i=i+1,并执行下一步;
[0088] 5)如果i≤I,则返回2);否则执行下一步;
[0089] 6)输出新集合X’;
[0090] S2b:采用公式(5)对S2a输出的新集合X’中的所有度量元值进行对数处理;
[0091]
[0092] 为了获得最佳预测性能,对属性值进行对数化预处理,同时避免对属性中的零值取对数,采取加一个极小值的方法取对数。
[0093] S3:采样;
[0094] S3a:Mj表示所有模块上的度量元值的中位数,确定满足xij>Mj,i=1,2,...I,j=1,2,...J的个数;
[0095] I)令i=1;
[0096] II)令j=1;
[0097] III)令Ki=0;
[0098] IV)如果xij>Mj,则Ki=Ki+1,并令j=j+1,执行下一步;
[0099] 否则,令j=j+1,并执行下一步;
[0100] V)如果j≤J,则返回Ⅳ);否则令i=i+1,并执行下一步;
[0101] VI)如果i≤I,则返回Ⅱ);否则执行下一步;
[0102] VII)输出Ki;
[0103] S3b:Ki值对应第i个模块,i=1,2…I,根据Ki值从大到小的顺序对Ki值对应的模块进行排序;
[0104] S3c:选取S3b排序后,处于前N位置的N个模块构成候选集,再从候选集中随机选取n个模块构成采样结果集,N>n;
[0105] 缺陷预测数据分布极不平衡,只有很少一部分数据存在缺陷。如果采用随机划分数据集的方式,极有可能出现训练数据集中含有极少缺陷数据甚至没有的情况。采用这样的数据作为训练集很难训练出较好的预测模型,本发明基于源代码度量元和缺陷潜在关联提出无监督的采样方法。因为度量元复杂度越高,度量元的值越大,其存在缺陷的可能性越大。如图1所示,本发明通过分析非缺陷数据和缺陷数据中度量元值得盒图发现,大多数情况下,存在缺陷的模块的度量元值高于不含缺陷模块的度量元值。
[0106] 通过采用步骤可以尽可能地避免训练集中缺陷数据太少,导致训练模型性能不佳的问题。
[0107] 属性中位数可以作为阈值衡量属性的复杂度。本发明提出一个无监督样本采样方法,该方法确保选择的样本中缺陷率不会过低,从而提升模型的性能,
[0108] 图2给出了一个具体的采用过程图示。
[0109] 如图2所示,X1-X6表示软件的模块(样本)的度量元值,I1-I7表示软件模块(样本集),假设需要采样的带标签样本数量为N,该采样方法主要分为以下五步:
[0110] 1)计算每个度量元值在所有模块中值的中位数,例如,对于属性X1,在所有模块中的值分别为2,3,0,1,2,1,3,这些数值的中位数为2。采用该方法依次为所有度量元值计算中位数。
[0111] 2)对于每个模块(样本),每个度量元值跟该度量元值的中位数进行比较,如果大,数量加1。例如,样本I1,属性X3和X5的值大于其中位数,3大于2,6大于4,所以样本I1的高属性值数量为2。
[0112] 3)根据高属性值数量对样本进行排序。
[0113] 4)选择排序结果前2*N个样本作为候选集。
[0114] 5)从候选集中随机选择N个样本作为最终的采样结果。
[0115] 图3展示了使用随机选择采样标签数据和本发明提出的采样方法采样标签样本时缺陷率的对比。其中,Folders是指把数据集分成Folders份,采样其中一份大小的数据进行标注。例如Folders为10时,我们从数据集中采样1/10数据去标注作为有标签数据。我们从图中我们可以看出,采用本发明提出的采样方法明显提高了采样样本中缺陷样本的比率,实验对比结果表明采样样本中缺陷率的提高有助于提升模型的预测性能。
[0116] S4:构建训练集;
[0117] S4a:对S3c得到的采样结果集中的n个模块,根据其是否存在缺陷给其打上有缺陷模块的分类标签或无缺陷模块的分类标签,分类标签y∈{±1},打上分类标签y=1的模块表示为有缺陷模块,打上分类标签y=-1的模块表示为无缺陷模块;
[0118] 标记后的采样结果集为有标签样本集,记为τn={(x1,y1),…(xi,yi)…,(xn,yn)},其中,xi表示第i个模块的度量元向量,yi表示第i个模块的标签;
[0119] S4b:从I个模块中踢出采样结果集中的n个模块,然后再随机选取u个模块,所述u个模块构成无标记样本集,记为τu={(x1,y1),…(xi,yi)…,(xu,yu)},其中,yi=0,i=1,2,...u;
[0120] S4c:S4a得到的有标签样本集和S4b得到的无标记样本集构成训练样本集;
[0121] S5:构建预测模型;
[0122] S5a:提出目标函数如下:
[0123]
[0124] 其中,H是由核函数k生成的再生核希尔伯特空间,l(yi,f(xi))和 是加权损失函数,分别见公式(3)和(4),C1和C2是正则化参数,为经验值, 表示训练过程中的预测标签;r是设定的参数,为经验值,其中, 1是全1向量,yi表示真实标签;
[0125]
[0126]
[0127] 其中,C(-1)是错分非缺陷模块的代价,是经验值,C(+1)是错分缺陷模块的代价,为经验值;
[0128] S5b:求解目标函数,得到使目标函数值最小的分类函数f(xi);(该求解过程数学方法,为现有技术);
[0129] S6:从I个模块中踢出训练样本集中的模块后剩余的模块构成待预测集,将待预测集中一个模块的度量元向量输入分类函数f(xi),如果得到值小于0,则该模块被预测为无缺陷,如果得到的值大于0,则该模块被预测为有缺陷;
[0130] 按照上述方式,将预测集中每个模块对应的度量元向量输入所述分类函数,对预测集中的每个模块进行预测,并输出预测结果。
[0131] 本发明的预测方法与现有预测方法的比对:
[0132] 实验数据集
[0133] 本发明采用来自NASA项目的四个公开数据集CM1,KC1,KC2,PC1。各数据集的详细如表1所示。表1中每个数据集均包含22个属性,分别为21个软件属性和一个二值分类属性,二值分类属性用于表明软件模块是否有缺陷。缺陷率是指数据集中有缺陷的软件模块数量占所有模块数量的比率,从表中可以看出,四个数据集的缺陷率在9.8%至20.5%之间,这也证实了软件缺陷数据具有类不平衡特性,大部分数据是不包含缺陷的。
[0134] 表1NASA缺陷预测数据集
[0135]数据集 编程语言 系统 模块数 缺陷数 缺陷率%
cm1 C NASA航天器仪器系统 498 49 9.8
kc1 C++ 存储管理系统 2109 326 15.5
kc2 C++ 科学数据处理系统 522 107 20.5
pc1 C 飞行软件系统 1109 77 6.9
[0136] 为评估本发明方法的性能,在所选的4个NASA数据集上分别与3个基于代价敏感学习的缺陷预测模型和2个基于半监督学习的缺陷预测模型进行对比。3个代价敏感方法分别是CSBNN-WU1,CSBNN-WU,CSBNN-TM,两个半监督模型分别是ACoForest和S4VM。CSBNN-WU1,CSBNN-WU2和CSBNN-TM是由Zheng等人提出的三个不同代价敏感神经网络算法。CSBNN-TM算法是将非代价敏感神经网络的判决边界向代价较低一类样本的边界偏移,从而降低代价较高一类样本被分错类的风险。该算法在训练阶段不做代价敏感处理,而是在预测阶段引入代价敏感信息。CSBNN-WU1和CSBNN-WU2也是神经网络算法的变种,它们在训练过程中根据代价矩阵调整训练数据集中缺陷样本的数量使得模型具有代价敏感性。ACoForest是一个基于主动学习的半监督模型,该算法通过主动学习去采样有助于提高模型性能的样本加入到训练集中。而S4VM则是一个通过提高原始半监督SVM算法安全性的半监督SVM模型。
[0137] 为方便叙述,本发明方法记为CS4VM+S。
[0138] 实验设置
[0139] 对于每个数据集,根据采样率使用本发明提出的采样方法采样少量样本进行标注,然后随机选择部分无标签样本组成训练样本集,剩余样本作为测试集。与有监督代价敏感算法对比实验时,本发明方法的采样率设置为0.3,即从数据集中采样30%的样本进行标注。有监督代价敏感方法则是使用90%标签样本作为训练集,10%作为测试集。与半监督算法对比实验时,分别在采样率为0.1和0.2下对各项指标进行比较。实验结果的每个评估指标值都是通过重复采样、训练、预测等步骤20次,取20次实验结果的平均值作为最终结果。
[0140] 评估指标
[0141] 对于缺陷预测这类二分类问题,混淆矩阵(Confusion Matrix)常被用于衡量模型性能,根据混淆矩阵可以计算出其他评价指标,如准确率(Accuracy)、召回率(Recall)、查准率(Precision),以及综合评价指标F值。
[0142] 表2混淆矩阵
[0143]
[0144] 其中,准确率是指模型预测正确的模块占总模块的比例,软件缺陷预测的目的是尽可能多地预测对模块是否具有潜在的缺陷。TP为有缺陷模块的正确分类数目,FN为有缺陷模块的误分类数目,FP无缺陷模块的误分类数目,TN为无缺陷模块的正确分类数目。
[0145] 准确率计算公式如(a)所示。
[0146]
[0147] 召回率表示正确预测的缺陷模块占真实缺陷模块总数的比例,一个好的预测模型应该是具有较高的召回率,尽可能多地找到有缺陷的模块。召回率计算公式如(b)所示。
[0148]
[0149] 查准率是查准率表示正确预测的缺陷模块占模型预测为缺陷的模块总数比例,计算公式如式(c)所示:
[0150]
[0151] F值查准率和召回率的加权调和平均,综合了召回率和查准率的结果,用于评价模型的综合性能。具体计算公式如(d)所示。
[0152]
[0153] 本发明采用上述四个评价指标衡量本发明方法的预测性能,并与其他方法进行了实验对比。
[0154] 为了更好地评估代价敏感算法的性能,本发明将采用四个被众多代价敏感研究应用的评估指标,它们分别是MR,FPR,FNR,NECM。MR是指错误率,是被误分的软件模块总数占所有模块总数的比率,MR的计算公式如(e)所示。
[0155]
[0156] FPR和FNR分别代表无缺陷模块中被错分模块的比率和有缺陷模块中被错分为无缺陷模块的占比。FNR体现了模型对软件缺陷的敏感程度,而FPR体现了预测模型对不包含软件缺陷的类别的敏感程度。FPR和FNR的具体计算公式如公式(f)、(g)所示。
[0157]
[0158]
[0159] 为了更好地评估代价敏感模型的整体代价,错误分类的预计成本(ECM)常被用作评估指标。ECM的计算方法如公式(h)所示,其中Pndf和Pdp分别表示数据集中非缺陷样本的比率和缺陷样本的比率,C(-1)和C(+1)分别表示非缺陷样本被错分的代价和缺陷样本被错分的代价。
[0160] ECM=C(-1)×FPR×Pndp+C(+1)×FNR×Pdp   (h);
[0161]
[0162] 然而,在真实项目中C(-1)和C(+1)的值不容易确定,因此一个新的评估指标NECM(Normalized Expected Cost of Misclassification)被提出,NECM通过ECM除以C(-1)进行归一化。在本发明实验中,我们也采用NECM去评估模型的整体代价。具体计算如公式(i)所示。
[0163] 结果与分析
[0164] 本发明方法结合了代价敏感学习和半监督学习,在训练过程中使用少量的标签数据和部分无标签数据,并在模型学习过程中综合考虑了两类误分类带来的不同代价,使得预测结果的整体代价最小,而且该模型能够很好地解决类不平衡问题。为了对本发明方法的有效性进行验证,本发明针对以下三方面对模型性能进行验证:
[0165] 1)相对于单纯的代价敏感算法或者半监督算法,本发明方法是否能够提高缺陷预测模型的预测效果?
[0166] 2)误分类代价的设定对本发明方法有什么影响?
[0167] 3)本发明提出的采样方法是否能够提高本发明方法的预测性能?
[0168] 针对问题1),本发明方法与3个代价敏感算法的预测性能进行对比,还对本发明方法与两个半监督算法的预测性能进行了实验对比。
[0169] 图5-8展示了3个代价敏感神经网络Boosting算法和CS4VM+S在四个NASA公共数据集CM1,PC1,KC1和KC2上的各项指标对比。为了更好评估模型对代价的敏感度,本发明采用不同的代价比率(从1到10)下评估模型的性能。实验结果表明CS4VM+S能够取得和三个全监督代价敏感算法相当的预测性能,甚至在一些情况下CS4VM+S优于有监督模型。例如,在CM1数据集上,CS4VM+S在NECM指标上表现明显优于其他算法。而且NECM是能更好地评估代价敏感算法的整体性能的评价指标,在代价敏感学习中应用广泛。实验结果还表明在大多数情况下CS4VM+S比CSBNN-WU1,CSBNN-WU2取得更小的NECM。CS4VM+S在CM1和PC1数据集上表现相对更好,而且数据集CM1和PC1都呈现类极不平衡性,CM1的缺陷率是9.8%,PC1的缺陷率更低,仅有6.9%。例如,当代价比率为2,数据集为CM1时,CS4VM+S的NECM值最小,我们可以看出,在NECM指标方面,CS4VM+S取得和CSBNN-TM几乎相同的值,而明显优于CSBNN-WU1和CSBNN-WU2的结果值。在整体上,CS4VM+S和其他三个算法随着代价比率的变化大体上呈现相同的变化趋势,表明该方法对代价敏感。
[0170] 如图6所示,当代价比率大于5时,CS4VM+S在FNR指标上表现与其他算法相当,甚至优于CSBNN-WU2。在NECM指标上,CS4VM+S算法表现与CSBNN-TM相近,但优于CSBNN-WU2算法,大多数情况下优于CSBNN-WU1算法。在MR和FPR两个指标上的表现,三个算法的结果值相当。
[0171] 如图7所示,当代价比率小于5时,当代价比率大于5时,CS4VM+S在FNR指标上表现明显优于其他算法。在NECM指标上,CS4VM+S算法表现与CSBNN-TM相近,Cost ratio小于4时甚至优于CSBNN-TM算法,而且大多数情况下优于CSBNN-WU2算法和CSBNN-WU1算法。在MR和FPR两个指标上的表现,三个算法的结果值相当。
[0172] 如图8所示,在大多数情况下,CS4VM+S在MR、FNR和NECM指标上表现都优于CSBNN-WU1和CSBNN-WU2,而与CSBNN-TM的结果值十分相近。在FPR指标上,CS4VM+S表现优于CSBNN-WU1,与CSBNN-TM的结果相近。
[0173] 表3-6展示了CS4VM+S和半监督算法ACoForest、半监督SVM算法S4VM+S在不同采样率上各项评价指标的性能对比,每个结果值都是通过20次随机实验的平均值。由于CS4VM+S的Cost ratio是不可缺的一个参数,本发明中当与半监督方法进行性能对比时Cost ratio设定为10。从实验结果可以看出,CS4VM+S在四个NASA数据集上都取得更小的FNR值,更小的FNR值表示缺陷的召回率越高。高的召回率比高的精度在现实项目中更加有用。总体来看,在数据集CM1和PC1上,CS4VM+S相比ACoForest算法和半监督SVM算法获得更高的F值和更低的FNR值。具体来看,CS4VM+S相比ACoForest方法在采样率为0.1时FNR值降低了37.9%,采样率为0.2时FNR值降低提升了58.2%,也就是说,在采样率指标方面CS4VM+S表现优于ACoForest方法;与半监督SVM方法相比,在采样率为0.1时FNR值降低了35.8%,采样率为0.2时FNR值降低了56.7%。总结来说,CS4VM+S由于代价敏感学习的融入使得FNR值降低,也就是说,在该模型上缺陷召回率得到了提高。
[0174] 在整体指标F值方面,在CM1、PC1数据集上CS4VM+S表现优于其他两个半监督模型,而CM1、PC1数据集的缺陷率都比较低,分别只有9.8%和6.9%,实验结果表明CS4VM+S在类极不平衡数据集上整体效果更优。
[0175] 表3采样率为0.1时,与半监督模型ACoForest的性能对比。下划线标注的是更好的结果。
[0176]
[0177] 表4采样率为0.1时,与半监督模型S4VM+的性能对比。下划线标注的是更好的结果。
[0178]
[0179] 柱状图9展示了CS4VM+S与两个半监督模型(ACoForest和S4VM+S)在采样率分别为0.1和0.2时FNR值的对比。从柱状图可以更直观的看出CS4VM+S在FNR指标上表现更优,表明CS4VM+S对缺陷代价更加敏感,提高了预测模型的缺陷召回率。
[0180] 表5采样率为0.2时,与半监督模型ACoForest的性能对比。下划线标注的是更好的结果。
[0181]
[0182] 表6采样率为0.2时,与半监督模型S4VM+的性能对比。下划线标注的是更好的结果。
[0183]
[0184] 综上所述,CS4VM+S能够取得与有监督代价敏感模型(CSBNN-WU1,CSBNN-WU2和CSBNN-TM)相当的预测效果,在MR、FPR、FNR、NECM各项指标各有优劣,CS4VM+S在一些情况下甚至优于有监督代价敏感模型,而该模型只需要少量的标签数据作为训练集。与半监督模型相比,误分缺陷类的代价大于误分非缺陷类带来的代价,CS4VM+S的分类平面向缺陷类倾斜,使得CS4VM+S对缺陷代价敏感性更强,而且结果表明该模型能够获得更高的召回率,这对真实项目更具实际意义。这也表明CS4VM+S能够解决类不平衡问题。
[0185] 针对问题2),本发明设计实验在不同的代价设定情况下评估本发明方法的性能。
[0186] 图10展示了不同的代价设定下,即C(+1)和C(-1)取不同值得情况下,CS4VM+S各项指标变化。同样,C(+1)和C(-1)的不同取值也是根据不同的代价比率来设定的。如图所示,当错分缺陷类的代价值(C(+1))增大时,指标FNR值随之减小,而越小的FNR值表示召回率越大,从原理上我们也不难分析,当缺陷类误分代价在增大时,CS4VM+S的目标是使得整体误分类代价最小,从而CS4VM+S在训练过程中更加关注缺陷类数据,使得CS4VM+S分类平面向缺陷类倾斜,缺陷类的数据分类更加准确。然而,当错分非缺陷类的代价值(C(-1))增大时,指标FPR值随之减小。由于模块中大部分模块式没有缺陷的,随着FPR值增大,也就是非缺陷样本的错误率增大,MR值也随之增大。实验结果表明CS4VM+S对缺陷代价敏感。
[0187] 针对问题3),本发明设计实验在分别使用本发明提出采样方法和随机选择标签样本情况下评估本发明方法的性能。
[0188] 图11展示了在采用本发明提出的采样方法和随机选择样本时CS4VM+S的NECM指标对比。从图中可以看出,在使用本发明提出的采样方法后,在不同的代价率下,CS4VM+S获得更小的NECM值,即获得更小的整体代价。在cm1数据集上表现更为明显,NECM值在使用采样方法后明显减小,降低了近1/3。
[0189] 图12展示了在采用本发明提出的采样方法和随机选择样本时CS4VM+S的FNR指标对比,FNR主要表现了体现了模型对软件缺陷的敏感程度。从图中可以看出,在使用本发明提出的采样方法后,在不同的代价率下,CS4VM+S获得更小的FNR值,即获得更高的召回率,这对缺陷预测模型来说更具有实际意义。如图所示,在CM1和PC1数据集上,FNR值在使用采样方法后有了明显降低,而在KC1和KC2数据集上有所减小但幅度不大。分析可以看出,CM1和PC1数据集中的缺陷率远远低于KC1,KC2数据集中的缺陷率,在缺陷率较低的数据集中,使用随机选择样本的方法使得训练样本中缺陷数据太少以至于模型训练效果不佳,而使用本发明提出的采样方法能够提高训练样本训练集中缺陷数据的比率,从而提高了模型的预测性能,而对于KC1和KC2数据集,缺陷率相对而言不是特别地低,随机选择和使用采样方法时训练集中的缺陷数据相差不是很大,所以预测性能提高幅度不是很大。
[0190] 最后说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的宗旨和范围,其均应涵盖在本发明的权利要求范围当中。