论文部分内容阅读
软件产品已经融入到我们日常生活的方方面面,但是在软件设计、开发、配置等过程中的种种因素导致软件中不可避免存在缺陷。软件模块中隐藏的缺陷威胁着软件产品的安全性,降低了软件产品的可靠性。因此,在交付产品之前,检测并修复有缺陷的软件模块是一项极为重要的软件质量保障活动。然而由于软件规模和复杂性的持续增长,提高软件质量对软件开发和测试人员来说是一项越来越具有挑战性的任务。由于有限的测试资源通常无法支持对所有的代码进行全面的检查,这需要一个优先级次序来更好地分析软件产品。换句话说,软件开发人员和测试人员应该合理地分配宝贵的资源来测试那些高概率包含缺陷的软件模块。为了寻求这种优先级,研究人员提出了软件缺陷预测来识别出这种高风险模块,进而推荐给开发或者测试人员进行优先检查。目前研究地最广泛的缺陷预测方法是基于有监督模型的技术,它首先在有标签的软件模块上训练一个分类模型,然后使用它来识别没有标签的模块是否包含缺陷。基于有监督的缺陷预测模型需要当前项目或外部项目的历史有标签数据作为训练集。根据训练集的来源不同,有监督的缺陷预测可以分为版本内缺陷预测场景、跨版本缺陷预测场景和跨项目缺陷预测场景。这三种场景下训练集分别来自于同一个项目相同版本的数据、同一个项目先前版本的数据和外部其他项目的数据。本论文主要研究基于机器学习的新技术来解决这三种缺陷预测场景所面临的不同问题,目的是进一步提升缺陷预测的性能。具体的研究内容如下:(1)为了学习更具有判别性的特征表示和解决缺陷数据固有的类不平衡问题,本文提出了一个基于核主成分分析和加权极限学习机相结合的版本内缺陷预测框架。该框架首先利用核主成分分析方法分别将训练集和测试集映射到一个高维的特征空间,这种特征映射使得在原始特征空间中线性不可分的模块变得易于区分。然后该框架用映射后的训练集构建一个加权的极限学习机分类模型来预测被映射以后的测试集的标签。该分类模型通过赋予有缺陷和没有缺陷的软件模块不同的权重来解决类不平衡问题。我们在NASA数据集的10个项目和AEEEM数据集的5个项目上进行实验,并用6个指标来评价所提出框架的性能。实验结果表明,我们提出的版本内缺陷预测框架的性能整体上优于其变体方法、对比的特征选择方法和类不平衡学习方法。(2)为了从先前版本数据中选择一个对当前版本的数据来说最优的软件模块子集作为训练集,本文提出了一个基于两步训练子集选择方法的跨版本缺陷预测框架。该框架首先使用稀疏建模表示选择方法过滤掉一些无用的软件模块,保留使重构原始数据误差最小的软件模块。该过程不依靠来自于当前版本的软件模块的辅助,是一个自我约简过程。然后该框架在当前版本数据的参与下,使用基于不相似性的稀疏子集选择方法从上一步选择的模块中再选出一个能够有效表示当前版本数据的模块子集,最后选择的模块子集构建的分类模型对当前版本的数据更有针对性。该过程需要来自于当前版本的软件模块的辅助,是一个辅助精炼过程。我们在PROMISE数据集的17个项目的67个版本数据上进行实验,也用6个指标来评价所提出框架的性能。实验结果表明,我们提出的跨版本缺陷预测框架在50组跨版本点对上的整体性能优于对比的训练子集选择方法以及其基于一步训练子集选择的变体方法。(3)为了进一步缩小两个跨项目数据之间的分布差异,本文通过引入一个先进的平衡分布适应模型,提出了一个新的基于迁移学习的跨项目缺陷预测框架。不同于之前的迁移跨项目缺陷预测模型只考虑跨项目数据间的边缘分布差异,该模型综合考虑跨项目数据间的边缘和条件分布差异。另外,考虑到跨项目数据间相似性程度对这两个分布差异相对重要性的影响,该模型还分配这两个分布差异不同的权重以适应不同的跨项目点对。除此之外,我们也研究了6种不同的数据归一化策略对该跨项目缺陷预测框架性能的影响。我们在NASA数据集的5个项目和AEEEM数据集的5个项目上进行实验,也用6个指标来评价所提框架的性能。实验结果表明,我们提出的跨项目缺陷预测框架在40组跨项目点对上的整体性能优于其他的基于迁移学习和基于训练数据过滤的跨项目模型。综上所述,本论文旨在针对不同的软件缺陷预测场景所要解决的难点问题,结合新的机器学习技术,提出新的框架模型以提高缺陷预测的性能。本论文扩展了机器学习技术在软件工程领域方向的应用,并给软件缺陷预测提供新的解决方案,对软件质量保障活动具有重要意义。