高 晶
(煙臺(tái)職業(yè)學(xué)院 信息工程系,山東 煙臺(tái) 264670)
隨著網(wǎng)絡(luò)的蓬勃發(fā)展與日益普及,軟件在社會(huì)工作與生活中起著至關(guān)重要的作用。若部署了含有缺陷的軟件,極有可能引發(fā)不堪設(shè)想的后果。因此,精準(zhǔn)預(yù)測(cè)出軟件缺陷具有重要的現(xiàn)實(shí)意義。為了降低缺陷修復(fù)代價(jià),應(yīng)在項(xiàng)目開發(fā)初期就完成項(xiàng)目中潛在缺陷程序模塊的識(shí)別,預(yù)測(cè)對(duì)象主要為模塊中的缺陷、缺陷數(shù)及缺陷密度等。眾多相關(guān)學(xué)者對(duì)軟件缺陷預(yù)測(cè)技術(shù)展開研究,以滿足更新?lián)Q代較快的軟件需求。
文獻(xiàn)[1]提出基于文件粒度的多目標(biāo)軟件缺陷預(yù)測(cè)方法,通過(guò)對(duì)比無(wú)監(jiān)督學(xué)習(xí)方法與有監(jiān)督學(xué)習(xí)方法間的性能,設(shè)計(jì)了一種多目標(biāo)優(yōu)化的MULTI方法,基于FL-SDP 問(wèn)題對(duì)兩個(gè)不同的優(yōu)化目標(biāo)進(jìn)行設(shè)定,采用Logistic回歸方法完成預(yù)測(cè)模型訓(xùn)練,將FL-SDP 問(wèn)題轉(zhuǎn)換為經(jīng)典的二元分類問(wèn)題后,對(duì)模塊是否存在缺陷實(shí)施判定。文獻(xiàn)[2]研究了一種兩階段的軟件模塊缺陷數(shù)預(yù)測(cè)特征選擇方法,F(xiàn)SDNP 方法中的階段分為特征聚類與特征選擇,前者采用密度峰聚類算法劃分相關(guān)性較高的缺陷特征,后者通過(guò)啟發(fā)式排序策略,對(duì)冗余、無(wú)效特征進(jìn)行濾除。文獻(xiàn)[3]則架構(gòu)了一種基于深度自編碼網(wǎng)絡(luò)的軟件缺陷預(yù)測(cè)方法,通過(guò)無(wú)監(jiān)督學(xué)習(xí)采樣策略,采集不同開源項(xiàng)目數(shù)據(jù)集,從而避免數(shù)據(jù)集出現(xiàn)類別不平衡,利用創(chuàng)建的深度自編碼網(wǎng)絡(luò)模型,降維數(shù)據(jù)集特征,經(jīng)過(guò)連接3 種分類器對(duì)其進(jìn)行訓(xùn)練,最終完成測(cè)試集預(yù)測(cè)。
由于上述方法多數(shù)是用于預(yù)測(cè)同項(xiàng)目軟件缺陷,無(wú)法精準(zhǔn)預(yù)測(cè)存在較大差異的源項(xiàng)目與目標(biāo)項(xiàng)目數(shù)據(jù)集,所以本文設(shè)計(jì)了一種基于代價(jià)敏感半監(jiān)督的跨項(xiàng)目軟件缺陷數(shù)預(yù)測(cè)模型。依據(jù)選取的度量元集合,收集各版本源代碼,應(yīng)用搜索下載的方式,采集缺陷數(shù)據(jù)。經(jīng)過(guò)在源代碼中提取度量元,將其與缺陷信息一一對(duì)應(yīng),完成度量元矩陣構(gòu)建,采用清洗、集成、規(guī)約及變換對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,隨后設(shè)定屬性復(fù)雜度的閾值為中位數(shù),得到最終采樣結(jié)果。利用設(shè)計(jì)的代價(jià)敏感半監(jiān)督支持向量機(jī),劃分樣本數(shù)據(jù)集,通過(guò)對(duì)預(yù)測(cè)模型實(shí)施訓(xùn)練學(xué)習(xí),實(shí)現(xiàn)缺陷數(shù)預(yù)測(cè)。
1.1.1 數(shù)據(jù)采集
數(shù)據(jù)的采集階段不僅是預(yù)測(cè)跨項(xiàng)目軟件缺陷數(shù)的基本,也是預(yù)測(cè)模型設(shè)計(jì)的重要環(huán)節(jié)。在軟件開發(fā)階段,相關(guān)數(shù)據(jù)一般為軟件源代碼[4]、開發(fā)人員溝通歷史記錄、有關(guān)文檔和缺陷追蹤信息等。其中,軟件缺陷主要存在于軟件源代碼信息與歷史缺陷信息中??珥?xiàng)目軟件缺陷數(shù)據(jù)的采集共分為以下5個(gè)階段:
1)度量元集合的合理選取
作為軟件缺陷預(yù)測(cè)模型的輸入部分,度量元可以實(shí)現(xiàn)源代碼缺陷信息的挖掘。因?yàn)槎攘吭獢?shù)量會(huì)隨著數(shù)據(jù)信息量的提升而增多,所以由較多度量元所組建的模型將具有更理想的預(yù)測(cè)精準(zhǔn)度。但是,當(dāng)度量元增加到一定數(shù)量時(shí),高維數(shù)據(jù)就會(huì)引發(fā)過(guò)擬合問(wèn)題,降低預(yù)測(cè)性能。因此,為了使預(yù)測(cè)模型性能達(dá)到最佳狀態(tài),應(yīng)通過(guò)斯皮爾曼等級(jí)相關(guān)系數(shù)[5]的選擇方法對(duì)合適的度量元進(jìn)行選取。
已知X=(X1,X2,…,Xn)與Y=(Y1,Y2,…,Yn)為兩個(gè)變量,經(jīng)過(guò)排列Xi與Yi的順序,獲得xi與yi,則采用下列公式對(duì)斯皮爾曼等級(jí)相關(guān)系數(shù)進(jìn)行運(yùn)算:
其中,xi與yi的均值分別為xˉ和yˉ。由式(1)可以看出,度量元和缺陷數(shù)量的關(guān)聯(lián)性與斯皮爾曼等級(jí)相關(guān)系數(shù)成正比,依據(jù)斯皮爾曼等級(jí)相關(guān)系數(shù)降序排列度量元,所選取的度量元集合由序列中前N個(gè)度量元架構(gòu)而成。
2)源代碼收集
由于大部分項(xiàng)目的源代碼均被儲(chǔ)存于代碼倉(cāng)庫(kù),以便于項(xiàng)目協(xié)作與代碼管理,所以開發(fā)人員只需運(yùn)用版本控制工具,就可以完成每個(gè)版本的源代碼收集任務(wù)??刂乒ぞ叩倪x取主要由項(xiàng)目數(shù)據(jù)托管平臺(tái)種類決定。
3)缺陷數(shù)據(jù)采集
收集源代碼數(shù)據(jù)后,要從Bugzilla 與Jira 的Bug跟蹤系統(tǒng)里采集與源代碼相對(duì)應(yīng)的缺陷信息。因?yàn)閮上到y(tǒng)性能相似,所以數(shù)據(jù)提取方法也大致相同,通過(guò)搜索下載就能夠完成,最后將獲取的缺陷數(shù)據(jù)與軟件源代碼文件進(jìn)行聯(lián)立。Bugzilla開源缺陷跟蹤系統(tǒng)的缺陷信息統(tǒng)計(jì)如表1所示。
表1 缺陷信息統(tǒng)計(jì)表
4)度量元提取
靜態(tài)分析統(tǒng)計(jì)源代碼就是度量元的提取過(guò)程,可以通過(guò)諸如OOMeter、semmle等提取工具完成。
5)度量元矩陣架構(gòu)
各矢量均為代價(jià)敏感半監(jiān)督支持向量機(jī)的輸入,分類標(biāo)簽則是缺陷信息,依據(jù)取得的度量元與缺陷信息,將兩者進(jìn)行一一對(duì)應(yīng)后,即可得到度量元數(shù)據(jù)矩陣。
1.1.2 數(shù)據(jù)預(yù)處理
預(yù)處理階段由清洗、集成、規(guī)約及變換組成。在軟件模塊內(nèi),提取的標(biāo)簽值主要用于缺陷存在判定,采集的度量屬性如表2 所示。若數(shù)據(jù)有屬性值缺失現(xiàn)象,則利用屬性期望值進(jìn)行填充。
表2 數(shù)據(jù)集度量元統(tǒng)計(jì)表
為了避免發(fā)生對(duì)0 取對(duì)數(shù)的情況,通過(guò)引入極小值方法,完成屬性值的對(duì)數(shù)化預(yù)處理,其計(jì)算式如下所示:
式中,x為屬性值。
1.1.3 數(shù)據(jù)采樣
由于缺陷預(yù)測(cè)數(shù)據(jù)呈不均勻分布狀態(tài),只有部分?jǐn)?shù)據(jù)存在缺陷,所以基于源代碼度量元與缺陷之間的潛在相關(guān)性,制定理想的采樣策略。通過(guò)觀察缺陷數(shù)據(jù)與非缺陷數(shù)據(jù)的度量元數(shù)值可知,存在缺陷的模塊度量元數(shù)值相對(duì)更高。將屬性中位數(shù)作為衡量屬性復(fù)雜度的閾值,通過(guò)保證所選樣本不存在過(guò)低的缺陷率,使模型性能得到提升。圖1 所示為數(shù)據(jù)采樣流程。
圖1 數(shù)據(jù)采樣流程
圖1 中,軟件樣本屬性值為Y1~Y6,樣本集合為S1~S7。如果待采樣的帶標(biāo)簽樣本[7]有N個(gè),則采樣步驟描述如下:
1)對(duì)所有模塊的屬性中位數(shù)進(jìn)行求解;
2)針對(duì)各樣本屬性值,若大于該屬性中位數(shù),則稱之為高屬性值;
3)將高屬性值個(gè)數(shù)降序排列,得到新的樣本列表;
4)選取列表的前2N個(gè)樣本構(gòu)成候選集;
5)對(duì)候選集內(nèi)的N個(gè)樣本進(jìn)行隨機(jī)抽取,并將其作為最終的采樣結(jié)果。
通過(guò)尋求一個(gè)代價(jià)敏感半監(jiān)督支持向量機(jī)的超平面,最小化分類整體代價(jià),該方法通過(guò)代價(jià)敏感[8]學(xué)習(xí)思想的引入,實(shí)現(xiàn)半監(jiān)督支持向量機(jī)的算法擴(kuò)展。已知一個(gè)含有帶標(biāo)簽樣本與無(wú)標(biāo)簽樣本的數(shù)據(jù)集:帶標(biāo)簽樣本呈獨(dú)立分布,設(shè)為{(x1,y1),…,(xl,yl)},l表示帶標(biāo)簽樣本的數(shù)量;無(wú)標(biāo)簽樣本屬于同一分布,表示為{(xl+1,yl+1),…,(xl+u,yl+u)},u為無(wú)標(biāo)簽樣本數(shù)量,分類標(biāo)簽y∈{± 1} 。假設(shè)Il={1,2,…,l} 為帶標(biāo)簽樣本,Iu={l+1,l+2,…,l+u}為無(wú)標(biāo)簽樣本,錯(cuò)誤地將有缺陷樣本劃分為無(wú)缺陷樣本的代價(jià)為c(+1),把不存在缺陷樣本劃分為存在缺陷的代價(jià)為c(-1),則代價(jià)敏感半監(jiān)督支持向量機(jī)的代價(jià)矩陣如表3所示。
表3 代價(jià)矩陣
式中,H為核函數(shù)k產(chǎn)生的再生核希爾伯特空間;l(yi,f(xi))為加權(quán)損失函數(shù)[9];C1與C2為正則化參數(shù);r為模型設(shè)置參數(shù),主要是為了避免將訓(xùn)練集全部無(wú)標(biāo)簽樣本劃分至一個(gè)類別里。
對(duì)訓(xùn)練集合內(nèi)帶標(biāo)簽樣本與無(wú)標(biāo)簽樣本的錯(cuò)分率與復(fù)雜度進(jìn)行權(quán)衡,加權(quán)損失函數(shù)如圖2 所示。如果c(+1)=c(-1),則該函數(shù)為標(biāo)準(zhǔn)對(duì)稱函數(shù),此時(shí)的代價(jià)敏感半監(jiān)督支持向量機(jī)轉(zhuǎn)換為半監(jiān)督支持向量機(jī)模型;若c(+1)≠c(-1),損失函數(shù)值將呈現(xiàn)連續(xù)性。
圖2 損失函數(shù)
新參數(shù)代價(jià)比率的引入實(shí)現(xiàn)了代價(jià)添加對(duì)預(yù)測(cè)模型性能的影響評(píng)估,下式即為參數(shù)代價(jià)比率表達(dá)式:
C取不同值,得到相應(yīng)的預(yù)測(cè)性能數(shù)據(jù),從而評(píng)估性能發(fā)揮程度。
基于代價(jià)敏感半監(jiān)督支持向量機(jī)的最小化分類代價(jià)目標(biāo),創(chuàng)建跨項(xiàng)目軟件缺陷數(shù)預(yù)測(cè)模型,流程共分為以下5個(gè)步驟:
1)通過(guò)分析缺陷數(shù)據(jù)特征,對(duì)合適的度量元進(jìn)行選??;
2)按照清洗、規(guī)約等順序,預(yù)處理所得數(shù)據(jù)集;
3)標(biāo)記采樣的數(shù)據(jù)樣本,并將任意選取的無(wú)標(biāo)簽樣本與帶標(biāo)簽樣本進(jìn)行組合,得到訓(xùn)練樣本;
4)合理設(shè)定模型參數(shù)值;
5)對(duì)預(yù)測(cè)模型實(shí)施訓(xùn)練學(xué)習(xí),利用學(xué)習(xí)到的模型對(duì)測(cè)試集所含的缺陷數(shù)實(shí)施類標(biāo)簽預(yù)測(cè)。
基于代價(jià)敏感半監(jiān)督的跨項(xiàng)目軟件缺陷數(shù)預(yù)測(cè)模型架構(gòu)流程如圖3所示。
圖3 預(yù)測(cè)模型架構(gòu)流程
仿真實(shí)驗(yàn)環(huán)境的硬件部分為英特爾酷睿i5-3337U1.8GHz 處理器,運(yùn)行內(nèi)存為6 GB,操作系統(tǒng)為64 位Windows10,軟件部分是Matlab R2013a 版本[10]。
實(shí)驗(yàn)數(shù)據(jù)集由5 個(gè)開源項(xiàng)目的16 個(gè)版本所構(gòu)成,各項(xiàng)目含有11 個(gè)靜態(tài)代碼特征與類別標(biāo)注,將類作為程序模塊的粒度。
預(yù)測(cè)模型仿真過(guò)程中,選取查全率recall與查準(zhǔn)率precision對(duì)軟件模型性能進(jìn)行評(píng)估,計(jì)算公式如下所示:
式中,TP表示實(shí)際存在缺陷且分類正確;FP表示實(shí)際不存在缺陷且劃分正確;FN則表示實(shí)際不存在缺陷但分類錯(cuò)誤。
查全率是指所有缺陷被預(yù)測(cè)正確的占比,查準(zhǔn)率是指預(yù)測(cè)為缺陷的數(shù)量與實(shí)際缺陷數(shù)的比值。
由于兩指標(biāo)的評(píng)估效果比較片面,所以采用F1 指標(biāo)將其進(jìn)行綜合,以有效達(dá)成模型性能評(píng)價(jià),計(jì)算公式如下:
由式(7)可知,模型性能與F1值成正相關(guān)。
為了驗(yàn)證本文模型的通用性與有效性,分別利用靜態(tài)軟件缺陷預(yù)測(cè)方法與本文模型,對(duì)數(shù)據(jù)集進(jìn)行一對(duì)一形式與多對(duì)一形式的跨項(xiàng)目缺陷數(shù)預(yù)測(cè)模擬實(shí)驗(yàn)。實(shí)驗(yàn)數(shù)據(jù)均為獨(dú)立操作5 次的運(yùn)行結(jié)果均值,兩者的比較曲線如圖4和圖5所示。
圖4 一對(duì)一形式下跨項(xiàng)目預(yù)測(cè)對(duì)比
圖5 多對(duì)一形式下跨項(xiàng)目預(yù)測(cè)對(duì)比
通過(guò)圖4 可以看出,本文模型的F1 均值相比靜態(tài)預(yù)測(cè)方法增加了28.5%,且曲線走勢(shì)一直位于較高水平。
根據(jù)圖5 可知,基于多對(duì)一形式的跨項(xiàng)目預(yù)測(cè),對(duì)比靜態(tài)預(yù)測(cè)方法,本文模型的F1均值大幅度提升,增幅約為30.7%,波動(dòng)狀態(tài)較為平穩(wěn),說(shuō)明本文模型的預(yù)測(cè)性能具有顯著的穩(wěn)定性。
針對(duì)新啟動(dòng)的軟件項(xiàng)目,搜集理想的缺陷預(yù)測(cè)數(shù)據(jù)集是一項(xiàng)挑戰(zhàn)。所以,本文創(chuàng)建一種基于代價(jià)敏感半監(jiān)督的跨項(xiàng)目軟件缺陷數(shù)預(yù)測(cè)模型。根據(jù)度量元對(duì)軟件源代碼信息與歷史缺陷信息的數(shù)據(jù)進(jìn)行采集,經(jīng)過(guò)預(yù)處理,分析非缺陷數(shù)據(jù)與缺陷數(shù)據(jù)的度量元值關(guān)系;采用中位數(shù)閾值完成數(shù)據(jù)采樣,依據(jù)代價(jià)敏感半監(jiān)督支持向量機(jī)的超平面,對(duì)樣本存在的缺陷情況進(jìn)行分類;通過(guò)整合帶標(biāo)簽樣本與無(wú)標(biāo)簽樣本,架構(gòu)訓(xùn)練樣本,從而使測(cè)試集缺陷數(shù)預(yù)測(cè)得以達(dá)成。該模型為未來(lái)的研究工作奠定相關(guān)理論基礎(chǔ),提供重要數(shù)據(jù)資料,具有廣闊的應(yīng)用前景與重要的實(shí)踐價(jià)值。