1. 引言
对于安全关键软件而言,在整个软件生产的生命周期中会有大量的数据被记录下来,称之为过程数据 [1] 。不仅包括诸如软件代码行数、软件复杂度、软件版本、需求设计等软件开发过程数据,还有很重要的测试过程数据,比如测试用例的个数,发现失效的个数、测试覆盖情况。对于过程数据的分析有利于开发人员改变测试决策,进而提高软件可靠性。对于这部分数据的处理,现阶段有机器学习、深度学习的方法来进行失效数预测。
另外,基于软件可靠性模型的传统可靠性分析方法使用失效数据进行建模,这种可靠性分析方法忽略了软件本身的结构以及测试过程的特征造成对抽样观察到的失效数据的影响,没有充分利用安全关键软件开发过程以及自测试过程的特征数据。为了改进这种现象,提出了机器学习的方法对软件测试过程中的数据进行回归,比如:决策树、随即森林、岭回归等方法但是这种数据的数量是较少的,机器学习方法的拟合会出现偏差。并且利用机器学习方法的输入并没有考虑到影响因子之间的交互作用,为了考虑影响因子之间的交互作用,故本文提出了广义可加模型 [2] ,简称GAM,对多元数据进行拟合。
GAM是由数据驱动而非统计分布模型驱动的非参数回归模型,可对部分解释变量进行线性拟合,对其他因子进行光滑函数拟合。模型不需要预先设定参数模型,模型通过解释变量的平滑函数建立,能够自动选择合适的多项式。GAM属于非参数回归模型中的一种,非参数回归不需要模型满足线性的假设前提,可以灵活的探测数据间的复杂关系,但是当模型中的自变量数目较多的时候,模型的估计方差会加大,另外,基于核与光滑样条估计 [3] 的非参数回归中自变量与因变量间关系的解释也有难度,1985年Stone [4] [5] 提出加性模型,模型中每一个加性项使用单个光滑函数来估计,在每一加性项中可以解释因变量如何随自变量变化而变化,很好的解决了上述问题。1990年Hastie和Tibshirani [4] [5] 扩展了加性模型的应用范围,提出了广义加性模型。
本文针对软件生产与自测试过程中产生的过程数据,利用GAM分析影响因素与其的交互作用,进一步拟合软件的失效数,并对实际工程提出有效可行的建议。其中,文章的结构如下:
第一部分是对问题背景的介绍。
第二部分是对问题进行详细叙述与模型的详细介绍。
第三部分是运用模型对数据进行分析的结果。
第四部分是对数据分析结果的总结与实际指导意义。
2. 模型介绍
软件开发过程中的测试数据分析对调整测试策略和可靠性分析具有重要的意义。对于较小的数据量,机器学习模型并没有很好的预测效果,并且无法给出因素之间的交互作用,而在软件的实际研发中因素之间的交互作用往往是存在的,例如,代码行数和测试用例个数之间的交互作用。本文尝试用GAM来分析各个因素的影响以及因素之间的交互作用,以提高数据分析的效果。
GAM,属于半参模型 [6] 中的一种,其表示形式如下所示:
其中,
是连接函数,
是连接解释变量的平滑函数,Xi为解释变量,fi(Xi)是关于Xi的非指定类别的非参数函数。
在该模型中,响应变量的分布可以是正态分布,二项分布、poisson分布等。对fi(Xi)的估计方法有平滑样条法,局部加权回归散点平滑法、薄板平滑样条法,平滑参数的选择有交叉验证法、广义交叉验证法等。在GAM模型具体分析过程中,采用Rx64.3.5.0版R软件及mgcv、DAAG等软件包,来进行实验仿真。
像线性回归一样,可以通过增加形式为Xi × Xj的交互项,使得GAM能够体现交互效应的作用。另外,可以增加形式为fu(Xi, Xj)的低维交互项,这样的交互项可以应用一些二维光滑方法,如局部回归或者二维样条来拟合。
GAM应用的潜在假设为函数是可加的,允许每个协变量作为一个不加限制的平滑函数,而不是仅仅作为一种呆板的参数函数被拟合,对部分或全部的解释变量采用平滑函数的方法建立模型。GAM与GLM [7] 共同的特点是用连接函数来估计响应变量和各解释变量间的关系。与GLM不同的是GAM中的各函数可以是非参数的形式,因而使得其应用范围更为广泛,GAM是GLM的一种推广。因此GAM适用于多种分布类型,多种复杂非线性关系的分析。
3. 分析过程
3.1. 数据描述
本文中所用的数据是来自于真实工程中的项目数据,是在软件生产过程中开发人员进行自测试产生的过程数据。变量解释如表1所示,数据格式如表2所示。
对数据进行初步的分析(如图1所示),经过Kolmogorov-Smirnov检验 [8] 可知,假设软件失效数为poisson分布,经检验,P值为0.0678,故假设软件失效数(fail_num)是呈poisson分布类型,同理可以假设,这些解释变量为正态分布类型,因此,采用poisson函数作为连接函数,将解释变量通过线性组合的方式来联结服从poisson分布的响应变量。
多重共线性 [9] 是指线性回归模型中的解释变量之间存在高度相关关系,它的存在使得模型无法求解。解释变量之间存在的共线性,可利用两个解释变量间的Pearson相关系数来判别两者的相关性程度,如果解释变量间的相关系数较大,则两个解释变量之间通常存在严重的共线性关系。处理变量间共线性的方法有主成份分析法、岭回归法、剔除变量法等。
由表3可知,代码行数、复杂度、语句覆盖率的相关系数均大于0.7,因此,它们之间存在着很强的共线性。又有每个测试用例对语句覆盖的贡献和每个测试用例对分支覆盖的贡献相关性很高为0.998。
3.2. GAM模型的单因素分析
根据变量预分析的结果,将stage (测试阶段)、weeks (测试周)、requirement_chg (需求变更量)、loc (代码行数)、complexity (复杂度)、tc_num_loc (测试资源分配特征)、tc_num (测试用例的个数)、stmt_cvg 语句覆盖率)、branch_cvg (分支覆盖率)、stmt_cvg_tc_num (每个测试用例对语句覆盖的贡献)、branch_cvg_tc_num (每个测试用例对分支覆盖的贡献)等十二个影响因素作为解释变量,每次选择1个影响因素作为解释变量,失效数 (fail_num)作为响应变量,采用样条平滑函数分别构建模型,并分析每个解释变量对响应变量的影响显著性及模型的拟合优度,如表4所示。结果表明:所有的影响因素均在P值 < 0.01水平下对失效数变化有显著影响,表明各影响因素单独作为失效数变化解释变量具有统计学意义;tc_num (测试用例的个数)、branch_cvg_tc_num (每个测试用例对分支覆盖的贡献)、stmt_cvg_tc_num (每个测试用例对语句覆盖的贡献)对失效数变化影响的模型解释率相对较高,调整判定系数较大,表明这三个因素与失效数变化构建模型方程拟合度较优;其他影响因素对失效数变化的解释率较低,调整判定系数也较低,表明他们单独对失效数进行模型拟合时的解释能力较差,虽然部分解释变量对模型的拟合效果较差,但是他们均通过了显著性检验,均具有统计学意义。
当自由度值为1时,函数为线性方程,表明影响因素与响应变量失效数间具有某种线性关系;当自由度大于1时,表示函数是非线性曲线方程,影响因素与失效数之间具有某种非线性关系,且值越大,非线性关系越显著。结果表明:loc (代码行数)、complexity (复杂度)的自由度为1,与失效数变化具有显著的线性关系,branch_cvg (分支覆盖率)自由度为2左右,与失效数变化之间具有一定的非线性关系,而其他变化具有显著的非线性关系。
3.3. GAM模型的多因素分析
通过pearson相关系数 [10] 以及单因素影响分析可得到,loc (代码行数)与complexity (复杂度)、tc_num_loc (测试资源分配特征)与tc_num_complexity与tc_num (测试用例的个数)、stmt_cvg (语句覆盖率)与branch_cvg (分支覆盖率)、stmt_cvg_tc_num (每个测试用例对语句覆盖的贡献)与branch_cvg_tc_num (每个测试用例对分支覆盖的贡献)的相关性高达99.9%以上,且两者之间通过单因素分析的结果也高度相似,故判定其为可以互相代替的变量。
将单因素分析与去除共线性之后且经过显著性检验的七个影响变量stage (测试阶段)、weeks (测试周)、requriement_chg (需求变更量)、loc (代码行数)、tc_num (测试用例的个数)、stmt_cvg (语句覆盖率)、branch_cvg(分支覆盖率)作为解释变量,将失效数作为响应变量,进行多影响因素与失效数变化间的GAM模型构建拟合,模型同样采用恒等联系函数作为连接函数,平滑回归项采用样条平滑函数估计,模型拟合结果如表5所示。
Table 5. GAM model hypothesis test results of failure number changes and multiple influencing factors
表5. 失效数变化与多影响因素的GAM模型假设检验结果
多因素分析表明,branch_cvg (分支覆盖率)的p值>0.05,故不能假设他对失效数有显著影响,loc (代码行数)、stmt_cvg (语句覆盖率)、requriement_chg (需求变更量)在P值<0.05水平下显著影响失效数变化,其余驱动因素在P值<0.01水平下显著影响失效数变化。模型判定系数为0.743,方差解释率为75.5%,表明模型拟合程度较高,通过显著性检验的6个因素对失效数的解释率较高。因此可以确定他们对失效数变化有显著性影响。其中,模型判定系数 [11] 与方差解释率 [12] 定义如下:
模型判定系数:
第j个变量的方差解释率:
3.4. GAM模型的检验
3.4.1. 影响因素对失效数变化作用效应诊断
通过对多影响因素(解释变量)与失效数变化间建立GAM模型,获得解释变量的平滑回归函数,并得到影响因素对失效数影响效应图,如图2所示。图中虚线表示拟合可加函数的逐点标准差,即可信区间的上下限,实线代表失效数的平滑拟合曲线,横坐标表示各解释变量的实测值,纵坐标表示解释变量对失效数的平滑拟合值。纵坐标括号数值代表估计自由度值。结果表明,失效数变化与loc (代码行数)、requriement_chg (需求变更量)间的相关性表现为线性相关,随着loc (代码行数)或requriement_chg (需求变更量)数值递增时,失效数变化也呈现递增趋势,当stage (测试阶段)小于4时,失效数变化呈现单增趋势,其他变量呈现了非线性关系,并且波动较大,例如,对于变量tc_num (测试用例的个数)而言,当超过200后,失效数的变化呈现快速减少的趋势,这是由于当测试用例增加到一定数量以后,软件的可靠性就会随之增加,失效数变化就会随之减少。
Figure 2. Effect of influencing factors on the change of failure number
图2. 影响因素对失效数变化的影响效应
3.4.2. 模型交叉检验
十折交叉验证 [13] ,英文名叫做10-fold cross-validation,用来测试算法准确性。是常用的测试方法。将数据集分成十份,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。每次试验都会得出相应的正确率(或差错率)。10次的结果的正确率(或差错率)的平均值作为对算法精度的估计。
在通过模型假设检验及多曲线共线性分析后得到的解释变量与失效数构建的到的GAM模型的拟合优度较好,影响因素对失效数变化的解释率较高。同时,为了避免过拟合现象,采用十折交叉验证 [15] 对其建立的GAM模型进行验证。在给定GAM建模数据中,拿出9份数据进行建模型,留1份数据用刚建立的模型进行预报误差。十折交叉验证的预测结果如图3所示,验证结果如表6所示,其中利用每份数据集的平方和、方差解释率、以及RMSE [14] 作为检验标准,可以看到预测值与实际值的差值较小,结果说明,GAM模型的拟合效果较好,准确率较高。其中,RMSE的定义如下:
Table 6. Ten-fold cross-validation of the failure number GAM model
表6. 失效数GAM模型的十折交叉验证
Figure 3. The number of failures is 10% of the predicted value of cross-validation
图3. 失效数10折交叉验证的预测值
3.5. 带有交互项的GAM模型分析
失效数变化受多个因素的影响,各解释变量之间交互作用对失效数变化也会产生强烈的影响。在第二节中介绍的GAM模型中引入两个因素间的交互作用项,可得带有交互作用项的GAM模型如下
其中,fi, j(Xi, j)为第i个因素和第j个因素的交互作用项。
把带有交互作用项的GAM模型用于第三节给出的数据,输出结果如表7所示。用于检验交互作用tc_num (测试用例的个数) × loc(代码行数)、tc_num (测试用例的个数) × branch_cvg (分支覆盖率)、tc_num (测试用例的个数) × stmt_cvg (语句覆盖率)的P值均小于0.05,所以可以认为这些交互作用影响是显著的。
从检验结果还可以发现,交互作用项主要发生在tc_num (测试用例的个数)与loc (代码行数)、branch_cvg (分支覆盖率)、stmt_cvg (语句覆盖率)之间,这也与失效数变化主要受测试用例个数与测试的复杂度(包括代码行数、分支覆盖率、语句覆盖率)的交互作用过程影响的特征吻合。
对具有显著性影响且具有统计学意义的交互作用进行可视化绘图,如图4所示。这种图显示了失效数变化在不同自变量维度下的变化特征。在图4中存在统计学意义的为图4(a)、图4(d)和图4(f),由图4(a)可知,当loc (代码行数)小于48000时,失效数是不受tc_num (测试用例的个数)变化的影响的,当loc(代码行数)大于48000时,失效数才发生了变化,由图四(d)可知,当固定branch_cvg (分支覆盖率)时,随着tc_num (测试用例的个数)的增加,失效数在一定范围内波动变化,但是当tc_num (测试用例的个数)超过1000时,失效数呈现快速减小的趋势。图4(e)呈现的趋势与图4(d)相似。
本研究结果表明,以上提到的三项交互作用项与单因素模型相比较,在方差解释率以及调整方差系数方面都有所提高。且对于branch_cvg(分支覆盖率)在GAM模型中的影响不显著,但是引入tc_num (测试用例的个数) × branch_cvg (分支覆盖率)交互项后,对失效数变化有显著性影响。通过在GAM模型中引入交互作用项的分析,可以有效的定量分析影响失效数变化的重要特征,同时也可以得出失效数变化不但受各个因素的影响,而且受因素间的交互作用的影响。因此,今后还可以考虑三个因素的交互作用。
最后,建立带有交互作用项的GAM模型,模型结果如表8所示。得到模型的方差解释为97.9%,相较于GAM模型的方法解释率,提高了29.7%。判定系数R2 = 0.989,得到模型效果良好,模型拟合程度较优。
Table 7. GAM model hypothesis test results of interaction factors and failure numbers
表7. 影响因素交互作用与失效数的GAM模型假设检验结果
Table 8. Final GAM model parameter table
表8. 最终GAM模型参数表
3.6. 机器学习模型与带有交互项的GAM模型的比较
为了比较带有交互项的GAM模型与现有的机器学习模型 [15] ,如岭回归、lasso回归、ElasticNet回归、支持向量机等的预测效果,对3.1节中的68组样本数据进行随机划分,选取70%样本作为训练集,30%样本作为测试集,对测试集中的样本,使用RMSE (root mean square error)指标:
来评价模型的预测效果。计算结果如表9所示。
Table 9. Comparison of machine learning methods and GAM models with interactive terms
表9. 机器学习方法与带有交互项的GAM模型比较表
表9中的第二列表明,带有交互项的GAM模型的RMSE值最低,相比ElasticNet回归RMSE降低了34.1%,相比较好的支持向量机方法仍降低了7.4%。由此可以得到,带有交互项的GAM模型对数据的预测效果要优于其他模型。
4. 结论
对3.1节中的数据使用带有交互项的GAM模型进行分析,发现在模型中添加交互项可以提高模型的拟合和预测效果。例如方差解释率与模型的调整判定系数相对于没有交互项的GAM模型都有所提高。用GAM模型对数据进行因素分析时发现,branch_cvg (分支覆盖率)并没有显著性影响,但是在模型中添加了交互项后,tc_num (测试用例的个数) branch_cvg (分支覆盖率)的交互项对失效数变化有显著性影响,这也是符合工程实际应用的。最后将带有交互项的GAM模型与其他机器学习模型进行比较,得到此模型的预测结果的RMSE要优于其他机器学习模型,因此说明带有交互作用的GAM模型可以分析软件开发中某些因素的交互作用。