蓋金晶,鄭 尚,于化龍,高 尚
(江蘇科技大學(xué)計算機學(xué)院,江蘇 鎮(zhèn)江 212100)
在軟件開發(fā)的過程中,需求分析、軟件設(shè)計以及開發(fā)人員的編碼實現(xiàn),每個過程都有可能由于開發(fā)人員的經(jīng)驗不足而出現(xiàn)軟件缺陷. 這些軟件缺陷可能會引起意想不到的問題,嚴重的情況下會給公司造成不可挽回的損失. 在軟件開發(fā)的過程中不可避免會出現(xiàn)軟件缺陷,而越早發(fā)現(xiàn)缺陷并且越早修復(fù)它們,則付出的代價越小. 若軟件發(fā)布后,修復(fù)缺陷的成本將大大增加. 我們希望在軟件開發(fā)初期就能夠有效地檢測出缺陷.
跨項目軟件缺陷預(yù)測(cross project defect prediction,簡稱CPDP)旨在軟件開發(fā)初期通過其他項目的歷史數(shù)據(jù),來構(gòu)建軟件缺陷預(yù)測模型,再在當前項目上進行預(yù)測,從而得到可能存在的潛在缺陷.
近年來,越來越多的研究者開始關(guān)注跨項目軟件缺陷預(yù)測. 主要圍繞同構(gòu)跨項目缺陷預(yù)測(homogeneous cross-project defect learning)和異構(gòu)跨項目缺陷預(yù)測(heterogeneous cross-project defect prediction)兩方面. 其中,同構(gòu)是指所有源項目和目標項目具有相同的度量元,而異構(gòu)是指源項目與目標項目具有不同的度量元,根據(jù)具體情況,源項目之間也可能具有不同的度量元. 而本文則是針對同構(gòu)跨項目缺陷預(yù)測開展研究.
Jureczko和Madeyski[1]從代碼所有權(quán)(code ownership)角度,考慮了3種不同類型(工業(yè)界、開源界、學(xué)術(shù)界)的項目,對CPDP的可行性進行了分析. 他們的研究結(jié)果表明,跨項目進行軟件缺陷預(yù)測的結(jié)果并不理想.
Turhan[2]為了深層次分析研究造成CPDP性能不理想的原因,引入了數(shù)據(jù)集漂移(dataset shift)的概念. 他們通過對數(shù)據(jù)集漂移類型進行分析,推薦了兩類解決方法:基于實例的方法和基于分布的方法. Zimmermann等[3]基于項目的上下文因素進行分析,共提出了40種不同的項目上下文因素來計算項目間的相似性. 他們的研究為源項目的選擇提供了指引.
由于大量不相關(guān)的跨項目數(shù)據(jù)往往使建立高性能的預(yù)測模型變得困難. 為了克服這一挑戰(zhàn),許多研究人員專注于篩選與CPDP任務(wù)無關(guān)的源實例或特性.
Turhan等[4]提出了Burak過濾法,他們通過計算訓(xùn)練集與目標項目中實例的歐式距離,選出最近的K個實例添加到訓(xùn)練集中. 他們的實驗結(jié)果表明,Burak過濾法能有效地提高CPDP模型的性能. He等[5]提出了一種兩階段的篩選方法TDS.第一階段他們根據(jù)目標項目度量元的分布特征取值,通過歐式距離篩選出前K個候選源項目;第二階段從前K個候選源項目中通過Burak過濾法或Peters過濾法[6]選出與目標項目最為接近的實例. 李勇等[7]隨后提出了相似的兩階段篩選方法,他們根據(jù)余弦距離選出與目標項目最為相關(guān)的前K個候選源項目,隨后借助Peters過濾法進一步選出相關(guān)實例.
除了上述基于實例選擇的研究成果,國內(nèi)外學(xué)者也對基于分布的跨項目缺陷預(yù)測開展了相關(guān)研究. Nam等[8]提出一種遷移學(xué)習(xí)方法,遷移學(xué)習(xí)通過調(diào)整源項目,使得源項目與目標項目的特征相似. 并且他們進一步拓展TCA,得到TCA+來提升跨項目缺陷預(yù)測性能.
Zhao等[9]提出了NN過濾器,他們通過刪除那些不在目標項目數(shù)據(jù)的最近鄰居中出現(xiàn)的源項目實例,這樣使得源項目和目標項目在分布上更加相似. Ma等[10]提出了一種名為transfer naive Bayes(TNB)的方法,該方法首先通過data gravitation(DG)方法[11]對源實例進行權(quán)重調(diào)整,以削弱不相關(guān)源數(shù)據(jù)的影響,然后對這些權(quán)重調(diào)整后的源數(shù)據(jù)構(gòu)建樸素Bayes分類器.
最近,一些研究表明,在目標項目中添加一定比例的標記數(shù)據(jù),可能有助于提高CPDP的性能. Chen等[12]提出了一種新的方法(DTB),它在目標項目中使用少量的標記數(shù)據(jù),同樣使用DG方法初始化源項目數(shù)據(jù)的權(quán)值,然后利用TrAdaboost[13]建立預(yù)測模型,利用目標項目中有限數(shù)量的標簽數(shù)據(jù)對源數(shù)據(jù)進行重估.
上述跨項目缺陷預(yù)測方法雖已經(jīng)取得了一定的成果,但是仍有改進的空間. 具體來說,即基于相似性選取的方法仍不精確,同時盲目使用大量的訓(xùn)練數(shù)據(jù)所訓(xùn)練出的預(yù)測模型容易導(dǎo)致較高的誤報率,因此,本文在一對一同構(gòu)跨項目缺陷預(yù)測領(lǐng)域做了相應(yīng)的改進工作:
(1)從數(shù)據(jù)分布的角度,利用JS散度測算找到與目標項目最相似的源項目,提升源項目選取的準確度;
(2)提出相對密度,對選定的源項目進行數(shù)據(jù)選擇,提高預(yù)測模型的精度;
(3)通過實驗驗證,本文方法對不同項目的訓(xùn)練集和分類器的選擇,皆表現(xiàn)出較好的性能.
JS散度也稱JS距離,是KL散度的一種變形. Kullback-Leibler divergence(KL散度[14])又稱為相對熵,信息散度,信息增益. KL散度是兩個概率分布P和Q差別的非對稱性的度量.典型情況下,P表示數(shù)據(jù)的真實分布,Q表示數(shù)據(jù)的理論分布、模型分布、或P的近似分布.那么離散變量KL散度見式(1):
(1)
由于KL散度不具有對稱性,即KL(P||Q)≠KL(Q||P),為了解決這個問題,有人提出了Jensen-Shannon divergence(JS散度)[15]作為相似度度量的指標.現(xiàn)有兩個概率分布P和Q,其JS散度公式如式(2):
(2)
在計算JS散度的過程中使用了蒙特卡洛[16]方法(Monte Carlo),蒙特卡洛法是一種用來模擬隨機現(xiàn)象的數(shù)學(xué)方法,這種方法在模擬中能直接反映過程中的隨機性.如公式(3)所示:
(3)
不同于KL散度,JS散度的值域范圍是[0,1],相同為0,相反則為1. 相比較于KL,對相似度的判別更準確了. 同時其對稱性能讓散度度量更準確. 因此,本研究擬利用JS散度去衡量任意兩個項目的相似性,即JS散度越接近,兩個項目的分布也就越相似.
經(jīng)過JS散度選定與目標項目分布最為相似的源項目需要對其訓(xùn)練數(shù)據(jù)選擇,以便構(gòu)建預(yù)測模型. 一般來說,若能精確地測出每一個訓(xùn)練樣本的概率密度,從噪聲點和離群點中區(qū)分出具有重要信息的樣本則變得比較容易. 但是,在高維特征空間中,獲得精確的概率密度是極為困難的,要獲取相對精確的概率密度也是十分耗時的. 因此,本文采用了一種避免概率密度測量的方法,即精確提取任意兩個訓(xùn)練樣本的概率密度的比例關(guān)系,我們稱這種反映比例關(guān)系的信息為相對密度.
為了計算相對密度,本文使用了與基于K最近鄰概率密度估計法(K-nearest neighbors-based probability density estimation,KNN-PDE[17])相似的策略. 作為一種非參數(shù)概率密度估計方法,KNN-PDE通過測量每個訓(xùn)練實例的K最近鄰距離來估計多維連續(xù)空間中的概率密度分布. 當訓(xùn)練實例的數(shù)量達到無窮大時,從KNN-PDE獲得的結(jié)果可以近似收斂到實際概率密度分布. 因此,本文提出的相對密度策略也采用了K最近鄰距離估計相對密度.
圖1 研究框架Fig.1 Research framework
(4)
顯然,在相對密度方法中,K值的選擇是十分重要的.若K值太小,則很難將低樣本從普通樣本中區(qū)分出來;若K值太大,則那些重要樣本與低樣本的區(qū)別便會變得模糊不清,而這些微小的差距將更難獲取.因此,需要給參數(shù)K選擇合適的值.
文章以源項目數(shù)據(jù)選擇為研究對象,從項目分布的相似性角度出發(fā),首先利用JS散度進行源項目選擇,其次提出相對密度進行訓(xùn)練數(shù)據(jù)選擇,最后采用CPDP中常見的分類器對數(shù)據(jù)進行訓(xùn)練,并將模型用于目標項目的預(yù)測. 具體的研究框架和方法描述分別見圖1和表1.
本文使用Z-Score標準化方法來處理數(shù)據(jù). Z-Score標準化方法是常見的數(shù)據(jù)處理方法,通過將不同量級的數(shù)據(jù)轉(zhuǎn)化為同一量級Z-Score分值進行比較.
表1 研究方法Table 1 Research method
該方法計算出原始數(shù)據(jù)的均值μ和標準差σ,對數(shù)據(jù)進行標準化處理. Z-Score標準化方法的公式可表示如式(5):
(5)
本文在對候選源項目集使用Z-Score標準化處理之后,將進行JS散度的計算,進而完成源項目的確定.
根據(jù)前文描述,JS散度能夠度量兩個項目數(shù)據(jù)分布的相似度,且JS越小證明分布越接近. 因此,本節(jié)工作主要是計算所有源項目與目標項目的JS散度,并選取與目標項目最接近的源項目.
具體流程如表2所示. 首先,將候選源項目集和目標項目分別擬合混合高斯(Gaussian mixture model,GMM)[18]模型. 高斯混合模型可以看作是由K個單高斯模型組合而成的模型,這K個子模型是混合模型的隱變量(hidden variable). 一般來說,一個混合模型可以使用任何概率分布,這里使用高斯混合模型是因為高斯分布具備很好的數(shù)學(xué)性質(zhì)以及良好的計算性能. 其次通過蒙特卡洛公式,計算候選項目集和目標項目的JS散度,其中JS(Si,T)表示為當前第i個候選項目與目標項目計算得出的JS散度值;并通過比較所得JS散度的大小,選取出與目標項目JS散度最小的源項目,即確定其為訓(xùn)練項目.
表2 源項目挑選流程Table 2 Source project selection
挑選后的源項目仍包含少量的噪聲或離群點樣本,如若盲目選擇將影響預(yù)測的效果. 為了篩選合適的訓(xùn)練數(shù)據(jù),本文通過相對密度反映類別中每個實例的重要性,并有選擇地截取數(shù)據(jù),提高訓(xùn)練模型的精度. 具體的方法流程如表3所示.
首先,根據(jù)2.2選取的源項目,統(tǒng)計其所有樣本數(shù)量,記為N;其次,計算每個樣本與第K個最近鄰的距離,獲得相對密度;最后,根據(jù)相對密度進行重要性排序,同時設(shè)定閾值p(percent)選擇合適數(shù)量的樣本作為訓(xùn)練集. 由表3可以看出,參數(shù)K和p的設(shè)定將決定模型訓(xùn)練的質(zhì)量,文中將在后續(xù)章節(jié)討論兩個參數(shù)的選擇.
表3 源項目的訓(xùn)練數(shù)據(jù)選擇Table 3 Training data selection of the source project
為了證明我們方法的適應(yīng)性,我們分別采取CPDP中常用的分類器邏輯回歸(LR)、貝葉斯(NB)、支持向量機(SVM)、K近鄰(KNN)訓(xùn)練預(yù)測模型,并用于目標項目加以驗證,對得到的CPDP性能進行對比分析.
3.1.1 數(shù)據(jù)集
文中的數(shù)據(jù)集是來自Jureczko和Madeyski[19]收集的PROMISE庫中的開源項目,其已經(jīng)被廣泛應(yīng)用于跨項目缺陷預(yù)測研究. 表4展示了數(shù)據(jù)集的基本信息,包括項目名稱、項目版本、實例數(shù)量和缺陷率.
表4 PROMISE數(shù)據(jù)集Table 4 PROMISE data sets
3.1.2 評價指標
在軟件缺陷預(yù)測中,合理的評價指標能更好地評估預(yù)測結(jié)果,下文將介紹軟件缺陷預(yù)測中的基本的評價指標.
軟件缺陷可以看做是二分類問題,若將有缺陷的模塊設(shè)置為正例,無缺陷模塊為反例,則每個實例的分類過程中可能會出現(xiàn)以下4種情況:實際為有缺陷類被正確分類為有缺陷類,即真正例(true positive,TP);實際為無缺陷類被錯誤分類為有缺陷類,即假正例(false positive,FP);實際為無缺陷類被正確分類為無缺陷類,即真反例(true negative,TN);實際為有缺陷類被錯誤分類為無缺陷類,即假反例(false negative,FN). 在人工智能中,混淆矩陣是表示精度評價的一種標準格式,用n行n列的矩陣形式表示,如表5所示.
表5 混淆矩陣Table 5 Confusion matrix
根據(jù)上述描述,文章將采用F-measure作為本研究的評價指標,具體描述如下:
Precision:正確分類為正樣本的實例數(shù)目與分類為正樣本的實例數(shù)目的比率.
(6)
Recall:正確分類為正樣本的實例數(shù)目與所有正樣本實例數(shù)目的比率.
(7)
F-measure:對精確度和召回率的綜合衡量.f值越高,表現(xiàn)越好.
(8)
本文為了確認本方法是否優(yōu)于其他方法,我們在PROMISE數(shù)據(jù)集上與主流的跨項目缺陷預(yù)測方法以及設(shè)定的基線方法進行了對比.
首先,對8種方法進行簡述,如下所示:
(1)DTB[12]方法:在目標項目中使用少量的標記數(shù)據(jù),用來提高CPDP的效果.
(2)TrAdaboost[13]方法:構(gòu)建預(yù)測模型,利用目標項目中有限數(shù)量的標簽數(shù)據(jù)對源數(shù)據(jù)進行重估.
(3)TNB[10]方法:通過data gravitation(DG)方法對源數(shù)據(jù)進行權(quán)重調(diào)整,然后用權(quán)重調(diào)整后的源數(shù)據(jù)構(gòu)建樸素貝葉斯分類器.
(4)TCA+[8]方法:轉(zhuǎn)移成分分析方法,僅使用跨項目數(shù)據(jù)進行預(yù)測.
(5)NN filter[9]方法:通過刪除非目標項目最近鄰的源項目數(shù)據(jù)來對源項目數(shù)據(jù)進行篩選.
(6)KMM[20]方法:是KMM-MCW中的主要步驟,使用MMD最小化來對齊分布,降低域間差異,跳過概率密度估計,直接根據(jù)樣本估計權(quán)重.
(7)KMM-MCW[21]方法:多分量權(quán)重(MCWs)學(xué)習(xí)模型來分析源項目中多個分量從而不斷優(yōu)化.
(8)基線方法:不做任何數(shù)據(jù)選擇,直接對使用源項目訓(xùn)練模型進行目標項目預(yù)測.
表6 各類方法的F-measure結(jié)果比較Table 6 F-measure comparison of various methods
除對比方法實驗之外,本文為驗證所提方法能夠提高不同分類器構(gòu)建的模型性能,在邏輯回歸(LR)、貝葉斯(NB)、支持向量機(SVM)、K-近鄰(KNN)這幾種CPDP中常見分類器上也做了對比的實驗,具體結(jié)果如表7所示.
表7 不同分類器下本方法獲得的F-measure結(jié)果比較Table 7 F-measure comparison under different classifiers
根據(jù)表6結(jié)果可以發(fā)現(xiàn),與其他方法相比,本文方法最終選取的訓(xùn)練數(shù)據(jù)在大多數(shù)項目上取得較高的F-measure,且整體結(jié)果的均值高于其他方法. 實驗結(jié)果表明,本文方法能夠在最大程度地利用源項目情況下,根據(jù)JS散度和相對密度選擇合適的訓(xùn)練集構(gòu)建預(yù)測模型,且獲得較優(yōu)的性能.
從表7可以發(fā)現(xiàn),不同分類器結(jié)合本文方法在整體結(jié)果的均值都有了提升,且在大多數(shù)項目提高預(yù)測性能. 實驗結(jié)果表明,本文方法能夠適應(yīng)于CPDP中常用的分類器,并提高模型性能.
圖2展示了不同項目的K和p組合,相應(yīng)的F-measure分布情況. 由圖2可知,我們能夠根據(jù)最優(yōu)的F-measure找到合適的參數(shù)組合.
圖2 不同K和p組合的F-measureFig.2 F-measure under different K and p
圖3 xerces不同分類器的F-measureFig.3 F-measure of xerces under different classifiers
如圖3所示,文章進一步討論了K和p在相同數(shù)據(jù)集上的不同分類器下F-measure的值變化情況. 以xerces為例,圖中結(jié)果表明,當F-measure值達到最高時,不同分類器在當前數(shù)據(jù)集上的K和p的組合基本保持一致,這說明經(jīng)過本文方法所選擇的訓(xùn)練數(shù)據(jù)已經(jīng)達到最優(yōu),且能夠適應(yīng)CPDP中各類常用的分類器.
本文圍繞一對一的同構(gòu)跨項目缺陷預(yù)測展開研究,主要針對源項目訓(xùn)練數(shù)據(jù)選擇的問題,提出基于JS散度和相對密度的跨項目缺陷預(yù)測方法. 該方法首先利用JS(Jensen-Shannon divergence)散度選擇與目標項目最相似的源項目;其次,提出基于相對密度的源項目數(shù)據(jù)選擇方法;最后,采用CPDP中常見的分類器構(gòu)建預(yù)測模型,并用于目標項目進行驗證. 實驗結(jié)果表明,在最大程度利用源項目的情況下,本方法不僅能夠提高缺陷預(yù)測模型的性能,同時對不同分類器表現(xiàn)出較高的適應(yīng)性.
后續(xù)工作中,我們將進一步在更多的軟件缺陷數(shù)據(jù)集上驗證方法的有效性,并對方法進行擴展,使其應(yīng)用于多對一跨項目缺陷預(yù)測.