郭 峰,和萌萌
(北方工業大學 信息學院,北京 100144)
軟件缺陷預測是軟件開發和運行維護領域中關鍵的研究內容,是根據軟件歷史倉庫提取軟件度量元信息進而預測待測版本各模塊的缺陷傾向性或者缺陷數量。軟件缺陷預測可以促進軟件開發和運行維護中測試資源合理分配,提高軟件測試效率,有助于發現軟件開發過程中存在的風險,降低開發成本,提高軟件質量[1]。
目前,已有研究者提出一些使用機器學習或統計學方法的有效軟件缺陷預測方法[2-5],但它們局限于將軟件缺陷預測工作劃分為二分類問題,即預測軟件模塊是否有缺陷傾向。由于軟件測試資源有限且每個軟件模塊在軟件質量管理過程中重要性不同,僅僅分析一個軟件模塊是否有缺陷會導致運行故障是遠遠不夠的[6-7]。較為準確的預測軟件缺陷數量能夠使有限的測試資源分配給更多缺陷模塊或更重要的缺陷模塊。因此,軟件缺陷數量預測會對軟件開發、運行和維護更有幫助。
針對軟件缺陷數量預測方法,2008年W. Afzal提出使用遺傳編程構建缺陷數預測模型,為缺陷數預測模型的構建開辟了新道路[8];Rathore S S在2015年利用神經網絡和遺傳編程進行了缺陷數量的預測[9],在2016年研究了決策樹回歸算法預測缺陷數量的能力[10],在2017年提出使用集成學習方法構建缺陷預測模型[11]。但是軟件產品大致符合二八原則,即80%的缺陷集中在20%的模塊中,有缺陷的模塊遠少于沒有缺陷的模塊[12-13]。在缺陷預測中,這種現象被稱為數據不平衡。數據不平衡嚴重影響了缺陷預測模型性能,沒有缺陷的模塊支配著數據樣本,學習器會偏向于沒有缺陷模塊,因此,學習器對有缺陷模塊不會產生好的預測結果[12]。
目前,調整該現象的方法可以分為兩類:數據層面和算法層面,算法層面基本思想是設計適用于不平衡數據集的軟件缺陷預測模型。部分研究者在構建缺陷預測模型模塊考慮到了數據不平衡問題。Sun等人[14]針對數據的不平衡特性提出了基于特定編碼的集成學習算法。Ryu等人[15]考慮了數據不平衡和分布特征,提出了一種基于代價敏感的遷移學習方法。Wang等人[16]提出將多核學習方法和集成學習方法相結合解決數據不平衡問題[12]。數據層面的主要策略是在數據預處理階段,對不平衡的數據進行調整。
數據層面抽樣方法是解決數據不平衡常用的方法,抽樣方法分為過采樣和欠采樣。欠采樣是隨機刪除含常見目標變量值的類(即多數類)以平衡數據的分布,可能會導致重要數據丟失。過采樣是通過隨機復制含稀有目標變量值的類(即少數類)以平衡數據的分布,可能會使學習器的決策區域變得更小、更具體,從而導致學習器出現過擬合現象。
對此,Chawla等人[17]在過采樣方法的基礎上,提出創建少數類以平衡數據分布的算法smote。smote算法的基本思想是對少數類樣本進行分析和模擬,人工模擬合成新的少數類,以平衡數據集分布。該算法克服了過采樣算法的缺點,但在選擇合成少數類的目標類時存在隨機性,會影響缺陷預測模型的性能。部分研究者采用抽樣方法去解決數據不平衡問題。Zhang等人[18]在原始抽樣算法基礎上提出一種改進算法EDBC,優化了原始抽樣方法,但性能上不及算法層面集成學習算法,Muhammed[19]利用不同基礎抽樣方法對數據集進行處理,發現不同抽樣方法性能差別不大。
如何利用軟件歷史倉庫信息準確預測出軟件缺陷數量是該文研究的重點。
根據軟件歷史倉庫信息可以提取軟件度量元信息,有利于軟件缺陷預測工作進行,但軟件產品大多存在數據不平衡現象,會影響缺陷預測性能。針對數據不平衡,已有研究僅局限于算法層面或數據層面,并且算法層面研究僅局限于單一的回歸算法,存在一定缺陷,會對軟件缺陷預測精度造成一定影響。為了提高缺陷數量預測精度,該文提出一種新的軟件缺陷數量預測方法ELDDP。該方法在數據層面和算法層面均考慮了不平衡數據集的影響。在數據層面將依賴度引入smote算法,對smote算法進行改進,然后使用改進smote算法進行數據預處理。在算法層面,該文提出結合集成學習Adaboost.R2算法[20]和Stacking算法優勢構建缺陷預測模型,這樣不僅可以減少不平衡數據集對預測結果的影響,也可以增加缺陷預測模型的魯棒性和準確性。ELDDP總體流程如圖1所示。

圖1 ELDDP方法總體流程
smote算法的主要策略是度量少數類之間的歐氏距離,選擇少數類i(i∈{1,2,…,T})(T為不平衡數據集中少數類的總個數)最k近鄰,從最k近鄰中隨機選擇一個少數類,與少數類i合成新的少數類,重復上述過程,直到數據集達到平衡狀態。smote算法示意如圖2所示。

圖2 smote算法示意圖
smote算法能夠避免過擬合的問題,通過人工合成少數類使得學習器決策區域更大,但仍存在一定的局限性。該文對從最k近鄰選擇目標類方法進行改進,將依賴度引入smote算法中。
1.1.1 依賴度
依賴度是指軟件中各個類之間依賴關系的度量,依賴關系包括控制關系、調用關系和數據傳遞關系。
在軟件缺陷預測中,軟件每個類可看作是一個節點,類以及類之間的關系可以看作是一個網絡結構。根據無標度網絡特性,即在一個網絡中,新增加一個節點,該節點會優先連接高度數的節點,即依賴度較大的節點,可知依賴度較大的類存在著缺陷引入的風險。因此,依賴度較大的類應是缺陷預測模型的重點研究對象。圖3展示了Promise數據集中基于Java環境開發的xalans軟件2.5版本部分類的依賴度和缺陷數。

圖3 xalans類
從圖3中可以看出,軟件中依賴度較大的類存在有缺陷可能性更大的現象。
該文使用Dependency Finder分析工具從Java字節碼文件中提取軟件類之間依賴關系,將每個類的依賴類和被依賴類個數總結、求和,形成一個新的特征:依賴度(depedency,dep),添加于軟件缺陷預測領域常用的數據集Promise中,對Promise數據集進行更新。
1.1.2 算法描述
改進smote算法的基本思想是:在原smote算法基礎上,從最k近鄰中選擇少數類,與少數類i合成新的少數類時優先選擇依賴度較大的少數類,使得人工合成少數類樣本能更加滿足實際需求。改進smote算法的具體描述如下:
第一步:定義少數類和多數類?;谙嚓P性函數和用戶指定的相關性閾值來定義稀有目標變量值和常見目標變量值。具有稀有目標變量值的類稱為少數類,具有常見目標變量值的類稱為多數類。為了預測軟件缺陷的數量,基于軟件歷史倉庫,將缺陷數為零的類定義為少數類,將缺陷數大于零的類定義為多數類。
第二步:創建合成少數類樣本。
假設一個具體的少數類樣本i,特征向量為xi,i∈{1,2,…,T}(T為不平衡數據集中少數類樣本的總個數),計算少數類i到該數據集所有少數類的歐氏距離,找到與少數類樣本i最近的k個少數類樣本xi(near),near∈{1,2,…,T}。
根據依賴度dep對xi(near),進行排序得到Xi(near),near∈{1,2,…,T}。
根據數據集中少數類和多數類的不平衡比例設定需要設置的采樣倍率N,然后從Xi(near),near∈{1,2,…,T}中選擇排在第n(n∈{1,2,…,k})(n的初始值為1,第二次重復時選擇排在第n+1個的少數類)個的少數類Xi(nn),同時隨機生成一個0到1之間的數ω,最后用公式(1)插入一個新的少數類樣本。
xi1=xi+ω×(Xi(nn)-xi)
(1)
這樣就在兩個少數類之間成功插入一個新的合成少數類。重復上述操作N次,合成了N個少數類。對于少數類樣本集T中的每個少數類均重復上述操作,就會合成NT個新的少數類樣本,最終達到平衡數據集的目的。
集成學習的基本思想是通過某種策略將多個方法集成,最終合成一個整體的學習器模型。Adaboost.R2(Adaptive Boosting Regression)算法是集成學習用于構建回歸模型的常用算法。Adaboost.R2算法[20]主要策略是基于不斷調整的數據集使用某一種回歸算法訓練多個基學習器,然后通過某種策略將基學習器結合起來構成一個強學習器[21]。該算法可以使用不同回歸算法構建學習器,非常靈活,但最終構建模型只針對某一種回歸算法,并且對異常樣本敏感,會影響最終強學習器的預測準確性[22]。Stacking方法的基本思想是將多個模型的結果進行融合來提高預測率。因此,該文結合集成算法Adaboost.R2和模型融合Stacking方法構建缺陷預測模型,具體描述如下:
第二步:訓練弱學習器,計算弱學習器樣本誤差。首先,分別依據決策樹回歸(DTR)、貝葉斯嶺回歸(BRR)和線性回歸(LR)訓練出弱學習器ht。然后,計算弱學習器ht的學習誤差率。如果εt表示弱學習器學習誤差率,t的取值范圍為[dj,bj,lj],j=1,2,…,T(T為基學習器的個數),則εt的計算方式如式(2):
(2)
其中,wi為當前訓練集中第i個樣本,ei為第i個樣本的指數誤差,其定義如式(3)所示:
(3)
Et表示針對弱學習器ht,訓練集上樣本的最大誤差,其計算方式如下:
Et=max|yi-ht(xi)|,i∈{1,2,…,m}
第三步:更新訓練集樣本權值。首先,根據弱學習器學習誤差率計算弱學習的權重系數αt,其計算方式如式(4)所示:
(4)
然后,更新訓練集中樣本權值wt+1,i:

第四步:將權值更新后的樣本組成一個新的訓練集,重復上述第二步和第三步,直到εt達到指定值為止。然后,通過線性組合的方式分別將以決策樹回歸(DTR)、貝葉斯嶺回歸(BRR)和線性回歸(LR)為基學習算法訓練出的弱學習器組合成強學習器(Hd,Hb,Hl)。
第五步:采用Stacking算法將Hd,Hb,Hl擬合成一個綜合決策樹回歸、貝葉斯嶺回歸、線性回歸算法優勢的學習器。具體而言,將Hd,Hb,Hl預測結果作為訓練集,對元學習器(該文采用決策樹回歸算法)進行訓練,最終得到預測結果更為準確的模型。
該文使用了添加依賴度特征后的Promise數據集中5個常用且可用的軟件項目,包含13個軟件項目版本。這些項目的詳細統計信息顯示在表1中,包括項目名稱、實例數目、缺陷總數、缺陷比例(有缺陷類所占百分比)、實例中最大的缺陷數。每個項目都包含了很多基于代碼度量元和過程度量元的特征。

表1 實驗數據集詳細信息
該文使用中位數絕對誤差(Median Absolute Error,MDAE)、平均絕對誤差(Average Absolute Error,AAE)和決定系數(R-square,R2)三個性能評價指標測評ELDDP在軟件缺陷數預測中的準確性。
中位數絕對誤差(MDAE):計算數據與它們中位數之間的偏差。對誤差絕對值取中位數,降低異常值的影響。定義為:
平均絕對誤差(AAE):計算預測結果與真實結果的接近程度,可以很好地反映預測結果的實際情況。該值越小說明模型擬合效果越好。其定義如下:

(5)
決定系數(R2):計算特征向量對預測結果的解釋程度,正常取值范圍為:[0,1],
R2值越接近1說明特征向量對預測結果的解釋能力越強,該模型對數據的擬合程度越好。其定義如下:
(6)

實驗中采用10折交叉驗證,具體而言,將一個項目的一個版本數據集分成大小相等的十個部分,其中九個部分用于構建缺陷數預測模型,剩余的一個部分作為測試集對構建的模型進行測試。如此操作重復十次,以便十個部分都可以作為測試數據進行一次測試。該文將10折交叉驗證方法10次的運行結果取均值作為模型的最終性能。
為了評估ELDDP方法的性能,驗證改進smote算法的有效性,將smote算法分別與DTR、BRR、LR結合,分別記為SDTR、SBRR和SLR,然后與ELDDP進行比較。為了減少人為因素對測評結果的影響,DTR、BRR和LR均由機器學習sklearn庫提供,即對這些回歸算法不做額外優化。
在本節中,對ELDDP方法整體性能進行實證研究。表2~表4分別記錄了ELDDP、SDTR、SBRR和SLR在AAE、MDAE、R2測評指標上的平均值。

表2 基于AAE測評指標,不同軟件缺陷數預測模型性能

表3 基于MDAE測評指標,不同軟件缺陷數預測模型性能

表4 基于R2測評指標,不同軟件缺陷數預測模型性能
在表2~表4中每一行表現最好的結果都被加粗表示,最后一行為ELDDP與SDTR、SBRR、SLR的Win/Draw/Loss(W/D/L)分析,該方法表示方法1與方法2關于特定測評指標的性能比較,即在某測評指標上,方法1的性能好于、相似或差于方法2的性能次數。
在表2~表4中,ELDDP在大多數情況下均表現良好,對于AAE測評指標,ELDDP方法在ant、camel、synapse、xalan和xerces項目上均獲得了最好的性能;對于MDAE測評指標,ELDDP分別在ant、camel、synapse、xalan和xerces項目上獲得了3/4,2/3,1/2,2/2,2/2勝績,SDTR取得了三次最好性能。對于R2測評指標,ELDDP方法在ant、camel、synapse、xerces和xalan項目均取得了最好性能。
為了更加直觀比較四種模型(ELDDP、SDTR、SBRR、SLR)的穩定性,該文采用了箱形圖描述,如圖4所示,分別表示四種模型在AAE、MDAE、R2測評指標上的性能。在圖4中每個箱形表示一個預測模型在一個測評指標上的性能。箱形越小說明預測模型在測評指標上表現越穩定。

圖4 預測模型箱型圖
比較圖4各子圖可以看出,相對于SDTR、SBRR、SLR預測模型,ELDDP在每一個測評指標上都具有一定穩定性。
綜上所述,ELDDP方法的性能均優于SDTR、SBRR和SLR,且ELDDP具有一定穩定性,可以有效提高軟件缺陷數預測效率。
本節主要討論可能對研究結果產生有效性威脅的因素。具體而言:影響內部有效性因素主要涉及代碼實現的正確性。為了減少人為因素對代碼復現的影響,該文選擇三種最經典的回歸算法作為Adaboost.R2算法基學習方法,采用機器學習包sklearn和mlxtend加以實現;外部有效性影響因素主要涉及實驗結果是否具有普適性。該文采用Promise數據集,該數據集包含15個不同類型、不同領域的應用項目,且該數據集已廣泛應用于軟件缺陷預測領域;結論有效性影響因素集中于測評指標,該文側重于AAE、MDAE和R2指標進行評測,AAE、MDAE和R2已應用于眾多領域,且具有一定表現力,可以很好地評估模型性能。
該文提出一種基于集成學習融合依賴度的軟件缺陷數預測方法ELDDP,該方法在數據預處理時將依賴度引入smote算法,對smote算法進行改進;在構建缺陷預測模型時,提出將集成學習Adaboost算法和Stacking模型融合算法相結合,以期提高軟件缺陷數預測準確性。實驗結果表明,該方法有較好的表現力,能夠較準確地預測軟件缺陷數量。在未來工作中,需將該算法應用于真實場景中,進行進一步完善和改進,使算法在軟件缺陷數預測領域更具有普適性。