基于机器学习的软件缺陷倾向性预测研究
作者: 颜慧
摘要:为了能尽早发现软件中存在的缺陷,使用传统的机器学习方法来预测软件模块的缺陷倾向性,选取了NASA公开数据集中的部分数据集,针对软件缺陷预测中类不平衡的问题,分别采取了随机欠采样和随机过采样的方案,再使用逻辑回归算法和随机森林算法分别对数据集进行训练和预测,使用了查准率(Precision)、查全率(Recall)、ROC曲线下面积(AUC)作为模型的评价指标,并给出了对比实验的结果。
关键词:机器学习;软件缺陷预测;倾向性预测;逻辑回归;随机森林
中图分类号:TP311.5 文献标识码:A
文章编号:1009-3044(2022)07-0067-04
1 引言
随着软件行业的快速发展,软件数量剧增,软件的形式趋于多样化,而且软件的复杂程度不断提高、规模不断增大,软件开发人员人数增多,软件质量问题日益突出。软件缺陷是影响软件质量的关键因素,而软件质量问题又是导致软件危机的重要原因。软件缺陷是指软件中存在的错误或故障,在软件的开发过程中难免会在软件产品中隐藏许多缺陷,这些缺陷有可能会导致软件系统不能正常运行,严重的甚至会导致财产、人身安全的重大损失。
如果能尽早发现软件中存在的错误并尽早修正这些错误,就可以避免在实际运行时发生错误而导致的损失,而且能减少开发的成本和时间,提高软件质量,减少软件危机带来的影响。如何充分做好软件的测试工作,保障软件质量,提高软件的可靠性,是软件工程中的一个重要研究课题。
随着人工智能技术的发展,如果能在传统的软件工程方法学中结合机器学习及深度学习等先进的技术来预测软件缺陷,尽早地预测出软件中哪些模块可能存在缺陷、缺陷数量、缺陷的严重程度等,就可以提高软件测试的智能化程度,给软件质量提供有力的保障,并在一定程度上缓解软件危机。在企业的实际应用中,通过机器学习技术来预测软件缺陷,通过对软件缺陷的严重程度进行排序,优先处理较严重的软件缺陷,就可以在有限的时间、成本、人力等资源限制之内,优化资源的分配,提高软件测试的效率及效果,提升软件质量,节约企业的成本,提高项目的成功率。
软件缺陷预测是软件工程领域的热点问题,国内外众多学者对软件缺陷的预测进行了研究,提出了多种研究方法并取得了丰富的研究成果,比较常见的技术是使用统计学和机器学习(包括深度学习)的技术来进行软件缺陷预测[1]。
预测软件模块缺陷的倾向性就是预测软件模块中是否存在软件缺陷,这是一个二分类问题。在预测软件模块缺陷倾向性时,常用的算法有逻辑回归、SVM(支持向量机)、贝叶斯网络、决策树、集成学习、神经网络等有监督学习算法,K-means、谱聚类等无监督学习算法,基于图、主动半监督学习、半监督字典学习方法等半监督学习算法[2]。
目前已经有一些公开的软件缺陷库可供研究,但是这些数据集中普遍样本数较少,且在数据集中存在严重的类不平衡问题,因此本文主要采用传统的机器学习方法来研究软件缺陷的倾向性预测的问题,并对比各机器学习算法的实验结果。
2 方案设计
方案设计的总体思路是先选取合适的数据集,在程序中读取数据集中的数据,使用数据可视化等方法和手段去观察和分析数据集中样本的情况,例如样本是否存在缺失值、异常值,是否存在类不平衡的问题等。根据观察的结果对读取的数据进行预处理,如果存在缺失值和异常值的情况,则对缺失值进行填充,异常值进行删除或者是根据一定的策略,用均值或上下样本的值进行替换;如果样本中存在类不平衡的问题,则需要对样本进行上采样或下采样,使得数据集中的样本基本达到类平衡。之后根据具体的问题选择合适的机器学习模型及模型评价指标,对数据集进行划分之后,使用训练集对机器学习模型进行训练,使用验证集调整模型参数,最后使用测试集对模型的效果进行评价。通过对比模型的评价指标得分,从中选取最适合的机器学习模型来对实际应用中软件的缺陷倾向性进行预测。
2.1 数据集
软件缺陷数据集按来源可分为商业数据集和公共数据集这两大类。因为商业数据集一般不易获得,因此研究人员常用的公共软件缺陷数据集,包括NASA、PROMISE等软件缺陷数据集。使用公共数据来进行研究,有利于实验复现。
文中使用的数据集是NASA软件缺陷数据集,从中选取了12个数据集作为实验数据。在NASA软件缺陷数据集中,每个无缺陷的模块对应一条标记为无缺陷的样本,每个有缺陷的模块对应一条标记为有缺陷样本。通过对这些数据集中的样本进行统计分析,得到每个数据集中的样本数、特征数、无缺陷模块数、有缺陷模块数以及缺陷率如表1所示。
根据帕累托法则,在软件中,约有80%的错误集中在20%的代码中,因而在大部分的软件缺陷数据集中,大部分模块是无缺陷模块,只有少部分模块是有缺陷模块,并且无缺陷模块的数量要远大于有缺陷的模块。从表1中的12个软件缺陷数据集的统计数据中也可以较直观地看出,在NASA大部分的软件缺陷数据集中,无缺陷样本数要远大于有缺陷样本数。因此,在软件缺陷的预测问题中,类不平衡的问题格外突出。在数据集中存在类不平衡,就会产生误报和漏报的问题。在进行软件缺陷预测时,将有缺陷样本预测为无缺陷样本,就会导致漏报;而将无缺陷样本预测为有缺陷样本,就会产生误报。而漏报和误报的代价是不同的,误报会导致在测试时增加测试人员、测试时间等成本,而漏报则会在软件交付给客户之后产生不可预计的后果。因此,需要在软件缺陷预测的过程中处理类不平衡的问题。
2.2 数据预处理
数据预处理部分主要包括异常值处理、降维处理、类不平衡处理、数据差异处理等。异常值处理又包括异常值的检测和异常值处理。异常值的检测可以通过可视化的方法来初步判断哪些是异常值,常用的工具有散点图、箱线图等。异常值的处理有删除、填充等方式,可以根据阈值将异常值删除,或用上下样本的正常值进行填充。
文中首先对数据集中的样本进行缺失值、异常值、标准化等常规的预处理之后,再根据软件缺陷预测问题中类不平衡的问题,在数据层面上再对数据进行进一步的处理。
在处理类不平衡问题时,目前的研究主要从数据层面和算法层面来处理[3]。从数据层面处理类不平衡问题,主要有抽样法和数据集划分法等。在算法层面处理类不平衡问题,主要有代价敏感法、集成学习法、阈值移动法等。本文采用随机过采样和随机欠采样的方法来处理软件缺陷数据集中类的不平衡问题,分别通过随机过采样和随机欠采样的方式获取两个处理之后的数据集,再用相同的模型去进行训练,然后比较两种方案的实验结果。
在随机欠采样方案中,首先计算出数据集中标记为有缺陷样本的数量,然后在标记为无缺陷的样本中,随机选取与有缺陷样本同样数量的样本,再将有缺陷样本和无缺陷样本进行组合得到下采样之后的数据,在这个基础上进行模型的训练与预测。
在随机过采样方案中,采用的是SMOTE过采样技术,使用SMOTE算法来生成新的标记为有缺陷的样本,与之前的样本进行合并,从而得到随机上采样之后的数据集,达到类之间的基本平衡。
2.3 选取评价指标
预测软件缺陷倾向性是一个二分类问题,在分类问题中评价模型预测性能时常用的评价指标有Accuracy(准确率)、Precision(查准率)、Recall(查全率)、AUC(ROC曲线下面积)等[4]。本文选取Precision(查准率)、Recall(查全率)、AUC(ROC曲线下面积)作为模型的评价指标。
对于二分类问题,分类结果常用混淆矩阵来表示,如表2所示。
其中TP代表真正例的数量,FP代表假正例的数量,TN代表正反例的数量,FN代表假反例的数量。
查准率Precision表示在所有预测为正例的样本中,真正例的比例。其定义如式(1)所示:
查全率Recall表示在所有正样本中,预测正确的比例。其定义如式(2)所示:
把数据集中标记为无缺陷的软件模块作为正例,标记为有缺陷的软件模块作为反例,则P表示在所有预测为无缺陷样本中,标记为无缺陷样本的比例。R表示在所有标记为无缺陷样本中,将标记为无缺陷样本预测为无缺陷样本的比例。
因为在进行软件缺陷预测时,需要比较多个学习器的性能,因此选取了AUC作为模型的一个评价指标。在进行多个学习器性能的比较时,常用的指标是AUC(ROC曲线下面积)。ROC曲线是以“真正例率”和“假正例率”作为坐标系的纵轴和横轴进行绘制,AUC代表ROC曲线下的面积。AUC越大,则学习器的性能越好。
2.4 逻辑回归模型
逻辑回归(Logistic Regression)是做分类任务时一种比较基础的机器学习算法,因为软件缺陷倾向性问题是一个二分类问题,因此可以使用逻辑回归模型去解决软件倾向性预测的问题。
在线性回归模型中,使用输入样本的特性的线性组合来产生预测值,如式(3)所示:
在二分类问题中,在线性回归模型的基础上,逻辑回归模型中使用了Sigmoid函数将线性回归模型中得到的预测值映射到[0,1]区间,完成了从预测值到概率值的转化,从而可以得到相应类别的预测概率值。Sigmoid函数如式(4)所示:
逻辑回归模型可以直接对样本属于各类别的可能性进行建模,并且得到各类别相应的概率预测。
2.5 随机森林模型
随机森林(Random Forest)是一种集成学习算法,以决策树作为基学习器,使用Bagging进行集成,构建出泛化能力更强的学习器。随机森林由多棵决策树组成,每棵决策树从样本的属性集合中,随机选择一个包含k个属性的子集,再从中选出最优属性用于划分,最后在预测分类时,根据每棵树的结果来投票决定样本所属的类别。随机森林算法比较简单,也有不错的性能表现。
文中选取了以上两种传统机器学习算法来建立软件缺陷的预测模型,并对比两种算法在两种采样方案中的性能。
3 实验结果分析
实验在Anaconda3环境下,采用Python语言编写,完成程序的编写和调试。首先对数据集按照上采样和下采样两种方案进行处理,在两种方案下重新构造类平衡的数据集,然后将新构造的数据集划分为训练集和测试集,分别使用了逻辑回归算法和随机森林算法使用训练集对模型进行训练,使用测试集来进行预测得到最终预测结果,对预测结果使用之前选定的Precision(查准率)、Recall(查全率)、AUC(ROC曲线下面积)等指标进行评分,并对实验的结果进行对比分析。
3.1 随机欠采样方案
在随机欠采样方案中,在标记为无缺陷的样本中,随机选取与有缺陷样本同样数量的样本,再将有缺陷样本和无缺陷样本进行组合,得到新的类平衡的数据集[5]。由于软件缺陷数据集中存在类不平衡问题,标记为无缺陷样本数要相对多于标记为有缺陷样本数,因此得到新数据集中的样本数就会较少。
3.2 随机过采样方案
在随机过采样方案中,使用SMOTE算法[6],对标记为有缺陷的少数样本进行分析,生成新的标记为有缺陷的样本,与原先的标记为无缺陷样本合并为新的类平衡的数据集,在此基础上进行模型的训练。由于标记为无缺陷样本数量较多,因此合成之后的新数据集中的样本数会增多。
3.3 实验结果分析
根据实验结果数据,绘制出Recall值对比的折线图如图1。
绘制出Precision值对比的折线图如图2所示。
从实验结果可以看出,随机上采样方案的总体性能优于随机下采样方案。这是由于随机欠采样生成的新数据集样本数量较少,模型训练不充分,存在欠拟合现象。而在随机过采样方案中,合成了新的标记为有缺陷的样本,新的样本集数量增多,减少了模型欠拟合的风险。