黃 琳,荊曉遠,董西偉
(南京郵電大學 自動化學院,江蘇 南京 210003)
軟件缺陷的產生往往是由于開發(fā)人員需求理解不正確或是經驗不足。而含有缺陷的軟件在運行時可能會產生意料之外的結果,嚴重的時候會給企業(yè)造成巨大的經濟損失,甚至會威脅到人們的生命安全。軟件缺陷預測(software defect prediction,SDP)是軟件工程中最重要的研究課題之一[1],吸引了學術界和工業(yè)界的廣泛關注?;诙攘康撵o態(tài)軟件缺陷預測技術借助于從已有的軟件模塊中獲得歷史數(shù)據(jù),對新的軟件模塊進行缺陷預測,來判斷它們是否存在缺陷,從而為軟件項目提供決策支持[2-4]。近年來,支持向量機(support vector machine,SVM)[5]、決策樹[6]、樸素貝葉斯[7-8]、代價敏感學習[9]和集成學習[10-11]這些機器學習技術已經被廣泛地用于軟件缺陷預測領域。最近,字典學習[12]、稀疏表示[13]等方法也被引入了軟件缺陷預測中。軟件缺陷預測的歷史數(shù)據(jù)具有樣本不足、結構復雜和類別分布不平衡的特點。為了解決這些問題,文中提出一種基于多核集成學習的跨項目軟件缺陷預測算法(cross-project software defect prediction based on multiple kernel ensemble learning,CMKEL)。
軟件缺陷預測是當前大數(shù)據(jù)技術在軟件工程領域的重點研究方向之一[14]。在早期大多數(shù)的研究都是使用項目內已經標記的程序模塊,一部分樣本來構建預測模型,另一部分樣本作為預測。然而在實際應用中項目內的歷史數(shù)據(jù)是有限的。由于歷史數(shù)據(jù)的缺少,研究者們開始關注跨項目軟件缺陷預測的問題,跨項目就是使用其他項目的訓練數(shù)據(jù)來構建預測模型,并對一個全新項目進行缺陷預測。
多核學習就是將不同特性的核函數(shù)進行組合,獲得多類核函數(shù)的優(yōu)點,來達到更優(yōu)的映射性能。和傳統(tǒng)的單核方法相比,多核學習不僅能夠組合利用各基本的單核函數(shù)的特征映射的能力,而且還能將不同特性的核函數(shù)進行組合,來獲得多類單核數(shù)的優(yōu)點,從而得到更優(yōu)的映射能力,提高預測的精度。
集成學習就是用多個弱分類器結合為一個強分類器,從而提升分類方法的效果。集成學習能夠得到比基分類器更好的分類效果和泛化能力,不容易出現(xiàn)過擬合情況,因此適用于跨項目缺陷預測問題。
對于靜態(tài)軟件缺陷模塊存在的結構復雜、類別不平衡、歷史數(shù)據(jù)缺少的問題,文中提出一種基于多核集成學習的跨項目軟件缺陷預測方法。
假設訓練的軟件模塊D={(xi,yi),i=1,2,…,N},其中xi是模塊屬性的向量,yi∈{0,1}是模塊的標簽,N是項目數(shù)。K={kj:X×X→R,j=1,2,…,M}是M個核函數(shù)的集合,其中X是輸入空間。CMKEL主要是學習基于多核的一個分類器f(x),這個分類器是通過有標記的歷史數(shù)據(jù)進行多核訓練得到的,通過基于多核的分類器f(x)來預測新的軟件模塊,基于多核分類器表示為:
(1)
其中,T為整個boosting過程的次數(shù);ft(x)為第t次(1≤t≤T)boosting過程得到的弱分類器;αt為相應的權重值。
該算法的關鍵點是每次在M個基于核函數(shù)的分類器中進行boosting過程后,學習得到一個錯誤分類誤差最小的ft(x)分類器及其組合權重αt。經過T次boosting過程之后,將這些分類器按照權重值集成,得到最終的分類器。
(2)
多核學習的目標是通過最優(yōu)化方法來求取合成核的參數(shù),將上式轉化為如下的最優(yōu)化形式:
(3)
為了學習一個多核集成的分類器,文中采用一個典型且有效的boosting算法。具體而言,在初始化訓練集之后通過一系列boosting過程,重復學習一些基于核的分類器,然后根據(jù)它們的組合權重進行集合,從而得到最終的CMKEL分類器。在boosting過程之前,需要先對訓練集進行初始化。文中在整個訓練集上直接執(zhí)行隨機抽樣策略,然后將這些選擇的樣本作為CMKEL初始訓練集。
在訓練集初始化完成之后,需要有對應的Dt向量,Dt表示每個樣本在整個boosting過程的不同權重。最初,這些權重都是相同的。為了更加關注那些錯誤分類的樣本,在每一次boosting過程增加錯誤分類的權重或是減少正確分類的權重,來調整權重向量Dt。一旦得到訓練集和權重向量Dt,就可以進行boosting過程。每次boosting過程的關鍵是要從M個基于核函數(shù)的分類器中學習得到一個基于核假設的分類器ft(x)。
樣本中無缺陷模塊的標簽為0,有缺陷模塊的標簽為1。軟件缺陷預測模型對有缺陷的模塊被預測為無缺陷時稱為Ⅰ類錯誤,代價表示為cost(1,0);反之Ⅱ類錯誤表示無缺陷模塊被預測為有缺陷的,代價表示為cost(0,1),顯然Ⅰ類錯誤的代價敏感要遠大于Ⅱ錯誤代價敏感。文中定義的代價矩陣如表1所示。
表1 代價矩陣
在表1中,μ表示I類錯誤的代價敏感系數(shù)。
考慮到代價矩陣后的每個基于核分類器的錯誤分類誤差的計算為:
(4)
其中,cost(l,g)為代價矩陣,cost(l,g)表示l類被錯分成g類的代價。
最好的分類器是得到最小的錯誤分類誤差,在第t次boosting過程之后得到的弱分類器為:
(5)
在第t次的boosting過程中,ft(x)分類器的權重αt和錯誤分類誤差的關系表達式為:
(6)
在得到權重αt之后,第t次的boosting過程完成。在下一次boosting開始前,要根據(jù)第t次boosting過程的結果更新下一次boosting過程中的權重向量Dt+1。權重向量的更新原則是根據(jù)分類結果進行更新,通過提高錯分樣本的權重,降低正確分類樣本的權重。目的是在下一次boosting過程中將重點放在錯誤分類的樣本上,訓練樣本集的權重向量更新表達式為:
(7)
其中,Zt是規(guī)范化因子。
根據(jù)分類的結果,權重向量的更新策略詳細表示為:
(8)
其中,ft(xi)=yi表示被正確分類;ft(xi)≠yi表示被錯誤分類。
經過T次boosting過程后,最終的分類器為:
(9)
綜上所述,CMKEL算法的描述如下:
輸入:訓練集、核函數(shù)kj、初始權重分布D1=1/N。
(1)開始第t=1~T次的boosting過程,權重向量表示每個訓練樣本Dt的權重分布。
(2)對于j=1~M來訓練對應kj核函數(shù)的弱分類器,根據(jù)式4計算在Dt下的錯誤分類誤差。
(3)訓練完所有的基于核的分類器之后,選擇最小錯誤分類的分類器,由式5得到ft(x)。
(4)由式6計算αt。
(5)根據(jù)式8權重更新的策略,更新下一次boosting過程的權重向量分布。
(6)T次boosting過程之后,得到T組分類器和與之對應的權重。
輸出:最終分類器G(x)。
為驗證CMKEL算法的預測效果,將該算法與加權樸素貝葉斯(weighted Na?ve Bayes,NB)算法[7]、壓縮的C4.5決策樹(compressed C4.5 decision tree,CC4.5)算法[15]和代價敏感的Boosting神經網絡(cost-sensitive boosting neural network,CBNN)算法[16]在NASA、AEEEM數(shù)據(jù)庫中進行對比驗證。
NASA、AEEEM數(shù)據(jù)庫的工程數(shù)都是五個,它們各個工程的靜態(tài)代碼度量和缺陷占比如表2所示。
預測模型的評估指標有召回率(pd)、誤報率(pf)、查準率(precision)和精確度(acc)。
表2 數(shù)據(jù)集的詳細信息
文中主要采用兩個綜合性能指標:F-measure,就是將pd與precision結合起來評價;AUC值(area under curve)被定義為ROC曲線下的面積,使用AUC值可以評估二分類問題分類效果的優(yōu)劣。F-measure和AUC的數(shù)值越大,表示軟件缺陷預測模型的預測性能越好。
在多核學習的訓練中,選擇具有20個不同寬度(2-10,2-9,…,29)的高斯核函數(shù),然后使用這20個基核分別將NASA和AEEEM里面的每一個工程映射到一個新的特征空間。對于弱分類器SVM,結合每個核函數(shù)訓練得到一個基于核的分類器,整個過程采用流行的LISVM工具箱作為SVM求解器。為了驗證代價敏感系數(shù)對模型是否有影響,設置μ=1,5,10,15,20,觀察代價敏感系數(shù)不同時對實驗的影響。Boosting過程的初始設計如下:在同一個數(shù)據(jù)庫下,隨機選擇一個工程作為訓練樣本,另一個工程作為測試樣本,每組算法迭代20次,最后將20次跑出來的數(shù)據(jù)取平均。Boosting的過程和文獻[17]中一致,訓練次數(shù)T為100。
為了驗證在CMKEL算法中代價敏感系數(shù)的大小對實驗結果的影響,設置了不同的μ值,在AEEEM數(shù)據(jù)庫上的實驗結果如表3所示。其中μ=1表示沒有引入代價敏感系數(shù)。
表3 不同代價敏感系數(shù)下的AUC值
從表3中的實驗結果可以看出:當μ>1時,AUC值要比μ=1高,說明引入代價敏感系數(shù)提高了預測的效果;隨著μ值的增大,AUC的值也在增長,但是當μ>15時,AUC值開始下降,說明代價敏感系數(shù)并不是越大越好,當μ=15時,CMKEL算法能達到最好的效果。
為了驗證文中算法是否有更好的性能,分別在NASA和AEEEM兩個數(shù)據(jù)庫與其他算法進行對比,結果如表4所示。(實驗結果中將F-measure值表示成F值)
表4 算法對比結果
通過以上實驗可以看出:NB,CC4.5,CBBN算法在某些項目上面能夠有比較好的F-measure值,但是CMKEL在大部分項目上都同時有很好的F-measure值、AUC值,效果要比前三種算法好,表明了CMKEL算法的優(yōu)越性。
為了解決軟件缺陷預測中樣本數(shù)據(jù)結構復雜與類別分布不平衡的問題,提出一種基于多核集成學習的跨項目軟件缺陷預測算法。利用多核學習將數(shù)據(jù)映射到新的特征空間,更好地表示數(shù)據(jù),提高預測的精確度。集成學習能夠解決類別分布不平衡的問題。在NASA和AEEEM這兩個數(shù)據(jù)庫上的實驗結果證明了該算法的有效性。