劉靖雯, 晉武俠,2, 屈 宇, 金洋旭, 范 銘
1西安交通大學(xué) 陜西省智能網(wǎng)絡(luò)與網(wǎng)絡(luò)安全教育部重點實驗室, 西安 中國 7100492西安交通大學(xué) 軟件學(xué)院 西安 中國 710049
3美國加州大學(xué)河濱分校計算機(jī)科學(xué)與工程系 河濱 美國加州 92521
4中國銀行軟件中心 西安 中國 710038
現(xiàn)代軟件系統(tǒng)需求不斷增多, 系統(tǒng)日漸復(fù)雜, 維護(hù)代碼變得越來越費時費力, 導(dǎo)致復(fù)雜軟件系統(tǒng)的缺陷和漏洞難以避免。國內(nèi)外歷史上出現(xiàn)過多次由于軟件缺陷而導(dǎo)致的重大事故[1], 預(yù)測軟件代碼缺陷以有效保證軟件可信性成為普遍關(guān)注的問題。軟件缺陷預(yù)測[1-4]是使用代碼復(fù)雜性和變更歷史等軟件特征構(gòu)建分類器以預(yù)測可能包含缺陷的代碼區(qū)域的過程, 該技術(shù)可提前發(fā)現(xiàn)潛在的缺陷和漏洞。近年來, Promise數(shù)據(jù)集和美國國家航空航天局項目(NASA數(shù)據(jù)集[5])的開源共享進(jìn)一步推動了學(xué)術(shù)界在缺陷預(yù)測領(lǐng)域上的廣泛研究。
根據(jù)缺陷預(yù)測使用的軟件特征的不同, 已有的軟件缺陷預(yù)測工作可分為基于代碼度量特征的預(yù)測[6-8]和基于網(wǎng)絡(luò)度量特征的預(yù)測[9-10]。傳統(tǒng)代碼度量特征主要包括Halstead特征[6], 基于依賴性的McCabe特征[7], 面向?qū)ο蟪绦虻腃K特征[8]等, 但難以刻畫軟件的結(jié)構(gòu)特征。網(wǎng)絡(luò)度量特征基于軟件實體間的依賴關(guān)系[11]構(gòu)成的網(wǎng)絡(luò)來度量結(jié)構(gòu)特性, 例如自我中心網(wǎng)絡(luò)的連接點、邊數(shù)[4]等等, 但在高維的網(wǎng)絡(luò)結(jié)構(gòu)空間上度量結(jié)構(gòu)特性, 復(fù)雜性較高。
為了降低網(wǎng)絡(luò)結(jié)構(gòu)特征表示的復(fù)雜性, 近年來網(wǎng)絡(luò)嵌入(Network Embedding)算法研究取得重大進(jìn)展。網(wǎng)絡(luò)嵌入[12]的核心思想是, 在保持網(wǎng)絡(luò)結(jié)構(gòu)特性(一階相似度、二階相似度等)的同時, 將高維稀疏的網(wǎng)絡(luò)結(jié)構(gòu)或者圖結(jié)構(gòu)映射到低維稠密的向量空間。這種嵌入后的網(wǎng)絡(luò)特征便于輸入到機(jī)器學(xué)習(xí)模型中。嵌入方法主要包括基于矩陣分解的方法[13-14]、基于隨機(jī)游走的方法[15-16]、基于深度學(xué)習(xí)的方法[17]。網(wǎng)絡(luò)嵌入目前已應(yīng)用到網(wǎng)絡(luò)壓縮[18-20]、可視化[21-23]、聚類[24]、鏈路預(yù)測[25-27]和節(jié)點分類[28]等不同領(lǐng)域。近年來軟件關(guān)聯(lián)網(wǎng)絡(luò)嵌入也開始應(yīng)用于軟件缺陷預(yù)測領(lǐng)域, 然而, 不同軟件關(guān)聯(lián)網(wǎng)絡(luò)以及不同網(wǎng)絡(luò)嵌入算法對缺陷預(yù)測性能的影響研究仍然很稀缺。
本文將應(yīng)用6種網(wǎng)絡(luò)嵌入算法在12個開源的Java軟件系統(tǒng)上, 研究基于網(wǎng)絡(luò)嵌入特征的缺陷預(yù)測, 并在缺陷預(yù)測場景中深入分析網(wǎng)絡(luò)嵌入算法保持的軟件結(jié)構(gòu)特征。首先, 從源代碼層次、軟件演化層次、開發(fā)者貢獻(xiàn)層次分別構(gòu)建軟件關(guān)聯(lián)網(wǎng)絡(luò), 從多層次刻畫軟件系統(tǒng)的結(jié)構(gòu)。然后, 提出了一種基于網(wǎng)絡(luò)嵌入和傳統(tǒng)度量特征相結(jié)合的缺陷預(yù)測模型, 并分析不同軟件關(guān)聯(lián)網(wǎng)絡(luò)上的缺陷預(yù)測性能。最后, 在缺陷預(yù)測場景中深入研究網(wǎng)絡(luò)嵌入特征, 分析不同網(wǎng)絡(luò)嵌入算法所保持的軟件關(guān)聯(lián)網(wǎng)絡(luò)結(jié)構(gòu)的差異以及導(dǎo)致缺陷預(yù)測性能差異的原因。具體工作如下:
(1) 構(gòu)建3種軟件關(guān)聯(lián)網(wǎng)絡(luò)模型。通過解析軟件系統(tǒng)的源代碼, 構(gòu)建類層次依賴網(wǎng)絡(luò); 基于修訂歷史記錄中文件的共同修改信息, 構(gòu)建文件耦合網(wǎng)絡(luò); 通過挖掘開發(fā)者對程序模塊的提交操作, 構(gòu)建開發(fā)者貢獻(xiàn)網(wǎng)絡(luò)。
(2) 設(shè)計基于網(wǎng)絡(luò)嵌入特征的缺陷預(yù)測模型。該模型通過網(wǎng)絡(luò)嵌入算法學(xué)習(xí)軟件關(guān)聯(lián)網(wǎng)絡(luò)的結(jié)構(gòu)特征, 將高維稀疏網(wǎng)絡(luò)結(jié)構(gòu)編碼至低維稠密向量空間; 并解決缺陷預(yù)測中常見的非平衡數(shù)據(jù)集問題。實驗發(fā)現(xiàn), 在傳統(tǒng)的代碼度量特征和網(wǎng)絡(luò)度量特征上, 結(jié)合網(wǎng)絡(luò)嵌入特征后, 缺陷預(yù)測性能平均提高了至少2%。
(3) 對比分析6種網(wǎng)絡(luò)嵌入算法在構(gòu)建的3種軟件關(guān)聯(lián)網(wǎng)絡(luò)上通過隨機(jī)森林、樸素貝葉斯、支持向量機(jī)和多層感知器的缺陷預(yù)測效果。實驗發(fā)現(xiàn): 使用DeepWalk、Grarep和Node2vec嵌入算法的缺陷預(yù)測效果最好, LINE和GF最差; 此外, 同一種算法在類依賴網(wǎng)絡(luò)和文件耦合網(wǎng)絡(luò)上的缺陷預(yù)測效果比開發(fā)者貢獻(xiàn)網(wǎng)絡(luò)要好; 隨機(jī)森林分類模型可以在任意網(wǎng)絡(luò)中得到最優(yōu)的缺陷預(yù)測性能。
(4) 比較6種網(wǎng)絡(luò)嵌入算法保持的軟件關(guān)聯(lián)網(wǎng)絡(luò)的結(jié)構(gòu)特性以分析缺陷預(yù)測效果存在差異的原因, 并探索網(wǎng)絡(luò)嵌入算法的不同參數(shù)設(shè)置對網(wǎng)絡(luò)結(jié)構(gòu)特征表示以及缺陷預(yù)測性能的影響。對網(wǎng)絡(luò)嵌入算法得到的節(jié)點特征向量進(jìn)行聚類, 度量聚類后的網(wǎng)絡(luò)結(jié)構(gòu)特征與軟件關(guān)聯(lián)網(wǎng)絡(luò)社區(qū)結(jié)構(gòu)的相似性, 并分析相似性與缺陷預(yù)測性能之間的相關(guān)性。實驗發(fā)現(xiàn): 當(dāng)網(wǎng)絡(luò)嵌入算法擅長學(xué)習(xí)網(wǎng)絡(luò)的同質(zhì)性時, 可以達(dá)到良好的缺陷預(yù)測效果; 不同網(wǎng)絡(luò)嵌入算法得到的聚類結(jié)構(gòu)相似時, 其對應(yīng)的缺陷預(yù)測結(jié)果也相近, 例如DeepWalk和Grarep算法的聚類結(jié)果相似, 其缺陷預(yù)測結(jié)果也相似; 網(wǎng)絡(luò)嵌入特征和基于網(wǎng)絡(luò)嵌入的缺陷預(yù)測性能對網(wǎng)絡(luò)嵌入算法的參數(shù)配置比較敏感。
其余章節(jié)安排。第2節(jié)介紹相關(guān)研究現(xiàn)狀; 第3節(jié)介紹軟件關(guān)聯(lián)網(wǎng)絡(luò)建模和網(wǎng)絡(luò)嵌入算法, 并給出案例展示; 第4節(jié)展示基于網(wǎng)絡(luò)嵌入特征的缺陷預(yù)測方法; 第5節(jié)敘述實驗和分析結(jié)果, 包括對數(shù)據(jù)的預(yù)處理、缺陷預(yù)測結(jié)果分析、網(wǎng)絡(luò)嵌入特征分析、以及參數(shù)影響分析; 第6節(jié)總結(jié)本文工作并展望未來研究方向。
軟件缺陷預(yù)測是軟件工程領(lǐng)域研究的熱點。軟 件缺陷預(yù)測通過分析和挖掘軟件庫(例如項目托管的缺陷跟蹤系統(tǒng)和版本控制系統(tǒng)), 根據(jù)軟件源代碼和開發(fā)過程設(shè)計與軟件缺陷相關(guān)的度量指標(biāo), 構(gòu)建缺陷預(yù)測模型, 使用訓(xùn)練出的模型識別出被測項目內(nèi)可能存在缺陷的模塊。開發(fā)人員可對這些潛在的缺陷模塊投入更多的精力進(jìn)行軟件測試, 修改或完善代碼以保證軟件產(chǎn)品質(zhì)量。Promise數(shù)據(jù)集的建立和美國國家航空航天局項目(NASA數(shù)據(jù)集[5])的開源共享推動了缺陷預(yù)測的研究進(jìn)展。影響軟件缺陷預(yù)測性能的主要因素包括: 度量指標(biāo)的設(shè)計、預(yù)測模型的構(gòu)建和數(shù)據(jù)集相關(guān)問題[30]。在預(yù)測模型中, 機(jī)器學(xué)習(xí)模型是目前主流的方法[31-32]。除此之外, 也有基于緩存的方法[33-34], 利用缺陷局部性原理識別缺陷。對于數(shù)據(jù)集, 經(jīng)常會出現(xiàn)噪音[35]和非平衡[36-37]等問題, 目前也已經(jīng)有針對這些問題的研究。
設(shè)計出與缺陷具有強(qiáng)相關(guān)性的度量指標(biāo)是提高預(yù)測效果的關(guān)鍵。軟件缺陷預(yù)測用到的特征常通過度量獲取。傳統(tǒng)的軟件度量指標(biāo)包括基于運算符和操作數(shù)的Halstead特征[6], 基于依賴性的McCabe特征[7], 面向?qū)ο蟪绦虻腃K特征[8]等。同時, 也有研究表明, 軟件演化數(shù)據(jù)在缺陷預(yù)測方面比代碼度量更有效[38], 在缺陷預(yù)測中利用軟件演化數(shù)據(jù)的一個方面是將變更過程建模為網(wǎng)絡(luò)[39], 并使用不同的網(wǎng)絡(luò)度量(例如, 度統(tǒng)計或中心度量)改進(jìn)機(jī)器學(xué)習(xí)分類器的性能。其中Zimmermann和Nagappan[4]提出在缺陷預(yù)測中使用軟件系統(tǒng)依賴關(guān)系圖上的網(wǎng)絡(luò)度量。Ma等人[10]進(jìn)一步評估了網(wǎng)絡(luò)度量在缺陷預(yù)測中的預(yù)測有效性。Chen等人[9]利用網(wǎng)絡(luò)度量來預(yù)測有嚴(yán)重缺陷的軟件, 他們發(fā)現(xiàn)大多數(shù)網(wǎng)絡(luò)與嚴(yán)重的缺陷顯著相關(guān)。另一方面是從代碼修改[40-42], 開發(fā)人員經(jīng)驗[43-45], 程序模塊間的依賴性[4,46]或項目團(tuán)隊組織構(gòu)架角度[47-49]等方面出發(fā)來設(shè)計度量指標(biāo)。程序的良好的語法定義、隱藏在抽象語法樹中的豐富語義以及程序中的依賴網(wǎng)絡(luò)信息通常無法被這些指標(biāo)很好的捕獲。因此傳統(tǒng)方法的預(yù)測結(jié)果差強(qiáng)人意。
軟件關(guān)聯(lián)網(wǎng)絡(luò)主要是根據(jù)實體和實體之間的依賴關(guān)系構(gòu)建的, 從各種不同的粒度(包、類、方法、函數(shù))可對軟件網(wǎng)絡(luò)進(jìn)行拓?fù)浞治?。軟件關(guān)聯(lián)網(wǎng)絡(luò)產(chǎn)生于復(fù)雜網(wǎng)絡(luò)理論, 復(fù)雜網(wǎng)絡(luò)[50-51]最初是在物理學(xué)和數(shù)據(jù)科學(xué)中開發(fā)的, 并在不同領(lǐng)域被廣泛采用。近年來, 該理論已成功地應(yīng)用于軟件工程領(lǐng)域。Myers CR[52]提出了復(fù)雜網(wǎng)絡(luò)理論在軟件系統(tǒng)中的應(yīng)用。Concas等人[53]和Louridas等人[54]隨后在軟件系統(tǒng)中觀察到了冪律分布。
軟件網(wǎng)絡(luò)被用于軟件演化過程的建模和理解[55-56], 軟件演化的預(yù)測[57], 軟件結(jié)構(gòu)的分析和評估[52,54], 軟件執(zhí)行過程和行為建模[58], 軟件的質(zhì)量評估[57,59-60], 軟件的安全分析[61-63]。其中Li[55]提出了一種軟件網(wǎng)絡(luò)演化的模塊化連接機(jī)制。Subelj等[64]分析了類依賴網(wǎng)絡(luò)中存在的社區(qū)結(jié)構(gòu)。Qu等[65]發(fā)現(xiàn)軟件中方法和它們之間的調(diào)用關(guān)系呈現(xiàn)出相對顯著的社區(qū)結(jié)構(gòu), 并基于軟件網(wǎng)絡(luò)的社區(qū)劃分提出了兩個類內(nèi)聚的度量指標(biāo)。Pan等[66]從實際的Java軟件系統(tǒng)中構(gòu)造了一組加權(quán)軟件網(wǎng)絡(luò), 并利用加權(quán)k核分解對其拓?fù)湫再|(zhì)進(jìn)行了實證研究。Cai[58]將軟件執(zhí)行過程建模為演進(jìn)的復(fù)雜網(wǎng)絡(luò)。 Bhattacharya[57]通過源代碼庫和缺陷追蹤系統(tǒng)中的實體關(guān)系構(gòu)建網(wǎng)絡(luò)以更好地理解軟件演化過程, 并構(gòu)建預(yù)測器以促進(jìn)軟件開發(fā)和維護(hù)。Concas等[59]研究了Java軟件網(wǎng)絡(luò)中劃分的社區(qū)與缺陷之間的關(guān)系。Pan等[60]提出了一個針對軟件網(wǎng)絡(luò)的度量元來量化軟件的穩(wěn)定性。
復(fù)雜網(wǎng)絡(luò)結(jié)構(gòu)中節(jié)點和邊眾多, 拓?fù)浣Y(jié)構(gòu)復(fù)雜, 難以高效分析。近幾年出現(xiàn)的網(wǎng)絡(luò)嵌入算法[13-17]可以有效解決網(wǎng)絡(luò)數(shù)據(jù)難以分析的難題, 其中心思想就在保持網(wǎng)絡(luò)結(jié)構(gòu)特性(一階相似度、二階相似度等)的同時將高維稀疏的網(wǎng)絡(luò)結(jié)構(gòu)或者圖結(jié)構(gòu)映射到低維稠密的向量空間。
表1 常用的網(wǎng)絡(luò)嵌入算法 Table 1 Common Network Embedding Algorithms
LE(Laplacian Eigenmaps)[64]方法和LLE(Locally Linear Embedding)[65]方法是傳統(tǒng)的將網(wǎng)絡(luò)節(jié)點映射為低維向量的方法。然而, 這些方法并沒有很好的可擴(kuò)展性。近些年又提出了很多的網(wǎng)絡(luò)嵌入算法, 根據(jù)其主要性質(zhì)可以分為3大類: 基于矩陣分解[13-14]、基于隨機(jī)游走[15-16]、基于深度學(xué)習(xí)[17]。隨機(jī)游走已經(jīng)被用于近似網(wǎng)絡(luò)的許多屬性, 包括節(jié)點中心性和相似性, 適用于過大的無法完整測量的網(wǎng)絡(luò); 基于分解的算法以矩陣的形式表示節(jié)點之間的連接, 并將矩陣分解以獲得向量表示; 基于深度學(xué)習(xí)的模型可 以對數(shù)據(jù)中的非線性結(jié)構(gòu)進(jìn)行建模, 捕獲網(wǎng)絡(luò)中非線性的特征。表1展示了每一類中的代表性算法以及它們保留的結(jié)構(gòu)特征和時間復(fù)雜度。
網(wǎng)絡(luò)嵌入算法是復(fù)雜網(wǎng)絡(luò)分析的研究重點, 也是將深度學(xué)習(xí)應(yīng)用到網(wǎng)絡(luò)分析的有效途徑, 網(wǎng)絡(luò)嵌入算法學(xué)習(xí)到的特征表示可以用作基于圖的各種任務(wù)的特征, 例如分類、聚類、鏈路預(yù)測和可視化。在軟件工程領(lǐng)域, 由于軟件內(nèi)部存在復(fù)雜的調(diào)用以及依賴關(guān)系, 軟件中存在多種類型的網(wǎng)絡(luò), 所以用網(wǎng)絡(luò)嵌入算法可以解決很多軟件中存在的問題。GefGroid[69]是基于網(wǎng)絡(luò)嵌入算法的安卓惡意軟件家族分析方法, 根據(jù)函數(shù)調(diào)用圖劃分出子圖, 用struc2vec[70]將子圖中API調(diào)用節(jié)點表示為向量, 通過向量相似度的計算聚類出安卓惡意家族。Node2defect[71]利用Node2vec[16]將軟件中的依賴網(wǎng)絡(luò)節(jié)點轉(zhuǎn)化為向量, 用于軟件的缺陷預(yù)測。Liu等[72]人利用DeepWalk[15]獲取軟件系統(tǒng)結(jié)構(gòu)特征, 并結(jié)合軟件抽象語法樹的語義特征共同進(jìn)行軟件的缺陷預(yù)測。Ling等人[73]提出基于圖嵌入的軟件項目源代碼檢索方法。該方法利用LINE[29]將代碼結(jié)構(gòu)圖中的節(jié)點轉(zhuǎn)化為向量, 用戶輸入自然語言問題即可檢索并返回相關(guān)的API 及其關(guān)聯(lián)信息構(gòu)成的連通代碼子圖。此外, 一些工作沒有利用常見的網(wǎng)絡(luò)嵌入算法, 而是通過構(gòu)造目標(biāo)函數(shù)將網(wǎng)絡(luò)節(jié)點轉(zhuǎn)化為低維的向量, 從而進(jìn)行方法名或類名的推薦[74-75]。
本章將構(gòu)建類依賴網(wǎng)絡(luò)、文件耦合網(wǎng)絡(luò)、開發(fā)者貢獻(xiàn)網(wǎng)絡(luò)等軟件關(guān)聯(lián)網(wǎng)絡(luò), 介紹6種常用的網(wǎng)絡(luò)嵌入算法, 最后在一個真實軟件系統(tǒng)上展示軟件關(guān)聯(lián)網(wǎng)絡(luò)及其嵌入特征。
本節(jié)將從源代碼、演化歷史中的共同修改、演化歷史中的開發(fā)者貢獻(xiàn)3個層次對軟件結(jié)構(gòu)進(jìn)行建模, 生成軟件關(guān)聯(lián)網(wǎng)絡(luò)。
3.1.1 類依賴網(wǎng)絡(luò) (Class Dependency Network, CDN)
從軟件的源代碼抽取類依賴網(wǎng)絡(luò)[76]: 對于面向?qū)ο笙到y(tǒng)P, 其類依賴網(wǎng)絡(luò) CDNP= (V,E)是有向網(wǎng)絡(luò), 其中V為 CDNP頂點的集合, 每個頂點v∈V代表軟件系統(tǒng)中的類/接口, E是網(wǎng)絡(luò)的邊集合, 代表類/接口之間的依賴關(guān)系。若類/接口v1、v2之間存在以下任意一種依賴關(guān)系, 則存在邊 e = (v1,v2)∈ E :
1) 繼承依賴(inheritance): 類v1(稱為子類、子接口)繼承類v2(稱為父類、父接口)的功能, 并可擴(kuò)展增加新功能。繼承是類與類或者接口與接口之間最常見的依賴關(guān)系, 在Java中通過關(guān)鍵字extends標(biāo)識;
2) 接口實現(xiàn)依賴(interface implementation): 類v1實現(xiàn)接口v2的功能, 在Java中此類關(guān)系通過關(guān)鍵字implements標(biāo)識;
3) 方法調(diào)用依賴(aggregation): 類v1中的方法調(diào)用了類v2中的方法;
4) 返回值依賴(return types): 類v1中的方法返回了類 2v的對象;
5) 參數(shù)依賴(parameter types): 類v1的對象作為類v2中的方法的參數(shù)。
以圖1為例, 圖1(a)展示了Java類和接口的代碼片段, 從中抽取出的類依賴網(wǎng)絡(luò)見圖1(b)。其中類A的方法調(diào)用了類B的方法, 因此存在一條從節(jié)點A指向節(jié)點B的邊。
圖1 類依賴網(wǎng)絡(luò)示例 Figure 1 Class Dependency Network
3.1.2 文件耦合網(wǎng)絡(luò) (Change Coupling Network, CCN)
本文提出從軟件演化歷史(記錄于軟件的版本控制系統(tǒng)如Git)中的共同修改記錄來構(gòu)建文件耦合網(wǎng)絡(luò): 對于面向?qū)ο笙到y(tǒng) P, 其文件耦合網(wǎng)絡(luò)CCNP= (V,E)是無向帶權(quán)圖, 其中V為圖 CCNP的頂點集合, 每個頂點v ∈ V 代表軟件系統(tǒng)中的源文件, E是圖的邊集合, 代表源文件在修訂歷史記錄中的的共同修改(co-change)關(guān)系, 權(quán)值代表源文件間的共同修改頻次。
圖2(a)示例出軟件修訂歷史中的4次提交記錄, 例如, A.java和C.java在Commit 1和Commit 3中都同時修改, 所以在CCN中A.java和C.java之間存在一條邊且權(quán)值為2。圖2(a)對應(yīng)生成的文件耦合網(wǎng)絡(luò)見圖2(b)。
構(gòu)建文件耦合網(wǎng)絡(luò)需設(shè)置過濾閾值參數(shù), 該參數(shù)是指一次提交所涉及的最大文件數(shù)。當(dāng)一次提交記錄中涉及的文件很多時, 相應(yīng)的文件耦合網(wǎng)絡(luò)會存在很多權(quán)值較小的邊, 這種“大提交”往往是由一些通用修改導(dǎo)致, 比如license修改, 分支合并等。為了避免過耦合, 需要設(shè)置適當(dāng)?shù)倪^濾閾值參數(shù)以篩選出有效的用于構(gòu)建文件耦合網(wǎng)絡(luò)的提交記錄。
圖2 文件耦合網(wǎng)絡(luò)示例 Figure 2 Change Coupling Network
3.1.3 開發(fā)者貢獻(xiàn)網(wǎng)絡(luò)(Developer Contribution Network, DCN)
從軟件演化歷史中的開發(fā)者維護(hù)活動來構(gòu)建開發(fā)者貢獻(xiàn)網(wǎng)絡(luò)DCN[43]: 對于面向?qū)ο笙到y(tǒng)P, 其開發(fā)者貢獻(xiàn)網(wǎng)絡(luò) DCNP= (D,B,E)是個無向帶權(quán)二分圖。其中D,B為圖 DCNP的頂點的兩個集合, 每個頂點d ∈ D代表軟件開發(fā)者, b ∈ B代表類/接口; E ? {( d ,b) |d ∈ D∧b ∈ B}是圖的邊集合, 邊(d,b)代表開發(fā)者d對類/接口b進(jìn)行了提交操作; 邊的權(quán)重表示開發(fā)人員對類/接口的提交次數(shù)。
圖3是開發(fā)者貢獻(xiàn)網(wǎng)絡(luò)的示例。其中, 矩形代表類/接口, 人形圖案代表開發(fā)者, 邊代表開發(fā)人員對類/接口的修改提交操作, 邊的標(biāo)簽代表開發(fā)人員提交該文件的次數(shù)。例如, 邊(d5,b1)表示開發(fā)人員d5對類b1做了6次提交操作。文獻(xiàn)[43]研究發(fā)現(xiàn), 開發(fā)者貢獻(xiàn)網(wǎng)絡(luò)中中心性越高的類/接口越易發(fā)生缺陷(error-prone)。當(dāng)一個類/接口被較多開發(fā)者修改, 則中心性會增強(qiáng), 所以類b1和類b2比類b3發(fā)生缺陷的概率更大; 加之, 開發(fā)人員同時處理許多其他文件則中心性會增加, 所以類b1比類b2更有可能發(fā)生缺陷。
圖3 開發(fā)者貢獻(xiàn)網(wǎng)絡(luò)示例 Figure 3 Developer Contribution Network
網(wǎng)絡(luò)嵌入[12]的核心思想是在保持網(wǎng)絡(luò)結(jié)構(gòu)特性(一階相似度、二階相似度等)的同時將高維稀疏的網(wǎng)絡(luò)結(jié)構(gòu)或者圖結(jié)構(gòu)映射到低維稠密的向量空間。本文選取DeepWalk、Node2vec、Grarep、Graph Factorization、SDNE和LINE算法共6種代表性的網(wǎng)絡(luò)嵌入算法, 對軟件關(guān)聯(lián)網(wǎng)絡(luò)進(jìn)行特征表示。
1) DeepWalk. 由Perozzi等人[15]于2014年提出, 是最早的基于Word2vec的節(jié)點向量化模型, 網(wǎng)絡(luò)中節(jié)點的鄰域的概念可以使用自然語言中單詞上的滑動窗口來定義。主要思路是利用網(wǎng)絡(luò)中隨機(jī)游走得到的節(jié)點序列, 生成節(jié)點的向量表示。DeepWalk發(fā)現(xiàn)網(wǎng)絡(luò)中隨機(jī)游走序列的節(jié)點分布類似于自然語言中的單詞分布。因此對于網(wǎng)絡(luò)中的每個節(jié)點, 生成長度為t的隨機(jī)游走序列。然后用Skip-gram模型訓(xùn)練模型, 最大化隨機(jī)游走序列中節(jié)點的概率:
其中w是窗口大小, φ( vi)是節(jié)點 vi的表示向量, {vi-w,… , vi+w}vi是節(jié)點vi的上下游節(jié)點。
DeepWalk算法充分利用了網(wǎng)絡(luò)結(jié)構(gòu)中的隨機(jī)游走序列的信息, 使用隨機(jī)游走序列的信息只依賴于局部信息, 所以適用于分布式和在線系統(tǒng)。
2) Node2vec. 該算法通過改變隨機(jī)游走序列生成的方式進(jìn)一步擴(kuò)展了DeepWalk算法, 由Grover于2016年提出[16]。DeepWalk隨機(jī)地選取隨機(jī)游走序列中下一個節(jié)點, 而Node2vec將廣度優(yōu)先搜索(BFS)和深度優(yōu)先搜索(DFS)引入隨機(jī)游走序列的生成過程, 通過兩個參數(shù)p、q實現(xiàn)二者的平衡, 可以同時考慮到局部和全局的信息, 并且具有很高的適應(yīng)性。
Node2vec中用參數(shù)p和q控制著行走過程中的轉(zhuǎn)移概率。參數(shù)p為返回參數(shù)(return parameter), 若p值高, 可以保證在下一步采樣已訪問過的節(jié)點的可能性比較低; 參數(shù)q為輸入-輸出參數(shù)(in-out parameter), q> 1時隨機(jī)游走會選擇離當(dāng)前節(jié)點更近的節(jié)點, 以此達(dá)到接近BFS的效果; q< 1時隨機(jī)游走會選擇離當(dāng)前節(jié)點更遠(yuǎn)的節(jié)點, 達(dá)到類似DFS的效果。它的目標(biāo)函數(shù)如下所示:
本式含義與DeepWalk類似, 其中 f(u)為當(dāng)前節(jié)點u在嵌入空間的向量表示, Ns(u)為當(dāng)前節(jié)點的上下游節(jié)點。
3) Grarep. 是基于矩陣分解的網(wǎng)絡(luò)嵌入算法之一, 由Cao等人[13]在2015年提出。Grarep通過操縱不同的全局轉(zhuǎn)移矩陣, 從圖形中直接捕獲不同的k階關(guān)系信息, 不需要緩慢且復(fù)雜的采樣過程。與其他算法不同的是, 該算法定義了不同的損失函數(shù), 來捕獲不同的k階關(guān)系信息, 允許集成不同局部關(guān)系信息的非線性組合。
該算法將節(jié)點的轉(zhuǎn)移概率定義為 A =D-1S, 其中D為度矩陣, S為鄰接矩陣。利用A可以計算出k階轉(zhuǎn)移概率Ak。將將其中從起始點w到終止點c的k-step路徑記作(w, c)。優(yōu)化目標(biāo)是: 最大化(w, c)所代表的路徑在圖中的概率; 最小化除了(w, c)以外的路徑在圖的概率來保留k階相似度。Grarep的主要缺點是其可擴(kuò)展性。并且, 該算法在學(xué)習(xí)過程中將奇異值分解方法(SVD)應(yīng)用于矩陣的冪以獲得節(jié)點的低維表示, 這可能會導(dǎo)致高昂的計算成本。
4) Graph Factorization. 由Ahmed等人[14]在2013年提出, 后面簡稱GF。目前來說, GF是第一個將算法復(fù)雜度降到O(|E|)的網(wǎng)絡(luò)嵌入算法。為了獲得表征結(jié)果, GF對網(wǎng)絡(luò)的鄰接矩陣進(jìn)行因式分解, 最小化隨后的損失函數(shù)如下所示:
式中 Wij是節(jié)點i和節(jié)點j連接邊的權(quán)重, < Yi,Yj>是降維后節(jié)點向量的內(nèi)積, λ是正則化系數(shù)。值得注意的是, 這里的求和是針對觀察到的邊而非所有邊,這是為了算法的可擴(kuò)展性, 但這樣可能會在結(jié)果中帶來噪聲。即使表示向量維度為|V|, 該損失函數(shù)的最小值仍然有可能大于0。
5) SDNE. 由Wang等人[17]在2016年提出, 使用深度自動編碼器來同時保留一階和二階相似度的算法。一階相似度衡量的是相鄰的兩個頂點對之間相似性。二階相似度衡量的是兩個頂點的鄰居集合的相似程度。該算法通過保持網(wǎng)絡(luò)的一階相似度來保持網(wǎng)絡(luò)局部結(jié)構(gòu), 通過保持網(wǎng)絡(luò)的二階相似度來保持全局的網(wǎng)絡(luò)結(jié)構(gòu)。論文采用了半監(jiān)督結(jié)構(gòu), 其中的無監(jiān)督組件(編碼器、解碼器)通過重構(gòu)鄰接矩陣來保持網(wǎng)絡(luò)的全局結(jié)構(gòu), 具有相似鄰域結(jié)構(gòu)的頂點將被映射到相近的向量空間; 而監(jiān)督組件借鑒了Laplacian Eigenmaps算法, 利用一階相似度來保持局部的網(wǎng)絡(luò)結(jié)構(gòu), 使得彼此相連的節(jié)點在映射空間中也十分靠近。由于模型高度非線性, 在參數(shù)空間中會存在很多局部最優(yōu)解。為了解決該問題, 該算法采用Deep Belief Network來對參數(shù)進(jìn)行預(yù)先訓(xùn)練, 完整算法可參考論文原文。SDNE的主要貢獻(xiàn)在于提出了一種新的半監(jiān)督深層學(xué)習(xí)模型, 結(jié)合一階與二階相似度的優(yōu)點, 用于表示網(wǎng)絡(luò)的局部結(jié)構(gòu)屬性和全局結(jié)構(gòu)屬性。
6) LINE. 由Tang等人[29]在2015年提出, 該方法的可擴(kuò)展性很好,能夠快速地對大規(guī)模網(wǎng)絡(luò)進(jìn)行嵌入,并且能夠同時保留局部和全局的結(jié)構(gòu)信息。它通過定義兩個函數(shù)來計算節(jié)點的嵌入向量, 分別用于一階相似度和二階相似度的計算, 并最小化這兩個函數(shù)的組合。一階相似度的函數(shù)類似于GF算法, 因為它們都旨在保持鄰接矩陣和降維后節(jié)點的點積接近。不同的是, GF通過直接最小化兩者的差異來做到這一點, 而LINE用鄰接矩陣和嵌入矩陣分別定義了每對節(jié)點的兩個聯(lián)合概率分布, 然后最小化這兩個分布的Kullback-Leibler(KL)散度。這兩個分布如下所示:
該算法的目標(biāo)函數(shù)如下所示:
其中 vi,vj為網(wǎng)絡(luò)中的兩個節(jié)點, Yi,Yj是 vi,vj的嵌入向量, Wij是 vi,vj的連接權(quán)重。作者類似地定義了對于二階相似度的概率分布和目標(biāo)函數(shù)。該算法適用于任意類型的信息網(wǎng)絡(luò), 并能夠輕易拓展到百萬個節(jié)點。
本節(jié)展示Lucene軟件①https://lucene.apache.org/的3種軟件關(guān)聯(lián)網(wǎng)絡(luò)及其網(wǎng)絡(luò)嵌入結(jié)果。
圖4可視化出3種軟件關(guān)聯(lián)網(wǎng)絡(luò): 使用工具Understand②https://scitools.com/抽取類依賴關(guān)系, 構(gòu)建類依賴網(wǎng)絡(luò)CDN, 見圖4(a); 基于Git log中文件的共同修改記錄, 構(gòu)建的文件耦合網(wǎng)絡(luò)CCN, 見圖4(b); 通過挖掘開發(fā)者對文件的修改提交操作, 構(gòu)建開發(fā)者貢獻(xiàn)網(wǎng)絡(luò)DCN, 見圖4(c)。在3種軟件關(guān)聯(lián)網(wǎng)絡(luò)中, 紅色節(jié)點表示存在缺陷的類/接口/文件, 藍(lán)色節(jié)點表示不存在缺陷的類/接口/文件, 綠色節(jié)點表示開發(fā)人員。從圖中可以看出, 在該軟件中存在缺陷的類/接口/文件相對較多, 且缺陷節(jié)點的分布沒有明顯規(guī)律。
選取Grarep和LINE網(wǎng)絡(luò)嵌入算法將Lucene軟件的CDN的節(jié)點轉(zhuǎn)化為向量表示。為了觀察向量反應(yīng)出的網(wǎng)絡(luò)節(jié)點之間的關(guān)系, 與文獻(xiàn)[16]類似, 我們使用k均值聚類算法[84](k-means clustering algorithm)基于嵌入后的向量信息對網(wǎng)絡(luò)節(jié)點進(jìn)行聚類, 使距離相近的向量被劃分到同一個簇(cluster)中, 不同簇使用不同顏色渲染, 結(jié)果如圖5所示, 圖5(a)為Grarep特征的聚類結(jié)果, 圖5(b)為LINE特征的聚類結(jié)果??梢杂^察到, Grarep算法和LINE算法嵌入后的節(jié)點向量經(jīng)聚類得到的結(jié)果存在很大差異, 初步得出不同網(wǎng)絡(luò)嵌入保持的網(wǎng)絡(luò)結(jié)構(gòu)特征可能不同。
圖4 Lucene的軟件關(guān)聯(lián)網(wǎng)絡(luò) Figure 4 Software Associated Network of Lucene
圖5 Lucene軟件CDN的網(wǎng)絡(luò)嵌入特征的聚類結(jié)果 Figure 5 Clusters of Class Dependency Network Embedding Features for Lucene
本文設(shè)計了一種基于軟件關(guān)聯(lián)網(wǎng)絡(luò)嵌入特征的缺陷預(yù)測方法, 該方法除了使用代碼度量和網(wǎng)絡(luò)度量的軟件特征, 也使用了軟件關(guān)聯(lián)網(wǎng)絡(luò)嵌入特征。本節(jié)先介紹方法流程, 再詳細(xì)介紹每個步驟。
圖6展示了基于軟件關(guān)聯(lián)網(wǎng)絡(luò)嵌入的缺陷預(yù)測流程:
1) 輸入處理。根據(jù)軟件的源代碼和修訂歷史構(gòu)建出CDN、CCN、DCN共3種軟件關(guān)聯(lián)網(wǎng)絡(luò)。
2) 特征提取。從源代碼和軟件關(guān)聯(lián)網(wǎng)絡(luò)中分別提取出3種特征: 代碼度量特征(CM)、網(wǎng)絡(luò)度量特征(NM)、網(wǎng)絡(luò)嵌入特征(NE)。其中CM和NM屬于傳統(tǒng)的度量特征。
3) 模型訓(xùn)練。對缺陷數(shù)據(jù)集使用SMOTUNED算法[77]進(jìn)行非平衡數(shù)據(jù)的處理, 將上一步得到的3種特征和對應(yīng)的缺陷標(biāo)簽輸入隨機(jī)森林、支持向量機(jī)、樸素貝葉斯和多層感知器進(jìn)行模型訓(xùn)練并測試, 預(yù)測是否存在缺陷。
圖6 基于軟件關(guān)聯(lián)網(wǎng)絡(luò)嵌入的缺陷預(yù)測方法流程 Figure 6 Defect Prediction Based on Network Embedding
本節(jié)詳細(xì)介紹從源代碼和軟件關(guān)聯(lián)網(wǎng)絡(luò)得到的度量特征:
(1) 代碼度量特征
本文將基于源代碼的度量結(jié)果作為代碼度量特征。已有研究提出了各種代碼度量指標(biāo), 本文使用了常用的C&K(Chidamber-Kemerer)指標(biāo)[8], McCabe的度量[7](Max_CC, Avg_CC)等共計20個代碼度量指標(biāo)。這些指標(biāo)的集合記為CM(Code Metrics), 來源于公開可用的tera-PROMISE數(shù)據(jù)庫, 表2展示指標(biāo)的名稱和說明。
(2) 網(wǎng)絡(luò)度量特征
本文使用了59種基于網(wǎng)絡(luò)的指標(biāo), 這些指標(biāo)集合記作網(wǎng)絡(luò)度量NM(Network Metrics), 包括對自我中心網(wǎng)絡(luò)(Ego Network)的度量和對全局網(wǎng)絡(luò)(Global Network)的度量。這些指標(biāo)詳見Zimmermann等[4]和Ma等[10]的研究工作, 其中16個指標(biāo)的說明見表3。NM指標(biāo)可以使用Ucinet①www.analytictech.com/ucinet/來計算, Ucinet可以處理矩陣格式的網(wǎng)絡(luò)結(jié)構(gòu)數(shù)據(jù), 探測網(wǎng)絡(luò)結(jié)構(gòu)的度量指標(biāo)。
表2 代碼度量(CM)和說明 Table 2 Code Metrics and Descriptions
表3 網(wǎng)絡(luò)度量(NM)和說明 Table 3 Network Metrics and Descriptions
(3) 網(wǎng)絡(luò)嵌入特征
網(wǎng)絡(luò)嵌入特征反映軟件關(guān)聯(lián)網(wǎng)絡(luò)的結(jié)構(gòu)信息, 本文分別使用DeepWalk、Node2vec、Grarep、Graph Factorization、SDNE和LINE算法, 將軟件關(guān)聯(lián)網(wǎng)絡(luò)中的節(jié)點表示為反映網(wǎng)絡(luò)結(jié)構(gòu)信息的向量。
圖7 3種特征合并后的特征向量示例 Figure 7 The Feature Vector with 3 Features
將該向量與此節(jié)點的代碼度量和網(wǎng)絡(luò)度量值合并后的向量 , 和對應(yīng)的缺陷標(biāo)簽(節(jié)點對應(yīng)的類/文件/接口是否存在缺陷)作為模型訓(xùn)練過程的輸入。如圖7所示, 對于Lucene軟件中的一個節(jié)點org.apache. lucene.search.spans.SpanNotQuery.java, 使用DeepWalk算法, 三種特征合并后的向量為: 對該節(jié)點的代碼度量、網(wǎng)絡(luò)度量與基于DeepWalk得到的節(jié)點向量的合并。
在模型訓(xùn)練過程中, 將特征向量和對應(yīng)缺陷標(biāo)簽輸入至機(jī)器學(xué)習(xí)模型中, 利用十次三折交叉驗證訓(xùn)練缺陷預(yù)測模型。大多數(shù)訓(xùn)練集中缺陷和非缺陷的數(shù)據(jù)比例不平衡, 因此需要先平衡訓(xùn)練集, 然后輸入至隨機(jī)森林、多層感知器、支持向量機(jī)、樸素貝葉斯等4種分類器中進(jìn)行訓(xùn)練。
4.3.1 非平衡數(shù)據(jù)集處理
很多機(jī)器學(xué)習(xí)算法都假設(shè)訓(xùn)練數(shù)據(jù)集是均勻分布的, 若把這些算法直接應(yīng)用, 大多數(shù)情況下無法取得理想的結(jié)果, 這是因為實際數(shù)據(jù)往往分布的很不均勻, 存在長尾現(xiàn)象: 即數(shù)據(jù)中的一類樣本在數(shù)量上遠(yuǎn)多于另一類。這種情況下, 傳統(tǒng)機(jī)器學(xué)習(xí)訓(xùn)練算法的結(jié)果可能會偏向于多數(shù)類, 對于少數(shù)類的預(yù)測性能會很差。為了解決數(shù)據(jù)非平衡問題, He等人[78], Zhang等人[79]和Lopez等人[80]提出了處理非平衡數(shù)據(jù)的模型。包括: 模型融合(Ensemble)方法, 代價敏感分類(Cost-sensitive)方法, 基于核的算法(Kernel-based)和主動學(xué)習(xí)(Active Learning)算法等。
本文使用Agrawal等人[77]在2018年提出的SMOTUNED(Autotuning Version of SMOTE)算法來對實驗數(shù)據(jù)進(jìn)行平衡處理。SMOTUNED 算法是對Chawala等人[81]在2002年提出的SMOTE(Synthetic Minority Over-sampling Technique)算法的改進(jìn)。SMOTE通過對少數(shù)類樣本進(jìn)行分析和模擬, 將新樣本添加到數(shù)據(jù)集中來減少數(shù)據(jù)失衡程度。該方法從少數(shù)類中的每個樣本x的k個近鄰(歐氏距離)中隨機(jī)挑選N個樣本進(jìn)行隨機(jī)線性插值, 構(gòu)造新的少數(shù)類樣本, 并將新樣本和原數(shù)據(jù)合成得到新的訓(xùn)練集。它是基于隨機(jī)過采樣的一種改進(jìn)方案, 是目前處理非平衡數(shù)據(jù)的常用手段。但是, SMOTE算法中涉及很多參數(shù), 參數(shù)的設(shè)置往往依賴于人們的經(jīng)驗, 有些研究使用了該算法的默認(rèn)參數(shù)[77], 這樣的設(shè)置并不能很好的適應(yīng)所有數(shù)據(jù)集。SMOTUNED使用差分進(jìn)化算法(Differential Evolution), 隨機(jī)生成SMOTE算法中參數(shù)的初值, 通過變異、交叉、選擇的演化過程逐步自適應(yīng)地尋求參數(shù)的最優(yōu)解。
4.3.2 隨機(jī)森林
隨機(jī)森林(Random Forest)[82]是利用多棵樹對樣本進(jìn)行訓(xùn)練并預(yù)測的一種分類器, 可以基于開源機(jī)器學(xué)習(xí)框架scikit-learn①https://scikit-learn.org/stable/實現(xiàn), 并利用scikit-learn的網(wǎng)格搜索(grid-search)功能調(diào)整隨機(jī)森林的參數(shù)。隨機(jī)森林以隨機(jī)的方式建立包含多棵決策樹的森林, 根據(jù)決策樹的分類結(jié)果對每個記錄進(jìn)行投票表決決定最終的分類。隨機(jī)森林可用于處理分類和回歸問題。隨機(jī)森林的隨機(jī)性可以有效地防止過擬合情況的出現(xiàn), 同時多棵決策樹增強(qiáng)了模型的泛化能力。
4.3.3 多層感知器
多層感知器(Multi-Layer Perception, MLP)是一種基于誤差反饋的人工神經(jīng)網(wǎng)絡(luò), 由一個輸入層、一個或多個隱層、一個輸出層構(gòu)成。MLP神經(jīng)網(wǎng)絡(luò)不同層之間是全連接的。訓(xùn)練過程包括正向和反向兩種傳播過程。在正向傳播過程中得到輸出結(jié)果, 在反向傳播過程中進(jìn)行驗證, 根據(jù)誤差逐層調(diào)整各層神經(jīng)元的權(quán)值, 最終使輸出結(jié)果滿足要求。
4.3.4 支持向量機(jī)
支持向量機(jī)(Support Vector Machine, SVM)是一個利用有監(jiān)督學(xué)習(xí)方法對數(shù)據(jù)進(jìn)行二元分類的廣義線性分類器。SVM的基本思想是在分類問題中求解能夠正確劃分訓(xùn)練數(shù)據(jù)集并且?guī)缀伍g隔最大的超平面。一些非線性可分的問題可以通過核函數(shù)替換實例和實例中的內(nèi)積解決, 常用的核函數(shù)有: 高斯核函數(shù)、Sigmoid核函數(shù)和多項式核函數(shù)。本文的輸入特征線性不可分, 因此選擇高斯核函數(shù)。
4.3.5 樸素貝葉斯
樸素貝葉斯(Naive Bayesian, NB)是基于貝葉斯定理與特征條件獨立假設(shè)的分類方法。通過貝葉斯公式可以由已知的先驗概率和條件概率, 推算出后驗概率P(B|A)。而樸素貝葉斯算法對條件概率分布做出了獨立性的假設(shè), 在這個假設(shè)的前提上, 結(jié)合貝葉斯定理即可得到分類結(jié)果。樸素貝葉斯有三個常用模型: 高斯、多項式、伯努利, 可以根據(jù)實際情況選擇不同的模型。多項式樸素貝葉斯模型常用于文本分類問題中, A中的特征為單詞在文本中出現(xiàn)的次數(shù)。如果A中的特征是連續(xù)變量, 則假設(shè)在B的條件下, A服從高斯分布, 則使用高斯樸素貝葉斯模型。由于本文中的輸入特征均為連續(xù)變量, 因此選擇高斯樸素貝葉斯模型。
本章首先介紹選取的數(shù)據(jù)集及其預(yù)處理, 然后分析基于軟件關(guān)聯(lián)網(wǎng)絡(luò)嵌入的缺陷預(yù)測結(jié)果, 緊接著分析網(wǎng)絡(luò)嵌入保持的網(wǎng)絡(luò)結(jié)構(gòu)特征以及缺陷預(yù)測性能差異的原因, 最后分析不同參數(shù)配置下的網(wǎng)絡(luò)嵌入特征對缺陷預(yù)測性能的影響。
5.1.1 實驗對象
本文使用了12個常用的大型開源Java軟件系統(tǒng)作為實驗對象。這些系統(tǒng)的缺陷數(shù)據(jù)來自于公開可用的tera-PROMISE數(shù)據(jù)庫①http://openscience.us/repo/和D’Ambros等人[83]于2010年發(fā)布的缺陷數(shù)據(jù)集②http://bug.inf.usi.ch/index.php。這12個軟件系統(tǒng)包括: Ant是用于自動化軟件構(gòu)建過程的命令行工具; Camel是集成框架; Ivy是傳遞依賴管理器; Lucene是搜索框架和算法; Poi是用來處理Microsoft Office文件的庫; Synapse實現(xiàn)了高性能的企業(yè)服務(wù)總線(ESB); Tomcat是web服務(wù)器, Servlet和JSP容器; Velocity是模板引擎, 用于引用Java代碼中定義的對象; Xalan用于處理xml文檔; Equinox Framework是OSGi核心框架規(guī)范的實現(xiàn); JDT Core是Eclipse IDE的核心組件; PDE UI也是Eclipse組件, 提供了一套全面的工具來開發(fā)和測試Eclipse插件和其他產(chǎn)品。
這些系統(tǒng)及其軟件關(guān)聯(lián)網(wǎng)絡(luò)的統(tǒng)計信息如表4所示。表中SLOC列表示軟件的源代碼行數(shù); |CRD∩ CCDN|代表了既出現(xiàn)在CDN中又在缺陷數(shù)據(jù)集中的實體的數(shù)量; |CRD∩ CCCN|代表了既出現(xiàn)在CCN 中又在缺陷數(shù)據(jù)集中的實體的數(shù)量; |CRD∩ CDCN|代表了既出現(xiàn)在DCN中又在缺陷數(shù)據(jù)集中的實體的數(shù)量; PCDNDefect表示CDN中被標(biāo)記為缺陷的實體所占的百分比, PCCNDefect表示CCN中被標(biāo)記為缺陷的實體所占的百分比, PDCNDefect表示DCN中被標(biāo)記為缺陷的實體所占的百分比。
5.1.2 參數(shù)設(shè)置
(1) 軟件關(guān)聯(lián)網(wǎng)絡(luò)的過濾閾值
如前文所述, 構(gòu)建CCN和DCN時需要設(shè)置過濾閾值, 過大或過小的過濾閾值都不能有效反映耦合信息。本實驗將以CCN為例, 使用從15到35、間隔為 5的不同過濾閾值進(jìn)行預(yù)處理實驗, 也對不設(shè)置過濾閾值 (即過濾閾值為∞)進(jìn)行實驗, 目的是驗證不同過濾閾值對缺陷預(yù)測實驗效果的影響, 同時找出最適用于缺陷預(yù)測模型的過濾閾值用于構(gòu)建軟件關(guān)聯(lián)網(wǎng)絡(luò)。過濾閾值為n意味著構(gòu)建網(wǎng)絡(luò)時忽略涉及的文件數(shù)超過n的歷史修改提交記錄。表5展示了不同過濾閾值下CCN的統(tǒng)計信息, NCCN代表節(jié)點數(shù)(節(jié)點代表的實體不一定在缺陷數(shù)據(jù)集中), ECCN代表邊數(shù)。
表4 實驗對象統(tǒng)計信息 Table 4 Dataset Summary
表5 不同過濾閾值下CCN統(tǒng)計信息 Table 5 CCN Information under Different Thresholds
可以看出, 隨著過濾閾值的增大, CCN規(guī)模逐漸增大, 網(wǎng)絡(luò)分析所需的時間和空間開銷也就越大。過濾閾值為∞的情況反映了最真實完全的CCN, 當(dāng)過濾閾值為20以上時, 可以覆蓋超過70%的節(jié)點, 所以建議使用大于20的過濾閾值。
在后續(xù)的缺陷預(yù)測實驗中, 構(gòu)建CCN和DCN時設(shè)置的過濾閾值默認(rèn)為25。該參數(shù)變化對缺陷預(yù)測性能的影響將在5.4.1節(jié)實驗分析。
(2) 網(wǎng)絡(luò)嵌入算法參數(shù)
不同網(wǎng)絡(luò)嵌入算法保持的網(wǎng)絡(luò)結(jié)構(gòu)信息不同, 目標(biāo)函數(shù)不同, 涉及的參數(shù)存在差異。本節(jié)將介紹6種網(wǎng)絡(luò)嵌入算法中的主要參數(shù)。
在DeepWalk和Node2vec中的可調(diào)節(jié)參數(shù)類似, number-walks是從每個節(jié)點出發(fā)的隨機(jī)游走數(shù)量, walk-length是每個隨機(jī)游走的長度。除此之外, Node2vec可以控制隨機(jī)游走的方向, 通過修改p、q參數(shù)即可控制到鄰居的轉(zhuǎn)移概率。在LINE中的主要調(diào)節(jié)參數(shù)有epochs和order, 其中epochs可以控制訓(xùn)練的迭代次數(shù), 而order可以控制算法中用到的相似度階數(shù)。GraRep中的kstep參數(shù)可以用來更改算法中的k步轉(zhuǎn)移概率矩陣, 用來保持網(wǎng)絡(luò)中的k階相似度。GF算法中的主要可調(diào)節(jié)參數(shù)為epochs, 用來控制訓(xùn)練迭代次數(shù)。SDNE中的encoder-list是一個二維向量, 其中第一維用于控制編碼層的神經(jīng)元數(shù)量, 第二維用于調(diào)整節(jié)點向量的維數(shù)。
本文的缺陷預(yù)測實驗中網(wǎng)絡(luò)嵌入算法借助OpenNE①https://github.com/thunlp/OpenNE實現(xiàn), 均使用默認(rèn)的參數(shù)設(shè)置。不同參數(shù)設(shè)置對軟件關(guān)聯(lián)網(wǎng)絡(luò)嵌入特征以及缺陷預(yù)測效果的影響會在5.4.2小節(jié)實驗分析。
本節(jié)展示了基于傳統(tǒng)度量特征和基于網(wǎng)絡(luò)嵌入特征的缺陷預(yù)測結(jié)果, 并對比了基于不同網(wǎng)絡(luò)嵌入特征得到的缺陷預(yù)測結(jié)果。
5.2.1 CDN的缺陷預(yù)測結(jié)果
表6展示了傳統(tǒng)度量特征和Grarep算法得到的網(wǎng)絡(luò)嵌入特征在CDN上通過隨機(jī)森林分類器對12個數(shù)據(jù)集的缺陷預(yù)測AUC(Area Under Curve)值。AUC指標(biāo)用于評估分類器性能, 該指標(biāo)權(quán)衡了分類結(jié)果的精確率和召回率。
對于每個軟件, 表6中展示的是十次三折交叉驗證得到的平均AUC值, 基于傳統(tǒng)的代碼度量特征的預(yù)測結(jié)果見CM列; 基于傳統(tǒng)的網(wǎng)絡(luò)度量特征的預(yù)測結(jié)果見NM列; 代碼度量和網(wǎng)絡(luò)度量組合的實驗結(jié)果見CM+NM列; 基于Grarep算法的缺陷預(yù)測結(jié)果以及與傳統(tǒng)度量組合后的缺陷預(yù)測結(jié)果見NE列、CM+NE列和CM+NM+NE列。
表6 CDN的缺陷預(yù)測AUC值 Table 6 AUC Value of Defect Prediction on CDN
表6中加粗的字體對應(yīng)每行最大值, 即每個軟件使用不同度量特征進(jìn)行缺陷預(yù)測時得到的最優(yōu)預(yù)測結(jié)果。從表中可以看出, 最大值分布在CM+NE、CM+NM+NE兩列。即對于傳統(tǒng)度量來說, 結(jié)合傳統(tǒng)度量和網(wǎng)絡(luò)嵌入特征可以使缺陷預(yù)測達(dá)到更好的效果。
圖8顯示了在CDN上傳統(tǒng)方法以及分別與6種網(wǎng)絡(luò)嵌入特征結(jié)合后通過隨機(jī)森林分類器得到的缺陷預(yù)測AUC值。由于基于代碼度量的缺陷預(yù)測效果在傳統(tǒng)方法中相對較好, 因此圖8中用于對比的傳統(tǒng)方法選擇基于代碼度量的方法。通過圖8可以觀察到, 使用了DeepWalk、Node2vec、Grarep后, 在絕大多數(shù)的實驗對象上的預(yù)測結(jié)果均得到改善; SDNE算法也可以在一定程度上提升預(yù)測效果; 而GF算法和LINE算法未能有效改進(jìn)缺陷預(yù)測模型, 僅在4個實驗對象上的實驗效果有所提升。由此得到結(jié)論, 對于大多數(shù)實驗軟件, 結(jié)合基于DeepWalk、Node2vec、Grarep算法得到的特征可以提升在隨機(jī)森林上的缺陷預(yù)測效果, 這些算法可以增加軟件的網(wǎng)絡(luò)結(jié)構(gòu)信息, 從而改善缺陷預(yù)測效果。經(jīng)對比計算可得, 在CDN上分別結(jié)合每種網(wǎng)絡(luò)嵌入特征后的缺陷預(yù)測的性能(AUC)比僅考慮傳統(tǒng)度量特征的預(yù)測性能, 性能提升程度的最大值是14.6%, 平均值是3.6 %。
與上述類似, 圖9、圖10、圖11分別顯示了在CDN使用樸素貝葉斯、支持向量機(jī)和多層感知器進(jìn)行缺陷預(yù)測的AUC值??梢杂^察到, 結(jié)合DeepWalk、Node2vec、Grarep嵌入特征后明顯提升了在這三種分類器上的缺陷預(yù)測效果, 這與在隨機(jī)森林分類器上的缺陷預(yù)測效果(見圖8)一致。通過計算可得: 結(jié)合網(wǎng)絡(luò)嵌入特征后, 使用樸素貝葉斯性能提升最大值為15.7%, 平均值為3.3%; 使用支持向量機(jī)性能提升最大值為9.6%, 平均提升為2.5%; 使用多層感知器, 性能提升最大值為14%, 平均值為3.4%。使用隨機(jī)森林缺陷預(yù)測的效果比樸素貝葉斯、支持向量機(jī)、多層感知器的效果要好, 性能平均高2%、10%、9%。
分析結(jié)果1: 在CDN上結(jié)合DeepWalk、Grarep、Node2vec特征后, 缺陷預(yù)測性能(AUC)優(yōu)于僅考慮傳統(tǒng)度量特征的預(yù)測性能, 且隨機(jī)森林分類器比其他三種分類器的效果更好。
圖8 CDN上缺陷預(yù)測的AUC值(使用隨機(jī)森林分類) Figure 8 AUC Value of Defect Prediction on CDN (by Random Forest)
圖9 CDN上缺陷預(yù)測的AUC值(使用樸素貝葉斯分類) Figure 9 AUC Value of Defect Prediction on CDN (by Naive Bayesian)
圖10 CDN上缺陷預(yù)測的AUC值(使用支持向量機(jī)分類) Figure 10 AUC Value of Defect Prediction on CDN (by Support Vector Machine)
圖11 CDN上缺陷預(yù)測的AUC值(使用多層感知器分類) Figure 11 AUC Value of Defect Prediction on CDN (by Multi-Layer Perception)
5.2.2 CCN的缺陷預(yù)測結(jié)果
表7展示了傳統(tǒng)度量特征和Grarep算法得到的網(wǎng)絡(luò)嵌入特征在CCN上通過隨機(jī)森林分類得到的缺陷預(yù)測結(jié)果, 每列代表的含義和表6相同, CM、NM、CM+NM列為傳統(tǒng)方法預(yù)測結(jié)果, NE、CM+NE、CM+NM+NE為結(jié)合網(wǎng)絡(luò)嵌入特征的預(yù)測結(jié)果。表7中用加粗字體標(biāo)出了每行的最大值。從加粗字體的分布可以發(fā)現(xiàn), 在CCN中, 用Grarep算法得到的網(wǎng)絡(luò)嵌入特征結(jié)合傳統(tǒng)指標(biāo)可以達(dá)到更好的缺陷預(yù)測效果。
表7 CCN的缺陷預(yù)測AUC值 Table 7 AUC Value of Defect Prediction on CCN
圖12展示了在CCN上傳統(tǒng)方法以及分別與6種網(wǎng)絡(luò)嵌入特征結(jié)合后通過隨機(jī)森林分類器得到的缺陷預(yù)測AUC值, 由于基于代碼度量和網(wǎng)絡(luò)度量結(jié)合的缺陷預(yù)測效果在傳統(tǒng)方法中相對較好, 因此圖12中對比的傳統(tǒng)方法選擇基于傳統(tǒng)度量結(jié)合的方法。從該柱狀圖中觀察到, LINE和GF在CCN上僅有一半的實驗對象性能得到提升, 而結(jié)合DeepWalk、Node2vec、Grarep、SDNE后, 缺陷預(yù)測性能都能有所改善。因此在CCN中使用傳統(tǒng)度量和網(wǎng)絡(luò)嵌入特征的結(jié)合有助于改善缺陷預(yù)測效果。經(jīng)對比計算可得, 在CCN上結(jié)合網(wǎng)絡(luò)嵌入特征后, 通過隨機(jī)森林的缺陷預(yù)測性能相比于僅基于傳統(tǒng)度量特征的預(yù)測方法, 性能提升程度的最大值是17.1%, 平均值是3.7%。
圖12 CCN上缺陷預(yù)測的AUC值(使用隨機(jī)森林分類) Figure 12 AUC Value of Defect Prediction on CCN (by Random Forest)
圖13 CCN上缺陷預(yù)測的AUC值(使用樸素貝葉斯分類) Figure 13 AUC Value of Defect Prediction on CCN (by Naive Bayesian)
與上述類似, 圖13、圖14、圖15分別顯示了在CCN使用樸素貝葉斯、支持向量機(jī)和多層感知器進(jìn)行缺陷預(yù)測的AUC值??梢杂^察到, 結(jié)合DeepWalk、Node2vec、Grarep嵌入特征后明顯提升了在這三種分類器上的缺陷預(yù)測效果, 這與在隨機(jī)森林分類器上的缺陷預(yù)測效果(見圖12)一致。通過計算可得: 結(jié)合網(wǎng)絡(luò)嵌入特征后, 使用樸素貝葉斯性能提升最大值為12.3%, 平均值為3.7%; 使用支持向量機(jī)性能提 升最大值為6.5%, 平均提升為2.2%; 使用多層感知器, 性能提升最大值為9.7%, 平均值為4%。使用隨機(jī)森林缺陷預(yù)測的效果比樸素貝葉斯、支持向量機(jī)、多層感知器的效果要好, 性能平均高2%、10%、10%。
分析結(jié)果2: 在CCN上結(jié)合DeepWalk、Grarep、Node2vec特征后, 缺陷預(yù)測性能(AUC)優(yōu)于僅考慮傳統(tǒng)度量特征的預(yù)測性能, 且隨機(jī)森林分類器比其他三種分類器的效果更好。
圖14 CCN上缺陷預(yù)測的AUC值(使用支持向量機(jī)分類) Figure 14 AUC Value of Defect Prediction on CCN (by Support Vector Machine)
圖15 CCN上缺陷預(yù)測的AUC值(使用多層感知器分類) Figure 15 AUC Value of Defect Prediction on CCN (by Multi-Layer Perception)
5.2.3 DCN的缺陷預(yù)測結(jié)果
表8展示了在DCN上傳統(tǒng)度量特征和Grarep算法得到的網(wǎng)絡(luò)嵌入特征通過隨機(jī)森林分類器的預(yù)測結(jié)果, 每列所代表的含義和表6和表7相同, 加粗字體標(biāo)出了每行的最大值。從最大值分布可以發(fā)現(xiàn), 對每個實驗對象來說, 缺陷預(yù)測的最好結(jié)果可能出現(xiàn)在傳統(tǒng)方法中, 也可能出現(xiàn)在結(jié)合網(wǎng)絡(luò)嵌入特征的方法中。也就是說, 在DCN中, 結(jié)合網(wǎng)絡(luò)嵌入特征的缺陷預(yù)測結(jié)果不一定比基于傳統(tǒng)方法的缺陷預(yù)測結(jié)果好, 沒有明顯的改進(jìn)效果。
圖16展示了DCN上傳統(tǒng)方法以及分別與6種網(wǎng)絡(luò)嵌入特征結(jié)合后通過隨機(jī)森林分類器得到的缺陷預(yù)測AUC值。傳統(tǒng)方法是基于代碼度量的缺陷預(yù)測。從該柱狀圖中可以看出, 對于12個實驗系統(tǒng), 當(dāng)Grarep、SDNE被應(yīng)用于模型時, 可以提升半數(shù)實驗對象的預(yù)測結(jié)果; 而其余網(wǎng)絡(luò)嵌入算法在DCN上的效果不佳, 實驗結(jié)果在大多數(shù)對象上均有下降。經(jīng)過計算, 在DCN上, 結(jié)合Grarep算法或SDNE算法使得缺陷預(yù)測預(yù)測性能對比傳統(tǒng)方法得到小幅提升, 平均提高0.8%, 而結(jié)合其余網(wǎng)絡(luò)嵌入算法后的缺陷預(yù)測性能均未提升。
與上述類似, 圖17、圖18、圖19分別顯示了在DCN使用樸素貝葉斯、支持向量機(jī)和多層感知器進(jìn)行缺陷預(yù)測的AUC值。由圖17可知, 當(dāng)DeepWalk、Grarep、SDNE被應(yīng)用于基于樸素貝葉斯的模型時, 可以提升多數(shù)實驗對象的預(yù)測結(jié)果, 平均提升1.1%,但不穩(wěn)定。由圖18可知, 分別結(jié)合6種網(wǎng)絡(luò)嵌入算法在使用支持向量機(jī)分類算法后的缺陷預(yù)測結(jié)果, 在絕大多數(shù)的實驗對象上的均得到小幅改善。且缺陷預(yù)測AUC值對比傳統(tǒng)方法平均提高1.8%。而通過圖19可知, 在多層感知器上的缺陷預(yù)測模型對比傳統(tǒng)方法沒有普遍且明顯的性能提升。使用隨機(jī)森林缺陷預(yù)測的效果比樸素貝葉斯、支持向量機(jī)、多層感知器的效果要好, 性能平均高2%、8%、9%。
分析結(jié)果3: 在DCN上結(jié)合網(wǎng)絡(luò)嵌入特征的缺陷預(yù)測性能(AUC)對比僅考慮傳統(tǒng)度量特征的預(yù)測性能沒有明顯改善,且隨機(jī)森林分類器比其他三種分類器的效果要好。
圖16 DCN上缺陷預(yù)測的AUC值(使用隨機(jī)森林分類) Figure 16 AUC Value of Defect Prediction on DCN (by Random Forest)
表8 DCN的缺陷預(yù)測AUC值 Table 8 AUC Value of Defect Prediction on DCN
5.2 節(jié)實驗發(fā)現(xiàn)基于不同的網(wǎng)絡(luò)嵌入特征會得到不同的缺陷預(yù)測結(jié)果。為了進(jìn)一步分析原因, 本節(jié)對網(wǎng)絡(luò)嵌入特征進(jìn)行深入研究。具體來講, 使用k均值聚類[81]對網(wǎng)絡(luò)嵌入特征進(jìn)行聚類, 觀察聚類結(jié)果在原軟件關(guān)聯(lián)網(wǎng)絡(luò)結(jié)構(gòu)的分布情況, 并結(jié)合缺陷預(yù)測結(jié)果進(jìn)行比較, 總結(jié)引起前述缺陷預(yù)測實驗效果差異的原因。
5.3.1 網(wǎng)絡(luò)嵌入特征的可視化
通過網(wǎng)絡(luò)嵌入算法得到網(wǎng)絡(luò)中節(jié)點的向量表示, 對所有向量進(jìn)行k均值聚類, 觀察節(jié)點的聚類結(jié)果在軟件關(guān)聯(lián)網(wǎng)絡(luò)中的分布, 以觀察軟件關(guān)聯(lián)網(wǎng)絡(luò)上的網(wǎng)絡(luò)嵌入特征特性。為了對比, 我們根據(jù)軟件網(wǎng)絡(luò)中節(jié)點的親疏關(guān)系劃分出社區(qū)(community), 每個社區(qū)內(nèi)部的節(jié)點間的聯(lián)系相對緊密, 各個社區(qū)之間的連接相對比較稀疏。將社區(qū)劃分結(jié)果與前述基于網(wǎng)絡(luò)嵌入的聚類結(jié)果進(jìn)行對比。
圖20展示了Lucene軟件的類依賴網(wǎng)絡(luò)(CDN), 網(wǎng)絡(luò)中共337個點, 1306條邊。使用力引導(dǎo)布局來展示節(jié)點分布, 以便觀察網(wǎng)絡(luò)中節(jié)點之間的親疏關(guān)系。網(wǎng)絡(luò)中的節(jié)點利用Gephi工具①https://gephi.org/劃分出社區(qū), 連接緊密的節(jié)點位于同一社區(qū), 每個社區(qū)內(nèi)的節(jié)點分配同一種顏色。
由k均值聚類可以得到向量距離相近的網(wǎng)絡(luò)節(jié)點, 我們將聚類結(jié)果表示在軟件網(wǎng)絡(luò)圖中, 并借助Gephi工具畫出, 分析節(jié)點的聚類在原軟件網(wǎng)絡(luò)中的分布。網(wǎng)絡(luò)中的所有節(jié)點被分為8個簇, 不同的簇用不同的顏色表示, 兩個節(jié)點如用一種顏色表示, 意 味著兩個節(jié)點向量的距離相近, 從而被分到一個簇中, 圖21展示了Lucene類依賴網(wǎng)絡(luò)的節(jié)點分別基于6種網(wǎng)絡(luò)嵌入特征的聚類結(jié)果。
圖17 DCN上缺陷預(yù)測的AUC值(使用樸素貝葉斯分類) Figure 17 AUC Value of Defect Prediction on DCN (by Naive Bayesian)
圖18 DCN上缺陷預(yù)測的AUC值(使用支持向量機(jī)分類) Figure 18 AUC Value of Defect Prediction on DCN (by Support Vector Machine)
圖19 DCN上缺陷預(yù)測的AUC值(使用多層感知器分類) Figure 19 AUC Value of Defect Prediction on DCN (by Multi-Layer Perception)
從圖21可以發(fā)現(xiàn), 不同網(wǎng)絡(luò)嵌入的節(jié)點的聚類結(jié)果不一樣。分析圖中不同顏色節(jié)點的分布, 例如藍(lán)色的節(jié)點, 經(jīng)過DeepWalk、Node2vec和Grarep算法的聚類效果接近, 這3種網(wǎng)絡(luò)嵌入算法均將原軟件網(wǎng)絡(luò)結(jié)構(gòu)中連接緊密的節(jié)點聚為一類, 同一顏色的節(jié)點都相距很近。而LINE和GF算法將原軟件網(wǎng)絡(luò)中相距很遠(yuǎn)的節(jié)點映射到了相近的向量空間中, 從而聚類為一簇, 聚類結(jié)果與原軟件網(wǎng)絡(luò)沒有明顯的相關(guān)性。而基于SDNE算法的節(jié)點聚類結(jié)果圖將網(wǎng)絡(luò)中78%的節(jié)點聚為一類(橙色節(jié)點)。其余未展示出的11個軟件也有同樣類似的聚類結(jié)果。
圖20 Lucene軟件類依賴網(wǎng)絡(luò)(CDN) Figure 20 Class Dependency Network(CDN) of Lucene
分析結(jié)果4: 由上述可視化結(jié)果初步觀察到, DeepWalk、Grarep和Node2vec算法比LINE和GF算法更擅長學(xué)習(xí)網(wǎng)絡(luò)的同質(zhì)性[16], 即傾向于將原軟件網(wǎng)絡(luò)中連接緊密的節(jié)點在向量空間中的距離也表示的相近。而LINE和GF算法卻可能將網(wǎng)絡(luò)中連接疏松的節(jié)點映射為在向量空間中相近的節(jié)點, 與原軟件網(wǎng)絡(luò)沒有明顯的相關(guān)性。
5.3.2 網(wǎng)絡(luò)嵌入特征保持的網(wǎng)絡(luò)結(jié)構(gòu)分析
為了進(jìn)一步分析6種網(wǎng)絡(luò)嵌入算法學(xué)習(xí)網(wǎng)絡(luò)同質(zhì)性的能力, 本節(jié)用MoJoFM值[85]衡量基于網(wǎng)絡(luò)嵌入的聚類結(jié)果與社區(qū)結(jié)構(gòu)的相似程度(例如圖11和圖12之間的相似程度)。MoJoFM通過計算從一個結(jié)構(gòu)轉(zhuǎn)換到另一個結(jié)構(gòu)所需的操作來度量兩個結(jié)構(gòu)之間的相似程度。較高的MoJoFM值意味著兩個結(jié)構(gòu)更相似。MoJoFM值介于0和1之間, 0表示最不相似, 1表示完全一樣。MoJoFM的公式如下:
其中, mno(O Ai, OAj)表示從一個結(jié)構(gòu)OAi轉(zhuǎn)變成另一個結(jié)構(gòu)OAj所需的Move操作和Join操作的數(shù)目。
表9對網(wǎng)絡(luò)中劃分的社區(qū)與6種網(wǎng)絡(luò)嵌入特征的聚類結(jié)果的相似程度進(jìn)行對比, 例如Lucene行DeepWalk列, MoJoFM值為47.98%, 說明Lucene的類依賴網(wǎng)絡(luò)的社區(qū)結(jié)構(gòu)與基于DeepWalk算法得到的聚類結(jié)果之間的相似程度為47.98%。MoJoFM值越大, 則說明聚類結(jié)果與社區(qū)的劃分越相似, 網(wǎng)絡(luò)嵌入算法能更好地保持網(wǎng)絡(luò)中連接緊密的節(jié)點的結(jié)構(gòu)特征, 對網(wǎng)絡(luò)同質(zhì)性的學(xué)習(xí)能力越強(qiáng)。
圖21 Lucene類依賴網(wǎng)絡(luò)的節(jié)點的聚類結(jié)果 Figure 21 Clusters of Class Dependency Network for Lucene
表9 Lucene的社區(qū)與聚類之間的MoJoFM值 Table 9 MoJoFM between Communities and Clusters for Lucene (%)
從表9可以發(fā)現(xiàn), 對軟件關(guān)聯(lián)網(wǎng)絡(luò)劃分的社區(qū)與不同網(wǎng)絡(luò)嵌入特征的聚類結(jié)果之間的MoJoFM值存在差別, 其中基于DeepWalk、Grarep、Node2vec算法的結(jié)果明顯高于基于GF、LINE的結(jié)果。也就是說, 基于DeepWalk、Grarep、 Node2vec算法的聚類結(jié)果, 與網(wǎng)絡(luò)的社區(qū)之間的相似程度更大, 可以使網(wǎng)絡(luò)中緊密相連的節(jié)點映射到相近的向量空間。
分析結(jié)果5:該實驗的定量分析結(jié)果驗證了5.3.1節(jié)的可視化觀察, 即: DeepWalk、Grarep和Node2vec算法比LINE和GF算法更擅長學(xué)習(xí)網(wǎng)絡(luò)的同質(zhì)性。
5.3.3 網(wǎng)絡(luò)嵌入特征的缺陷預(yù)測性能分析
本節(jié)中用MoJoFM值對不同網(wǎng)絡(luò)嵌入特征的聚類結(jié)果之間的相似性進(jìn)行衡量, 并觀察聚類結(jié)果的相似性與缺陷預(yù)測結(jié)果差值之間的關(guān)系。本節(jié)首先分析不同網(wǎng)絡(luò)嵌入特征保持的軟件網(wǎng)絡(luò)結(jié)構(gòu)信息之間的相似程度。用MoJoFM值衡量5.3.1節(jié)獲得的6種網(wǎng)絡(luò)嵌入特征的聚類結(jié)果之間的相似程度, Mo-JoFM值越大, 說明聚類結(jié)果越相似, 也就是網(wǎng)絡(luò)嵌入特征保持的網(wǎng)絡(luò)結(jié)構(gòu)信息越相似。然后分析聚類結(jié)果相似性與相應(yīng)缺陷預(yù)測性能差異之間的關(guān)系, 表10和表11展示Lucene軟件基于不同網(wǎng)絡(luò)嵌入的聚類結(jié)果之間的相似性與缺陷預(yù)測AUC差值。
對照表10和表11中的值可以發(fā)現(xiàn), 對于Lucene軟件, 兩種網(wǎng)絡(luò)嵌入特征的聚類結(jié)果之間相似度(MoJoFM)大于50%時, 則基于這兩種網(wǎng)絡(luò)嵌入的缺陷預(yù)測AUC差值不超過0.03。
表10 Lucene軟件的網(wǎng)絡(luò)嵌入聚類結(jié)果之間的MoJoFM值 Table 10 MoJoFM between Different Network Embedding Clusters for Lucene (%)
表11 Lucene軟件基于不同網(wǎng)絡(luò)嵌入的缺陷預(yù)測AUC差值 Table 11 AUC Difference Based on Different Network Embedding Algorithms for Lucene
對數(shù)據(jù)集中12個軟件進(jìn)行同樣分析后發(fā)現(xiàn)類似的結(jié)果: 對某一軟件, 用MoJoFM值度量任意兩種網(wǎng)絡(luò)嵌入特征的聚類結(jié)果之間相似度, 相似度大于50%則缺陷預(yù)測結(jié)果相近, 一般情況下缺陷預(yù)測AUC值之間相差小于0.05。并且由前述可知, DeepWalk、Grarep和Node2vec算法均擅長學(xué)習(xí)網(wǎng)絡(luò)的同質(zhì)性, 它們的缺陷預(yù)測性能良好且相近。
分析結(jié)果6: 當(dāng)兩種網(wǎng)絡(luò)嵌入算法保持的軟件關(guān)聯(lián)網(wǎng)絡(luò)的結(jié)構(gòu)特征相似時, 其缺陷預(yù)測效果也相似; 且當(dāng)網(wǎng)絡(luò)嵌入能保持網(wǎng)絡(luò)結(jié)構(gòu)的同質(zhì)性時, 則缺陷預(yù)測性能良好。
本節(jié)分析不同的參數(shù)設(shè)置對缺陷預(yù)測帶來的影響。5.4.1節(jié)展示了預(yù)處理時過濾閾值的選取對缺陷預(yù)測結(jié)果的影響。5.4.2節(jié)展示了網(wǎng)絡(luò)嵌入算法在不同參數(shù)設(shè)置下的缺陷預(yù)測結(jié)果。
5.4.1 過濾閾值參數(shù)的影響分析
在數(shù)據(jù)集預(yù)處理中提到, 在構(gòu)建CCN和DCN時需要找到最適用于缺陷預(yù)測模型的過濾閾值。圖22展示了在不同過濾閾值下, 在CCN使用傳統(tǒng)度量的缺陷預(yù)測AUC值。
如圖22所示, 預(yù)測效果常在10~25之間上升, 在閾值為25的時候達(dá)到最佳, 在30和35時又有點回落。根據(jù)表5, 閾值為25時的網(wǎng)絡(luò)已經(jīng)包含了超過70%的真實節(jié)點信息。注意到在Equinox Framework上的實驗閾值為10時的AUC值超過了閾值為 25的時候, 但這只是個例, 不具普遍性; 且閾值為10包含的節(jié)點信息過少, 無法準(zhǔn)確地反映真實網(wǎng)絡(luò)的情況。因而, 本文在前文缺陷預(yù)測實驗中過濾閾值參數(shù)也是設(shè)置為25 (見5.1.2節(jié))。
圖22 不同過濾閾值下基于CCN的缺陷預(yù)測AUC值 Figure 22 AUC Value of Defect Prediction under Different Thesholds on CCN
分析結(jié)果7: 將CCN 和DCN用于缺陷預(yù)測時, 過濾閾值參數(shù)設(shè)置為25可使得缺陷預(yù)測性能得到最佳。
5.4.2 網(wǎng)絡(luò)嵌入算法參數(shù)的影響分析
本節(jié)對網(wǎng)絡(luò)嵌入算法的參數(shù)進(jìn)行修改, 得到基于不同參數(shù)的網(wǎng)絡(luò)嵌入的缺陷預(yù)測結(jié)果。每個網(wǎng)絡(luò)嵌入算法選擇一個主要影響參數(shù)進(jìn)行修改, 表12和表13展示了5個軟件在CDN上的基于不同參數(shù)的網(wǎng)絡(luò)嵌入的缺陷預(yù)測結(jié)果。分析可得:
DeepWalk算法的步長參數(shù)從80改為40后, 缺陷預(yù)測效果沒有明顯差異。
GF算法的epochs參數(shù)從5調(diào)整為100后, 缺陷預(yù)測效果在所有軟件中均有大幅提升。
Grarep算法中的kstep參數(shù)不同時, 可以得到不同階次的全局信息, 將kstep從4調(diào)整為8后, 得到的缺陷預(yù)測結(jié)果并沒有大的變動, 說明調(diào)整參數(shù)前后, 算法保持的網(wǎng)絡(luò)結(jié)構(gòu)信息相似。
LINE算法中的epochs參數(shù)從5調(diào)整為100后, 與GF算法類似, 缺陷預(yù)測效果在所有軟件中均有大幅提升。
Node2vec算法的p、q參數(shù)用于控制隨機(jī)游走的方向。當(dāng)p=1、q=0.5時, 算法對比p=1、q=1更擅長學(xué)習(xí)網(wǎng)絡(luò)的同質(zhì)性。并且從缺陷預(yù)測結(jié)果可以觀察到, 當(dāng)算法參數(shù)選擇p=1、q=0.5時, 擁有更好的缺陷預(yù)測效果, 即連接緊密的節(jié)點在低維向量空間中的表示結(jié)果也相近時, 可以獲得更好的缺陷預(yù)測效果, 這與5.3節(jié)中得到的結(jié)論是一致的。
SDNE算法修改encoder-list參數(shù)的第一項, 將編碼器的神經(jīng)元個數(shù)從1000改為500, 缺陷預(yù)測效果變化較小, 說明調(diào)整該參數(shù)前后, 算法保持的網(wǎng)絡(luò)結(jié)構(gòu)信息相似。
分析結(jié)果8: 網(wǎng)絡(luò)嵌入算法參數(shù)發(fā)生變化時, 相應(yīng)的缺陷預(yù)測效果會受到不同程度的影響。特別是, 缺陷預(yù)測性能對Node2vec、LINE、GF算法的參數(shù)更為敏感。
表12 基于網(wǎng)絡(luò)嵌入的缺陷預(yù)測AUC值 Table 12 AUC Value of Defect Prediction Based on Network Embedding
表13 基于網(wǎng)絡(luò)嵌入的缺陷預(yù)測AUC值 Table 13 AUC Value of Defect Prediction Based on Network Embedding
本章研究了基于不同網(wǎng)絡(luò)嵌入特征的缺陷預(yù)測結(jié)果。首先展示了實驗的數(shù)據(jù)集, 對實驗軟件構(gòu)建了3種網(wǎng)絡(luò)——CDN、CCN和DCN, 將傳統(tǒng)度量特征和6種網(wǎng)絡(luò)嵌入特征與對應(yīng)缺陷標(biāo)簽輸入至4種分類算法中進(jìn)行訓(xùn)練并測試, 并用AUC值衡量缺陷預(yù)測效果, 總結(jié)見表14。然后分析了網(wǎng)絡(luò)嵌入保持的網(wǎng)絡(luò)結(jié)構(gòu)特征以及缺陷預(yù)測性能差異的原因, 最后分析了不同參數(shù)設(shè)置下的網(wǎng)絡(luò)嵌入特征對缺陷預(yù)測性能的影響。
表14 面向缺陷預(yù)測的網(wǎng)絡(luò)嵌入算法預(yù)測效果總結(jié) Table 14 Summary for Defect Prediction Based on Network Embedding
總體而言: 1) 除了開發(fā)者貢獻(xiàn)網(wǎng)絡(luò)DCN之外, 在類依賴網(wǎng)絡(luò)CDN和文件耦合網(wǎng)絡(luò)CCN上, 在傳統(tǒng)的度量特征上結(jié)合網(wǎng)絡(luò)嵌入特征后, 缺陷預(yù)測性能得到顯著提升; 2)使用隨機(jī)分類器的效果要比樸素貝葉斯、支持向量機(jī)、多層感知器的效果要好; 3) DeepWalk、Grarep和Node2vec這3種網(wǎng)絡(luò)嵌入算法保持的網(wǎng)絡(luò)結(jié)構(gòu)特性類似, 缺陷預(yù)測效果相近; 4) 與LINE和GF算法不同, DeepWalk、Grarep和Node2vec算法更擅長學(xué)習(xí)網(wǎng)絡(luò)的同質(zhì)性, 因而在相同軟件關(guān)聯(lián)網(wǎng)絡(luò)上的缺陷預(yù)測效果更好; 5) 網(wǎng)絡(luò)嵌入算法在不同的參數(shù)設(shè)置下保持的網(wǎng)絡(luò)結(jié)構(gòu)特性存在差異, 缺陷預(yù)測性能對網(wǎng)絡(luò)嵌入算法參數(shù)敏感, 實驗中應(yīng)根據(jù)觀察和經(jīng)驗選擇合適的參數(shù)。
本文主要研究面向軟件缺陷預(yù)測的網(wǎng)絡(luò)嵌入特征, 設(shè)計了一種基于軟件關(guān)聯(lián)網(wǎng)絡(luò)嵌入的缺陷預(yù)測方法, 全面分析了不同軟件關(guān)聯(lián)網(wǎng)絡(luò)、不同網(wǎng)絡(luò)嵌入算法、不同參數(shù)設(shè)置下的網(wǎng)絡(luò)嵌入特征及其缺陷預(yù)測性能。通過實驗分析, 主要發(fā)現(xiàn)類依賴網(wǎng)絡(luò)和文件耦合網(wǎng)絡(luò)比開發(fā)者貢獻(xiàn)網(wǎng)絡(luò)更能顯著提升缺陷預(yù)測效果; DeepWalk、Grarep和Node2vec算法比LINE和GF算法更擅長保持網(wǎng)絡(luò)結(jié)構(gòu)的同質(zhì)性, 因而這3種算法下的缺陷預(yù)測效果最好。此外, 缺陷預(yù)測對網(wǎng)絡(luò)嵌入算法參數(shù)設(shè)置敏感??傊? 本文得出的實驗結(jié)論有助于指導(dǎo)缺陷預(yù)測活動中如何選擇軟件關(guān)聯(lián)網(wǎng)絡(luò)和網(wǎng)絡(luò)嵌入算法以獲取較好的性能。
未來將進(jìn)一步完善本文工作, 包括: 1)本文構(gòu)建的類依賴網(wǎng)絡(luò)是針對面向?qū)ο筇匦? 使用的實驗對象是Java實現(xiàn)的軟件系統(tǒng)。在應(yīng)用于其他編程語言如C/C++、Python等實現(xiàn)的系統(tǒng)時, 需要擴(kuò)展類依賴網(wǎng)絡(luò), 以更準(zhǔn)確的描述軟件網(wǎng)絡(luò)結(jié)構(gòu), 我們未來將對這一部分進(jìn)行探索。2)本文探究了對相同軟件使用不同網(wǎng)絡(luò)嵌入算法得到的缺陷預(yù)測效果的差異性原因, 也觀察到不同軟件上的缺陷預(yù)測效果存在一定差異。因此未來將分析不同軟件系統(tǒng)上預(yù)測效果差異的原因。3)除了本文使用的AUC外, 還有其他評價分類性能的指標(biāo), 例如對于不均衡數(shù)據(jù)集的評估非常有效的MCC(Matthews Correlation Coefficient)指標(biāo)。未來將使用更多的相關(guān)指標(biāo)進(jìn)一步驗證本文缺陷預(yù)測效果。
致 謝 在此向給予指導(dǎo)的老師、提供幫助的同學(xué)和給本文提出建議的評審專家表示感謝。并且感謝國家重點研發(fā)計劃資助項目(No.2018YFB1004500), 國家自然科學(xué)基金(No.61632015, No.61772408, No.U1766215, No.61721002, No.61833015, No.62002280, No.61902306, No.61602369), 國網(wǎng)陜西省電力公司科技項目(No.5226SX1800FC), 教育部創(chuàng)新團(tuán)隊(No.IRT_17R86)和中國工程科技知識中心項目, 中國博士后資助項目(No.2019TQ0251, No.2020M673439)的資助。