崔軍,丁浩杰,王瑞波,李濟洪
(1.山西大學 計算機與信息技術(shù)學院,山西 太原 030006;2.山西大學 現(xiàn)代教育技術(shù)學院,山西 太原 030006)
作為軟件工程領(lǐng)域的主要任務(wù)之一,軟件缺陷預(yù)測的主要目的是利用機器學習方法預(yù)測出當前開發(fā)的軟件中的缺陷模塊,為后續(xù)的高效測試提供重要基礎(chǔ)[1-6]。軟件缺陷預(yù)測任務(wù)主要分為兩個子任務(wù):(1)跨版本預(yù)測子任務(wù):指使用軟件項目的歷史版本數(shù)據(jù)構(gòu)建預(yù)測模型,來預(yù)測當前版本中的缺陷模塊;(2)跨項目預(yù)測子任務(wù):指使用其他軟件項目的源代碼構(gòu)建模型來預(yù)測當前項目的缺陷模塊。當軟件項目的歷史版本數(shù)據(jù)充足時,子任務(wù)(1)所構(gòu)建的軟件缺陷預(yù)測模型常被使用。不過,很多軟件項目在開發(fā)初期,不具備充足的歷史版本數(shù)據(jù)。此時,子任務(wù)(2)所構(gòu)建的預(yù)測模型常被用來預(yù)測項目中的缺陷模塊。本文的研究涵蓋了這兩個子任務(wù)。
在軟件缺陷預(yù)測任務(wù)中,機器學習算法被廣泛用于建模過程。所構(gòu)建的軟件缺陷預(yù)測模型的性能不僅依賴于機器學習算法的類型,也依賴于機器學習算法中超參數(shù)的設(shè)置[7-8]。目前,包含支持向量機[1-2],隨機森林[3],神經(jīng)網(wǎng)絡(luò)[4-5]等在內(nèi)的主流機器學習算法已在軟件缺陷預(yù)測任務(wù)中被深入探討。其中,基于集成學習的軟件缺陷預(yù)測模型[9-13]取得了不錯的性能。具體地,通過對軟件缺陷預(yù)測數(shù)據(jù)進行多次重抽樣,多個訓(xùn)練樣本集可以被獲得。進而,支持向量機等主流分類算法被應(yīng)用在多個訓(xùn)練樣本集上,生成多個軟件缺陷預(yù)測模型。最終,這些軟件缺陷預(yù)測模型可以通過眾數(shù)投票方法形成一個集成的軟件缺陷預(yù)測模型。實際上,基于集成學習的軟件缺陷預(yù)測模型的性能明顯依賴于單個軟件缺陷預(yù)測模型的性能。因此,如何優(yōu)化單個分類算法中的超參數(shù),是提升基于集成學習的軟件缺陷預(yù)測模型性能的主要問題之一。
常用的超參數(shù)優(yōu)化方法,主要關(guān)注軟件缺陷模型的平均性能,并不關(guān)心軟件缺陷預(yù)測模型性能的變異性。這會導(dǎo)致軟件缺陷預(yù)測模型的性能變差很多,不利于該模型在新軟件模型上的穩(wěn)定預(yù)測。為此,本文提出一種超參數(shù)的穩(wěn)健優(yōu)化方法。該方法不僅關(guān)注軟件缺陷預(yù)測模型的平均性能,而且使用標準差來度量模型的穩(wěn)健性。進而,該方法使用信噪比作為優(yōu)化目標,尋求超參數(shù)的最優(yōu)取值,以構(gòu)建性能優(yōu)良的軟件缺陷預(yù)測模型。
為了驗證超參數(shù)的穩(wěn)健優(yōu)化方法的有效性,本文采用支持向量機作為集成學習的基分類器,使用塊正則化m×2交叉驗證方法[14]作為重抽樣方法,構(gòu)建了一種基于集成學習的軟件缺陷預(yù)測基線模型。進而,采用穩(wěn)健優(yōu)化對該基線模型中支持向量機的兩個超參數(shù)(方差參數(shù)和松弛參數(shù))進行調(diào)優(yōu),并與基線模型的預(yù)測性能進行比較。本文在10個軟件項目的20個版本上構(gòu)建了軟件缺陷預(yù)測實驗,并使用F1值度量模型的性能。實驗結(jié)果表明,基于穩(wěn)健優(yōu)化的超參數(shù)選擇方法可以有效地提高軟件缺陷預(yù)測模型的性能。
對于單個軟件項目,將其軟件缺陷預(yù)測數(shù)據(jù)集記為Dn={(xi,yi)}(i=1,…,n)。其中,第i條記錄對應(yīng)軟件項目中的第i個模塊。xi表示模塊i的度量向量,用來量化模塊i的源代碼的特性。常用的度量指標在表1中給出。yi表示模塊i是否有缺陷,為一個二值變量。yi=1表示模塊i為有缺陷模塊,相應(yīng)的記錄被稱為正例;反之,yi=0表示模塊i不含缺陷,相應(yīng)的記錄被稱為負例。顯然,軟件缺陷預(yù)測任務(wù)可以形式化為如式(1)所示的二類分類問題。
表1 軟件缺陷預(yù)測任務(wù)中常用的度量集合Table 1 Commonly used metrics in software defect prediction task
其中,A(Dn,θ)為某一分類算法A在數(shù)據(jù)集Dn上構(gòu)建的軟件缺陷預(yù)測模型,θ為算法A中所含的超參數(shù)集合。z=(x,y)為獨立于Dn的一個新的軟件模塊記錄。通常y是未知的,因此,需要將模型A(Dn,θ)作用在x上對y進行預(yù)測,其預(yù)測值為。顯然,超參數(shù)集合θ的取值對模型的性能有著明顯的影響。
本文采用集成學習算法,將塊正則化m×2交叉驗證方法和支持向量機進行融合,來構(gòu)建一個軟件缺陷預(yù)測模型A(Dn,θ)。模型的輪廓圖見圖1,其中,“m×2 BCV”代表塊正則化m×2交叉驗證方法,“RUS”代表隨機下采樣方法,“Tm”和“Vm”分別代表第m次切分下對應(yīng)的訓(xùn)練集和驗證集,“Tum”和“Vum”分別為“Tm”和“Vm”進行下采樣之后的訓(xùn)練集和驗證集結(jié)果,“SVM(X)”和“Pred(X)”則分別代表使用X數(shù)據(jù)集訓(xùn)練而得到的SVM模型和其預(yù)測結(jié)果,“Majority Voting”代表眾數(shù)投票法,“Predictions”表示的是使用眾數(shù)投票法集成后的最終結(jié)果。整個模型具體分為如下4個步驟。
圖1 基于集成學習的軟件缺陷預(yù)測模型框圖Fig.1 Sketch plot of software defect prediction model based on ensemble learning
(1)采用塊正則化m×2交叉驗證方法將數(shù)據(jù)集Dn切分成m組訓(xùn)練集,每一組訓(xùn)練集包含兩個大小為n/2且完全不相交的訓(xùn)練集。任意兩組之間,訓(xùn)練集間重疊的記錄個數(shù)均相同。也就是說,從重疊記錄個數(shù)來看,這m組訓(xùn)練集是“均衡”的。
(2)在m組訓(xùn)練集上實施隨機下采樣方法。由于訓(xùn)練集中正例所占比例較小,隨機下采樣方法隨機去除掉訓(xùn)練集中的負例樣本,使正例和負例樣本所占比例均衡。在隨機采樣過程中,馬氏距離用來度量同一組內(nèi)兩個訓(xùn)練集間的分布距離。馬氏距離較小的下采樣樣本被優(yōu)先考慮。
(3)在下采樣后的m組訓(xùn)練集上,使用支持向量機訓(xùn)練形成2m個軟件缺陷預(yù)測模型。根據(jù)塊正則化m×2交叉驗證的性質(zhì)可知:1)由于m組訓(xùn)練集來自同樣的總體,2m個軟件缺陷預(yù)測模型的性能是基本相同的;2)由于m組訓(xùn)練集是均衡的,2m個軟件缺陷預(yù)測模型間的相關(guān)性也是相同的,并且是最小的。這兩點優(yōu)良性質(zhì)為后續(xù)的集成奠定了良好的基礎(chǔ)。
(4)對于2m個軟件缺陷預(yù)測模型,采用眾數(shù)投票的方法進行集成。具體地,當預(yù)測新的軟件模塊是否有缺陷時,先使用構(gòu)建好的2m個軟件缺陷預(yù)測模型對該模塊分別預(yù)測,形成了2m個預(yù)測結(jié)果。如果預(yù)測結(jié)果認為該模塊有缺陷的票數(shù)不少于一半時,則判定為缺陷模塊;否則,判定該模塊不含缺陷。
容易看出,上述基于集成學習的軟件缺陷預(yù)測模型的性能明顯優(yōu)于支持向量機基分類器的性能。在常用的支持向量機算法中,方差參數(shù)(Gamma)和代價參數(shù)(Cost)是兩個重要的超參數(shù)。因此,如何優(yōu)化這兩個超參數(shù)的取值,是改善本文所提模型的性能的關(guān)鍵所在。
本文采用穩(wěn)健設(shè)計的方法來優(yōu)化方差參數(shù)和代價參數(shù)θ=(Gamma,Cost)的取值。穩(wěn)健設(shè)計是統(tǒng)計實驗設(shè)計中的一種重要優(yōu)化方法,其主要用于設(shè)計電子產(chǎn)品的參數(shù),使得產(chǎn)品的性能指標穩(wěn)定。穩(wěn)健設(shè)計在關(guān)注性能指標期望改善的同時,也關(guān)注其方差的變化,并能夠減小模型的波動。
本文采用塊正則化m×2交叉驗證來估計軟件缺陷預(yù)測模型的性能。假設(shè)軟件缺陷預(yù)測模型性能的m×2 交叉驗證估計為,且假設(shè)越大,模型的性能越優(yōu)。的形式如下:
其中,θ*為θ在望大特性下的最優(yōu)值。然而,上式不能直接進行梯度優(yōu)化。因此,本文使用網(wǎng)格搜索的方法在參數(shù)集合θ的多組取值中尋求近似的最優(yōu)值。
支持向量機的兩個超參數(shù)Gamma和Cost的取值默認為1。對于這兩個參數(shù),本文在候選取值集合{0.5,0.75,1,1.25,1.5}中尋求它們的最優(yōu)值。因為該候選取值集合的大小為5,因此,兩種參數(shù)共可組成52=25種候選取值。
本文采用了10個常用的軟件缺陷預(yù)測項目,共計涵蓋了26個軟件版本。這些項目數(shù)據(jù)均來自于PROMISE數(shù)據(jù)庫。軟件缺陷數(shù)據(jù)集的詳細信息見表2。這些軟件缺陷預(yù)測數(shù)據(jù)集的度量集合見表1,有關(guān)這些指標的詳細解釋,請參閱文獻[15]的表II。這些數(shù)據(jù)和度量變量之前已被廣泛使用[16-18]。從表2可以看出,不同版本的軟件項目的缺陷率分布在8%~53%之間,變化范圍較大。
表2 軟件缺陷數(shù)據(jù)集的基本統(tǒng)計信息Table 2 Basic statistics of the defect data set.
本文用F1值度量軟件缺陷預(yù)測模型的性能。F1值的具體定義如下:
其中,準確率P為預(yù)測正確的缺陷模塊數(shù)在預(yù)測為缺陷的模塊數(shù)中所占比例;召回率R為預(yù)測正確的缺陷模塊數(shù)在原有的缺陷模塊數(shù)中所占比例。
此外,本文還計算了F1值的后驗置信區(qū)間(置信度為95%)來度量軟件缺陷預(yù)測模型的F1值的波動范圍,并使用置信區(qū)間的長短來衡量軟件缺陷預(yù)測模型的穩(wěn)定性。后驗置信區(qū)間的具體計算公式在文獻[19]中給出。
在集成學習模型中,m設(shè)置為13。在穩(wěn)健設(shè)計的參數(shù)調(diào)優(yōu)中,本文將m設(shè)置為3。為了將塊正則化m×2交叉驗證方法貫串于參數(shù)調(diào)優(yōu)和集成學習構(gòu)建兩個階段,本文首先生成塊正則化16×2交叉驗證切分,然后將前3組切分用于參數(shù)調(diào)優(yōu)階段,將后13組切分用于軟件缺陷預(yù)測模型的構(gòu)建。這種做法可以保證兩個階段中采用的交叉切分間的均衡性,可從整體上有效改善軟件缺陷預(yù)測模型性能的穩(wěn)定性。另外,本文所用的支持向量機算法來自R語言的“e1071”程序包的“svm”函數(shù)。
本文主要關(guān)注如下兩點研究問題:
(1)基于穩(wěn)健優(yōu)化后的超參數(shù)取值是否可以提升跨版本軟件缺陷預(yù)測模型的F1值的平均性能和穩(wěn)定性?
(2)基于穩(wěn)健優(yōu)化后的超參數(shù)取值是否可以提升跨項目軟件缺陷預(yù)測模型的F1值的平均性能和穩(wěn)定性?
針對第2.3節(jié)中的兩個研究問題,本文分別對跨版本軟件缺陷預(yù)測任務(wù)和跨項目軟件缺陷預(yù)測任務(wù)進行實驗。實驗結(jié)果分別在如下兩節(jié)中給出。
表3給出了跨版本軟件缺陷預(yù)測模型的實驗結(jié)果。從表3中可以得到如下幾點結(jié)論:
表3 跨版本軟件缺陷預(yù)測模型的實驗結(jié)果Table 3 Experimental results of the CVDP task
(1)相比于基線模型,穩(wěn)健優(yōu)化后的軟件缺陷預(yù)測模型的F1值大多數(shù)有所上升??傮w上講,穩(wěn)健優(yōu)化后的模型宏平均F1值達到了54.3%,相較基線模型的宏平均F1值(53.1%),有1.2%的上升。
(2)從模型的穩(wěn)定性來看,穩(wěn)健調(diào)優(yōu)后的置信區(qū)間長度(13.6)明顯小于基線模型的置信區(qū)間長度(14.1)。F1值的置信區(qū)間的平均長度可以縮減3.5%。這說明,超參數(shù)的穩(wěn)健優(yōu)化算法對于模型性能的穩(wěn)定性上有著明顯的影響。
(3)表3的最后兩列給出了穩(wěn)健調(diào)優(yōu)后兩個超參數(shù)的具體取值。這些超參數(shù)明顯偏離它們在基線系統(tǒng)中的默認取值。因此,基于穩(wěn)健調(diào)優(yōu)的超參數(shù)選取方法對于改善跨版本軟件缺陷預(yù)測模型的性能有著明顯的積極作用。
(4)根據(jù)望大特性信噪比挑選的最優(yōu)超參數(shù)并不完全能達到最高的F1值,比如在跨版本缺陷預(yù)測任務(wù)lucene 2.2→2.4中,根據(jù)望大特性信噪比挑選的最優(yōu)超參數(shù)組合為(Gamma=1,Cost=1.25),而該參數(shù)組合的F1值要小于(Gamma=1.25,Cost=1.5)參數(shù)組合下的F1值。
跨項目軟件缺陷預(yù)測模型的實驗結(jié)果在表4中給出。本節(jié)實驗中,原項目和目標項目的度量集合相同。因此,本文可以將原項目上構(gòu)建的軟件缺陷預(yù)測模型用于預(yù)測目標項目的軟件模塊的缺陷。從表4中,可以獲得如下幾點結(jié)論:
表4 CPDP任務(wù)的實驗結(jié)果Table 4 Experimental results of the CPDP task
(1)穩(wěn)健調(diào)優(yōu)后的跨項目軟件缺陷預(yù)測模型的平均性能明顯優(yōu)于基線模型的平均性能。具體地,優(yōu)化后的模型的宏平均F1值達到49.5%,比基線模型的宏平均F1值(45.4%)高出4.1%。相比于跨版本的軟件缺陷預(yù)測模型,超參數(shù)的穩(wěn)健調(diào)優(yōu)算法對跨項目軟件缺陷預(yù)測模型的改進幅度更大。
(2)從F1值置信區(qū)間長度來看,穩(wěn)健調(diào)優(yōu)后的置信區(qū)間長度(14.9)明顯小于基線模型的置信區(qū)間長度(15.3)。其F1值的置信區(qū)間的平均長度縮減了2.6%。這個現(xiàn)象和跨版本軟件缺陷預(yù)測模型的實驗結(jié)果是一致的。這說明基于穩(wěn)健調(diào)優(yōu)后的超參數(shù)取值可以改善跨項目的軟件缺陷預(yù)測模型的穩(wěn)定性。
(3)表4的最后兩列給出了超參數(shù)Gamma和Cost調(diào)優(yōu)后的具體取值。從最后兩列數(shù)據(jù)可見,這些最優(yōu)取值均明顯偏離基線模型中使用的默認參數(shù)值。這說明穩(wěn)健設(shè)計對超參數(shù)的優(yōu)化有著明顯的積極影響。
(4)通過比較跨項目軟件缺陷預(yù)測模型的性能(表4最后一行)和跨版本軟件缺陷預(yù)測模型的性能(表3最后一行)可見,前者的平均性能明顯低于后者的平均性能,并且前者的置信區(qū)間長度明顯大于后者的置信區(qū)間長度。這主要是因為跨項目軟件缺陷預(yù)測模型中,原項目和目標項目的數(shù)據(jù)來自于不同的分布。分布間的差異導(dǎo)致了上述現(xiàn)象的發(fā)生。盡管如此,基于穩(wěn)健優(yōu)化后的超參數(shù)仍然可以使兩種不同情形的軟件缺陷預(yù)測模型的平均性能以及穩(wěn)定性得到明顯改善。
綜合上述實驗結(jié)果,基于穩(wěn)健優(yōu)化的超參數(shù)選擇方法可以明顯改善軟件缺陷預(yù)測模型的平均性能和穩(wěn)定性。
本文針對軟件缺陷預(yù)測任務(wù),提出了一種基于穩(wěn)健設(shè)計的超參數(shù)優(yōu)化方法。本文分析了超參數(shù)的穩(wěn)健優(yōu)化對基于集成學習的軟件缺陷預(yù)測模型性能的影響。實驗結(jié)果表明,超參數(shù)的穩(wěn)健優(yōu)化方法可以明顯提升軟件缺陷預(yù)測模型的預(yù)測性能,并可有效改善軟件缺陷預(yù)測模型的穩(wěn)定性。
后續(xù)的研究主要關(guān)注超參數(shù)個數(shù)較多情形下的魯棒優(yōu)化問題,擬通過采用實驗設(shè)計中的分式析因設(shè)計方法來挑選出有顯著作用的超參數(shù)子集,并對模型的性能進行魯棒優(yōu)化。