论文部分内容阅读
基于度量元的软件缺陷预测是利用软件模块的各种特征(如代码长度、代码变化等)构造模型,用于预测新的软件模块的缺陷相关信息。最为常见的预测目标包括预测软件模块是否含有缺陷,以及预测软件模块含有缺陷的个数。模型预测的软件模块的缺陷相关信息不但能反映软件模块的质量,还能用于指导测试资源的分配。比如,通过预测新的软件模块是否含有缺陷,我们可以只对含有缺陷的软件模块进行测试,从而节省检测正确软件模块的资源。根据软件缺陷预测的目标,目前基于度量元的软件缺陷预测技术大致分为两类:分类任务的软件缺陷预测技术和排序任务的软件缺陷预测技术。本文根据两类软件缺陷预测技术的不同研究现状,分别对它们进行研究。分类任务的软件缺陷预测的目的是预测软件模块是否含有缺陷,从而引导软件开发人员对含有缺陷的软件模块进行检测。分类任务的软件缺陷预测模型不但要求较高的缺陷模块检测率,并且要求较低的资源浪费率(错误预测正确模块所引起的资源浪费率)。而这二者往往是冲突的。并且,不同的应用对缺陷模块的检测率、能允许的资源浪费率的要求并不相同。当前的研究往往以二者的折中为目标构造预测模型,这样构造的模型不一定满足实际应用对二者的具体要求。于是,本文提出将缺陷模块检测率以及模型引起的资源浪费率看成两个目标,并使用多目标方法Non-dominated Sorting Genetic Algorithm (NSGA)-Ⅱ结合代价敏感支持向量方法,同时优化这两个目标,构造一组缺陷模块检测率不同且相应的资源浪费率较低的模型。实验证明,这样的方法不但能构造出多样性的模型以满足不同应用的不同要求,并且当缺陷模块检测率以及资源浪费率的折中一定时,这种方法也能构造出比单目标学习方法更好的模型。排序任务的软件缺陷预测模型适用于测试资源未知的情况——测试资源少时,只对含缺陷个数很多的软件模块进行测试;当测试资源多时,含缺陷个数较少的软件模块也能得到测试。对于此类软件缺陷预测模型而言,精准地预测软件模块所含的缺陷个数是不必要的,在数据质量不高的情况很难做到。换句话说,排序任务的软件缺陷预测关注的是模型给出的模块排序。然而,目前排序任务的软件缺陷预测模型的主要构造算法是回归或者分类算法,由最小二乘法或者最大似然法得到,以拟合度为目标。这样构造排序任务的软件缺陷预测模型存在的问题是,拟合度好的模型给出的模块排序不一定好。因此,本文提出排序学习算法,即通过直接优化软件缺陷预测模型的排序性能来构造模型。实验结果表明,与最小二乘法、最大似然法相比,直接优化模型的排序性能得到的预测模型能给出更好的模块排序,特别是在软件度量元个数较多的情况。并且,与现有方法的比较进一步证明了排序学习算法在构造排序任务的软件缺陷预测模型的优势。软件缺陷预测主要包括两个部分:数据和建模。软件缺陷预测的数据是根据软件特征(即软件度量元)进行收集,所以数据的质量由度量元决定。随着软件的发展,越来越多的度量元被引进。这些度量元的建模有效性也受到了关注。现有的针对排序任务的软件缺陷预测进行的度量元分析方法主要有两种——不同类别度量元的对比分析以及相关系数分析。不同类别的度量元的对比分析无法反映具体哪个度量元对建模有效,而相关系数分析则不一定能反映度量元的建模有效性。于是,本文提出使用针对排序任务的度量元分析方法,并在两组公开数据集上对度量元进行综合研究。分析表明,相比现有的方法,针对排序任务的度量元分析方法更适合研究度量元构造排序任务软件缺陷预测模型的有效性。实验结果表明在这两组数据集上,最佳建模的度量元个数依赖于建模方法和数据集,且对于建模最有效的具体度量元也依赖于数据集。