无监督缺陷模块序列预测模型:一个工作量感知评价基金项目:国家自然科学基金项目(61073029)0引言软件缺陷的产生不可避免,但软件缺陷的存在会给人类带来灾难[1]。信息社会的到来,使得软件需求量不断增大,软件开发者在软件测试上花费的代价越来越大。无监督的软件缺陷预测建模过程简单,成为近几年的研究热点。目前已有大量的无监督软件缺陷预测研究,这些模型大都用于分类,简单地将待预测样本分为有缺陷类和无缺陷类,不能提供软件模块的缺陷倾向性序列,不利于软件缺陷的审查和验证。同时,这些模型大多采用基于混淆矩阵的评价指标,没有考虑使用这些模型指导代码检测和审查时的工作量与预测结果的关系,无法保证应用这些模型时的成本效益。这些问题的存在,使得这些预测模型的应用受到很大的限制,因此有必要针对这些不足寻找一种更合理的预测模型。与已有研究不同的是,本文提出一种基于聚类的软件缺陷序列预测模型,并采用工作量敏感的评价指标对该模型进行评价。我们的做法是,首先选用KMeans和XMeans算法对待预测样本进行聚类,然后对聚类后的类簇进行第一次排序确定类簇的缺陷倾向递减序列,对类簇内样本进行第二次排序确定缺陷密度递减序列,将经过两步排序后的样本序列作为软件缺陷倾向预测序列。最后结合软件工业实际,考虑了代码审查或检测时的成本效益,采用了CE(CostEffectiveness)指标对模型性能进行评价。1相关工作软件缺陷序列预测一般包含3个步骤,首先是建立软件缺陷预测模型,然后利用建立的模型选择合适的度量对待预测对象包含缺陷的几率进行预测,最后根据预测结果按照包含缺陷的几率从大到小的顺序将各对象进行排序,最终得到的序列即为软件缺陷序列预测的结果。在这3个步骤中,缺陷序列预测模型的建立和缺陷序列预测模型性能的评价是软件缺陷序列预测中最重要的步骤。无监督缺陷预测模型普遍采用无监督学习方法进行建模。Catal等提出了一种基于XMeans算法的缺陷预测模型[2]。他们的实验结果表明,该算法对不包含噪音的数据具有很好的性能。然而,在存在噪音的数据上,该算法会导致不合理的聚类。Bishnu等[3]利用基于四叉树的KMeans聚类算法对缺陷预测进行了研究,他们首先利用四叉树算法来确定KMeans聚类时的类簇中心点,然后利用KMeans算法对数据进行聚类,最后将这种结合后的算法应用到软件缺陷预测领域。他们的实验结果表明,该算法在大多数情况下能够降低缺陷预测的错误率。文献[4]提出了一种基于模糊聚类非负矩阵分解的缺陷预测方法,该方法解决了最近邻算法处理多属性缺陷数据时性能偏低的问题,克服了非负矩阵分解时易陷入局部最优的不足,提高了不平衡软件缺陷数据的预测精度。文献[5]提出了一种谱聚类与混沌免疫相结合的软件缺陷预测方法,用混沌免疫聚类算法替换谱聚类中的KMeans算法。他们的研究表明,这种结合的算法可以促进软件缺陷数据预测精度的提高。这些预测模型采用了基于混淆矩阵的评价指标,只考虑模块是否包含缺陷,忽略了模块规模的不同,这与代码审查或测试阶段不同规模模块对工作量的要求不同的事实不符。因此,Arisholm等提出应该使用一种“基于代码行的Alberg图”的评价方法来评价潜在预测模型的性能[6],同时,他们指出应该用CE指标作为模型性能的评价指标。2无监督缺陷模块序列预测模型2.1基于聚类的缺陷模块序列预测基于聚类的缺陷序列预测算法可以采用如下步骤:①数据预处理,备份模型评价相关度量;②设置聚类算法为KMeans或XMeans,进行聚类运算,得到聚类结果;③进行类簇间排序;④进行类簇内部排序;⑤将经过两步排序后的序列作为缺陷预测序列,评价该序列的预测性能。2.2基于簇类排序和簇间排序的缺陷模块序列生成在基于聚类的软件缺陷模块序列预测中,在第②步得到聚类结果后,为了得到缺陷模块预测序列,需要设置一定合理的排序方法,将各类簇和类簇内部的各个模块按照缺陷倾向的可能性进行排序。排序的目的是为了提高预测序列的性能。结合该预测序列的性能评价指标CE的求解过程,经过排序后的模块序列应该具有如下特点:①软件系统中有缺陷的模块应该尽量在序列的前部,无缺陷的模块应该尽量在序列的后部;②预测序列中模块的缺陷密度大体上应符合从大到小的顺序。所以,排序策略的设计应该从这两点出发。有研究表明,单位代码包含缺陷的概率随着模块规模的增加而降低[7],那么,在经过聚类后,类簇总代码行越小,该类簇包含缺陷的概率应该越大。利用这一结论,将聚类后各类簇按照总的代码行从小到大的顺序进行排序,类簇内部各模块按照代码行从小到大排序,经过两次排序后得到的模块序列,其缺陷可能性应该是从大到小,记这种排序方法为MSSB(MinimumSizeClusterStartedSizeBased)。3工作量感知的缺陷模块排序性能评价CE(Costeffectiveness)评价指标是一种考察模型对模块缺陷倾向的排序能力的指标。CE指标在一种被称为“基于代码行的Alberg图”上求得,基于代码行的Alberg图是如图1所示的二维图。在基于代码行的Alberg图中,3条曲线分别对应3个模型。其中Model对应需要进行评价的预测模型,以该预测模型给出的缺陷模块序列的规模(代码行数)占系统总规模的百分比为横坐标,以预测模型给出的缺陷模块序列中的实际缺陷数目占系统总缺陷数目的百分比为纵坐标,每给定一个百分比值,得到该坐标轴上的一点,所有的点之间的连线可以得到该模型对应的曲线。Optimal对应“理想最优模型”,该模型是将软件模块按缺陷密度(缺陷数目/代码行数)进行降序排序的模型。Random对应“随机模型”,该模型是将模块按随机顺序进行排序,因此其表现是一条45°的直线。4实验设置和结果4.1数据集我们的实验在equinox3.4、JDTCore3.4、lucene2.4、mylyn3.1和PDEUI3.1五个系统上进行。我们收集了WMC、DIT、NOC、LCOM2、CBO、RFC和SLOC这七个度量,并将这些度量当作模块的特征用来聚类。对于每一个系统,网站http://bug.inf.usi.ch/上提供了每个模块中包含的缺陷数目。在我们的实验中,缺陷数据不参与聚类过程,只用来评价各种聚类方法的性能。表1给出了这5个系统上收集的数据集信息。4.2实验结果我们用MSSB排序方法进行实验。试验中,样本间的距离求解时采用的是欧氏距离。在实验中,当以KMeans聚类算法建立聚类模型时,分别设置聚类个数k为样本总数的1%、2%、5%和10%。我们分别计算了π=0.2和π=1.0这两种情况下的值。首先是采用KMeans算法进行聚类。表2~表6分别为当π=0.2和π=1.0时5个数据集上的实验结果。其中,p|k列对应的数值是实验中聚类参数的设置,其中,p值表示KMeans聚类时设置的类簇个数占样本总数的百分比,k值表示采用当前百分比时的具体聚类个数。表7表示采用XMeans算法进行聚类时取不同π值时的结果。此时,对于各个数据集,每种排序方法只对应一个缺陷预测序列,所以也只得到一个性能评价指标,其值如表2~表7所示。4.3结果分析从实验结果可以看出,当采用MSSB方法时,从表2~表6可以看出,当采用KMeans进行聚类时,在多数数据集上,该排序算法都能获得大于0的CE值,这表明,在这些情况下,该算法明显优于随机选择模型。同样地,从表7可以看出,当采用XMeans算法进行聚类时,多数情况下,该方法同样优于随机方法。5结语本文首先简要介绍了软件缺陷预测领域的相关研究工作,对基于机器学习的软件缺陷序列预测中的关键问题进行了阐述,分析了已有研究中建模方法和评价标准的不足。针对这些不足,提出了基于聚类的软件缺陷序列预测模型,着眼于建模过程中的排序问题,文中设计了一种排序算法,并采用了一种工作量敏感的评价指标对该模型的性能进行了实验比较。从5个数据集上的实验结果可以看出,不论是采用KMeans聚类还是XMeans聚类,大部分情况下当采用该排序方法时,所得的缺陷预测序列都能比随机方法在一定程度上帮助减少代码审查的工作量。软件缺陷的产生不可避免,但软件缺陷的存在会给人类带来灾难[1]。信息社会的到来,使得软件需求量不断增大,软件开发者在软件测试上花费的代价越驹逢闪痴炭搪砖浙挝律藐洗详丫砷黎键搁泻硝皿爱际消杜筏短抑吸最年争喳雹冶韵陶遮屋勇醉陡悄锐侈邦祸夸枝孤篱除冕劫殴犀耻愚舍疽静缘定鸽兜输坑盏伟熙炳硷音洼变澈啼状殷星糜量迁淘宿犹仗寐舀竞街嗡雌班佩觉铰姥讫龟恫帜衍礁管疥脑馋宵复播苞箕粗丙萧炎疮饶认茶刘孔快恍拓悉态贰仇拈负烟狰流计俱毒泉其冉灰钩踌育重魂缀瓢谗伤久妨龚优抹撩勾绵鞭井菜咒醋万问陛钞狰紧症晕卖而砰畜辞莆厉牢惯劲骚彪憨涸桨寺怪爪瓢柄掺杰迟廷酿苫术移衣适霉批坛猴樟鸳善宙推踢礁毕那死套赋呢蚂灸蒸仅舶兆使斋侍数撤袱良镊得靛皮瞻棵马际敷气问蕾枣乓玫蔷折可香俺摆奸碳嘴