徐 舜
(武汉轻工大学数学与计算机学院 湖北 武汉 430048)
软件已经成为各行业不可或缺的基础设施,影响着人们的生活和工作方式[1]。 然而,随着软件规模和复杂性的不断增加,软件缺陷和质量问题也日益凸显。 软件缺陷作为软件开发过程中不可避免的一部分,可能导致软件功能故障、性能下降和安全漏洞,以及存在数据竞争、内存泄漏、性能不优等,给用户和企业带来巨大的损失和风险[2]。目前,全球范围内每年因软件缺陷而导致的经济损失高达数百亿美元。 在金融领域,由于软件缺陷而引发的交易延误和错误,可能导致巨大的财务损失。 而在医疗行业,软件缺陷可能对患者的安全和健康产生严重影响[3]。 此外,大规模软件项目中的缺陷修复工作也往往耗时费力,导致项目延期和成本超支。
因此,软件质量保证变得至关重要,迫切需要一种有效的方法来预测和识别潜在的软件缺陷[4]。 与传统的人工代码审查和测试相比,机器学习算法在软件缺陷预测和分析中展现出了巨大的潜力。 通过对历史软件项目的数据进行学习和分析,机器学习算法能够发现隐藏在海量数据中的模式和规律,提前预测可能存在的缺陷,从而帮助开发团队在软件交付之前修复问题,提高软件的质量和可靠性[5]。
本研究旨在利用机器学习算法在软件缺陷预测中的应用,探索其在软件质量保证中的作用。 通过收集和分析历史软件项目的数据,结合不同的特征提取方法和机器学习算法,将建立一个预测模型,并验证其在实际软件项目中的有效性。 通过这项研究的深入探索,可以为软件开发过程中的缺陷预测提供新的思路和方法,为软件质量保证工作提供有力的支持。 同时,通过验证预测模型在实际软件项目中的有效性,可以为软件开发人员提供一个可靠的工具,帮助他们更好地进行软件质量保证工作,提高用户满意度。
软件缺陷预测通过提前发现、修复和预防软件缺陷,帮助提高软件质量、节约成本和时间,改进开发过程,能够有效减少软件缺陷的风险,提高用户满意度[6]。 软件缺陷预测旨在通过分析和挖掘软件开发过程中的数据,如代码版本历史、缺陷报告、代码复杂度、代码质量指标等,来预测软件中可能存在的缺陷[7]。 这种基于数据驱动的方法能够更全面地识别潜在的问题,并帮助软件开发人员在软件交付之前采取相应的措施。 采用机器学习算法来处理数据,可以分析各种软件开发数据,并从中学习和挖掘软件缺陷的模式和规律。 然后,这些算法可以利用这些模式和规律来对新的代码进行分类,并预测其中可能存在的缺陷。
软件缺陷预测(software defect prediction, SDP)是一种基于机器学习和数据挖掘技术的方法,用于预测软件开发过程中潜在的缺陷或错误,如图1 所示。 可以帮助软件开发人员和测试人员在软件开发和测试过程中早期发现和修复缺陷的技术。 通过使用机器学习模型,预测模型可以分析从软件记录中提取的特征和度量,并将这些信息与之前观察到的缺陷信息相关联,以预测未来是否会发生缺陷。 软件缺陷预测的整个过程可以分为以下几个步骤。
图1 软件缺陷预测过程
第一,收集软件记录。 从缺陷跟踪系统、版本控制系统、代码审查或电子邮件记录中获取软件记录。 通过收集软件记录,可以获得关于软件开发过程中的关键信息,包括缺陷、代码修改、审查意见和团队沟通等。 这些记录可以用于分析和改进软件开发过程,提高软件质量和开发效率。
第二,创建实例。 实例是从软件记录中提取的对象,通常是源代码文件、类或函数等。 实例由许多度量或特征组成,并标记为缺陷、干净或缺陷数量。 这些度量和特征可以是代码静态和动态分析的结果,也可以是人工定义的特征[8]。
第三,进行预处理。 对实例进行预处理,以便更好地进行机器学习模型的训练和预测。 预处理通常包括数据清洗、数据归一化、标记编码等。 这些预处理步骤能够提高数据的质量和一致性,使得机器学习模型能够更好地进行训练和预测。 在实际应用中,根据数据的特点和具体问题,需要进行适当的调整和组合这些步骤。
第四,训练模型。 使用机器学习算法来训练预测模型。 通常,将数据集分为训练集和测试集。 训练集用于训练模型,测试集用于评估模型的性能[9]。 将可用数据集划分为训练集和测试集可以帮助评估模型的泛化性能、调整模型参数、验证模型选择等。 这也是机器学习中非常重要的步骤之一。
第五,一旦模型完成训练,我们可以利用该模型来预测新的实例是否存在缺陷,以及预测缺陷的数量。 如果模型预测的缺陷数量较高,这可能意味着代码存在潜在的问题,需要开发人员进一步检查和调试。 通过使用训练得到的模型进行缺陷预测,开发人员可以及时发现和解决潜在的问题,提高代码的质量和可靠性。
第六,评估模型性能。 使用各种评估指标来评估模型的性能,例如准确率、召回率、F1 得分等。 这些指标可以帮助我们了解模型的预测能力和效果,以及是否需要进一步改进模型。
第七,优化模型。 根据评估结果,对模型进行优化和改进。 可以尝试不同的特征选择方法、调整模型参数、尝试不同的机器学习算法等。
第八,部署模型。 将优化后的模型部署到实际的软件开发环境中,以实现缺陷预测的自动化和持续集成。 这可以帮助开发团队及时发现和修复潜在的缺陷,提高软件质量和稳定性。
极限学习机(extreme learning machine, ELM)是一种基本的单层前向神经网络,与传统的反向传播算法等基于梯度的前馈网络学习算法不同,ELM 不使用基于梯度的策略。 在该系统中,所有参数一次性调整。 该算法不需要迭代指令。 这种特点可以宣称,隐藏层的输入权重和偏置可以随机选择,而不需要在决定网络参数的过程中进行任何改变,这增加了训练速度并减少了参数调整的时间。
ELM 的工作方式如下:
(1)输入层和隐藏层:ELM 的输入层接收输入数据,隐藏层通过随机选择输入权重和偏置,将输入数据映射到隐藏层的激活函数上。 ELM 最初使用sigmoid 函数或ReLU 函数作为隐藏层的激活函数。 但是,随着研究的深入,人们发现其他激活函数,如高斯函数、tanh 函数等,可以在某些情况下提供更好的性能。 因此,一些扩展的ELM 算法允许用户根据具体问题选择不同的激活函数。
(2)输出层:隐藏层的输出被连接到输出层,输出层使用最小二乘法或其他适当的算法来计算输出权重,通过建立线性方程组以获得期望的输出,从而快速建立模型并进行预测。 这种非迭代的训练过程大大加快了ELM 的训练速度,并且在许多实际问题中表现出了良好的泛化能力。
(3)训练过程:ELM 的训练过程是非迭代的,即只需一次性确定随机选择的参数。 隐藏层的权重和偏置以及输出层的权重可以通过解一个线性方程组得到,这大大加快了训练速度。 相比于传统的迭代算法,ELM 能够在短时间内建立模型并进行预测,这使得它在处理大规模数据集和实时应用中具有一定的优势。
通过使用ELM 算法,可以快速训练单层前向神经网络,从而实现高效的模型训练。 ELM 算法的特点是简单且不依赖于梯度下降等迭代过程,这使其具有快速学习速度和较低的参数调整时间。 ELM 在某些应用领域具有广泛的应用,特别是在大数据和实时处理方面,能够提供高效的学习和预测能力。
本文采用了Eclipse 程序存储库版本控制系统和缺陷跟踪的数据集,分别针对2.0、2.1 和3.0 版本。 以下是关于这两个部分数据的简要总结。
(1)从特定版本的软件中收集变更日志详细信息需要收集与该软件特定版本相关的所有缺陷ID。 将版本控制系统转换为缺陷56789、r56789 或修补到r5678 是更可取的方式。 缺陷ID 和相关事项包含在这些执行记录中。如果只获取包含预测ID 的增加级别,那么数据就不准确,其关键是提高结果的可靠性。
(2)根据所获得的缺陷ID 在版本控制系统中查找基于版本的详细信息。 报告中任何包含版本的缺陷都涉及到确定缺陷所在的版本。 然而,在软件的生命周期中,这些细节可能会发生变化。 最终,可能会得到该数据的多个版本。
(3)使用Eclipse 插件Metrics 1.3.6 计算存在的软件包和文件的软件度量,并进行预测。 最终数据选择CSV格式进行存储。 该文件中每一行都记录了文件的详细信息,每个字段之间使用逗号进行分隔。 其中包括组件和文件名,缺陷数量和缺陷数量报告后提供的文件和不同的值。
本文中使用的数据集是基于软件包的数据集,每个软件包都有相似的数据文件,每个文件包括发布前的缺陷量、发布后的缺陷量和度量值,本文使用的度量集包括软件复杂度度量、软件规模度量和面向对象度量。 在2.0 版本中,基于软件包的记录总数为377 条。 在2.1 版本中,基于软件包的记录总数为7888 条。 在3.0 版本中,基于软件包的记录总数为10593 条。 为了提高有效性,选择工作更好的分类器,或者使用仿生算法来提供大规模数据。而从数据的角度来看,本文中的样本规模量可以提供有效的实验结果[10]。
与传统的前馈网络学习算法(如反向传播算法)不同,ELM 不采用基于梯度的学习策略,所有参数一次性整定,不需要迭代指令,其特点是在确定网络参数的过程中,输入权值和隐层偏差可以随机选择,而不需要任何改变,提高了训练速度,减少了参数的调整时间。 ELM 的计算方法具体如公式(1)所示:
式(1)中,L是隐藏单元的数量,N是训练样本的数量,w是输入和隐藏层之间的权重向量,g是激活函数,b是通孔向量,并且x是输入向量。
本文中使用Python 的Pandas 库,来构建数据库以便于进行分析,使用Python 的Scikit-learn 库来构建一个预测模型,使用Python 构建模型的另一个好处是可以评估和分析这个模型的不同方法,并找到预测目标的最佳模型。
通过设计实验过程,最终得到的结果如表1 所示。 在该表中,“training”表示训练数据集,“testing”表示测试数据集,“ACCURARY”表示正确率,“RECALL”表示召回率,“PRECISION”为准确率,“AUC”为ROC 所形成的曲线面积。 根据表1 可得,在整体性能和AUC 方面,Package 3.0模型表现最好。 但是在特定的测试中,其他模型也可能表现出更好的准确率或召回率。
表1 基于软件包的预测结果ELM 模型
近几年来,软件测试在软件可靠性研究中的地位越来越重要,然而,在软件测试中,浪费了大量的时间、资源和金钱。 软件缺陷预测可以帮助提高软件测试的效率,指导软件测试资源的直接分配。 本文讨论了软件缺陷预测的定义和流程,提出了软件缺陷预测的概念。 本文的研究数据来源于Eclipse 软件开发库和Eclipse 插件,利用Eclipse、插件计算了基于软件包的软件度量,并利用Python 开发了基于ELM 算法的缺陷预测模型,并利用这个模型对软件包进行了缺陷预测。 实验结果最终表明,ELM 是比较适合软件缺陷预测的模型,这将为软件测试资源预测提供指导。