范貴生,刁旭煬,虞慧群,陳麗瓊
(1.華東理工大學(xué) 計(jì)算機(jī)科學(xué)與工程系,上海 200237; 2.上海市計(jì)算機(jī)軟件評(píng)測重點(diǎn)實(shí)驗(yàn)室,上海 201112;3.上海應(yīng)用技術(shù)大學(xué) 計(jì)算機(jī)科學(xué)與信息工程系,上海 201418)
軟件缺陷產(chǎn)生于軟件開發(fā)過程中開發(fā)人員的錯(cuò)誤編碼,含有缺陷的編碼在軟件運(yùn)行過程中可能會(huì)產(chǎn)生意料之外的結(jié)果或行為,從而帶來不必要的企業(yè)經(jīng)濟(jì)損失。在軟件項(xiàng)目開發(fā)的生命周期中,發(fā)現(xiàn)缺陷的時(shí)間越晚,帶來的風(fēng)險(xiǎn)和修復(fù)代價(jià)就越高。因此,在軟件部署上線之前必須進(jìn)行軟件測試和代碼審查。然而目前保障軟件質(zhì)量的常規(guī)方法往往不能及時(shí)檢查出缺陷,并且無法在有限的資源內(nèi)對(duì)所有程序模塊進(jìn)行審核。為了及時(shí)幫助開發(fā)和測試人員定位軟件中存在的缺陷,軟件缺陷預(yù)測成為當(dāng)前軟件工程數(shù)據(jù)挖掘[1]領(lǐng)域的重點(diǎn)研究方向。軟件缺陷預(yù)測[2-3]是指挖掘軟件倉庫的歷史數(shù)據(jù)信息,如代碼復(fù)雜度、類型、變更記錄等,可設(shè)計(jì)缺陷相關(guān)的度量元并構(gòu)建分類器來預(yù)測軟件中潛在的缺陷。
目前,大部分研究工作關(guān)注的是同一項(xiàng)目內(nèi)的軟件缺陷預(yù)測[4](Within-Project Defect Prediction,WPDP),即利用項(xiàng)目內(nèi)的歷史數(shù)據(jù)對(duì)新版本進(jìn)行建模預(yù)測。但在實(shí)際的軟件開發(fā)過程中,對(duì)于新啟動(dòng)的項(xiàng)目而言,通常沒有足夠多的訓(xùn)練數(shù)據(jù)來建模訓(xùn)練,而重新對(duì)新項(xiàng)目中的缺陷數(shù)據(jù)集進(jìn)行標(biāo)注,需要耗費(fèi)大量的人力與物力資源。因此,一些研究人員開始關(guān)注跨項(xiàng)目軟件缺陷預(yù)測[4-5](Cross-Project Defect Prediction,CPDP),即利用其他項(xiàng)目(源項(xiàng)目)的歷史數(shù)據(jù)建立缺陷預(yù)測模型,然后對(duì)當(dāng)前項(xiàng)目(目標(biāo)項(xiàng)目)進(jìn)行缺陷預(yù)測。然而,由于源項(xiàng)目和目標(biāo)項(xiàng)目之間的數(shù)據(jù)分布存在較大差異,會(huì)導(dǎo)致直接利用源項(xiàng)目中的數(shù)據(jù)進(jìn)行建模不能達(dá)到較好的預(yù)測性能,因此縮小源項(xiàng)目和目標(biāo)項(xiàng)目數(shù)據(jù)集之間分布的差異性是跨項(xiàng)目軟件缺陷預(yù)測領(lǐng)域中的關(guān)鍵問題。此外,人工標(biāo)注項(xiàng)目數(shù)據(jù)集的過程中容易產(chǎn)生噪聲數(shù)據(jù),這將導(dǎo)致后續(xù)實(shí)例遷移的偏差。
針對(duì)實(shí)例存在噪聲和數(shù)據(jù)分布差異性的問題,本文從實(shí)例過濾和實(shí)例遷移的角度出發(fā),提出一種兩階段跨項(xiàng)目缺陷預(yù)測方法CLNI-KMM。在實(shí)例過濾階段,借助CLNI[6]算法對(duì)訓(xùn)練數(shù)據(jù)集中的每一個(gè)實(shí)例選取其附近的k個(gè)鄰居,計(jì)算與該實(shí)例標(biāo)簽相反的鄰居占所有鄰居的比例,如果有一定數(shù)量的鄰居具有相反的標(biāo)簽,則該實(shí)例被視為噪聲并被過濾。在實(shí)例遷移階段,借助KMM[7]算法,利用源項(xiàng)目和目標(biāo)項(xiàng)目中的數(shù)據(jù)計(jì)算源項(xiàng)目所有實(shí)例的訓(xùn)練權(quán)重,對(duì)與目標(biāo)項(xiàng)目實(shí)例分布相近的實(shí)例賦予較高的權(quán)重。在此基礎(chǔ)上,利用目標(biāo)項(xiàng)目集中已有的少量有標(biāo)注數(shù)據(jù),結(jié)合帶有權(quán)重的源項(xiàng)目訓(xùn)練數(shù)據(jù)建立缺陷預(yù)測模型。
跨項(xiàng)目軟件缺陷預(yù)測采用其他項(xiàng)目(即源項(xiàng)目)的訓(xùn)練數(shù)據(jù)集進(jìn)行模型的建模,然后對(duì)當(dāng)前目標(biāo)項(xiàng)目進(jìn)行缺陷預(yù)測。為解決不同數(shù)據(jù)源之間的分布差異性問題,遷移學(xué)習(xí)的相關(guān)方法被應(yīng)用到了跨項(xiàng)目軟件缺陷預(yù)測領(lǐng)域中。TCA[8]是基于特征的經(jīng)典遷移學(xué)習(xí)方法,采用TCA來從源項(xiàng)目中提取與目標(biāo)項(xiàng)目相關(guān)的特征,從而減少源于和目標(biāo)域的距離。在基于實(shí)例遷移方法中,NNfilter[9]過濾與目標(biāo)項(xiàng)目集中的實(shí)例不夠接近的源項(xiàng)目中的實(shí)例,只保留每個(gè)目標(biāo)項(xiàng)目實(shí)例中最接近的k個(gè)源項(xiàng)目實(shí)例鄰居。文獻(xiàn)[10]提出一種遷移樸素貝葉斯(TNB)的方法,首先通過調(diào)整源項(xiàng)目中的實(shí)例權(quán)重,削弱不相關(guān)實(shí)例的影響,然后將帶有權(quán)重的訓(xùn)練實(shí)例放入樸素貝葉斯模型中進(jìn)行訓(xùn)練。文獻(xiàn)[11]提出了基于Box-Cox轉(zhuǎn)換的集成跨項(xiàng)目軟件缺陷預(yù)測方法。文獻(xiàn)[12]利用 Box-Cox、Log和Rank轉(zhuǎn)換對(duì)源項(xiàng)目進(jìn)行多重變換,最終得到最接近于目標(biāo)項(xiàng)目的訓(xùn)練實(shí)例集。文獻(xiàn)[13]提出了一種基于度量元相似度的多源異構(gòu)缺陷預(yù)測方法。研究表明,利用目標(biāo)項(xiàng)目中少量的有標(biāo)記數(shù)據(jù)能提升跨項(xiàng)目軟件缺陷預(yù)測模型的性能。
然而,無論是基于特征遷移的TCA、基于實(shí)例過濾的NNfilter,還是基于實(shí)例權(quán)重調(diào)整的TNB、基于特征變換的Box-Cox或相似度計(jì)算的多源異構(gòu),都要對(duì)源項(xiàng)目中的實(shí)例進(jìn)行篩選、權(quán)重調(diào)整或特征變換。因此,實(shí)例標(biāo)注的準(zhǔn)確性會(huì)對(duì)后序的源項(xiàng)目實(shí)例遷移和缺陷模型的構(gòu)建產(chǎn)生重大的影響。然而在挖掘軟件歷史倉庫時(shí),對(duì)軟件程序模塊進(jìn)行類型標(biāo)注時(shí)可能產(chǎn)生噪聲,這些噪聲的存在會(huì)影響到實(shí)例遷移的效果。而上述研究工作并沒有對(duì)可能產(chǎn)生噪聲數(shù)據(jù)的源項(xiàng)目進(jìn)行去噪處理,從而影響了跨項(xiàng)目缺陷預(yù)測模型的性能。
針對(duì)實(shí)例的噪聲和分布差異性問題,本文從實(shí)例過濾和實(shí)例遷移的角度出發(fā),利用源項(xiàng)目的訓(xùn)練數(shù)據(jù)集和目標(biāo)項(xiàng)目中的少部分標(biāo)注數(shù)據(jù)集建立缺陷預(yù)測模型,提出一種兩階段跨項(xiàng)目軟件缺陷預(yù)測方法CLNI-KMM。
如圖1所示,CLNI-KMM方法包含2個(gè)階段:實(shí)例過濾和實(shí)例遷移階段。在實(shí)例過濾階段,為去除源項(xiàng)目集中的噪聲數(shù)據(jù),CLNI-KMM方法首先對(duì)源項(xiàng)目集中的每一個(gè)實(shí)例,選取最靠近它的k個(gè)鄰居。當(dāng)這k個(gè)鄰居中與該實(shí)例標(biāo)簽相反的個(gè)數(shù)達(dá)到一定數(shù)量時(shí),則該實(shí)例被判定為噪聲數(shù)據(jù),過濾所有的噪聲數(shù)據(jù),最后得到去除噪聲后的源項(xiàng)目集。在實(shí)例遷移階段,為降低源項(xiàng)目集和目標(biāo)項(xiàng)目集之間分布的差異性,采用KMM算法計(jì)算源項(xiàng)目實(shí)例與目標(biāo)項(xiàng)目實(shí)例之間的相似度,為每個(gè)實(shí)例分配相應(yīng)的訓(xùn)練權(quán)重,提高與目標(biāo)項(xiàng)目集相似的實(shí)例權(quán)重,降低與目標(biāo)項(xiàng)目集差異大的實(shí)例權(quán)重,再結(jié)合目標(biāo)項(xiàng)目集中少量的有標(biāo)簽數(shù)據(jù),建立缺陷預(yù)測模型,對(duì)新項(xiàng)目中的程序模塊進(jìn)行缺陷預(yù)測。
圖1 CLNI-KMM軟件缺陷預(yù)測流程Fig.1 Procedure of software defect prediction of CLNI-KMM
人工采集標(biāo)注的源項(xiàng)目數(shù)據(jù)集通常會(huì)因?yàn)闃?biāo)記錯(cuò)誤導(dǎo)致后期預(yù)測模型的性能下降。如果能在建模之前找出這些噪聲并將其從實(shí)例中過濾,那么過濾后的數(shù)據(jù)將更有利于分類器建立準(zhǔn)確的預(yù)測模型。根據(jù)文獻(xiàn)[6]研究可知,CLNI算法在不同的噪聲比例下都表現(xiàn)出了良好性能,使得預(yù)測模型的準(zhǔn)確度得到提升。因此,本文采用了一種有效的錯(cuò)誤標(biāo)簽檢測方法CLNI來去除噪聲數(shù)據(jù)。對(duì)于每一個(gè)實(shí)例,選取距離該實(shí)例最近的k個(gè)鄰居。當(dāng)有一定數(shù)量的鄰居和該實(shí)例的缺陷標(biāo)注類型相反時(shí),則認(rèn)為該實(shí)例大概率是噪聲數(shù)據(jù)。
算法1CLNI實(shí)例過濾
輸出源項(xiàng)目中的噪聲實(shí)例集合A
初始化列表A,閾值δ、ε,鄰居個(gè)數(shù)k
1.For each iteration j:
7.End
θ=n/k*100%
9.If θ≥δ:
11.End
12.End
13.If |A)j∩Aj-1|/|Aj|≥ε:break
14.End
15.return Aj
在實(shí)例遷移階段,本文采用KMM實(shí)例遷移算法,目的是調(diào)整源項(xiàng)目中訓(xùn)練樣本的權(quán)重,降低與目標(biāo)項(xiàng)目分布差異較大的實(shí)例對(duì)缺陷預(yù)測模型的影響。與其他的實(shí)例遷移算法不同,KMM是一種非參數(shù)方法,不需要估計(jì)不同類別的概率分布。此外,該方法只要使用源項(xiàng)目和目標(biāo)項(xiàng)目的實(shí)例集合就能求解出樣本的訓(xùn)練權(quán)重,不需要使用類標(biāo)簽信息。
通常,源項(xiàng)目和目標(biāo)項(xiàng)目之間的分布差異性較大,因此,根據(jù)源項(xiàng)目的聯(lián)合概率分布Prs(x,y)和目標(biāo)項(xiàng)目的聯(lián)合概率分布Prt(x,y)無法推斷出很好的估計(jì)量。因此,KMM假設(shè)源項(xiàng)目和目標(biāo)項(xiàng)目的2個(gè)條件概率分布是相同的,即Prs(y|x))=Prt(y|x))?;谏鲜黾僭O(shè),以及Pr(x,y)=Pr(y|x))Pr(x),可以得出Prs(x,y)和Prt(x,y)只受Prs(x)和Prt(x)影響。因此,降低Prs(x,y)和Prt(x,y)的分布差異性可以轉(zhuǎn)化為降低Prs(x)和Prt(x)的邊緣分布的差異。
(1)
式(1)是一個(gè)有約束的二次規(guī)劃問題,可以被轉(zhuǎn)化為以下形式:
(2)
為評(píng)估CLNI-KMM方法,本文采集了15個(gè)Java開源項(xiàng)目作為實(shí)驗(yàn)數(shù)據(jù)集,項(xiàng)目的靜態(tài)度量元特征和其對(duì)應(yīng)代碼文件的缺陷標(biāo)注數(shù)據(jù)集來源于Promise公開數(shù)據(jù)庫(https://github.com/klainfo/DefectData)。表1展示了這些項(xiàng)目的具體信息,包括項(xiàng)目名稱、項(xiàng)目版本、代碼文件數(shù)和缺陷率。此外,本實(shí)驗(yàn)選取的20個(gè)靜態(tài)度量元特征都是由文獻(xiàn)[21]針對(duì)面向?qū)ο蟪绦蛘Z言設(shè)計(jì)提取的,包括代碼行數(shù)、子類個(gè)數(shù)、公共方法的個(gè)數(shù)、樹的繼承深度以及相關(guān)代碼復(fù)雜度特征等。
表1 Java項(xiàng)目數(shù)據(jù)集信息Table 1 Dataset information of Java project
本實(shí)驗(yàn)中,采用cvxopt,Scikit-learn(0.19.2)和Python3.6來構(gòu)建缺陷預(yù)測模型。實(shí)驗(yàn)運(yùn)行環(huán)境是Ubuntu16.04服務(wù)器,配有3.60 GHz的因特爾i7處理器和8 GB內(nèi)存。表1中的一些項(xiàng)目(jedit,elearn)的缺陷率很低,而有一些項(xiàng)目(log4j,xalan)則擁有很高的缺陷率,這表明Promise數(shù)據(jù)集存在類不平衡問題。為解決此問題,本文使用過采樣技術(shù)SMOTE[22]來合成少數(shù)類,從而使得兩類達(dá)到平衡。
本文采用2種評(píng)測指標(biāo),即F1值和準(zhǔn)確率來評(píng)價(jià)缺陷預(yù)測模型的性能,其中F1值用來度量預(yù)測模型的穩(wěn)定性,而準(zhǔn)確率用來度量預(yù)測模型精確度。F1值是綜合考慮了查準(zhǔn)率和召回率的度量方法。本文用c代表無缺陷的程序文件,用b代表有缺陷的程序文件。然后,定義以下3種情況:1)b→b代表將有缺陷的文件預(yù)測為有缺陷的;2)b→c表示將有缺陷的文件預(yù)測為無缺陷的;3)c→b則是將無缺陷的文件預(yù)測為有缺陷的。N代表了每種情況下的數(shù)量,比如Nb→b表示第一種情況的數(shù)量。最后定義軟件缺陷預(yù)測中的查準(zhǔn)率、召回率、F1值和準(zhǔn)確率,如式(3)~式(6)所示。
查準(zhǔn)率:標(biāo)記為有缺陷的文件被正確預(yù)測的數(shù)量在所有被預(yù)測為有缺陷的文件中的占比。
(3)
召回率:標(biāo)記為有缺陷的文件被正確預(yù)測的數(shù)量在所有標(biāo)記為有缺陷文件中的占比。
(4)
F1值:查準(zhǔn)率和召回率的調(diào)和平均數(shù)。
(5)
Acc值:預(yù)測正確的文件數(shù)在總文件數(shù)中的占比。
(6)
此外,使用Friedman[23-25]檢驗(yàn)來分析評(píng)價(jià)指標(biāo)在統(tǒng)計(jì)上的顯著性。Friedman檢驗(yàn)服從自由度為k-1的卡方分布,其原假設(shè)為多個(gè)方法間的效果不存在顯著的差異。如果發(fā)現(xiàn)檢驗(yàn)結(jié)果的p值足夠的小(小于0.05),則認(rèn)為原假設(shè)并不成立,即各個(gè)方法之間存在顯著性差異。進(jìn)一步,采用Nemenyi[26]的后置檢驗(yàn)來比較CLNI-KMM方法和其他經(jīng)典的跨項(xiàng)目缺陷預(yù)測方法之間的差異。
為檢驗(yàn)CLNI-KMM方法與其他3種經(jīng)典CPDP方法之間的差異性,本文采用Friedman檢驗(yàn)方法對(duì)各個(gè)方法的Acc值進(jìn)行分析。由于共有5種方法,因此自由度k=4。如表2所示,檢驗(yàn)結(jié)果的p值為8.77×10-8(遠(yuǎn)小于0.05),反映了CLNI-KMM和其他經(jīng)典CPDP方法之間的差異性。
表2 CLNI-KMM與4種CPDP方法之間的Friedman檢驗(yàn)結(jié)果Table 2 Friedman test results of CLNI-KMM and four CPDP methods
表3展示了CLNI-KMM和其他4種CPDP方法之間的Nemenyi后置檢驗(yàn)結(jié)果。實(shí)驗(yàn)結(jié)果表明,CLNI-KMM方法與其他經(jīng)典CPDP方法之間的顯著性差異主要體現(xiàn)在TCA和NNFilter中。
表3 CLNI-KMM與4種CPDP方法之間的Nemenyi檢驗(yàn)結(jié)果Table 3 Nemenyi test results of CLNI-KMM and four CPDP methods
表4和表5分別列出了不同方法之間的Acc和F1值對(duì)比結(jié)果,其中粗?jǐn)?shù)據(jù)表示最佳值。所有其他方法都與CLNI-KMM方法一樣,在訓(xùn)練集中加入來自目標(biāo)項(xiàng)目中的少量(5%)有標(biāo)簽數(shù)據(jù)。
表4 CLNI-KMM與CPDP之間的Acc值比較Table 4 Comparison of Acc between CLNI-KMM and CPDP
表5 CLNI-KMM與CPDP之間的F1值比較Table 5 Comparison of F1 value between CLNI-KMM and CPDP
相較于TNB方法,CLNI-KMM方法在Acc和F1值的W/T/L上分別贏了11次和10次,這表明CLNI-KMM在模型在穩(wěn)定性和預(yù)測準(zhǔn)確性上都占有較大的優(yōu)勢(shì)。相較于經(jīng)典的TCA方法,CLNI-KMM方法在Acc的W/T/L上全部占優(yōu),而在F1值的W/T/L比較中與TCA持平。該結(jié)果表明CLNI-KMM的模型穩(wěn)定性與TCA方法接近,而在模型的準(zhǔn)確率上有較大的提升。從外,在Acc和F1值的W/T/L比較中,CLNI-KMM都比NNfilter方法表現(xiàn)得更為出色,分別贏了15次和11次,這都反映出了CLNI-KMM模型的優(yōu)越預(yù)測性能。最后,根據(jù)Acc和F1-值的平均值來看,CLNI-KMM也比TNB、TCA以及NNfilter在Acc和F1值上分別提升了1.0,28.7,21.3和3.3,0.7,10.4個(gè)百分點(diǎn)。
基于上述分析,相較于經(jīng)典的CPDP方法,CLNI-KMM通過同時(shí)考慮實(shí)例過濾和實(shí)例遷移,在使用CLNI算法過濾源項(xiàng)目噪聲的基礎(chǔ)之上,再運(yùn)用KMM算法對(duì)實(shí)例進(jìn)行遷移,提升了軟件缺陷預(yù)測模型的準(zhǔn)確率和穩(wěn)定性,達(dá)到更好的預(yù)測性能。
從外部有效性和內(nèi)部有效性2個(gè)角度對(duì)本文方法進(jìn)行有效性分析。外部有效性反映的是實(shí)驗(yàn)研究得到的結(jié)論是否具有普遍性,本文采用Apache下開源的Java項(xiàng)目數(shù)據(jù)集,所有關(guān)于項(xiàng)目程序模塊的靜態(tài)度量元數(shù)據(jù)集能從Promise公開數(shù)據(jù)庫中獲得,因此,可以保證研究結(jié)論具有一定的代表性。內(nèi)部有效性則反映實(shí)驗(yàn)結(jié)果的正確性,本文編寫的代碼主要是基于Python的cvxopt模塊和Scikit-learn機(jī)器學(xué)習(xí)包,因此,可以最大程度上保證模型構(gòu)建的正確性。在評(píng)估指標(biāo)上,本文從模型的準(zhǔn)確性和穩(wěn)定性出發(fā),采用Acc和F1值分別進(jìn)行衡量,保證了評(píng)價(jià)指標(biāo)的可靠性。
本文以跨項(xiàng)目軟件缺陷預(yù)測為研究背景,提出一種跨項(xiàng)目軟件缺陷預(yù)測方法CLNI-KMM,其中包含實(shí)例過濾和實(shí)例遷移2個(gè)階段。對(duì)源項(xiàng)目進(jìn)行噪聲實(shí)例的過濾,保證源項(xiàng)目實(shí)例集的可靠性,并在實(shí)例遷移過程中為源項(xiàng)目的實(shí)例分配訓(xùn)練權(quán)重,減少與目標(biāo)項(xiàng)目不相關(guān)實(shí)例的負(fù)面影響。在此基礎(chǔ)上,結(jié)合目標(biāo)項(xiàng)目集中少量的有標(biāo)簽數(shù)據(jù)集建立缺陷預(yù)測模型,對(duì)新項(xiàng)目中的程序文件進(jìn)行缺陷預(yù)測?;趯?shí)際項(xiàng)目數(shù)據(jù)集的實(shí)驗(yàn)結(jié)果驗(yàn)證了本文方法的有效性。后續(xù)將嘗試在實(shí)例遷移完成后,去除權(quán)重過低的實(shí)例,并驗(yàn)證此步驟是否會(huì)提升預(yù)測性能,同時(shí)將利用更多實(shí)際項(xiàng)目的數(shù)據(jù)集進(jìn)一步驗(yàn)證本文方法的普適性。