刁旭煬,劉曉陽,徐 利,陳天群,徐亞周
(1.上海機(jī)電工程研究所,上海 201109; 2.上海航天電子技術(shù)研究所,上海 201109)
規(guī)模龐大和復(fù)雜的軟件容易產(chǎn)生缺陷,從而導(dǎo)致整個(gè)系統(tǒng)在運(yùn)行時(shí)產(chǎn)生錯(cuò)誤、失效甚至崩潰,越晚發(fā)現(xiàn)軟件缺陷則修復(fù)成本就越高。對于一個(gè)嚴(yán)重的缺陷來說,如果在軟件發(fā)布之后才定位識別出來,那么其帶來的修復(fù)代價(jià)往往是在需求和設(shè)計(jì)階段的幾十甚至幾百倍,這對于企業(yè)來說是不可估量的經(jīng)濟(jì)損失。而對于一個(gè)架構(gòu)復(fù)雜的軟件,組織人員進(jìn)行代碼測試和審查需要耗費(fèi)大量的人力物力資源,通常無法高效地發(fā)現(xiàn)軟件缺陷。因此,如果能挖掘軟件項(xiàng)目中的歷史數(shù)據(jù),設(shè)計(jì)出相關(guān)典型的度量特征,對軟件中的程序模塊進(jìn)行缺陷傾向性預(yù)測,就可根據(jù)預(yù)測結(jié)果對缺陷傾向度高的程序模塊進(jìn)行重點(diǎn)測試與維護(hù),從而有效地提高軟件質(zhì)量保障的效率。軟件缺陷預(yù)測技術(shù)[1]正是從軟件項(xiàng)目中去挖掘有效信息并設(shè)計(jì)缺陷度量特征,運(yùn)用相關(guān)機(jī)器學(xué)習(xí)算法建立可靠的缺陷預(yù)測模型,來識別定位新程序模塊的潛在缺陷。
按照源項(xiàng)目與目標(biāo)項(xiàng)目是否同源,軟件缺陷預(yù)測可分為源項(xiàng)目與目標(biāo)項(xiàng)目同源的同項(xiàng)目軟件缺陷預(yù)測[2-4](Within-Project Defect Prediction, WPDP)和源項(xiàng)目與目標(biāo)項(xiàng)目不同源的跨項(xiàng)目軟件缺陷預(yù)測[5-6](Cross-Project Defect Prediction, CPDP)。同項(xiàng)目軟件缺陷預(yù)測通常運(yùn)用于一個(gè)已經(jīng)過多輪迭代開發(fā)的項(xiàng)目,此時(shí)歷史項(xiàng)目版本中可供提取的實(shí)例集合足以支撐缺陷預(yù)測的建模。而在軟件項(xiàng)目建立的初期,往往缺少帶有缺陷標(biāo)注的程序模塊數(shù)據(jù)集來作為缺陷預(yù)測模型的訓(xùn)練輸入,如何運(yùn)用其他項(xiàng)目中已有的標(biāo)注數(shù)據(jù)集對該項(xiàng)目進(jìn)行缺陷建模與預(yù)測是跨項(xiàng)目軟件缺陷預(yù)測的核心研究內(nèi)容。
通常而言,2個(gè)不同的項(xiàng)目之間存在數(shù)據(jù)跨域問題,其特征與實(shí)例的分布差異性會導(dǎo)致缺陷預(yù)測模型性能的下降。為了盡可能縮小跨域項(xiàng)目間特征與實(shí)例的分布差異,本文提出一種面向跨項(xiàng)目軟件缺陷預(yù)測的特征過濾與實(shí)例遷移框架KCF-KMM(K-medoids Cluster Filtering-Kernel Mean Matching)。具體來說,在特征過濾階段,該框架采用基于K-medoids[7]的特征過濾算法,首先依據(jù)特征間的相似度計(jì)算方法對特征進(jìn)行聚簇,然后從各個(gè)簇中篩選出與目標(biāo)項(xiàng)目分布相似度高的特征,形成后續(xù)建模的特征子集;在實(shí)例遷移階段,采用KMM[8]算法,首先將源項(xiàng)目與目標(biāo)項(xiàng)目的實(shí)例數(shù)據(jù)集映射到同一空間內(nèi),然后計(jì)算2組數(shù)據(jù)集間的最大平均差異,并以此為依據(jù)分配源項(xiàng)目實(shí)例的訓(xùn)練權(quán)重;最后在建立預(yù)測模型的階段,嵌入少量的目標(biāo)有標(biāo)注數(shù)據(jù)集來提升模型的預(yù)測性能。
在基于特征遷移的方法中,Liu等人[9]在TCA[10]方法的基礎(chǔ)上提出了一種基于自適應(yīng)策略的特征降維提取方法TCA+;Zhang等人[11]基于log、rank、Box-Cox、均方根等常用特征變換方法,提出了一種MT的多重度量元轉(zhuǎn)換方法,縮減源項(xiàng)目特征與目標(biāo)特征間的差異;此外,Wu等人[12]采用自動編碼器方法從原始特征中學(xué)習(xí)提取隱藏特征來縮減2個(gè)項(xiàng)目間的特征差異。在基于實(shí)例遷移的跨項(xiàng)目缺陷預(yù)測研究中,NNfilter方法直接基于目標(biāo)實(shí)例對源項(xiàng)目實(shí)例進(jìn)行最近鄰篩選;TN方法將樸素貝葉斯模型運(yùn)用到遷移學(xué)習(xí)中,以此對源項(xiàng)目實(shí)例的訓(xùn)練權(quán)重進(jìn)行合理調(diào)整[13];Sun等人[6]提出了一種基于協(xié)作過濾的源項(xiàng)目選擇方法CFPS,該方法采用基于用戶的協(xié)同過濾算法為給定的目標(biāo)項(xiàng)目推薦合適的源項(xiàng)目。
通過上述的研究可知,特征遷移和實(shí)例遷移都能促進(jìn)跨域缺陷預(yù)測模型性能的提升。因此,為了充分利用兩者的優(yōu)勢,本文構(gòu)建一種基于特征過濾與實(shí)例遷移的2階段跨項(xiàng)目軟件缺陷預(yù)測框架KCF-KMM。
本章對跨項(xiàng)目軟件缺陷預(yù)測框架KCF-KMM進(jìn)行了詳細(xì)闡述,該框架主要分為特征過濾、實(shí)例遷移和模型訓(xùn)練3個(gè)階段。圖1展示了KCF-KMM的總體架構(gòu)。
圖1 KCF-KMM總體架構(gòu)
在特征過濾階段,KCF-KMM采用基于K-medoids的特征過濾方法,篩選出與目標(biāo)項(xiàng)目集分布相似度高的特征子集;在實(shí)例遷移階段,KCF-KMM采用KMM算法,將源項(xiàng)目和目標(biāo)項(xiàng)目實(shí)例映射到同一空間內(nèi),衡量兩者的差異度,依據(jù)與目標(biāo)項(xiàng)目實(shí)例的相似程度分配訓(xùn)練權(quán)重。最后在模型訓(xùn)練階段,嵌入少量目標(biāo)項(xiàng)目的有標(biāo)簽數(shù)據(jù),運(yùn)用邏輯回歸分類器進(jìn)行建模、訓(xùn)練與預(yù)測。
在特征過濾階段,采用了基于K-medoids的特征過濾算法,篩選出與目標(biāo)特征關(guān)聯(lián)度高的特征子集。特征過濾階段可進(jìn)一步拆分為3個(gè)核心子階段:基于信息熵增益的特征相似度計(jì)算階段、基于K-medoids聚類算法的特征聚類階段和基于特征聚類簇的特征選擇階段。
2.1.1 特征相似度計(jì)算階段
在特征相似度計(jì)算階段,首先合并源項(xiàng)目和目標(biāo)項(xiàng)目的特征集合,并計(jì)算特征之間的關(guān)聯(lián)度。由于2個(gè)項(xiàng)目集的特征之間的關(guān)聯(lián)性不一定滿足線性關(guān)系,并且前期的研究表明[14-15],對于軟件特征的度量,非線性的相關(guān)度度量方法要優(yōu)于線性方法,因此本文采用基于信息熵增益[16]的方法計(jì)算特征fi與特征fj之間相似度。
在已知特征y為fj時(shí),特征x為fi的后驗(yàn)概率,即信息增益率IG(fi│fj)如下:
IG(fi│fj)=H(fi)+∑y∈fjp(y)∑x∈fip(x|y)log2p(x|y)
(1)
其中,H(fi)的計(jì)算表達(dá)式如下:
H(fi)=-∑x∈fip(x)log2p(x)
(2)
基于特征fi、特征fj以及兩者的信息增益 IG(fi│fj),本文采用非線性的對稱不確定性(Symmetric Uncertainty, SU)作為KCF-KMM框架的特征相似度度量公式,其計(jì)算公式如式(3):
(3)
其中,特征fi和特征fj的SU值越高,表明兩者之間的關(guān)聯(lián)性越強(qiáng),SU(fi,fj)最小值為0,最大值為1。SU(fi,fj)=0表示2個(gè)特征相互獨(dú)立;反之,當(dāng)SU(fi,fj)=1時(shí),兩者之間則是完全相關(guān)。
2.1.2 特征聚類階段
在特征聚類階段,借助K-medoids聚類算法將軟件缺陷特征劃分為不同的簇。相比于K-means算法,該算法的優(yōu)勢在于在更新簇中心時(shí),不必重復(fù)計(jì)算各個(gè)特征之間的相關(guān)度,只需利用在特征相似度計(jì)算階段預(yù)存的計(jì)算結(jié)果就可進(jìn)行簇中心更新運(yùn)行,不僅能有效提高算法的運(yùn)算性能,而且也在有限的計(jì)算資源中節(jié)省了開銷。
首先,根據(jù)K-S(Kolmogorov-Smirnov)檢驗(yàn)計(jì)算每一特征在源項(xiàng)目和目標(biāo)項(xiàng)目上的分布相似度。K-S檢驗(yàn)[17]主要用來比較2個(gè)數(shù)據(jù)集的分布是否相同,其假設(shè)檢驗(yàn)表達(dá)式如下:
H0:2組特征樣本的分布相同
(4)
H1:2組特征樣本的分布不同
(5)
對于某同一特征,假設(shè)在源項(xiàng)目SP中的特征維度為n和在目標(biāo)項(xiàng)目TP中的特征維度為m,則SP和TP這2個(gè)樣本集合分別為{SP1,…,SPn},{TP1,…,TPm}。
對特征fi的K-S檢驗(yàn)的步驟如下:
1)計(jì)算源項(xiàng)目集合與目標(biāo)項(xiàng)目集合的經(jīng)驗(yàn)分布函數(shù)Fcdf-SP和Fcdf-TP。
2)將SP和TP中的特征集合進(jìn)行合并,然后進(jìn)行綜合排序,排序結(jié)果為{s1,…,sb,…,sn+m}。
3)分別計(jì)算sb在SP樣本集合和TP樣本集合中的觀測概率Fobs-SP(sb)、Fobs-TP(sb)。對于某一樣本點(diǎn)x在樣本集合a中的觀測概率Fobs-a(x)計(jì)算公式如式(6)所示。其中,z為樣本a中的數(shù)量,t為樣本a中小于等于x的數(shù)量,a為SP或TP。
(6)
4)計(jì)算fi在SP和TP間的特征分布相似度KS(fi),其計(jì)算公式如式(7)所示,其取值范圍為[0,+∞)。
KS(fi)=max|Fcdf-a(x)-Fobs-a(x)|
(7)
然后根據(jù)KS(fi)指標(biāo),由低到高排序選擇前k個(gè)缺陷特征作為初始特征簇的中心。接著在預(yù)先計(jì)算好的特征間相似度列表中,查找其余特征與這k個(gè)簇中心的相似度,依次將剩余每一個(gè)特征放入與之相似度最高的簇中,并重新計(jì)算簇中心,更新各個(gè)簇中的特征子集,直到本次簇中心與上一次的結(jié)果一致為止。
2.1.3 特征選擇階段
算法1給出了基于K-medoids特征過濾算法的詳細(xì)描述。算法1的輸入為源項(xiàng)目、目標(biāo)項(xiàng)目、特征簇個(gè)數(shù)、初始特征個(gè)數(shù)以及篩選后的特征個(gè)數(shù);輸出則為篩選后的特征子集。
算法1 基于K-medoids的特征過濾
輸入:
SP:源項(xiàng)目
TP:目標(biāo)項(xiàng)目
k:特征簇個(gè)數(shù)
n:初始特征個(gè)數(shù)
m:篩選后的特征個(gè)數(shù)
輸出:
FS:篩選后的特征子集
1.移除SP和TP的類標(biāo)簽;
2.將SP和TP合并形成特征集合F={f1,f2,…,fn};
3.計(jì)算SU(fi,fj);
4.計(jì)算同一特征在SP與TP上的分布相似度KS(fi);
5.基于SU(fi,fj)和KS(fi)指標(biāo),利用K-medoids聚類方法將所有特征分成k個(gè)簇;
6.對每一簇中的特征fi按照KS(fi)計(jì)算結(jié)果進(jìn)行升序排列;
8.將過濾后的特征放入FS中;
9.Return FS。
在實(shí)例遷移階段,采用的是KMM算法,通過比較源項(xiàng)目與目標(biāo)項(xiàng)目實(shí)例間的平均分布差異來合理分配訓(xùn)練實(shí)例的權(quán)重。與其他基于實(shí)例的遷移算法不同的是,KMM算法無需事先利用2個(gè)項(xiàng)目的類標(biāo)簽信息預(yù)先建立類概率分布函數(shù),而是以非參數(shù)的方式通過特征空間中的源項(xiàng)目集和目標(biāo)項(xiàng)目集之間的分布匹配度直接推算源項(xiàng)目集的訓(xùn)練權(quán)重??紤]到源項(xiàng)目與目標(biāo)項(xiàng)目實(shí)例的分布差異性通常情況下很大,該算法假設(shè)源項(xiàng)目條件概率Prs(y│x)與目標(biāo)項(xiàng)目條件概率Prt(y│x)相等,從而將對Prs(x,y)和Prt(x,y)的衡量轉(zhuǎn)化為對Prs(x)和Prt(x)的邊緣分布概率的差異性比較。
KMM算法在將源項(xiàng)目與目標(biāo)項(xiàng)目實(shí)例同時(shí)映射到RKHS[18]空間內(nèi)的基礎(chǔ)上,計(jì)算兩者間的最大平均差異值MMD[19],具體計(jì)算公式如式(8):
(8)
(9)
在該階段,將目標(biāo)項(xiàng)目中已存在的少量有標(biāo)簽數(shù)據(jù)集的訓(xùn)練權(quán)重設(shè)置為1,并與經(jīng)KKM算法調(diào)整后帶有權(quán)重的源項(xiàng)目數(shù)據(jù)集進(jìn)行合并,形成混合訓(xùn)練集,運(yùn)用LR(Logistic Regression)分類器構(gòu)建缺陷預(yù)測模型,并對相關(guān)軟件項(xiàng)目模塊進(jìn)行缺陷預(yù)測。
本文以Apache下的15個(gè)公開Java項(xiàng)目作為實(shí)驗(yàn)數(shù)據(jù)集。所選取的實(shí)驗(yàn)數(shù)據(jù)集均可在Github(網(wǎng)址為https://github.com/klainfo/DefectData)上獲取。針對Java面向?qū)ο蟪绦蛘Z言的特點(diǎn),Jureczko等人[20]已進(jìn)行相關(guān)研究并提取出了20個(gè)典型的靜態(tài)度量元,其中不僅含有通用軟件缺陷特征,如軟件規(guī)模、計(jì)算復(fù)雜度等,而且也包含了基于面向?qū)ο蟪绦蛘Z言設(shè)計(jì)的相關(guān)缺陷度量元,如繼承深度、不同域中的方法個(gè)數(shù)等。表1列舉出了實(shí)驗(yàn)中項(xiàng)目數(shù)據(jù)集的相關(guān)信息,主要包括項(xiàng)目名稱、版本號、程序模塊數(shù)量(以代碼文件為單位)以及總體缺陷率。
表1 Java項(xiàng)目數(shù)據(jù)集信息
3.2.1 實(shí)驗(yàn)環(huán)境
本次實(shí)驗(yàn)的硬件配置為一臺帶有Intel i7酷睿處理器、8 GB內(nèi)存和GTX1060顯卡的臺式機(jī),操作系統(tǒng)為Ubuntu16.04,使用的開發(fā)語言為Python及其相關(guān)科學(xué)計(jì)算與分析模塊cvxopt和Scikit-learn,開發(fā)工具為jupyter notebook。
3.2.2 評價(jià)指標(biāo)
本文以F1和Acc這2個(gè)維度對KCF-KMM框架的軟件缺陷預(yù)測性能進(jìn)行衡量。F1值綜合了查準(zhǔn)率和查全率,對預(yù)測框架的綜合性能進(jìn)行了考量,而Acc則是從總體預(yù)測精度出發(fā),對框架的預(yù)測準(zhǔn)確性進(jìn)行了評價(jià)。兩者的計(jì)算公式如下:
(10)
(11)
其中,P和R分別代表軟件缺陷預(yù)測中的查準(zhǔn)率和召回率,Nd→d+Nc→c表示預(yù)測結(jié)果正確的數(shù)量,Nd→d+Nd→c+Nc→d+Nc→c則是所有的預(yù)測結(jié)果。
在實(shí)證研究階段,將15個(gè)項(xiàng)目逐次作為源項(xiàng)目和目標(biāo)項(xiàng)目,建立KCF-KMM缺陷預(yù)測模型框架,并進(jìn)行跨項(xiàng)目軟件缺陷預(yù)測。對于每一個(gè)目標(biāo)項(xiàng)目,將其余14個(gè)項(xiàng)目作為源項(xiàng)目建立缺陷預(yù)測模型,考慮數(shù)據(jù)選擇具有一定的隨機(jī)性,采用m-折(m取20)交叉驗(yàn)證法并重復(fù)20次后,最終取所有預(yù)測模型結(jié)果的均值作為最終的評價(jià)指標(biāo)。此外,本文通過SMOTE[21]過采樣技術(shù)合成訓(xùn)練集中的少數(shù)類,使得有缺陷與無缺陷訓(xùn)練數(shù)據(jù)達(dá)到類平衡。
為了說明KCF-KMM與經(jīng)典CPDP方法之間的差異性,本文在Acc值上采用Friedman[22-24]和Nemenyi[25]檢驗(yàn)方法。首先,采用Friedman方法對KCF-KMM與其他3個(gè)方法進(jìn)行總體比較,如表2所示,p value的檢驗(yàn)結(jié)果為1.43×10-9(遠(yuǎn)小于0.05),該結(jié)果表明KCF-KMM與其他方法之間存在顯著差異性。
表2 KCF-KMM與其他3種CPDP之間的Friedman檢驗(yàn)
為了進(jìn)一步分析KCF-KMM與3種經(jīng)典方法的差異程度,采用Nemenyi檢驗(yàn)方法來檢驗(yàn)顯著性差異。從表3的檢驗(yàn)結(jié)果分析可得,KCM-KMM與TCA+和NNFilter顯著性差異較大,與TNB方法比較相似。
表3 KCF-KMM與其他3種CPDP之間的Nemenyi檢驗(yàn)
為了說明KCF-KMM框架相較于基于特征遷移方法的優(yōu)越性,本文選取了具有典型代表意義的TCA+方法進(jìn)行對比分析。表4和表5分別列出了KCF與基于特征遷移方法TCA+之間的Acc和F1對比結(jié)果。相較于TCA+方法,KCF-KMM在Acc的W/T/L和在F1值的W/T/L上,分別贏了15次和11次,該結(jié)果表明KCF-KMM比TCA+方法在整體上都有較大提升。與此同時(shí),根據(jù)評價(jià)指標(biāo)在15個(gè)項(xiàng)目上的平均值計(jì)算結(jié)果來看,KCF-KMM在Acc和F1值上分別比TCA+提升了34.1%和14.4%。綜合上述比較結(jié)果,可判得KCF-KMM在缺陷預(yù)測模型的總體預(yù)測準(zhǔn)確率和模型穩(wěn)定性上都要優(yōu)于只考慮特征遷移單階段的方法。
表4 KCF-KMM與基于特征遷移方法之間的Acc比較
表5 KCF-KMM與基于特征遷移方法之間的F1比較
為了說明KCF-KMM框架相較于基于特征遷移方法的優(yōu)越性,本文選取了具有典型代表意義的TNB和NNfilter方法進(jìn)行對比分析。表6和表7分別列出了KCF-KMM與基于實(shí)例遷移方法之間的Acc和F1對比結(jié)果。KCF-KMM比TNB在Acc和F1值的W/T/L上都贏了超過半數(shù),分別為11次和9次;相較于NNfilter,則分別贏了15次和10次。此外從預(yù)測評價(jià)指標(biāo)的平均值來看,KCF-KMM在Acc上和F1值上也分別比TNB和NNfilter有所提升。綜合以上比較結(jié)果,可判得在預(yù)測精度和模型穩(wěn)定性2個(gè)方面,KCF-KMM都要比只進(jìn)行實(shí)例遷移單階段的CPDP方法來得更優(yōu)。
表6 KCF-KMM與基于實(shí)例遷移方法之間的Acc比較
表7 KCF-KMM與基于實(shí)例遷移方法之間的F1比較
基于上述分析,相較于經(jīng)典的CPDP方法,KCF-KMM采用基于K-medoids的特征過濾方法篩選出了關(guān)鍵特征子集,并在此基礎(chǔ)之上,運(yùn)用KMM實(shí)例遷移相關(guān)方法對訓(xùn)練集權(quán)重進(jìn)行調(diào)整,提高了與目標(biāo)項(xiàng)目分布相似度高的數(shù)據(jù)訓(xùn)練權(quán)重。在經(jīng)過上述特征過濾與實(shí)例遷移之后,整個(gè)軟件缺陷預(yù)測模型的預(yù)測性能得到了很大的提升。
本節(jié)從外部和內(nèi)部影響因素2個(gè)角度對缺陷預(yù)測模型的有效性進(jìn)行分析。首先,從外部有效性來看,本文采用的數(shù)據(jù)集都是基于Apache下的公開Java項(xiàng)目,相關(guān)度量元數(shù)據(jù)集則是由相關(guān)專家設(shè)計(jì),研究數(shù)據(jù)的可靠性和缺陷特征設(shè)計(jì)的代表性都得以保障;從內(nèi)部有效性來看,本文所有的數(shù)據(jù)處理和算法設(shè)計(jì)都是基于Python相關(guān)的科學(xué)計(jì)算分析包進(jìn)行編碼實(shí)現(xiàn),最大程度上保證了模型構(gòu)建的正確性;且在評估指標(biāo)上采用Acc和F1值,從多角度對缺陷預(yù)測模型的性能進(jìn)行了驗(yàn)證,保證了驗(yàn)證結(jié)果的全面性和可靠性。
本文針對跨項(xiàng)目軟件缺陷預(yù)測中特征關(guān)聯(lián)與實(shí)例分布差異的問題,提出了一種面向跨項(xiàng)目軟件缺陷預(yù)測的特征過濾與實(shí)例遷移框架KCF-KMM,篩選出來了與目標(biāo)關(guān)聯(lián)度高的特征,并合理分配了源項(xiàng)目實(shí)例的訓(xùn)練權(quán)重,提升了整個(gè)缺陷預(yù)測模型的性能。該框架仍有一些后續(xù)工作值得研究,具體來說:1)考慮其他特征相似性度量方法,并驗(yàn)證是否能提升預(yù)測性能;2)運(yùn)用工程項(xiàng)目[26-27]的數(shù)據(jù)集來進(jìn)一步驗(yàn)證模型框架在工程應(yīng)用中的性能與效果。