1.论文的创新
1.1 摘要阅读理解
论文摘要 软件缺陷预测通过挖掘软件历史仓库, 构建缺陷预测模型来预测出被测项目内的潜在缺陷程序模块. 但有时候搜集到的缺陷预测数据集中含有的冗余特征和无关特征会影响到缺陷预测模型的性能. 提出一种基于聚类分析的特征选择方法 FECAR. 具体来说, 首先基于特征之间的关联性 (即 FFC), 将已有特征进行聚类分析. 随后基于特征与类标间的相关性 (即 FCR), 对每个簇中的特征从高到低进行排序并选出指定数量的特征. 在实证研究中, 借助对称不确定性 (symmetric uncertainty) 来计算 FFC, 借助信息增益 (information gain)、卡方值 (chi-square) 或 ReliefF 来计算 FCR. 以 Eclipse 和 NASA 数据集等实际项目为评测对象, 重点分析了应用 FECAR 方法后的缺陷预测模型的性能, FECAR 方法选出的特征子集冗余率和比例. 结果验证了 FECAR 方法的有效性.论文的研究主题
软件缺陷预测模型的构建。论文的研究方法
(1)目前方法的不足。 传统方法:预测。对挖掘软件历史仓库,以构建缺陷预测模型。 不足:缺陷预测数据的无关特征。 可知论文分类:数据挖掘应用在软件缺陷。关键字:软件缺陷、数据挖掘。 (2)提出新的方法,聚类分析的特征选择方法,命名为FECAR。选择特征的新方法:聚类分析。 *聚类分析特征间的关联,得到多个簇。 *根据特征与类标的相关性,对每个簇中的特征进行排序,得到簇的特征。 *实证分析。对簇中特征的关联性进行调整,借助多个数据挖掘、统计分析的方法。分析模型的性能和特征子集的优度。 数据的实证分析实现了方法的有效性验证。 关键字:聚类分析,特征选择。1.2 论文创新
论文主题:软件缺陷预测
通过分析软件代码或开发过程, 设计出与软件缺陷相关的度量元 (metrics), 随后通过挖掘软件历史仓库 (software historical repositories) 来创建缺陷预测数据集. 最后基于上述搜 集的缺陷预测数据集, 构建缺陷预测模型, 并用于预测出被测项目内的潜在缺陷程序模块. (1)创建软件开发过程中的软件缺陷度量元(特征),包括软件分析的结果,建立缺陷预测数据集。即:数据挖掘技术中的样本数据集创建过程。 度量元特征存在维度灾难问题。 (2)构建缺陷预测模型 (3)应用在被测项目中,预测潜在程序模块中的缺陷。 (4)在大量特征中辨别异常和无用值,并且提高数据集的有效性,所谓数据选择过程。 ************** 软件缺陷的定义:软件缺陷是存在于软件(文档、数据、程序)之中的那些不希望或不可接受的偏差,其结果是软件运行于某一特定条件时将出现软件故障,这时称软件缺陷被激活。
“缺陷”被认为是“欠缺和不够完备的地方”。软件的欠缺和不完备主要是针对产品说明书而言的。按一般定义,只要软件出现的问题符合下列5种情况的任何一种,就叫做软件缺陷,即: 功能低劣,意外错误;功能超出范围;软件未达到应有目标;软件测试人员认为软件难以理解、不易使用、运行速度慢、和最终用户认为不好使用。
***************
2.软件缺陷预测模型的构造过程
软件缺陷预测模型的功能,可将程序模块的缺陷倾向性、缺陷密度或缺陷数设置为预测目标。
模型构造和预测过程:
第一步: 挖掘软件历史仓库, 并且取出程序模块。选择程序模块的规模大小可根据应用场景, 设置为文件、包、类或函数等。程序模块有:
版本控制系统 (例如 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.
3.实证
数据源,选择的项目包括 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 折交叉验证
( 关注4)
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 的数据集的数量。”
论文的最后是数理统计方法,不再多言。
科研论文的阅读比较困难,原因是既有理论,平时在工作中没有应用和认识,又有课题的方法,包括实证方法,特定的实验方法,因此应该对研究方向的前沿理论逐渐掌握,而且对课题研究的具体方法能有实际的了解。科研论文的阅读不仅能提高编程人员在工作中认识项目的高度,而且能掌握处理遇到问题的理论,能将各种方法应用到程序设计实践中,是有意义的事情。
因为时间有限,仓促中造成的错误,请正常批注评论与指正。
沉默寡言的人内心强大。
--狄拉克