软件缺陷是存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差,其结果是软件运行于某一特定条件时将出现软件故障,这时称软件缺陷被激活。
“缺陷”被认为是“欠缺和不够完备的地方”。软件的欠缺和不完备主要是针对产品说明书而言的。按一般定义,只要软件出现的问题符合下列5种情况的任何一种,就叫做软件缺陷,即: 功能低劣,意外错误;功能超出范围;软件未达到应有目标;软件测试人员认为软件难以理解、不易使用、运行速度慢、和最终用户认为不好使用。
***************
软件缺陷预测模型的功能,可将程序模块的缺陷倾向性、缺陷密度或缺陷数设置为预测目标。
模型构造和预测过程:
第一步: 挖掘软件历史仓库, 并且取出程序模块。选择程序模块的规模大小可根据应用场景, 设置为文件、包、类或函数等。程序模块有:
版本控制系统 (例如 CVS, SVN 或 Git 等),
缺陷跟踪系统 (例如 Bugzilla, Mantis, Jira 或 Trac 等) ,
相关开发人员的电子邮件等.
随后将该程序模块标记为有缺陷模块或无缺陷模块,可用不同颜色标记。
第二步:应用特征对程序模块进行软件度量,建立缺陷预测数据集
在源程序分析和分析开发过程后,设计软件缺陷的相关特征。并且应用特征对程序模块进行软件度量,然后构建缺陷预测数据集.
特征度量元有程序模块的规模、复杂度。度量方法应关注,例如, McCabe 环路复杂度 , Halstead 科学度量 或 CK 度量。
因此一个技术关注和研究方向是:程序模块规模与复杂度的度量方法。 (关注 1)
近些年来, 更多的设计度量元研究工作集中在软件历史存档, 重点关注基于软件开发过程的软件度量, 包括
代码修改角度, 开发人员经验角度(程序设计经验等级), 程序模块间的依赖性角度。项目团队组织构架角度 。
第三步:缺陷预测数据预处理
对缺陷预测数据集进行数据预处理 ,例如噪声移除、特征选择、数据归一化等, 论文应用聚类分析方法,构建缺陷预测模型.
目前大部分建模方法都是机器学习方法. 缺陷预测数据集的质量问题有:部分数据取值遗失或不一致, 以及一些实例存在重复。关注数据集中噪声产生的原因、维数灾难问题以及类不平衡问题。重点是维度灾难问题。
第四步:将预测模型和特征值应用在新程序模块上。
对被测项目的新程序模块, 进行该模块的软件度量, 再基于缺陷预测模型和度量元取值, 完成对该模块的分类, 即有缺陷倾向性模块或无缺陷倾向性模块.。
缺陷度量元特征选择方法
若特征子集里的特征和类标间强相关, 子集中特征间的关联性低, 则该特征子集取得比较好的预测性能.
因此特征选择是解决维数灾难问题的有效方法,现有方法是基于排序和基于子集搜索的两种方法.第一个方法冗余多,开销也不小,第二个方法问题空间搜索难度大。子集搜索方法有算法的搜索策略,集成学习方法等。
算法 1 FECAR 方法
Input: 原有特征集 F, FCR 度量方法 Rel, FFC 度量方法 SU, 选出的特征子集规模 m, 簇的数量 k
Output: 选出的特征子集 S
/* 特征聚类阶段 */
1: for i = 1 to n do
2: for j = 1 to n do
3: 借助 SU 计算特征 fi 与特征 fj 之间的关联性.
#论文建立特征关联性的方法与邻接矩阵类似,所以用两个循环。
4: end for
5: end for
6: 构造出矩阵 M, 其中 Mi,j 表示 C(fi,fj). #特征间关联Mi,j
7: for i = 1 to n do
8: 借助 Rel 计算特征与类标之间的相关性, 并构造向量 V , 其中 Vi 表示 R(fi). #特征与类标的关系R(fi)
9: end for
10: 根据矩阵 M 和向量 V , 将原有的特征集划分成 k 个簇. #根据M和v,将特征集分类,得到k个簇。
/* 特征排序阶段 */
11: for i = 1 to k do
12: 将簇 Ci 中的特征按照 R(fi) 从高到低进行排序. #特征选择用排序方法
13: end for
14: S ←∅
15: for i = 1 to k do
16: 将簇 Ci 中前[(|Ci|×m)/n ]个特征添加到 S. #每个簇的特征
17: end for
18: return S
使用 SU 来度量两个特征之间的关 联性, 使用 IG, CS 或 RF 来度量特征与类标之间的相关性。
聚类分析算法K-Medoids
采用了 K-Medoids 聚类算法来进行聚类分析. K-Medoids 聚类算法
(1)输入是原始特征集和每对特征之间的关联性, 以及需要生成的簇的数量 K, 输出是 K 个聚成簇的特征子集.
(2)算法思想:该算法首先为每个簇选择一个代表特征 (即分类中心); 然后对其余的每个特征, 根据其与每个中心的关联性, 将其分配给关联性最高的中心所代表的簇; 然后不断更新簇的中心, 直至簇内的代表特征保持不变。
论文提出的FECAR方法 以特征之间的关联性作为聚类的标准, 目的是最大化簇内特征的关联性, 因此不存在数据平均值的问题, 所以选择和簇内其他特征关联性最大的特征作为新的代表特征.
代表特征的相关和最大。
度量特征和类标之间的相关性. 常用的特征相关性度量方法可以简单分为 3 类,
第 1 类是基于信息熵的技术, 包括信息增益 (information gain)、信息增益率 (gain ratio)、 对称不确定性 (symmetric uncertainty) 等;
第 2 类是基于实例的技术, 包括 Relief, ReliefF 等;
第 3 类 是基于统计信息的技术, 如卡方值 (chi-square) 等.
论文分别从这 3 类方法中选出一种典型的度量方法, 最终选出的方法包括: 信息增益(特征提供的类标信息量)、卡方值(卡方检验)和 ReliefF.
数据源,选择的项目包括 Eclipse 项目和 NASA 项目. 其中 Eclipse 项目的数据集可以从 Promise 库中下载, NASA 项目中的数据集 kc1 同样可以从 Promise 库中获取, 而 NASA 项目的其他数据集则从 MDP 数据集中获取。
预测目标:软件发布后的缺陷数,包含的特征包括代码行数、环路复杂度和类数量等代码复杂度特征, 以及基于语法树的特征等。
数据预处理方法: (关注2)
(1) 取出所有非数值型的特征;
(2) 取出取值完全相同的特征, 因为这些特征不能提供任何分类信息;
(3) 原有数据集的类标表示的是软件发布后缺陷数, 针对该问题, 将缺陷数大于 0 的模块标记为有缺陷模块, 其他模块则标记为无缺陷模块.
(4)特征离散化。在计算特征关联性时, 需 要对特征进行离散化, 因此我们使用了 MDL 方法 对 Eclipse 和 NASA 项目中的连续型属性进行 了离散化处理.
1.AUC (area under ROC curve) 值来评估不同缺陷预测模型的预测性能.
ROC 曲 线在评估分类器的时候, 综合考虑了不同的分类阈值. 在 ROC 曲线中, 横坐标表示 tpr (true positive rate) 值, 纵坐标表示 fpr (false positive rate) 值, 对每一个分类阈值, 分类器都有对应的 tpr 值和 fpr 值 (即对应坐标系上的一个坐标点). 将所有坐标点连接起来就是该分类器对应的 ROC 曲线. 而 AUC 值则对应的是 ROC 曲线下的面积, 其取值越接近于 1, 则代表对应的分类器性能越好.
2.冗余率 (redundancy rate)
论文提出。
论文采用 Friedman 检验来比较不同特征选择方法的效果差异.
论文选取了 3 类代表性特征选择方法, 作 为 FECAR 的比较对象:
(1) FullSet, (2) IG, CS 和 RF, (3) CFS, FCBF 和 Consist.
(1) FullSet 方法不做特征选择, 即使用原始特征集来构建缺陷预测模型. 与该方法进行对比, 可以研究使用 FECAR 做特征选择是否可以提高缺陷预测性能.
(2) IG, CS 和 RF 这 3 种方法均属于基于排序的特征选择方法, 在排序时分别考虑了信息增益、 卡方值和 ReliefF 等相关性度量方法. 而 FECAR 先对特征进行聚类, 然后再使用信息增益, 卡方值和 ReliefF 对每个簇中的特征进行排序, 我们将使用 3 种不同特征相关性度量方法的 FECAR 分别称为 CIG, CCS 和 CRF. 通过将 CIG 和 IG, CCS 和 CS, CRF 和 RF 进行对比, 我们可以研究特征聚类对 所选特征子集的冗余度的影响, 以及对缺陷预测模型性能的影响.
(3) CFS, FCBF和 Consist分别是 3 种经典的特征选择方法. 其中 CFS 特征选择方法 同时考虑了特征与类标间的相关性以及特征彼此间的关联性, CFS 使用 Best-First 搜索策略来寻找高 相关性低关联性的特征子集. FCBF 也同时考虑了特征与类标的相关性和特征间的关联性, 该方法每次评估一个特征, 因此不需要成对地进行相关性分析. 根据 Yu 等 [42] 的建议, 将 FCBF 中的相关性阈 值设置为 ⌊M/logM⌋, 其中 M 是原始的特征数. Consist 的目的是寻找一个最小特征子集, 使用该子 集的分类效果和使用全集的分类效果一致. Consist 也使用 Best-First 搜索策略进行搜索. 我们将上述 方法与 FECAR 进行比较, 研究它们在构建缺陷预测模型后的性能差异.
Bayes 方法中的 Naive Bayes (NB) 和决策树方法中 的 C4.5.
(1) 与其他 Bayes 方法不同的是, NB 算法假设特征之间条件独立. 即在类标确定的情况下, 特征和特征之间相互独立.
(2)C4.5 在构建决策树的过程中根据特征的信息增益率选择分裂节点特征, 同时使用剪枝方法来防止过拟合问题的出现.
NB 分类器和 C4.5 分类器是缺陷预测领域应用最广泛的分类算法 .
在实证研究中, 使用 Weka 软件包实现NB和C4.5分类器, 并采用默认的参数设置. (关注3)
10 折交叉验证 (10-fold cross validation) 是评估分类方法性能的一种常用方法. 即将数据集划分 为 10 份, 轮流将其中的 9 份作为训练数据, 剩余 1 份作为测试数据 . 上述过程重复 10 次 (即确保每个实例都被预测过一次), 并最终取这 10 次运行结果的平均值.
在每一轮中, 首先不同的特征选择方法根据训练集确定要选择的特征子集, 然后根据该特征子集同时对训练数据和测试数据进行降维处理 (即只保留该特征子集中的特征),
其次根据降维后的训练数据构建缺陷预测模型, 并将该模型应用到测试数据上取得性能结果.
.为了避免数据集中实例次序对结果的影响, 在实验中进一步重复 10 折交叉验证 10 次, 每次 执行前将数据集中的实例随机打乱. 论文将上述验证方法称为 10×10 折交叉验证.
对每一组实验结果, 首先执行 Friedman 检验来验证它们之间是否存在显著性差异, 然后采用 Nemenyi 检验来比较不同方法间的效果。
“ 为了进一步发现两个方法间的差异, 我们统计了两个方法间的 Win/Draw/Loss 信息, 具体来 说: ‘方法 A vs 方法 B’ 的 Win/Draw/Loss 信息包括 3 个值: Win, Draw, Loss. 分别表示方法 A 好于、等于和差于方法 B 的数据集的数量。”
论文的最后是数理统计方法,不再多言。
科研论文的阅读比较困难,原因是既有理论,平时在工作中没有应用和认识,又有课题的方法,包括实证方法,特定的实验方法,因此应该对研究方向的前沿理论逐渐掌握,而且对课题研究的具体方法能有实际的了解。科研论文的阅读不仅能提高编程人员在工作中认识项目的高度,而且能掌握处理遇到问题的理论,能将各种方法应用到程序设计实践中,是有意义的事情。
因为时间有限,仓促中造成的错误,请正常批注评论与指正。
沉默寡言的人内心强大。
--狄拉克