李 昭,彭小紅,謝仕義*,梁春林,趙 一,蔡莉華
(1.南方海洋科學與工程廣東省實驗室(湛江) 南海資源大數據中心,廣東 湛江 524013;2.廣東海洋大學 數學與計算機學院,廣東 湛江 524088)
軟件缺陷在軟件研發過程中不可避免,其嚴重影響著軟件產品的質量。由于在軟件研發過程中,缺陷修復得越晚,系統損失和修復成本就越大,因而研發人員希望在軟件生命周期的早期及時發現盡可能多的缺陷并修復缺陷[1]。然而受限于人力及時間成本,通常無法檢測全部組件,若能預先識別可能存在缺陷的組件及缺陷數量,將有限的測試資源合理分配給缺陷數更多的被測組件,這樣的解決方案實用性更強。軟件缺陷預測是提升軟件質量的有效途徑,成為近年來研究的焦點[2-4]。雖然現有研究在缺陷傾向性和缺陷數預測方面已取得顯著成果,但從訓練數據的平衡性和預測效能考慮,主要存在兩方面問題:(1)訓練樣本存在不平衡性[5-7];(2)單一的回歸技術對有缺陷組件支持能力不足。
該文針對缺陷傾向性和缺陷數預測領域存在的訓練數據不平衡和預測效能問題,研究基于SMOTE的均衡樣本數據構建技術、面向缺陷數預測的回歸技術選取、支持先分類后回歸的缺陷數多步預測,以期推進組件缺陷數多步預測和檢測修復研究與應用的繼續深入。
大量研究對如何運用二分類技術構建缺陷預測模型進行了廣泛探索[5,8],包括監督學習(如決策樹、神經網絡、支持向量機等)、半監督學習(如期望最大化算法)及無監督學習(如K均值聚類、譜聚類等)。
文獻[5]將NASA數據集作為樣本數據,提出基于協作表達分類的缺陷預測方法,可降低計算復雜度并提升分類效能,研究中設計了基于CRC的學習器,然后構建基于CRC的預測器,對有缺陷組件和無缺陷組件進行分類。文獻[9]采用同一軟件的七個歷史版本及相關特征來預測當前版本的缺陷,研究中對樸素貝葉斯、決策樹和隨機森林算法的建模效果進行了比較,通過分析模型的AUC值,發現隨機森林算法的預測效能最佳。文獻[10]在11種數據集上將15種不同的貝葉斯網絡分類器與其他經典的缺陷預測方法進行比較,實驗結論建議采用貝葉斯網絡構建具有較少節點的簡單且可理解的網絡。文獻[11]對比了13種機器學習方法,結果表明樸素貝葉斯、神經網絡和基于實例的學習其效能優于其他方法。
回歸技術通過度量軟件相關屬性以預測軟件組件包含的缺陷數。最初,文獻[12]提出了一種預測軟件組件中缺陷數的方法,研究中利用廣義線性回歸算法和軟件變更歷史指標建立缺陷預測模型,結果表明,缺陷數預測提供了更多有價值信息,而不僅限于識別某一組件是否含有缺陷。文獻[6]探索了決策樹回歸(DTR)用于軟件同一版本內和不同版本間缺陷預測的效能,實驗分析采用了PROMISE數據集中5個開源軟件項目的19個版本,使用絕對誤差和相對誤差以評估DTR的預測精度,結果表明,決策樹回歸用于版本內和版本間缺陷數預測能取得較高的準確性。文獻[13]提出一種遺傳編程方法用于預測軟件系統的缺陷數,并選用PROMISE數據集中10個軟件項目的缺陷數據開展實驗,采用預測模型的錯誤率、召回率和完整性指標評估了方法的效能。文獻[14]通過逐步線性回歸算法構建預測模型,以探索度量元對模型性能的影響。文獻[15]采用廣義線性回歸算法和回歸樹算法建立基準模型,基于CK度量元和LOC度量元[16],使用遺傳算法自動搜索可優化成本效益的內部參數,結果表明遺傳算法訓練的回歸模型比傳統模型效能更高。
基于聚類技術的缺陷預測方法通過分析軟件特征與缺陷數據來建立軟件屬性與缺陷間的關聯關系。伴隨機器學習技術的蓬勃發展,采用聚類算法預測軟件缺陷也演化為重要的研究與應用方向。文獻[17]建議為增強對軟件過程的控制并實現軟件的高可靠性,需在軟件生命周期早期使用K-means聚類技術對缺陷進行預測,該方法已在NASA數據集進行了驗證,缺陷預測的準確性較高。文獻[18]提出了一種面向同一軟件不同版本間的缺陷預測技術,使用結構信息對軟件類進行聚類,然后識別每個類中的缺陷信息,利用同一類簇中的相關類進行模型訓練,而不是利用整個系統含有的類進行訓練。通過PROMISE數據集中8個開源軟件項目的29個版本開展實證研究,并結合多元線性回歸算法構建預測模型,結果表明,基于同一類簇的預測模型其效能優于基于整個系統全部類的模型。文獻[19]分析了混合模糊遺傳算法和基于模糊聚類的技術,結果表明,在軟件缺陷嚴重性預測中,模糊聚類技術取得了較高效能。文獻[20]將無監督分類技術用于缺陷預測,以規避不同類型軟件中缺陷的異構性。
部分研究將聚類技術用于特征選擇,文獻[21]提出了一個新的特征選擇框架FECAR,該框架首先將原始特征劃分為k個類簇,然后在每個類簇中選取相關特征,實驗結果驗證了該框架對軟件缺陷預測的有效性。文獻[22]提出一種基于選擇策略的特征選擇方法,包含特征聚類和特征選擇兩個階段,應用k-medoids方法實現了特征的有效聚類與排序。
由此可見,雖然目前國內外有很多研究在缺陷傾向性預測、缺陷數預測和缺陷預測效能優化方面進行了大量卓有成效的工作,特別是解決問題的方法有很多可借鑒之處,但直接針對組件缺陷數多步預測及其效能提升、準確性更高且實用性更強的預測理論和技術還相當缺乏。
缺陷預測中,大多數常用開源數據集普遍存在訓練樣本不平衡問題,即訓練樣本中有缺陷組件遠少于無缺陷組件,且現有技術缺乏對樣本數據不平衡問題的處理,導致訓練出的模型其預測效能偏向于無缺陷組件,弱化了對有缺陷組件的兼顧,降低了預測的準確性。需選用合適的技術并設置合理的參數對數據集中有缺陷組件樣本進行過采樣,生成均衡的樣本數據集,應能有效支持組件缺陷數多步預測,提升預測的準確性。
該文通過合成少數類過采樣技術(synthetic minority over-sampling technique,SMOTE)[23]對不均衡的樣本數據集中有缺陷組件(少數類樣本)進行過采樣,生成新的有缺陷組件樣本,將新生成的樣本與原有數據集進行合并,增加有缺陷組件在數據集中的占比,獲取有缺陷組件數與無缺陷組件數均衡的樣本數據集,以增強預測模型對有缺陷組件的偏好,為缺陷數多步預測提供均衡的樣本數據集支持。鑒于缺陷樣本數據集通常存在嚴重的數據類不平衡問題,SMOTE技術可提供有效的解決方案支持。
若樣本數據集中有缺陷組件數為t,設需合成的新的有缺陷組件數為(n/100)*t,即原有樣本數的n%,其中n≠ 0,通過SMOTE技術進行有缺陷組件過采樣的具體步驟如下:
Step1:對n進行判斷,若n<100,則令t=(n/100)*t,即從t個有缺陷組件中隨機選取(n/100)*t個樣本,構成新的有缺陷組件樣本集,且令n=100,隨后執行Step2;若n≥100,則直接執行Step2。
Step2:令n=(int)(n/100),即對n/100取整并重新賦值給n。使用歐氏距離依次計算t個有缺陷組件樣本中每個樣本Si與其余各個有缺陷組件樣本間的距離,其中i=1,2,…,t,依此找到與Si距離最近的k個近鄰樣本。
Step3:針對每個樣本Si,在其k個近鄰樣本中隨機選擇一個樣本Sj,其中j∈{1,2,…,k},計算該樣本與初始樣本Si間的歐氏距離D(Sj,Si),隨機生成一個0到1之間的數字r,依此計算生成一個新的有缺陷組件樣本Snew,定義如公式(1)所示:
Snew=Si+r?D(Sj,Si)
(1)
重復n次執行Step3,獲取n個新樣本,其中Snew位于Si與Sj間的連接線上。
Step4:針對t個有缺陷組件樣本依次執行Step3,直到初始的t個有缺陷組件樣本均生成了對應的新樣本,獲取n*t個新樣本。
通過合理設置k的值,生成新的有缺陷組件,將新生成的有缺陷組件與初始樣本數據集進行合并,獲取有缺陷組件數與無缺陷組件數均衡的新數據集。
鑒于缺陷樣本數據集包含冗余的缺陷特征,依據均衡的樣本數據集,采用主成分分析技術(principal component analysis,PCA)[24]自動抽取對目標變量具有較高貢獻的主要缺陷特征,實現特征降維與優化,降低建模的開銷。將降維后的均衡樣本數據集劃分為訓練集和測試集,采用支持向量機(support vector machine,SVM)[25-26]算法并結合訓練數據訓練獲取缺陷傾向性預測模型,基于測試集評估模型的性能,利用預測模型對待測組件進行缺陷傾向性預測(預測某一組件是否含有缺陷),獲取軟件組件缺陷傾向性預測結果。鑒于缺陷數預測的主要目的在于更快地發現并修復盡可能多的缺陷,預測模型應聚焦有缺陷組件,因此篩除缺陷傾向性預測結果中無缺陷組件,構建僅包含有缺陷組件的樣本數據集,以增強后續回歸技術對有缺陷組件的偏好。利用回歸技術并結合僅含有缺陷組件的樣本數據集訓練獲取缺陷數預測模型,評估模型性能并利用模型預測待測組件所含缺陷數,構建缺陷數等級(依據每個組件所含缺陷數,按降序依次排列的各個組件),依據缺陷數等級優先檢測并修復缺陷數較多的組件,有效實現組件缺陷數多步預測,提升預測準確性。支持先分類后回歸的缺陷數多步預測方法體系結構如圖1所示。

圖1 缺陷數多步預測體系結構
均衡的缺陷樣本數據集包含部分冗余特征,因此首先采用PCA技術對樣本數據集進行特征降維與優化,獲取特征優化后的數據集。
通過支持向量機并結合訓練數據訓練獲取缺陷傾向性預測模型。
鑒于組件缺陷數預測的目的在于更快地發現并修復盡可能多的缺陷,預測模型應聚焦有缺陷組件,因此篩除缺陷傾向性預測結果中無缺陷組件,構建僅包含有缺陷組件的樣本數據集,以增強后續回歸技術對有缺陷組件的偏好。
采用回歸算法并結合僅包含有缺陷組件的分類結果,訓練獲取缺陷數預測模型,評估模型性能并利用模型預測待測組件所含缺陷數,生成缺陷數等級(依據每個組件所含缺陷數,按降序依次排列的各個組件),依據缺陷數等級優先檢測并修復缺陷數較多的組件,構建支持先分類后回歸的缺陷數多步預測方法,有效實現組件缺陷數多步預測,提升預測準確性。缺陷數多步預測數據流程如圖2所示。

圖2 缺陷數多步預測數據流程
組件缺陷數預測屬于典型的回歸問題,鑒于梯度提升回歸(gradient boosting regression,GBR)[27]和線性回歸(linear regression,LR)[27]在軟件缺陷數預測中取得的較好效能[28],該文分別選用以上兩種算法,依次訓練并生成對應的缺陷數預測模型,獲取對應的缺陷數等級,實現先分類后回歸的缺陷數多步預測。
支持先分類后回歸的組件缺陷數多步預測方法包含如下步驟:
Step1:通過SMOTE技術對不均衡樣本數據集中的有缺陷組件樣本進行過采樣,生成有缺陷組件與無缺陷組件均衡的新數據集。
Step2:采用PCA技術對均衡的樣本數據集進行特征降維與優化,獲取特征優化后的數據集。
Step3:通過SVM算法并結合降維后的均衡樣本數據集訓練獲取缺陷傾向性預測模型,利用模型對待測組件進行缺陷傾向性預測,即第一步預測(分類),獲取組件缺陷傾向性預測結果。
Step4:篩除分類結果中的無缺陷組件,構建僅包含有缺陷組件的樣本數據集。
Step5:利用回歸算法并結合僅含有缺陷組件的樣本數據集訓練并構建缺陷數預測模型,通過模型預測每個組件的缺陷數,即第二步預測(回歸),構建缺陷數等級,測試人員依據缺陷數等級優先檢測并修復缺陷數較多的組件,實現更準確的缺陷預測。
本節采用PROMISE開源數據集[29]開展實驗驗證,該數據集常用于軟件缺陷預測[30-31],選取該數據集中10個開源項目36個版本的樣本數據,每個版本包含靜態代碼屬性和數據屬性,靜態代碼屬性包含組件的20個特征。
由于PROMISE的樣本數據只包含組件的缺陷數標簽,并未對組件的缺陷傾向性進行標注,而在組件缺陷傾向性預測時,需將缺陷傾向性標簽加入樣本數據,即需明確各個組件為“有缺陷”或“無缺陷”。因此,該文依據數據集提供的各組件所含缺陷數對其缺陷傾向性進行標注,將至少含有1個缺陷的組件標注為1,將含有0個缺陷的組件標注為0,數字1代表有缺陷組件,數字0代表無缺陷組件。
依據收集的實驗數據,本節首先采用SMOTE技術對不均衡實驗數據集中的有缺陷組件樣本進行過采樣,k值設置為3,生成新的均衡樣本數據集。基于均衡的樣本數據集,利用PCA技術對20個特征進行降維與優化,將PCA的主成分比例參數設置為0.8,獲取降維后的均衡樣本數據集。按照4∶1的比例將數據集隨機劃分為訓練集和測試集,SVM算法沿用默認參數,通過SVM并結合降維后的均衡樣本數據集訓練獲取缺陷傾向性預測模型,利用模型對樣本數據進行分類,獲取分類結果。篩除分類結果中的無缺陷組件,構建僅包含有缺陷組件的樣本數據集。基于僅包含有缺陷組件的樣本數據集,分別采用梯度提升回歸(GBR)和線性回歸(LR)算法訓練生成對應的缺陷數預測模型。最后將先分類后回歸的多步預測方法與直接使用回歸技術的預測方法進行效能評估與對比,由于該文關注組件缺陷數的預測和排序結果,因此采用Spearman相關系數[32]和Kendall相關系數[33]來評估方法的效能。
本節使用Strategy-1代表該文所提先分類后回歸的缺陷數多步預測方法,Strategy-2代表僅用回歸技術的預測方法。圖3顯示了僅使用GBR的預測以及使用SMOTE-SVM結合GBR的多步預測效能的柱狀圖。由圖3可知,36個項目版本中,在Spearman相關系數上,Strategy-1相比Strategy-2在23個版本中效能得到提升,GBR的Spearman相關系數取值范圍在(-0.35,0.31)之間,Strategy-1的Spearman相關系數取值范圍在(-0.39,1)之間,且在ant-1.3、camel-1.0、poi-2.0三個項目版本上的Spearman相關系數為1,明顯優于Strategy-2。在Kendall相關系數得分上,Strategy-1在22個項目上的表現優于Strategy-2,且在ant-1.3、camel-1.0、poi-2.0三個項目版本上的Kendall相關系數同樣為1,表明Strategy-1適用于對這三個項目版本建模。總體來說,先分類后回歸的多步預測方法可在一定程度上提升組件缺陷數預測的效能。

圖3 多步預測與單一使用GBR預測在不同版本上的預測效能
由于篇幅的限制,本節僅通過圖4闡釋多步預測與單一使用LR預測的效能評價結果。同理,由圖4可知,單純使用LR所建預測模型的Spearman相關系數和Kendall相關系數的得分最大值分別為0.42和0.29,而多步預測在這兩項指標上的得分最大值均為1,多步預測在36個項目版本的評估結果中,22個版本的Spearman相關系數得分和20個版本的Kendall相關系數得分優于單純使用LR的預測。


圖4 多步預測與單一使用LR預測在不同版本上的預測效能
該文重點討論了通過建立均衡的樣本數據集且基于先分類后回歸的缺陷數多步預測方法提升軟件缺陷數預測效能的問題。首先,針對缺陷預測中訓練數據不平衡的問題,提出采用SMOTE技術構建均衡樣本數據集,即通過SMOTE技術對不均衡的樣本數據集中有缺陷組件進行過采樣,兼顧不同類別樣本占比,構建均衡的樣本數據集,提升預測的準確性。其次,瞄準單一回歸技術對有缺陷組件缺陷數預測的支持能力不足問題,提出了支持先分類后回歸的缺陷數多步預測方法,該方法利用分類技術(SVM)生成缺陷傾向性預測結果(分類步驟),篩除缺陷傾向性預測結果中無缺陷組件,構建僅包含有缺陷組件的樣本數據集,以增強后續回歸技術對有缺陷組件的偏好。依據選取的回歸技術并結合僅含有缺陷組件的樣本數據集訓練獲取缺陷數預測模型(回歸步驟),構建缺陷數等級,進一步提升缺陷數預測效能。最后,通過典型開源數據集進行實驗實證與效能評估,證實了文中方法的有效性和實用性。