APP下载

基于Weka的软件缺陷预测研究与应用

2020-05-19郭江峰曲豫宾

河南科技 2020年8期
关键词:机器学习

郭江峰 曲豫宾

摘 要:在软件开发过程中,软件缺陷预测能预先识别存在的潜在缺陷模块,大幅减少测试所需的人力、物力,优化测试资源分配,提高测试效率和软件产品质量。软件缺陷预测技术不仅具有重要的研究意义,更具有重要的应用价值。基于Weka数据挖掘平台,本研究使用NASA缺陷数据集进行了软件缺陷预测,在合理选择机器学习算法、科学设置参数的情况下,取得了良好的软件缺陷预测结果。

关键词:软件缺陷预测;度量元;机器学习;Weka

中图分类号:TP311.52文献标识码:A文章编号:1003-5168(2020)08-0014-05

Research and Application of Software Defect Prediction Based on Weka

GUO Jiangfeng1,2 QU Yubin1

(1.Jiangsu College of Engineering and Technology,Nantong Jiangsu 226007;

2.Kizilsu Vocational Technical College,Atushi Xinjiang 845350)

Abstract: In the process of software development, software defect prediction can identify the potential defect modules in advance, greatly reduce the human and material resources needed for testing, optimize the distribution of testing resources, and improve the testing efficiency and software product quality. Software defect prediction technology not only has important research significance, but also has important application value. Based on Weka data mining platform, the software defect prediction was carried out by using NASA defect data set in this study, and good software defect prediction results were obtained under the condition of selecting machine learning algorithm reasonably and setting parameters scientifically.

Keywords: software defect prediction;metrics;machine learning;Weka

随着科学技术和社会经济的快速发展,计算机技术在各个行业得到了广泛应用,计算机软件(系统)与人们的工作、生活也越来越紧密,软件质量和系统可靠性对生产和管理活动的效率和安全性的影响也越来越大[1]。但是,随着人们对软件需求的不断增长,软件规模变大,复杂程度增加,软件的开发与维护难度越来越大。隐含缺陷的软件在运行过程中可能会产生软件失效或系统崩溃,严重的软件缺陷会给企业带来巨额的经济损失,甚至可能引发人员伤亡[1-2]。

用户需求不明确、软件开发过程不规范、软件开发人员经验与能力不足等原因,均会导致软件缺陷的产生。为保证软件质量,软件测试人员会通过一定的软件测试方法对软件缺陷进行排查,然后通知开发人员对软件缺陷进行处理。然而,受软件项目的开发进度和成本控制等实际因素的影响,软件测试工程师无法对所有软件模块进行完全覆盖测试。

1 软件缺陷预测的定义与研究意义

随着人们对计算机软件的依赖程度越来越大,如何有效提高软件质量成为软件工程领域研究的重點和难点。传统的软件质量保障手段(如静态代码审查或动态软件测试)效率低下,需要大量的人力、物力,而且需要额外对代码进行插桩等修改操作[3]。软件缺陷预测技术逐渐成为软件工程领域的研究热点之一[4-12]。

软件缺陷预测,一般是指通过分析软件源代码或开发过程,设计出与软件缺陷存在相关性的度量元,然后对软件历史仓库进行挖掘分析来创建缺陷预测数据集。基于缺陷预测数据集,使用特定的建模方法(如机器学习)构建缺陷预测模型,基于预测模型对软件后续版本中的潜在缺陷模块进行预测分析[13]。

软件缺陷预测能大幅度减少测试所需的人力、物力,并且无须额外对代码进行插桩等修改操作。软件部署前、模块开发结束后可以及时开展缺陷预测,预先识别出潜在缺陷模块,便于项目主管优化测试资源分配,提高测试效率和软件产品质量。因此,研究软件缺陷预测技术,构建软件缺陷预测模型,提前预测识别软件中的缺陷,不仅具有重要的研究意义,更具有重要的应用价值。

2 软件缺陷预测方法

根据软件缺陷预测方法的不同,可将其分为静态预测和动态预测[6]。静态预测主要将软件代码量化为静态特征,对这些特征和历史缺陷信息进行统计分析,挖掘历史缺陷的分布规律并构建预测模型,然后基于预测模型对新的程序模块进行预测。动态预测则是对软件缺陷发生的时间进行分析,挖掘软件缺陷与其发生时间之间的关联。目前,随着机器学习算法的广泛应用,静态软件缺陷预测不断取得良好的预测结果,受到了研究者的更多关注[14-15]。

2.1 软件缺陷预测过程

软件缺陷预测过程可分为四个阶段,如图1所示[16]。

2.1.1 程序模块抽取。对软件历史仓库进行挖掘分析,从中抽取出程序模块。程序模块的粒度可设置为文件、包、类、函数等。抽取出模块后,将这些程序模块分别标记为有缺陷模块或无缺陷模块。

2.1.2 设计度量元。基于软件静态代码或软件开发过程,设计相应的度量元,通过这些度量元对程序模块进行软件度量,并构建出缺陷预测数据集。

2.1.3 构建缺陷預测模型。对缺陷预测数据集进行必要的数据预处理之后,借助特定的建模方法(如机器学习方法)构建出软件缺陷预测模型。

2.1.4 缺陷预测。使用构建好的软件缺陷预测模型对新程序模块进行预测分类,将程序模块预测为有缺陷倾向性模块或无缺陷倾向性模块。预测目标也可以是程序模块含有的缺陷数或缺陷密度。

2.2 度量元设计

度量元的设计是软件缺陷预测研究中的核心问题[17]。典型的度量元包括代码行数、McCabe环路复杂度和Halstead科学度量等。将McCabe环路复杂度作为度量元主要考虑程序的控制流复杂度,其假设条件是如果程序模块的控制流复杂度越高,含有缺陷的可能性也越高[18]。将Halstead科学度量作为度量元主要考虑程序内操作符和操作数的数量,其假设条件是如果程序模块中的操作符和操作数越多,导致代码的阅读难度越大,含有缺陷的可能性越高[19]。

除了基于软件代码设计度量元之外,部分研究者基于软件开发过程进行度量元的设计[20-21]。基于软件开发过程主要考虑软件项目管理、开发人员经验、代码修改特征等方面。基于哪一种方式设计度量元更能有效构建缺陷预测模型,研究人员对此进行了比较研究。Graves[22]、Moser[21]等人研究认为,基于开发过程设计出的度量元更为有效。而Menzies[23]等人研究认为,基于静态代码的度量元可以构建出高质量的缺陷预测模型。可以看出,两者并无明显的优劣之分,合理地设计度量元,都能取得良好的预测效果。

2.3 缺陷预测模型构建与应用

在构建缺陷预测模型之前,根据数据集的质量,可能需要先进行缺陷预测数据集的预处理。这是因为数据集可能存在噪声、维数灾难和类不平衡等问题,预处理可以提高数据集的质量[24]。

数据集经过预处理后,借助一定的算法来构建缺陷预测模型。作为人工智能和数据科学核心的机器学习,在软件缺陷预测领域得到了广泛应用,通常被选用为构建软件缺陷预测模型的算法。常用于软件缺陷预测的机器学习方法可分为分类方法和回归方法。分类方法主要包括分类回归树、朴素贝叶斯、K-最近邻、支持向量机、集成学习和聚类分析等;回归方法主要包括线性回归、多项式回归、逐步回归和弹性回归等。

使用构建的软件缺陷预测模型,就可以对新数据(测试集)进行测试并得出预测结果,预测目标可以是模块内是否含有缺陷、含有的缺陷数量或缺陷密度等。

3 基于Weka的软件缺陷预测应用

Weka是由新西兰怀卡托大学开发的数据挖掘工具,内含了大量的机器学习算法,可以实现数据的预处理、分类、回归、聚类、关联规则以及可视化等功能。

本文试验数据采用美国国家航空航天局(NASA)缺陷数据集。里面包括12个项目的缺陷数据集,其中每个数据集都对软件系统中的功能模块进行了标记,分别标记为有缺陷模块和无缺陷模块。数据集的缺陷率为0.78%~35.2%,数据集的模块总数范围为125~16 962,数据集基本信息如表1所示。

3.1 数据集加载与预处理

在“Preprocess”选项卡中,单击“Open file”命令按钮,选择指定的数据集。Weka默认的数据格式为“*.arff”。

加载完数据集后,如果数据集中问题数据较多,则不能直接进行数据挖掘模型的训练和学习,必须进行数据预处理。数据预处理一般可分为数据清理、数据集成、数据变换、数据归约4个方面。这些预处理都可以使用Weka提供的过滤器(Filter)来实现,Filter又可分为非监督学习和监督学习两种过滤器。

3.2 指定分类器

选择“Classify”选项卡,点击“Choose”按钮,展开“Classifiers”后可以看到bayes、functions、lazy、meta、misc、rules、trees,共7种类型,每种类型又包括多种具体的分类或回归算法,如图2所示。鼠标左键点击“Choose”按钮右侧的文本框,出现“GenericObjectEditor”对话框,可以在对话框中为各算法指定具体参数,不同的参数值对算法性能具有重要影响。

本次试验选择软件缺陷预测研究中经常采用的决策树法分类器,在图2中展开“trees”列表,选择其中的“J48”。

3.3 构建软件缺陷预测模型

为评估软件缺陷预测模型的性能,需要通过“Test Option”来指定测试模式。Weka共提供了4种测试模式,分别为“Using training set”“Supplied test set”“Cross-validation”和“Percentage split”。

本次试验采用交叉验证模式(Cross-validation)。将“Folds”参数指定为“10”,即进行10折交叉验证。在该参数设置下,将数据集随机划分为10份,轮流将其中的9份作为训练数据,剩余1份作为测试数据[16]。循环10次,取这10次运行结果的平均值作为模型的预测性能。

点击“Start”按钮,使用训练数据对算法进行训练并生成相应的预测模型。

本次试验生成决策树模型,如图3所示。在右侧的“Classifier output”中,显示用文本表示的决策树、准确率及误差分析等结果。同时,左下角的“Results list”出现了一个列表项,显示生成时间和算法名称。在分类结果中,显示出混淆矩阵,如图4所示。

通过混淆矩阵可以看出,缺陷数据集中178个“Defective”属性被标记为有缺陷的模块,其中104个被正确预测为有缺陷、有74个被错误预测为无缺陷。数据集中1 201个“Defective”属性被标记为无缺陷的模块,其中,78个被错误预测为有缺陷,有1 123个被正确预测为无缺陷。矩阵左上到右下对角线上的数字越大,说明预测的准确度越好。在结果列表中,鼠标右击选中结果项,在出现的快捷菜单中选择“Visualize tree”,可以图形化显示生成的決策树。

3.4 预测软件缺陷

软件缺陷预测模型生成之后,就可以对待预测的数据集进行预测。值得注意的是,待预测数据集和训练用数据集的属性设置要保持一致。

在“Test Opion”中选择“Supplied test set”,点击“Set”按钮,在出现的“Test Instances”对话框中指定要应用模型的数据集。右键点击“Result list”中刚产生的列表项,选择“Re-evaluate model on current test set”。预测模型将对测试数据集进行预测,结果显示在右侧区域,如图5所示。可以看出,在选用合适的机器学习算法的基础上,预测正确率达到了96.12%,效果良好。

4 结论

软件缺陷预测能预先识别出软件中的潜在缺陷模块,大幅度减少测试所需的人力、物力,优化测试资源分配,提高测试效率和软件产品质量。度量元的设计是软件缺陷预测研究中的核心问题,设计与软件缺陷存在强相关性的度量元可以显著提高预测模型质量。静态软件缺陷预测可基于软件代码或者软件开发过程设计度量元。人们可以借助Weka数据挖掘工具,合理选择机器学习算法,设置相关参数,构建出实用的软件缺陷预测模型,进而对软件缺陷实施预测。由于不同软件项目具有不同的开发流程和编程语言等特性,如何在数据集间存在较大差异的情况下提升软件缺陷预测方案的有效性、开展跨项目的软件缺陷预测,值得进一步的研究。

参考文献:

[1]于巧.基于机器学习的软件缺陷预测方法研究[D].北京:中国矿业大学,2017.

[2]沈鹏.基于机器学习的软件缺陷预测方法研究[D].重庆:西南大学,2019.

[3]陈翔,顾庆,刘望舒,等.静态软件缺陷预测方法研究[J].软件学报,2016(1):1-25.

[4]Kanmani S,Uthariaraj V R,Sankaranarayanan V,et al.Object-oriented software fault prediction using neural networks[J].Information and Software Technology,2007(5):483-492.

[5]Elish K O,Elish M O.Predicting defect-prone software modules using support vector machines[J].Journal of Systems and Software,2008(5):649-660.

[6]王青,伍书剑,李明树.软件缺陷预测技术[J].软件学报,2008(7):1565-1580.

[7]罗云锋,贲可荣.软件故障静态预测方法综述[J].计算机科学与探索,2009(5):449-459.

[8]Arisholm E,Briand L C,Johannessen E B.A systematic and comprehensive investigation of methods to build and evaluate fault prediction models[J].Journal of Systems and Software,2010(1):2-17.

[9]Catal C.Software fault prediction:A literature review and current trends[J].Expert Systems withApplications,2011(4):4626-4636.

[10]Hall T,Beecham S,Bowes D,et al.A systematic literature review on fault prediction performance in software engineering[J].IEEE Transactions on Software Engineering,2012(6):1276-1304.

[11]Laradji I H,Alshayeb M,Ghouti L.Software defect prediction using ensemble learning on selected features[J].Information and Software Technology,2015(58):388-402.

[12]Zhang F,Zheng Q,Zou Y,et al.Cross-project defect prediction using a connectivity-based unsupervised classifier[C]//Proceedings of the 38th International Conference on Software Engineering.2016.

[13]陈翔,王莉萍,顾庆,等.跨项目软件缺陷预测方法研究综述[J].计算机学报,2018(1):254-274.

[14]Menzies T,Greenwald J,Frank A.Data mining static code attributes to learn defect predictors[J].IEEE Transactions on Software Engineering,2007(1):2-13.

[15]Li L,Leung H.Mining static code metrics for a robust prediction of software defect-proneness[C]//Proceedings of the International Symposium on Empirical Software Engineering and Measurement.LosAlamitos,CA:IEEE Computer Society.2011.

[16]陳翔,贺成,王宇,等.HFS:一种面向软件缺陷预测的混合特征选择方法[J].计算机应用研究,2016(6):1758-1761.

[17]Radjenovic D,Hericko M,Torkar R,et al.Software fault prediction metrics:A systematic literature review[J].Information and Software Technology,2013(8):1397-1418.

[18]McCabe T J.A complexity measure[J].IEEE Transactions on Software Engineering,1976(4):308-320.

[19]Halstead M H.Elements of Software Science (Operating and Programming Systems Series)[M].New York:Elsevier Science Inc.,1978.

[20]N Nagappan,T Ball.Use of Relative Code Churn Measures to Predict System Defect Density[C]//In Proceedings of the International Conference on Software Engineering.2005.

[21]R Moser,W Pedrycz,G Succi.A Comparative Analysis of the Efficiency of Change Metrics and Static Code Attributes for Defect Prediction[C]//In Proceedings of the International Conference on Software Engineering.2008.

[22]T Graves,A Karr,J Marron,et al.Predicting Fault Incidence using Software Change History[J].IEEE Transactions on Software Engineering,2000(7):653-661.

[23]T Menzies,J Greenwald,A Frank.Data Mining Static Code Attributes to Learn Defect Predictors[J].IEEE Transactions on Software Engineering,2007(1):2-13.

[24]M Shepperd,Q Song,Z Sun,et al.Data Quality:Some Comments on the NASA Software Defect Datasets[J].IEEE Transactions on Software Engineering,2013(9):1208-1215.

猜你喜欢

机器学习
基于词典与机器学习的中文微博情感分析
基于网络搜索数据的平遥旅游客流量预测分析
前缀字母为特征在维吾尔语文本情感分类中的研究
下一代广播电视网中“人工智能”的应用
基于支持向量机的金融数据分析研究
基于Spark的大数据计算模型
基于朴素贝叶斯算法的垃圾短信智能识别系统
基于图的半监督学习方法综述
机器学习理论在高中自主学习中的应用
极限学习机在图像分割中的应用