宮麗娜,姜淑娟,姜 麗
1(中國礦業(yè)大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,江蘇 徐州 221116)
2(礦山數(shù)字化教育部工程研究中心,江蘇 徐州 221116)
3(棗莊學(xué)院 信息科學(xué)與工程學(xué)院,山東 棗莊 277160)
隨著軟件規(guī)模的擴大和復(fù)雜度的不斷提高,軟件的質(zhì)量問題成為了關(guān)注的焦點,軟件缺陷是軟件質(zhì)量的對立面,威脅著軟件質(zhì)量.因此,如何在軟件開發(fā)的早期挖掘出缺陷模塊成為一個亟需解決的問題.軟件缺陷預(yù)測技術(shù)能夠在軟件開發(fā)過程中使用軟件模塊的度量元數(shù)據(jù)來提前發(fā)現(xiàn)與鎖定缺陷模塊,從而合理地分配有限資源,為軟件質(zhì)量提供保障.
從20 世紀(jì)70 年代以來,軟件缺陷預(yù)測技術(shù)一直是軟件研究人員和開發(fā)者非常關(guān)注的研究熱點之一[1].研究者從軟件倉庫出發(fā),基于軟件度量數(shù)據(jù),利用統(tǒng)計學(xué)和機器學(xué)習(xí)等方法來研究缺陷預(yù)測技術(shù),并且取得了豐富的研究成果.
目前已有一些研究人員從不同角度對缺陷預(yù)測的相關(guān)研究工作進行了總結(jié)[2-5],重點討論了靜態(tài)缺陷預(yù)測方法、數(shù)據(jù)驅(qū)動缺陷預(yù)測方法等.特別地,Li 等人以數(shù)據(jù)來源為主線對版本內(nèi)數(shù)據(jù)、跨版本數(shù)據(jù)和跨項目數(shù)據(jù)進行了歸納和分析[2],Chen 等人對靜態(tài)軟件缺陷預(yù)測技術(shù)[5]和跨項目缺陷預(yù)測技術(shù)[3]分別進行了歸納和總結(jié).在此基礎(chǔ)上,本文收集了近8 年的缺陷預(yù)測技術(shù)的相關(guān)文獻,以缺陷預(yù)測形式為主線,從數(shù)據(jù)集、構(gòu)建方法、評價指標(biāo)等多個角度對相關(guān)技術(shù)進行了匯總和分析.
本文使用defect prediction、software defect prediction、fault prediction 及software fault prediction 等搜索關(guān)鍵詞,在ACM Digital Library、Springer Link online Library、IEEE Xplore Digital Library、Elsevier ScienceDirect及CNKI 等在線數(shù)據(jù)庫中全面搜索了2010 年~2017 年在期刊和會議中發(fā)表的相關(guān)文獻,截止到2018 年1 月進行人工的篩選和過濾,選擇出與缺陷預(yù)測技術(shù)相關(guān)的高質(zhì)量論文117 篇,其中,期刊論文85 篇,會議論文30 篇,其他2 篇.其發(fā)表出處的分布情況如圖1 所示,發(fā)表的文獻每年呈增長趨勢.其中不乏在軟件工程領(lǐng)域的國際頂級期刊和頂級會議上的研究論文.例如:TSE 期刊(14 篇)、FSE/ESEC 期刊(3 篇)、ICSE 會議(6 篇)、ASE 會議(2篇)、IST(12 篇)和ESE(12 篇).基于上述分析不難發(fā)現(xiàn),軟件缺陷預(yù)測技術(shù)一直是軟件工程中一個重要的研究課題.

Fig.1 The source distribution of the literature圖1 文獻發(fā)表出處分布
本文第1 節(jié)對軟件缺陷預(yù)測模型的框架進行描述.第2 節(jié)系統(tǒng)分析已有軟件缺陷數(shù)據(jù)集及數(shù)據(jù)集的預(yù)處理過程.第3 節(jié)對軟件缺陷預(yù)測模型的構(gòu)建方法進行總結(jié)和分析.第4 節(jié)總結(jié)分析目前軟件缺陷預(yù)測技術(shù)的相關(guān)性能評價指標(biāo).最后總結(jié)全文,并對未來值得關(guān)注的研究方向進行探討.
軟件缺陷預(yù)測技術(shù)通過使用軟件度量元數(shù)據(jù)來對軟件模塊的缺陷傾向性、缺陷數(shù)或者缺陷嚴(yán)重度等進行預(yù)測.根據(jù)模型的構(gòu)建方法,軟件缺陷預(yù)測模型可以用數(shù)學(xué)符號表示如下.
假設(shè)給定包含n個樣本的數(shù)據(jù)集D={(x1,y1),(x2,y2),…,(xi,yi),,,(xn,yn)},其中,xi=(a1,a2,…,aj,…,ad)∈Rd表示軟件模塊i的度量屬性向量,aj表示模塊的第j個度量元的值,d表示度量元的個數(shù);yi∈Y表示軟件模塊i的標(biāo)記,Y表示所有標(biāo)記的集合,如若是對缺陷傾向性進行預(yù)測,則Y={有缺陷,無缺陷},如若是對缺陷數(shù)進行預(yù)測,則Y=N,如若是對缺陷嚴(yán)重度進行預(yù)測,則Y={Z|Z≥0},根據(jù)Y值對程序模塊嚴(yán)重度進行排序.軟件缺陷預(yù)測模型f:Rd→Y,表示了從軟件模塊的內(nèi)部度量元屬性到軟件外部缺陷的映射.
具體的缺陷預(yù)測過程由4 部分組成[2-5]:收集軟件缺陷數(shù)據(jù)、提取度量元、構(gòu)建軟件缺陷預(yù)測模型的方法和性能評價指標(biāo).圖2 給出了軟件缺陷預(yù)測模型的框架.
(1)從包含軟件項目開發(fā)周期的全部數(shù)據(jù)的軟件倉庫里收集軟件缺陷數(shù)據(jù);
(2)提取與軟件缺陷(缺陷數(shù)、缺陷傾向性、缺陷嚴(yán)重性)相關(guān)的不同軟件度量元,并對軟件模塊進行標(biāo)記;
(3)在提取的數(shù)據(jù)集上利用統(tǒng)計學(xué)和機器學(xué)習(xí)的技術(shù)構(gòu)建軟件缺陷預(yù)測模型;
(4)最后通過性能評價指標(biāo)(比如精確率、召回率、AUC 等)對構(gòu)建的預(yù)測模型進行評價.

Fig.2 The framework of software defect prediction model圖2 軟件缺陷預(yù)測模型框架
在上述流程中,第(2)步和第(3)步的處理直接決定著軟件缺陷預(yù)測模型的性能.因此,本文重點關(guān)注軟件缺陷數(shù)據(jù)集及構(gòu)建方法的研究進展,在總結(jié)常用的數(shù)據(jù)集及數(shù)據(jù)預(yù)處理方法的基礎(chǔ)上,對構(gòu)建缺陷預(yù)測模型的關(guān)鍵技術(shù)進行了綜述,最后給出經(jīng)常使用的評價指標(biāo).接下來的章節(jié)將從這幾方面分別展開詳細(xì)的敘述.
軟件缺陷預(yù)測技術(shù)需要大量的缺陷數(shù)據(jù)來挖掘模塊內(nèi)部的度量元與模塊外部的缺陷之間的某種關(guān)系,因此獲取有效的缺陷數(shù)據(jù)集及度量元是構(gòu)建軟件缺陷預(yù)測模型的前提.軟件缺陷數(shù)據(jù)倉庫中包含大量項目的缺陷數(shù)據(jù)集,但是存在著異常值、高維度、類不平衡等問題,所以,在使用前需要對這些數(shù)據(jù)集中的數(shù)據(jù)進行預(yù)處理.使用的軟件缺陷數(shù)據(jù)倉庫、度量元及數(shù)據(jù)預(yù)處理技術(shù)直接關(guān)系到預(yù)測模型的性能.
接下來,我們分別從軟件缺陷數(shù)據(jù)倉庫、缺陷度量元以及數(shù)據(jù)處理這3 個方面進行詳細(xì)的總結(jié)和分析.
缺陷數(shù)據(jù)倉庫收集了軟件項目從需求、設(shè)計、開發(fā)、測試等各個生命期階段的缺陷數(shù)據(jù).缺陷庫對于能否構(gòu)建一個有效的預(yù)測模型起到關(guān)鍵作用.不同的缺陷庫具有不同的特征信息,其中,用于缺陷預(yù)測的信息主要包括數(shù)據(jù)來源、項目成熟度、開發(fā)環(huán)境及粒度等.
(1)數(shù)據(jù)來源
隨著越來越多的大型開源軟件的公開,缺陷數(shù)據(jù)倉庫經(jīng)歷了從私有數(shù)據(jù)集到公開數(shù)據(jù)集的發(fā)展階段.缺陷預(yù)測模型對不同來源的缺陷庫會產(chǎn)生不同的性能.到目前為止,用于軟件缺陷預(yù)測的數(shù)據(jù)倉庫大體上可以分為私人/商業(yè)倉庫、部分公共/免費倉庫和公共倉庫這3 種類型[4].
·私人/商業(yè)倉庫:缺陷庫只能公司內(nèi)部使用,以這些數(shù)據(jù)集為依據(jù)進行的實驗無法重現(xiàn).
·部分公共/免費倉庫:缺陷庫中無度量元信息,源代碼和錯誤信息公開使用.
·公共倉庫:缺陷庫中度量元及錯誤信息都可使用(如:NASA、PROMISE 等公共庫).
本文針對收集和選出的117 篇論文進行分析,發(fā)現(xiàn)預(yù)測模型使用的數(shù)據(jù)來源的分布如圖3 所示,公共倉庫的數(shù)據(jù)集(NASA、PROMISE、AEEEM 及ReLink)占絕大多數(shù),越來越多的研究者使用公共缺陷數(shù)據(jù)集,這樣有利于缺陷預(yù)測模型的重現(xiàn),實現(xiàn)各個模型的比較分析.

Fig.3 The distribution of the repository圖3 數(shù)據(jù)倉庫的分布情況
(2)項目成熟度
項目成熟度主要是指項目進化的版本數(shù).通常,一個版本對應(yīng)于項目的一個缺陷庫,而不同版本的缺陷庫會對缺陷預(yù)測模型產(chǎn)生不同影響.因此,部分研究者提出了跨版本的缺陷預(yù)測模型,研究使用之前版本數(shù)據(jù)對缺陷預(yù)測模型的預(yù)測能力.
(3)開發(fā)環(huán)境
開發(fā)環(huán)境指的是軟件項目開發(fā)過程中使用的軟件工具,比如:Java、C++等.同樣,使用不同開發(fā)語言的缺陷庫會對缺陷預(yù)測模型產(chǎn)生不同的影響.因此,在選取訓(xùn)練集時需要考慮該項目的開發(fā)環(huán)境.
(4)粒度
粒度指的是缺陷庫中每條樣本的項目粒度.其中可以分為類粒度、文件粒度或者包粒度等.使用不同粒度的缺陷庫會對缺陷預(yù)測模型產(chǎn)生不同的影響.因此,部分研究者從不同粒度提取不同的度量元,研究它們對缺陷預(yù)測模型的影響.
綜上所述,由于數(shù)據(jù)來源、項目成熟度、開發(fā)環(huán)境及粒度等的不同會形成不同類型的缺陷庫.但是,目前大部分的研究在建立預(yù)測模型前很少考慮這些缺陷庫的特征,而且對于這些特征對缺陷預(yù)測模型的影響的研究也很少.因此,在后續(xù)研究中可以討論這些特征對缺陷預(yù)測模型的不同影響程度.
軟件缺陷預(yù)測技術(shù)可以使項目開發(fā)人員重點關(guān)注那些有缺陷的模塊,但是要挖掘出有缺陷的模塊,需要找出與缺陷外在表現(xiàn)有關(guān)系的內(nèi)在屬性,這些屬性就是軟件度量數(shù)據(jù),即度量元.通常,每個度量都與軟件項目的一些功能屬性相關(guān)(比如耦合、內(nèi)聚、繼承、代碼更改等)[6].目前,現(xiàn)有的度量方法可以分為軟件產(chǎn)品屬性度量和軟件過程度量兩大類,圖4 表明了文獻中使用到的度量方法分類情況.本文在文獻[5]的基礎(chǔ)上,對度量方法作了進一步的總結(jié)和分析.

Fig.4 The literature overview of software metrics圖4 軟件度量元文獻分類總覽圖
2.2.1 軟件產(chǎn)品度量
軟件產(chǎn)品度量是通過分析軟件代碼來設(shè)計度量元,描述軟件產(chǎn)品的特征,用于產(chǎn)品評估和決策.軟件產(chǎn)品度量重點關(guān)注的是代碼的規(guī)模和內(nèi)在復(fù)雜度等屬性,軟件產(chǎn)品度量包括規(guī)模度量、復(fù)雜度度量等.
(1)規(guī)模度量
軟件產(chǎn)品的規(guī)模度量是以代碼行數(shù)、對象點、特征點或功能點數(shù)等來衡量的.常用的度量方法主要有:代碼行度量(lines of code,簡稱LOC)方法[16]、功能點分析法、面向?qū)ο筌浖膶ο簏c方法及構(gòu)造性成本模型(constructive cost model,簡稱COCOMO).
(2)復(fù)雜度度量
軟件產(chǎn)品的復(fù)雜度度量是用于確定程序控制流或軟件系統(tǒng)結(jié)構(gòu)的復(fù)雜程度的指標(biāo).主要有面向過程的傳統(tǒng)度量和面向?qū)ο蟮亩攘?
傳統(tǒng)度量是在軟件工程初期,針對面向過程程序設(shè)計的方法級別進行的度量.常用的是 Halstead[6]和McCabe[18]的度量.
·Halstead 度量法:依據(jù)程序中可執(zhí)行代碼行的操作數(shù)和操作符的數(shù)量來計算程序的復(fù)雜性.其值越大,程序結(jié)構(gòu)就越復(fù)雜.
·McCabe 度量法:依據(jù)控制流的復(fù)雜性來計算程序的復(fù)雜性,順序結(jié)構(gòu)單一,則程序最簡單,而選擇和循環(huán)構(gòu)成的環(huán)路越多,程序越復(fù)雜.
隨著面向?qū)ο箝_發(fā)方法成為主流方法,研究者依據(jù)代碼結(jié)構(gòu)中的繼承、耦合、內(nèi)聚等關(guān)系計算代碼的復(fù)雜度,形成了面向?qū)ο蠖攘恐笜?biāo)[27].主要的面向?qū)ο笾笜?biāo)(OO)包括C&K 度量[28]和MOOD 度量[29].
2.2.2 軟件過程度量
軟件過程(process)度量是對軟件開發(fā)過程的各個因素進行度量.過程度量與軟件開發(fā)流程密切相關(guān),對軟件開發(fā)過程的各階段行為進行目標(biāo)管理,為軟件開發(fā)的過程評價及控制提供定量性度量.例如,代碼變更度量、開發(fā)人員度量等過程度量元被提了出來.
(1)源代碼變更度量
在軟件項目開發(fā)過程中,源代碼是不斷變更的,代碼在不同的版本中會增加、刪除或者修改,從而有可能導(dǎo)致軟件缺陷.因此,一些研究者借助源代碼的變更,設(shè)計出新的源代碼變更度量元進行軟件缺陷預(yù)測.Madeyski等人[10]通過實驗確定過程度量元與缺陷預(yù)測數(shù)量的關(guān)系,設(shè)計出了NR(number of revisions)、NDC(number of distinct committers)、NML(number of modified lines)、NDPV(number of defects in previous version)4 個過程度量元,并通過實驗發(fā)現(xiàn) NDC、NML 對軟件缺陷預(yù)測有很大的影響.Feng 等人[28]提出了 PL(programming language)、IT(issue tracking)、TLOC(total lines of code)、TNF(total number of files)、TNC(total number of commits)及TND(total number of developers)這6 種度量元,并使用這6 種度量元對項目內(nèi)和跨項目缺陷預(yù)測模型進行分析.
(2)基于開發(fā)人員度量
軟件開發(fā)過程中人是不可忽視的重要因素,基于開發(fā)人員度量就是對人進行度量.Bhattacharya 等人[24]引入社交網(wǎng)絡(luò)概念,提取變更信息和開發(fā)者關(guān)系信息構(gòu)建開發(fā)者交互關(guān)系圖.Lee 等人[25]對開發(fā)人員的交互行為進行分析,提出了MIMS(micro interaction metrics)度量元,通過實驗驗證MIMS 對缺陷預(yù)測性能的影響.Ekanayake 等人[26]提出了開發(fā)人員的數(shù)量的度量元,通過實驗驗證得出:該度量元對預(yù)測的質(zhì)量有影響.Jiang 等人[7]根據(jù)個人開發(fā)者的表現(xiàn)作為度量元進行軟件修改的缺陷預(yù)測,為每一個開發(fā)者建立一個預(yù)測模型PCC(personalized change classification).
2.2.3 度量元分析
近幾年,隨著開源項目以及缺陷公共數(shù)據(jù)集的增多,部分研究者開始把工作轉(zhuǎn)移到哪些度量元可以構(gòu)建更好的缺陷預(yù)測模型研究中.Muhammed 等人[9]通過實驗對比靜態(tài)度量元和過程度量元哪個是更影響類不平衡的數(shù)據(jù),實驗結(jié)果表明,過程度量元要比靜態(tài)度量元產(chǎn)生更好的分類效果.Shin 等人[8]同時使用復(fù)雜性、代碼變更和開發(fā)人員活動度量元對軟件缺陷進行預(yù)測,實驗發(fā)現(xiàn),使用這些度量元的組合能夠得到較好的預(yù)測性能.Shepperd 等人[11]分析了分類器、數(shù)據(jù)集、度量元及研究團隊4 個因素對缺陷預(yù)測模型性能的影響,實驗發(fā)現(xiàn),研究團隊對缺陷預(yù)測模型的影響最大.接著,Chakkrit 等人[12]對Shepperd 的研究加以重現(xiàn),發(fā)現(xiàn)研究人員與使用的數(shù)據(jù)集及度量元有很大的關(guān)系,建議使用更廣泛的數(shù)據(jù)集.Okutan 等人[14]設(shè)計了開發(fā)者人數(shù)(number of developers,簡稱NOD)和源代碼質(zhì)量(lack of coding quality,簡稱LOCQ)兩個度量元,并使用貝葉斯網(wǎng)絡(luò)分析各種度量元與錯誤傾向性之間的關(guān)系,發(fā)現(xiàn)RFC(response for class)、LOC(lines of code)及LOCQ 是最有效的度量元,而CBO(coupling between objects)、WMC(weighted method perclass)及LCOM(lack of cohesion of methods)對缺陷傾向性的影響較小,NOD 和缺陷傾向性預(yù)測呈正相關(guān)的關(guān)系.
本文針對收集的117 篇論文進行分析,發(fā)現(xiàn)預(yù)測模型使用的度量元的分布如圖5 所示.大部分研究者使用混合的度量元集(如:OO+LOC、OO+Process),其次是面向?qū)ο蠛瓦^程度量元.軟件產(chǎn)品度量用來描述軟件產(chǎn)品的特征,針對最終軟件產(chǎn)品進行度量,而過程度量是對軟件開發(fā)過程的各個質(zhì)量指標(biāo)進行度量,軟件過程質(zhì)量直接影響軟件產(chǎn)品質(zhì)量.因此,同時考慮這兩種度量方法可以進一步提高缺陷預(yù)測模型的性能.

Fig.5 The distribution of the metric圖5 度量元的分布情況
軟件缺陷數(shù)據(jù)集從包含軟件項目開發(fā)周期的軟件倉庫里收集.然而,在挖掘軟件歷史倉庫的過程中,數(shù)據(jù)集中包含一些降低預(yù)測模型性能的不必要的信息,如異常值、高維度、類不平衡、數(shù)據(jù)差異等.因此,在使用這些數(shù)據(jù)集之前,需要處理數(shù)據(jù)集中存在質(zhì)量問題的數(shù)據(jù).本文對文獻進行了匯總分析,圖6 所示為具體數(shù)據(jù)質(zhì)量處理的文獻分類總覽圖.

Fig.6 The literature overview of data processing圖6 數(shù)據(jù)處理文獻分類總覽圖
2.3.1 異常值
在挖掘軟件倉庫的過程中,對代碼類型標(biāo)記和軟件度量等操作可能產(chǎn)生部分?jǐn)?shù)據(jù)值不一致或一些實例重復(fù)等異常值[31]問題,這些異常值影響到預(yù)測模型的性能.Gray 等人[30]的實驗結(jié)果表明,異常值降低了缺陷預(yù)測模型的性能.所以,在構(gòu)建預(yù)測模型前要處理離群的異常值,研究者在異常值檢測及處理方面作了相應(yīng)的研究.
(1)檢測異常值
數(shù)據(jù)集中的異常值可以通過箱線圖進行檢測,箱線圖的結(jié)構(gòu)如圖7 所示,分別由最小值、中位數(shù)、最大值和兩個四分位數(shù)這5 部分組成.
(2)處理異常值
對異常值的處理在缺陷預(yù)測技術(shù)中主要通過刪除異常值的方法來解決.Ryu 等人[32]針對跨項目缺陷數(shù)據(jù)集中的異常數(shù)據(jù)進行處理,結(jié)合實例中的異常屬性個數(shù)超過某個范圍就剔除該實例的方法,提出了VAB-SVM(value aware boosting with support vector machine)預(yù)測方法.Cao 等人[33]對缺陷數(shù)據(jù)集中的異常值也進行了研究,通過四分位距(inter quartile range,簡稱IQR)去除源項目和目標(biāo)項目數(shù)據(jù)集中的異常數(shù)據(jù),實驗結(jié)果表明,去除了異常值后,缺陷預(yù)測模型的性能得到提升.

Fig.7 The structure of boxplot圖7 箱線圖結(jié)構(gòu)
2.3.2 高維度數(shù)據(jù)
在程序模塊度量中,不同的度量方法(如規(guī)模度量LOC、過程度量、傳統(tǒng)度量和面向?qū)ο蠖攘?被應(yīng)用在缺陷預(yù)測中,文獻[8]的實驗發(fā)現(xiàn),使用度量元的組合能夠得到較好的預(yù)測結(jié)果.大部分研究者使用的是不同度量方法組合的度量元集,比如OO+LOC、OO+Process+LOC 等.然而,同時考慮所有的度量元會導(dǎo)致數(shù)據(jù)集的高維度數(shù)據(jù)問題,需要設(shè)計有效的方法來識別出冗余的度量元和無關(guān)度量元.He 等人[53]認(rèn)為,對于大量的特征進行特征選擇是一種合理的方法,處理后的特征子集有助于提升缺陷預(yù)測模型的性能.因此,對缺陷數(shù)據(jù)集進行高維度數(shù)據(jù)處理能夠促進數(shù)據(jù)可視化和數(shù)據(jù)的可理解,縮短訓(xùn)練時間,提高預(yù)測模型的性能.應(yīng)用于軟件缺陷預(yù)測模型的高維度數(shù)據(jù)處理方法主要包括特征選擇和特征提取這兩種.
(1)特征選擇
特征選擇是從原始的缺陷度量元數(shù)據(jù)集中得到最“好”的度量元子集,在選擇度量元子集時,需要一個評價函數(shù)進行評估,根據(jù)評價函數(shù)的工作原理,主要分為過濾和包裝兩種方法[52],其工作流程如圖8 所示.過濾法是對每一個度量元計算Chi-squared test(CS)或information gain(IG)或correlation coefficient scores 或Pearson correlation等的值,根據(jù)這些值進行特征選擇,選擇的過程與后續(xù)的學(xué)習(xí)器無關(guān)[63].相反地,包裝方法是根據(jù)學(xué)習(xí)器的性能來作為最佳特征子集選擇的評價準(zhǔn)則.包裝法是將學(xué)習(xí)器的性能作為評價函數(shù)[61],所以,包裝法的性能要優(yōu)于過濾法的性能.但是,包裝法的時間開銷較大,而過濾式方法與學(xué)習(xí)器無關(guān),開銷較小,所以泛化能力強于包裝法.

Fig.8 Process of filter and wrapper圖8 過濾法和包裝法的工作流程
He 等人[53]提出了一種Topk的特征選擇方法.首先使用過濾法對缺陷數(shù)據(jù)集進行特征選擇,然后根據(jù)特征在所有的缺陷數(shù)據(jù)集中出現(xiàn)的次數(shù)進行排序,并且引入覆蓋索引來決定最優(yōu)的k值.Sadhana 等人[54]提出了使用局部選擇和全局優(yōu)化的特征選擇方法.首先,利用基于IG 的過濾法(mutual information maximization,簡稱MIM)和基于correlation coefficient 的過濾法(sequential backward search,簡稱SBS)得到兩個初始的特征子集,然后,將這些子集進行組合,將全局優(yōu)化技術(shù)(GA(genetic algorithm)、DEFS(differential evolution-cased feature selection)或PSO(particle swarm optimization))分別應(yīng)用到組合的子集中,將方差作為停止標(biāo)準(zhǔn),從而得到有效的特征子集.Chao 等人[55]提出了基于聚類的特征選擇方法FeSCH(feature selection using clusters of hybrid-data)以解決跨項目缺陷預(yù)測問題.該方法分為兩個階段.第1 階段使用基于密度的DPC(density peaks clustering)聚類方法將原始特征集劃分為多個簇,第2 階段分別使用局部密度策略(local density of features,簡稱LDF)、相似特征分布策略(similarity of feature distributions,簡稱SFD)及信息增益策略(feature class relevance,簡稱FCR)對每個簇的特征進行排序,然后選擇前Topk的特征.
Yu 等人[58]針對缺陷數(shù)的預(yù)測提出了結(jié)合譜聚類及特征排序的FSCR(feature spectral clustering and feature ranking)特征選擇方法.首先,根據(jù)每兩個特征之間的相關(guān)性,利用譜聚類方法對原始特征集進行聚類.然后,利用ReliefF 算法計算每個特征與缺陷數(shù)之間的相關(guān)性.最后,從每個聚類里選擇Topk的特征組成特征子集.
Chen 等人[62]首次將多目標(biāo)優(yōu)化的特征選擇方法應(yīng)用于軟件缺陷預(yù)測中,提出了MOFES(multi-objective feature selection)方法.主要考慮了兩個目標(biāo),一個是盡可能地減少特征子集的數(shù)量,另一個是最大化缺陷預(yù)測模型的性能.其中,優(yōu)化算法使用NSGA-II方法,染色體的編碼模式根據(jù)特征集決定,若數(shù)據(jù)集有n個特征,則編碼為n位的串,i-th位的值為1,表明該i-th特征被選擇.
除此之外,Wang 等人[64]首次研究了不同的性能指標(biāo)對基于Wrapper 特征選擇的預(yù)測模型性能的影響.該研究以邏輯回歸學(xué)習(xí)器作為基礎(chǔ)分類器,分別使用Accuracy、AUC、Area Under the Precision-Recall Curve(PRC)、Best Geometric Mean(BGM)及Best Arithmetic Mean(BAM)作為性能評價指標(biāo),實驗結(jié)果表明,基于BAM 的Wrapper 方法是最好的Wrapper 特征選擇方法.Khoshgoftaar 等人[52]使用16 個軟件數(shù)據(jù)集進行實驗,對比了7個基于過濾的特征排序技術(shù).這些技術(shù)包括chi-squared(CS)、信息增益(IG)、增益比(gain rate,簡稱GR)、對稱不確定性(symmetric uncertainty,簡稱SU)和ReliefF(兩個變體:RF 和RFW).
(2)特征提取
特征提取是根據(jù)缺陷度量元之間的關(guān)系,將原始特征集映射到一個新特征集中.用于軟件缺陷預(yù)測的特征提取方法主要有主成分分析(principal component analysis,簡稱PCA)方法、判別分析(linear discriminant analysis,簡稱LDA)方法和多維標(biāo)度測量(multidimensional scaling,簡稱MDS)方法.PCA 和MDS 都是無監(jiān)督的特征提取方法,而LDA 是有監(jiān)督的特征提取方法.當(dāng)數(shù)據(jù)規(guī)模較小時,PCA 優(yōu)于LDA,但當(dāng)數(shù)據(jù)規(guī)模較大時,LDA 優(yōu)于PCA.
?ztürk 等人[37]比較哪種度量元對類不平衡的缺陷預(yù)測模型影響最大時,使用主成分分析PCA 方法進行特征提取.Lu 等人[38]使用半監(jiān)督學(xué)習(xí)方法FTcF(fitting the confident fits)對軟件缺陷進行預(yù)測,在使用該方法前首先使用MDS 方法進行特征提取.Jing 等人[69]使用改進的LDA 方法對項目內(nèi)和跨項目的數(shù)據(jù)集進行特征提取.
另外,有些研究者對特征選擇和特征提取方法進行了比較.Lu 等人[39]比較了特征選擇的IG 方法和特征提取的MDS 方法.實驗結(jié)果表明,MDS 方法要優(yōu)于IG 方法.但是特征選擇后的特征是原來特征的一個子集,而特征提取則形成了新的特征空間.相比較而言,特征選擇能夠?qū)θ毕蓊A(yù)測模型有更好的理解和解釋,能夠分辨出哪些度量元對缺陷更為重要,有利于指導(dǎo)軟件的研發(fā).
2.3.3 類不平衡問題
通常,軟件產(chǎn)品大致符合二八原則,80%的缺陷集中在20%的程序模塊中,缺陷數(shù)據(jù)分布不均勻,有缺陷的模塊要遠(yuǎn)少于無缺陷模塊,即類不平衡問題.類不平衡嚴(yán)重影響了分類模型的性能,無缺陷的實例支配著數(shù)據(jù)樣本,學(xué)習(xí)分類器會偏向于無缺陷的實例,因而,分類器對于有缺陷的實例不會產(chǎn)生好的分類結(jié)果[66].而在軟件測試中,有缺陷的模塊被誤報為無缺陷模塊,會給軟件公司帶來更大的損失.
類不平衡學(xué)習(xí)是當(dāng)前機器學(xué)習(xí)中的一個熱點研究領(lǐng)域.在軟件缺陷預(yù)測中也有不少研究,形成了若干類不平衡的學(xué)習(xí)方法,用于缺陷預(yù)測的類不平衡調(diào)整方法可大體上分為數(shù)據(jù)層面和算法層面兩類.
(1)數(shù)據(jù)層面
數(shù)據(jù)層面決策是從數(shù)據(jù)準(zhǔn)備階段入手,對原始不平衡的缺陷數(shù)據(jù)進行調(diào)整,從而達(dá)到平衡的數(shù)據(jù).主要包括抽樣方法及數(shù)據(jù)集劃分方法.
(a)抽樣方法
主要采用隨機欠抽樣或者隨機過抽樣技術(shù)將不平衡的缺陷數(shù)據(jù)集轉(zhuǎn)化成平衡數(shù)據(jù)集.隨機過抽樣技術(shù)是隨機地復(fù)制小類(有缺陷)的實例,但卻使模型訓(xùn)練難度加大,容易導(dǎo)致模型的過擬合問題.針對此問題,可以使用合成少數(shù)類過采樣技術(shù)(synthetic minority over-sampling,簡稱SMOTE),對少數(shù)類樣本進行分析并根據(jù)少數(shù)類樣本人工合成新的樣本.相反地,隨機欠抽樣技術(shù)是隨機剔除大類(有缺陷)的實例,但卻帶來一些重要信息的缺失.針對此問題,可以采用迭代的思想,如BalanceCascade,是通過迭代思想不斷更新大類的實例.
在軟件缺陷預(yù)測模型中,不少研究者考慮到了類不平衡問題并采用抽樣技術(shù)解決這個問題.Zhang 等人[67]提出了一種改進的采樣算法,被稱為擴散的基于相似性的分類算法(expanded dissimilarity based classification algorithm,簡稱EDBC),實驗結(jié)果表明,改進算法優(yōu)于隨機欠采樣和隨機過采樣,但其性能不如集成學(xué)習(xí)方法.Muhammed[9]首先利用主成分分析對數(shù)據(jù)進行特征提取,然后利用SOMTE、Virtual 和HSDD(hybrid sampling for defect data sets)方法進行過抽樣,利用Bayes、Na?ve Bayes(NB)、Random Forest(RF)、J48 和LIB-SVM 進行訓(xùn)練,發(fā)現(xiàn)不同抽樣方法的性能差別不大.
(b)數(shù)據(jù)集劃分方法
數(shù)據(jù)集劃分法的主要思想是將不平衡的缺陷數(shù)據(jù)集按照一定的規(guī)則劃分為多個平衡的缺陷數(shù)據(jù)集,然后在平衡的缺陷數(shù)據(jù)集上訓(xùn)練多個分類器,按照一定的學(xué)習(xí)方法集成在一起.
在軟件缺陷預(yù)測模型中,有部分研究者采用數(shù)據(jù)集劃分方法解決類不平衡問題.Xia 等人[70]設(shè)計了ELBlocker 方法來預(yù)測阻礙性錯誤.首先,將訓(xùn)練集隨機分為多個互斥集合,對每個互斥集合構(gòu)建一個分類器.然后,集成這些分類器,并能自動確定恰當(dāng)?shù)牟黄胶鉀Q策邊界來區(qū)分阻礙性錯誤和非阻礙性錯誤.若一個錯誤的似然分?jǐn)?shù)大于決策邊界值,即使它的似然值很低,也會被分類為阻礙性錯誤.Jing 等人[69]提出了改進的子類判別分析(improved subclass discriminant analysis,簡稱ISDA)方法以解決類不平衡問題,把每個類的數(shù)據(jù)分成若干個子類,對每個子類進行判別分析學(xué)習(xí)分類能力強的特征,從而解決類不平衡問題.
抽樣方法和數(shù)據(jù)集劃分方法都是從數(shù)據(jù)層面上解決缺陷預(yù)測的類不平衡問題.抽樣方法簡單,但容易出現(xiàn)重要數(shù)據(jù)丟失或過擬合的現(xiàn)象.數(shù)據(jù)集劃分方法需要與集成方法一起使用,相對比抽樣方法要復(fù)雜,但是可以在一定程度上避免抽樣方法的問題.
(2)算法層面
除了從數(shù)據(jù)層面降低類不平衡的影響外,也可以直接從算法層面進行改進,設(shè)計出適用于類不平衡數(shù)據(jù)的缺陷預(yù)測分類算法.主要包括代價敏感學(xué)習(xí)方法、集成學(xué)習(xí)方法及分類閾值移動方法.
(a)代價敏感學(xué)習(xí)方法
該方法對數(shù)據(jù)集中的有/無缺陷實例賦予不同的誤分類代價,其中,誤分類代價可以分為基于類別的代價和基于樣本的代價兩種.在軟件缺陷預(yù)測模型中,基于類別的誤分代價使用得比較多.Ryu 等人[72]考慮了跨項目的類不平衡問題,提出了基于代價敏感的遷移學(xué)習(xí)方法TCSBoost(transfer cost-sensitive boosting).該方法基于分布特征及類不平衡特征,對正確和錯誤分類的樣本賦予不同的權(quán)值.?mer 等人[73]針對類不平衡問題提出了代價敏感的神經(jīng)網(wǎng)絡(luò)缺陷預(yù)測方法.為了把人工神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)化為代價敏感學(xué)習(xí)器,將假陽性(FP)及假陰性(FN)引入到誤差函數(shù)中,使用人工蜂群算法對人工神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練.Liu 等人[71]提出了兩階段的代價敏感學(xué)習(xí)方法(two-stage cost-sensitive,簡稱TSCS),代價敏感不僅使用于分類階段,而且使用在特征選擇階段.在特征選擇階段,將代價敏感信息引入到傳統(tǒng)的特征選擇方法中,設(shè)計了3 種新的代價敏感特征選擇算法,即代價敏感方差評分(cost-sensitive variance score,簡稱CSVS)、代價敏感拉普拉斯評分(cost-sensitive Laplacian score,簡稱CSLS)以及代價敏感約束評分(cost-sensitive constraint score,簡稱CSCS).
(b)集成學(xué)習(xí)方法
集成學(xué)習(xí)方法是結(jié)合多個弱監(jiān)督分類器以得到一個更好的強監(jiān)督分類器,比較常用的集成學(xué)習(xí)方法有Bagging、Boosting 和Stacking.在缺陷預(yù)測模型中,部分學(xué)者使用集成學(xué)習(xí)方法解決類不平衡問題.
Sun 等人[76]針對缺陷預(yù)測問題提出了基于編碼的集成學(xué)習(xí)(coding based ensemble learning,簡稱CEL)方法,該方法首先將無缺陷的實例分成幾個箱子,每個箱子樣本的數(shù)量與有缺陷樣本的數(shù)量相同,然后用一個特定的編碼方案在多類數(shù)據(jù)集上構(gòu)建缺陷預(yù)測模型.Wang 等人[77]將多核學(xué)習(xí)方法和集成學(xué)習(xí)方法相結(jié)合,提出了多核集成學(xué)習(xí)方法(multiple kernel ensemble learning,簡稱MKEL).首先,通過集成學(xué)習(xí)的boosting 方法反復(fù)學(xué)習(xí)多個內(nèi)核分類器,然后,根據(jù)它們的組合權(quán)重集成起來,從而得到最終的多核集成分類器.Ryu 等人[78]針對跨項目的類不平衡問題,提出了VCB-SVM(value-cognitive boosting with a support vector machine)方法.該模型的相似性權(quán)值根據(jù)分布特征及非對稱誤分類代價得到.同時,采用Boosting-SVM 和重新采樣技術(shù)來解決類不平衡問題.
(c)分類閾值移動
該方法的主要思想是在算法分類過程中,閾值的設(shè)定不再是0.5,而且根據(jù)有/無缺陷樣本的比例對閾值進行移動,根據(jù)改變后的閾值在分類器上進行預(yù)測.部分學(xué)者使用分類閾值移動方法解決缺陷預(yù)測的類不平衡問題.Zheng[80]提出了使用神經(jīng)網(wǎng)絡(luò)算法解決缺陷預(yù)測的類不平衡問題.在分類過程中,使用閾值移動的方法將分類閾值移動到無缺陷的模塊,這樣可使更多的有缺陷模塊得到預(yù)測.與代價敏感學(xué)習(xí)法相比,實驗結(jié)果表明,閾值移動方法要優(yōu)于代價敏感方法.Wang 等人[79]在10 個不同的數(shù)據(jù)集上對采樣方法、閾值移動方法、代價敏感方法和集成學(xué)習(xí)方法進行了研究,使用G-means 和AUC 進行評估,集成學(xué)習(xí)方法表現(xiàn)最佳.
除此之外,部分研究者還將高維度問題和類不平衡問題相結(jié)合來構(gòu)建軟件缺陷預(yù)測模型.?mer 等人[65]使用隨機抽樣方法解決類不平衡問題,特征選擇使用correlation-based feature selection(CFS)過濾方法.Kehan 等人[68]使用抽樣的方法解決類不平衡問題,特征選擇使用Filter 方法.Wan 等人[74]使用代價敏感解決類不平衡問題,特征提取使用稀疏編碼方式,采用字典學(xué)習(xí)方法進行缺陷預(yù)測.Issam 等人[75]將集成學(xué)習(xí)方法和特征選擇相結(jié)合來解決類不平衡問題,該方法同時使用了靜態(tài)代碼度量元和過程度量元.Gao 等人[81]提出了兩種結(jié)合抽樣方法的集成學(xué)習(xí)方法:selectRUSBoost 和selectSMOTEBoost.
但是,大部分研究者集中于對項目內(nèi)的類不平衡問題進行研究,針對跨項目類不平衡問題的研究還比較少,這是今后進一步的研究方向.
2.3.4 數(shù)據(jù)差異性問題
通常,實際軟件開發(fā)中,當(dāng)要預(yù)測的項目沒有充足的歷史數(shù)據(jù)時,需要使用其他項目的數(shù)據(jù).但是不同項目開發(fā)過程、使用的語言及應(yīng)用領(lǐng)域不同,導(dǎo)致訓(xùn)練數(shù)據(jù)集與測試數(shù)據(jù)集分布不一致的問題,即存在數(shù)據(jù)差異性.在缺陷預(yù)測領(lǐng)域,數(shù)據(jù)差異性包括同構(gòu)(度量元集相同但分布不同)及異構(gòu)(度量元不同)兩種情況,其預(yù)測模型如圖9 所示[82].數(shù)據(jù)差異性的問題會導(dǎo)致無法直接使用傳統(tǒng)學(xué)習(xí)器進行預(yù)測,因為傳統(tǒng)學(xué)習(xí)器要求訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集同分布,所以需要對訓(xùn)練集和測試集的分布進行轉(zhuǎn)變.在缺陷預(yù)測領(lǐng)域,研究者主要通過轉(zhuǎn)換數(shù)據(jù)分布,篩選相關(guān)數(shù)據(jù)集,遷移學(xué)習(xí)方式來解決差異性問題.

Fig.9 The prediction model of data difference圖9 數(shù)據(jù)差異的缺陷預(yù)測模型
(1)轉(zhuǎn)換數(shù)據(jù)分布
在實際軟件開發(fā)過程中,若新項目沒有足夠的標(biāo)簽數(shù)據(jù),可以使用同公司其他的歷史項目數(shù)據(jù)集,即存在度量元相同但數(shù)據(jù)分布不同的情況.針對該情況,可以在建立模型前對數(shù)據(jù)的分布進行調(diào)整,使得訓(xùn)練集與測試集具有相似的分布.Feng 等人[40]首先研究了不同的數(shù)據(jù)轉(zhuǎn)換方法(log、rank 及Box-Cox)對跨項目缺陷預(yù)測的影響,發(fā)現(xiàn)3 種方法的影響是相似的,然后整合這3 種數(shù)據(jù)轉(zhuǎn)換方法后提出了多數(shù)據(jù)轉(zhuǎn)換方法MT(multiple transformations),更進一步地,使用Box-Cox 轉(zhuǎn)換的參數(shù)來確定每個測試集最適合的訓(xùn)練集,即MT+方法.Li 等人[41]通過對數(shù)據(jù)進行標(biāo)準(zhǔn)化和正態(tài)化(log)處理來解決數(shù)據(jù)差異性問題,然后使用無監(jiān)督學(xué)習(xí)方法SNN(shared nearest neighbors)提取靜態(tài)代碼度量元的相似模式.
(2)篩選相關(guān)數(shù)據(jù)集
針對特征集相同但數(shù)據(jù)分布不同的情況,在建立模型前,部分研究者通過算法對訓(xùn)練數(shù)據(jù)集進行實例篩選,篩選出與被測項目相似性高的數(shù)據(jù)集進行訓(xùn)練.Seyedrebvar 等人[43]提出了基于搜索的實例選擇方法GIS(genetic instance selection),使用遺傳算法進行搜索,并且以收斂目標(biāo)來指導(dǎo)實例的選擇過程,從而更精確地匹配測試集的分布特征.每代的適應(yīng)度函數(shù)通過NN-filter 得到的確認(rèn)集進行評估.而且基于這些確認(rèn)集,GIS 方法能夠同時解決數(shù)據(jù)中的潛在噪音和實例選擇兩個問題.Steffen 等人[42]和Tim 等人[45]比較了全局模型和局部模型對跨項目缺陷預(yù)測的影響,在局部模型中使用EM 和WHERE 等聚類方法對訓(xùn)練項目集進行聚類,實驗結(jié)果表明,聚類后的數(shù)據(jù)集有更好的性能.He 等人[46]研究了各種實例選擇方法,發(fā)現(xiàn)可以通過數(shù)據(jù)集的分布特征進行訓(xùn)練實例的選擇.然后根據(jù)數(shù)據(jù)集的分布特征提出了一種三步法的自動實例選擇方法.Peters 等人[47]針對數(shù)據(jù)差異性問題,提出了Peters filter 方法選擇訓(xùn)練樣本集.該方法假設(shè)訓(xùn)練集中包含了比較小的測試集的缺陷信息,因此,該方法能夠為每個訓(xùn)練集發(fā)現(xiàn)距離最近的測試集實例.最后每個測試實例會選擇離它最近的實例作為篩選訓(xùn)練集的候選.Herbold[48]根據(jù)數(shù)據(jù)集的分布,提出了兩種基于距離的實例選擇方法,即EM-Clustering 和K-nearest neighbor 策略.
(3)遷移學(xué)習(xí)技術(shù)
遷移學(xué)習(xí)是用一個環(huán)境中學(xué)到的知識來幫助新環(huán)境中的學(xué)習(xí)任務(wù),正好可以解決缺陷預(yù)測中數(shù)據(jù)分布差異問題[49,51].根據(jù)被測項目和源項目之間的度量元空間是否相同,遷移學(xué)習(xí)可以分為同構(gòu)遷移學(xué)習(xí)和異構(gòu)遷移學(xué)習(xí),其中,同構(gòu)遷移又可分為基于實例的遷移學(xué)習(xí)及基于特征的遷移學(xué)習(xí)等[83].
·基于實例的遷移學(xué)習(xí).根據(jù)被測項目中部分標(biāo)簽的缺陷數(shù)據(jù),對源域項目實例的權(quán)值進行調(diào)整,使得源域與目標(biāo)域進行匹配.Ma 等人[49]提出了TNB(transfer Na?ve Bayes)模型,首先計算測試集每個特征的最大值和最小值,然后依據(jù)數(shù)據(jù)引力計算訓(xùn)練集實例的權(quán)重,利用貝葉斯網(wǎng)絡(luò)對這些加權(quán)重的訓(xùn)練集進行訓(xùn)練,實驗設(shè)計與直接使用所有的訓(xùn)練集和使用NN-filter 方法進行比較,實驗結(jié)果表明,TNB 提高了模型的性能.Ryu 等人[72]提出了基于代價敏感的遷移學(xué)習(xí)方法,對于源項目中與目標(biāo)項目有相同分布的實例分類錯誤時增加權(quán)重,分類正確的實例減少權(quán)重;對于分布不同的實例分類錯誤時減少一定的權(quán)重,分類正確的實例減少更多的權(quán)重.Chen 等人[17]提出了雙遷移Boosting(double transfer boosting,簡稱DTB)方法來減少消極的數(shù)據(jù)實例.首先利用NN 和SMOTE 對源項目數(shù)據(jù)集進行處理,然后利用數(shù)據(jù)引力對選擇的數(shù)據(jù)集賦予權(quán)重,利用Boosting 方法消減小數(shù)據(jù)集的權(quán)重.
·基于特征的遷移學(xué)習(xí).主要是通過特征變換,將源項目和被測項目的度量元集變換到相同的空間.缺陷預(yù)測模型中最常用的是遷移主成分分析(transfer component analysis,簡稱TCA).Cao 等人[33]使用遷移主成分分析(TCA)轉(zhuǎn)換訓(xùn)練數(shù)據(jù)集數(shù)據(jù),使得訓(xùn)練數(shù)據(jù)集具有與測試數(shù)據(jù)集相似的數(shù)據(jù)分布.
·異構(gòu)遷移學(xué)習(xí).這是源項目和被測項目之間的度量元空間不同,而且特征的維度也可能不同的學(xué)習(xí)方法.Yu 等人[50]針對跨項目缺陷預(yù)測模型的異構(gòu)問題,首先對源項目和目標(biāo)項目進行特征選擇,然后利用特征匹配遷移匹配特征,消除數(shù)據(jù)集的差異性.Feng 等人[84]采用無監(jiān)督學(xué)習(xí)中的譜聚類方法進行跨項目缺陷預(yù)測,實驗結(jié)果表明能取得較好的結(jié)果.
這3 種方法的假設(shè)都是目標(biāo)任務(wù)和源任務(wù)的目標(biāo)都是對缺陷的傾向性進行預(yù)測.其中,基于實例的遷移學(xué)習(xí)和基于特征的遷移學(xué)習(xí)的假設(shè)是源項目和被測項目的度量元集相同,數(shù)據(jù)分布不同,而異構(gòu)遷移學(xué)習(xí)的前提是源項目和被測項目的度量元是不同的.在使用這3 種方法時,如果假設(shè)得不到滿足,則這類方法的有效性得不到保障.在特征遷移和異構(gòu)遷移方法中,源項目向被測項目遷移,或者被測項目向源項目遷移,與源項目和被測項目遷向共同的空間之間存在著差異性.Li 等人[85]提出了多核的集成學(xué)習(xí)方法解決異構(gòu)缺陷預(yù)測,實驗發(fā)現(xiàn),源項目向被測項目轉(zhuǎn)換的性能優(yōu)于后兩個的性能.基于上述研究工作,在后續(xù)的研究中需要深入地分析全局和局部對預(yù)測模型性能的影響.
本文通過對收集的117 篇文獻進行研究和分析,根據(jù)預(yù)測形式可以將缺陷預(yù)測模型大體上分為缺陷傾向性、缺陷嚴(yán)重度及缺陷數(shù)量3 種類型,具體的分類方法及文獻分布如圖10 所示.
缺陷傾向性預(yù)測是把需要預(yù)測的軟件模塊分類為有缺陷或者無缺陷,是一個二分類問題,也是構(gòu)建最多的缺陷預(yù)測模型.大量的研究者已經(jīng)使用了不同的分類技術(shù)來構(gòu)建缺陷傾向性預(yù)測模型,主要包括統(tǒng)計學(xué)方法和機器學(xué)習(xí)方法.
3.1.1 機器學(xué)習(xí)方法
大部分的研究都是基于機器學(xué)習(xí)方法來進行缺陷傾向性預(yù)測.具體可以分為有監(jiān)督缺陷預(yù)測、無監(jiān)督缺陷預(yù)測和半監(jiān)督缺陷預(yù)測,下面我們分別介紹應(yīng)用到缺陷傾向性預(yù)測中的方法.
(1)有監(jiān)督學(xué)習(xí)方法
該方法是利用已有標(biāo)簽的有/無缺陷樣本集優(yōu)化分類器的參數(shù),使其達(dá)到最佳預(yù)測效果的過程.在117 篇文獻中,應(yīng)用到的有監(jiān)督學(xué)習(xí)主要有:貝葉斯[14,16,65,86,87]、決策樹[39,88]、集成學(xué)習(xí)[17,34-36,57,72,77,89-92]、神經(jīng)網(wǎng)絡(luò)[33,93-95]、支持向量機[59,96,97]、邏輯回歸[64]及字典學(xué)習(xí)[66]等.接下來在文獻[5]的基礎(chǔ)上,對近兩年的有監(jiān)督的學(xué)習(xí)方法進一步地加以總結(jié)和分析.
Issam 等人[34]將特征選擇和集成學(xué)習(xí)相結(jié)合,提出了平均概率集成(average probability ensemble,簡稱APE)學(xué)習(xí)方法,其中包含了Random Forests(RF)、Gradient Boosting(GB)、Stochastic Gradient Descent(SGD)、Weighted SVMs(W-SVMs)、Logistic Regression(LR)、Multinomial Na?ve Bayes(MNB)及Bernoulli Na?ve Bayes(BNB)這7種分類器.在APE 模型里,每個分類器都預(yù)測出軟件模塊屬于缺陷的概率,然后對這7 個概率取平均值作為最后的輸出.
Yang 等人[35]提出了結(jié)合決策樹和集成學(xué)習(xí)的雙層集成學(xué)習(xí)方法TLEL(two-layer ensemble learning)來構(gòu)建預(yù)測動態(tài)缺陷預(yù)測模型.在內(nèi)層使用基于決策樹的bagging 集成學(xué)習(xí)方法來構(gòu)建隨機森林模型,在外層使用隨機抽樣的方法來訓(xùn)練不同的隨機森林模型,然后按照stacking 方式來集成這些不同的隨機森林模型.
Bowes 等人[89]提出了多樣性選擇的集成學(xué)習(xí)方法.該方法首先選擇來自4 個不同家族的分類器NB、C4.5、K-NN 及序列最小化作為基礎(chǔ)分類器,并且設(shè)計了加權(quán)精度多樣性WAD(weighted accuracy diversity),然后依據(jù)WAD 使用stacking 技術(shù)集成一個強分類器.
Xia 等人[92]針對跨項目的缺陷預(yù)測問題提出了混合重構(gòu)方法 HYDRA(hybrid model reconstruction approach).該方法包括兩個階段:遺傳算法階段和集成學(xué)習(xí)階段.在遺傳算法階段,首先將每個帶標(biāo)簽的源訓(xùn)練集與帶標(biāo)簽的測試集結(jié)合構(gòu)建多個分類器,然后利用遺傳算法,為每個分類器分配不同的權(quán)值構(gòu)建GA 分類器.在集成學(xué)習(xí)階段,即多次迭代GA 階段,每次迭代產(chǎn)生一個GA 分類器,然后根據(jù)每個GA 分類器的錯誤率分配相應(yīng)的權(quán)重.經(jīng)過兩階段后就建立了大量的分類器,然后將這些分類器集成進行測試集的缺陷預(yù)測.
(2)半監(jiān)督學(xué)習(xí)方法
該方法是將有監(jiān)督學(xué)習(xí)與無監(jiān)督學(xué)習(xí)相結(jié)合的一種學(xué)習(xí)方法.該方法在使用大量的未標(biāo)記缺陷數(shù)據(jù)的同時使用了標(biāo)記的缺陷數(shù)據(jù),來進行缺陷預(yù)測.Zhang 等人[98]提出了基于圖的半監(jiān)督學(xué)習(xí)方法.首先根據(jù)拉普拉斯算子得分從無缺陷的訓(xùn)練集中抽樣樣本,構(gòu)建一個類平衡的標(biāo)簽訓(xùn)練集.然后用非負(fù)稀疏算法來計算關(guān)系圖的非負(fù)稀疏權(quán)值作為聚類指標(biāo).最后在非負(fù)稀疏圖上使用一個標(biāo)簽傳播算法來迭代預(yù)測未標(biāo)記的軟件模塊的標(biāo)簽.Wu 等人[99]使用半監(jiān)督結(jié)構(gòu)字典學(xué)習(xí)方法SSDL(semi-supervised dictionary learning)構(gòu)建項目內(nèi)和跨項目的缺陷預(yù)測總體框架.該方法學(xué)習(xí)了總字典,以及有缺陷、無缺陷、未標(biāo)記模型3 個子字典,從而充分提取了缺陷數(shù)據(jù)的有用信息.
He 等人[100]提出了半監(jiān)督學(xué)習(xí)方法extRF.該方法通過自我訓(xùn)練模式擴展了有監(jiān)督的隨機森林算法.首先從數(shù)據(jù)集中抽取小部分?jǐn)?shù)據(jù)作為有標(biāo)簽的數(shù)據(jù)集,使用這一部分?jǐn)?shù)據(jù)集訓(xùn)練隨機森林分類器,根據(jù)訓(xùn)練好的分類器來預(yù)測未標(biāo)記的數(shù)據(jù)集,然后選擇最自信的樣本加入到訓(xùn)練集中,并進行訓(xùn)練初始模型,以此類推,最后形成精煉模型.
(3)無監(jiān)督學(xué)習(xí)方法
當(dāng)被測項目為無任何標(biāo)記的有/無缺陷數(shù)據(jù)集時,可采用無監(jiān)督學(xué)習(xí)方法.該方法沒有導(dǎo)師,需要學(xué)習(xí)器自身形成(form)和評價(evaluate)概念.Feng 等人[84]采用無監(jiān)督學(xué)習(xí)中的譜聚類方法進行跨項目缺陷預(yù)測.并且,將該方法和5 個經(jīng)常使用的有監(jiān)督學(xué)習(xí)器RF、NB、LR、DT 及邏輯模型樹進行比較,發(fā)現(xiàn)使用譜聚類的無監(jiān)督學(xué)習(xí)方法在跨項目和項目內(nèi)場景下都有可比較性.Fu 等人[101]重新驗證了無監(jiān)督學(xué)習(xí)對動態(tài)缺陷預(yù)測模型的影響,發(fā)現(xiàn)并不是所有的無監(jiān)督學(xué)習(xí)都優(yōu)于有監(jiān)督學(xué)習(xí),提出了OneWay 方法來自動選擇潛在的最好的方法.Rodrigo 等人[102]提出了結(jié)合粒子群算法的基于聚類集成方法的缺陷預(yù)測模型.Park 等人[103]使用無監(jiān)督學(xué)習(xí)方法(EM 和Xmeans)方法進行缺陷傾向性預(yù)測.Muhammed 等人[104]針對網(wǎng)絡(luò)軟件系統(tǒng),使用無監(jiān)督學(xué)習(xí)的Kmeans++進行缺陷預(yù)測.Bishnu 等人[105]使用基于四叉樹的K-means 聚類算法進行缺陷傾向性預(yù)測.

Fig.10 The overview of the learners圖10 學(xué)習(xí)器分布總覽
3.1.2 統(tǒng)計學(xué)方法
統(tǒng)計學(xué)方法是收集、整理、分析和解釋統(tǒng)計數(shù)據(jù),并給出一定結(jié)論的方法.在缺陷傾向性預(yù)測中統(tǒng)計學(xué)方法也有一定研究.Shepperd 等人[11]使用統(tǒng)計學(xué)的方法分析了分類器、數(shù)據(jù)集、輸入度量元以及研究團隊4 個因素對缺陷預(yù)測模型的性能影響,實驗結(jié)果表明,研究團隊的影響較大.Pradeep 等人[120]針對缺陷傾向性提出了模糊規(guī)則,根據(jù)使用的特征比例選擇有用的特征.Chang 等人[121]提出了基于行為的缺陷模型,利用行為修正建議(action correction recommendation,簡稱ACR)構(gòu)建低缺陷行為和高缺陷行為,預(yù)測算法使用負(fù)關(guān)聯(lián)規(guī)則挖掘技術(shù).Zhang 等人[122]提出了代價效益規(guī)則,利用規(guī)則進行缺陷傾向性預(yù)測,并提出了FN/(FN+TN)的新的性能評價指標(biāo).
一般地,當(dāng)有標(biāo)簽的缺陷數(shù)據(jù)集充足時,使用有監(jiān)督學(xué)習(xí)要優(yōu)于無監(jiān)督學(xué)習(xí)和半監(jiān)督學(xué)習(xí);當(dāng)有部分標(biāo)簽缺陷數(shù)據(jù)集時,可以使用半監(jiān)督學(xué)習(xí);當(dāng)無任何缺陷標(biāo)簽數(shù)據(jù)集時,使用無監(jiān)督學(xué)習(xí).除此之外,有些研究者使用不同的方法,比較分類器的不同分類效果,但是,由于項目內(nèi)在特征及評價指標(biāo)的不同,沒有哪個分類器對所有的數(shù)據(jù)集都能產(chǎn)生好的結(jié)果[25,37,40,41,44,46,47,53,60,67,76,107,126-128],但是,在比較的時候,對于分類器的參數(shù)一般采用的是默認(rèn)值,所以,在后續(xù)的工作中需要深入地分析分類器方法中參數(shù)取值對缺陷預(yù)測模型性能的影響.
軟件缺陷數(shù)預(yù)測是通過軟件歷史數(shù)據(jù)對軟件模塊的缺陷數(shù)量進行預(yù)測,一般地,程序模塊針對的是類級別或文件級別.近年來,一些研究者在這個領(lǐng)域進行了研究,大部分研究者使用的是邏輯回歸算法和簡單的神經(jīng)網(wǎng)絡(luò)算法進行預(yù)測.
Bell 等人[118]分析了開發(fā)人員對缺陷預(yù)測模型的影響,使用標(biāo)準(zhǔn)的負(fù)二項回歸分類器預(yù)測文件缺陷的數(shù)量.Andreou 等人[119]提出了隨機信念泊松回歸網(wǎng)絡(luò)(stochastic belief Poisson regression network,簡稱SBPRN)來計算缺陷數(shù),通過引入雙隨機齊次泊松過程模型,受SBN 公式的啟發(fā),在每個時間點的失效log-rate 參數(shù)進行建模.Santosh 等人[36]提出將以前版本的數(shù)據(jù)作為依據(jù),利用集成學(xué)習(xí)技術(shù)預(yù)測現(xiàn)在版本的軟件模塊的缺陷數(shù).首先,把數(shù)據(jù)集按照6、2、2 分成訓(xùn)練集、確認(rèn)集和測試集,之后,利用meta-training 重新訓(xùn)練3 個分類器(線性規(guī)劃、遺傳算法、多層感知器),用訓(xùn)練好的分類器對確認(rèn)集進行訓(xùn)練,得到相應(yīng)的值,然后,利用整合函數(shù)得到最后的缺陷數(shù).Tanvi 等人[114]利用人工神經(jīng)網(wǎng)絡(luò)預(yù)測缺陷的數(shù)量,并且與模糊邏輯回歸方法進行比較,實驗結(jié)果表明,該方法的性能有很大提高.Ratgore 等人[112]比較了6 個常用的預(yù)測缺陷數(shù)量的技術(shù),包括歸零校正“泊松回歸”和負(fù)二項回歸,結(jié)果表明,DTR(decision tree regression)、GP(genetic programming)、多層感知器以及LR 在所有考慮的項目中都能得到較好的性能.
研究者近年來對缺陷嚴(yán)重性預(yù)測進行了一定的研究,大多采用邏輯回歸方法進行預(yù)測.You 等人[106]提出了采用多邏輯回歸方法(multiple linear regression,簡稱MLR)和隨機梯度下降法來預(yù)測缺陷的嚴(yán)重度,進而以此對軟件模塊進行排序,指導(dǎo)測試資源的合理分配.Nguyen 等人[107]針對缺陷的嚴(yán)重度提出了一種基于排序的方法,根據(jù)軟件模塊的缺陷數(shù)來對軟件模塊的嚴(yán)重度排序,通過實驗表明,該方法提高了缺陷預(yù)測的性能.Yang 等人[108]將LTR(learning to rank)方法引入到缺陷預(yù)測模型中,組合不同的評估指標(biāo)來優(yōu)化缺陷的嚴(yán)重度,實驗結(jié)果表明了方法的有效性.Yadav 等人[109]使用模糊邏輯提取規(guī)則,預(yù)測缺陷的嚴(yán)重度,其中,嚴(yán)重度的確定根據(jù)缺陷的數(shù)量來判斷.You 等人[110]針對跨項目缺陷預(yù)測的嚴(yán)重度問題,提出了利用單目標(biāo)的多線性回歸方法,分類器使用Linear Regression(LR)、RankSVM、RankBoost,嚴(yán)重度根據(jù)bug 的個數(shù)進行排序.
大部分的研究者主要對缺陷傾向性、缺陷數(shù)和缺陷嚴(yán)重度進行了建模,除此之外,部分研究者還研究了其他預(yù)測模型.Borg 等人[129]利用K-means 聚類方法預(yù)測缺陷修復(fù)時間.Parizy 等人[130]基于硬件設(shè)計資源庫(私有項目)的缺陷預(yù)測,來預(yù)測缺陷的等級.Gupta 等人[131]針對缺陷預(yù)測的類重疊和噪音問題,首先將54 個軟件項目整理為327 個二類的數(shù)據(jù)集,然后利用數(shù)據(jù)復(fù)雜度對數(shù)據(jù)集進行重疊度計算,并且對207 個重疊度高的數(shù)據(jù)集計算實例的重疊度,最后在327 個Promise 數(shù)據(jù)集上利用KNN、SVM、NB 和C4.5 分別進行有重疊實例和沒有重疊實例的計算,實驗結(jié)果表明,去除重疊的數(shù)據(jù)集有更好的預(yù)測性能.Rathore 等人[132]提出了一個推薦系統(tǒng),該系統(tǒng)考慮了影響缺陷性能的10 種因素,從10 種因素提取相應(yīng)的規(guī)則,依據(jù)項目的實際需求選擇合適的技術(shù)進行缺陷預(yù)測.
綜上所述,研究者采用機器學(xué)習(xí)的方法對程序模塊的缺陷傾向性進行了大量研究,但對于程序模塊粗粒度的缺陷數(shù)和缺陷嚴(yán)重度的研究較少,而缺陷數(shù)和缺陷嚴(yán)重度的研究更能指導(dǎo)實際的軟件開發(fā)和測試工作,所以,在后續(xù)的工作中需進一步加強對缺陷數(shù)或者缺陷嚴(yán)重度模型的研究.
性能評價指標(biāo)是對構(gòu)建的缺陷預(yù)測模型的性能進行評價,以此來判斷構(gòu)建的缺陷預(yù)測模型的好壞.針對不同的缺陷預(yù)測模型可以分為不同的評價指標(biāo),大體上可以分為缺陷傾向性評價指標(biāo)、缺陷數(shù)分析評價指標(biāo)和缺陷嚴(yán)重度評價指標(biāo).但是目前還沒有一套通用的評價標(biāo)準(zhǔn)來衡量不同的缺陷預(yù)測模型的性能,大部分研究者使用多種性能指標(biāo)進行評估.
軟件缺陷傾向性預(yù)測是預(yù)測軟件模塊為有缺陷模塊還是無缺陷模塊,是一個二分類問題.因此,可以使用機器學(xué)習(xí)中分類問題的模型評價指標(biāo),混淆矩陣是評價分類模型好壞的展示工具,具體見表1.矩陣的每一行表示實例的真實情況,矩陣的每一列表示預(yù)測模型預(yù)測的實例情況.
矩陣元素的具體含義分別是:
True Positive(TP):表示實例的真實類別是有缺陷模塊,預(yù)測模型的預(yù)測結(jié)果也是有缺陷模塊.
False Negative(FN):表示實例的真實類別是有缺陷模塊,預(yù)測模型的預(yù)測結(jié)果是無缺陷模塊.

Table 1 Confusion matrix表1 混淆矩陣
False Positive(FP):表示實例的真實類別是無缺陷模塊,預(yù)測模型的預(yù)測結(jié)果是有缺陷模塊.
True Negative(TN):表示實例的真實類別是無缺陷模塊,預(yù)測模型的預(yù)測結(jié)果是無缺陷模塊.
根據(jù)混淆矩陣衍生了各種評價指標(biāo),其中,用于缺陷預(yù)測的主要有Accuracy、Precision、Recall、F-measure、G-mean、AUC、MCC 等.
(1)Accuracy:表示預(yù)測模型的精確度,是預(yù)測模型預(yù)測正確的個數(shù)與數(shù)據(jù)集中實例總個數(shù)的比值.公式為

在軟件缺陷預(yù)測中,精確度表示被正確分類的軟件模塊的比例,但是,這個度量指標(biāo)有些含糊不清,沒有說明有/無缺陷的錯誤分類的信息.
(2)Precision:表示查準(zhǔn)率,是預(yù)測模型預(yù)測為有缺陷實例中真實類別為有缺陷所占的比例.公式為

缺陷預(yù)測中的精確度表示了正確分類的缺陷模塊與預(yù)測為有缺陷模塊的比例,一般情況下,Precision 越高,說明預(yù)測模型的效果越好.
(3)Recall:表示召回率,是預(yù)測模型預(yù)測為有缺陷的實例的數(shù)量占真實有缺陷的實例數(shù)的比例.公式為

Recall 對軟件缺陷預(yù)測非常重要,越早地找到有缺陷的特別是高危的模塊,對軟件越好.一般情況下,Recall越高,說明有更多的有缺陷的模塊被模型預(yù)測正確,預(yù)測模型的效果越好,但是,較高的召回率往往是以降低精確度為代價的.
(4)pf:表示假陽率,是真實為無缺陷模塊被預(yù)測為有缺陷模塊占真實無缺陷模塊的比例.其公式表示為

當(dāng)然,pf 值越小,表明模型的性能越好.因為pf 的值過大,表明越多的無缺陷模塊被誤分為有缺陷,則需要投入很多的資源到無缺陷的模型進行測試,造成資源的浪費.
(5)F-measure:是一個綜合評價指標(biāo),提供了召回率和精確度之間的權(quán)衡,具體公式如下:

(6)G-mean:幾何平均數(shù),能夠評價類不平衡數(shù)據(jù)的表現(xiàn).對于軟件缺陷數(shù)據(jù)來說,有缺陷的模塊占少數(shù),無缺陷的模塊占多數(shù),所以有類不平衡的問題.公式如下:

(7)AUC:表示ROC 曲線下的面積.ROC 曲線叫作接受者工作特征曲線,其橫坐標(biāo)為假陽性率,縱坐標(biāo)為Recall.一般情況下,AUC 值越大,說明缺陷預(yù)測模型的性能越好[95].
(8)MCC(Matthews correlation coefficient):表示實際分類與預(yù)測分類之間的相關(guān)系數(shù).該指標(biāo)同時考慮了TP、FN、FP 及TN,是一個相對均衡的指標(biāo),能夠評價類不平衡數(shù)據(jù)的表現(xiàn)[133].公式如下:

一般地,Accuracy、Precision、Recall、F-measure、G-mean、AUC 的取值范圍在[0,1],而MCC 的取值范圍是[–1,1].在缺陷數(shù)據(jù)的類不平衡情況下,Accuracy 指標(biāo)有很大的缺陷(如有缺陷的模塊只占2%時,Accuracy 等于98%,但無意義);Precision 是檢索出來的缺陷模塊有多少是準(zhǔn)確的,Recall 是所有有缺陷的模塊有多少被檢索出來,F-measure 和G-mean 是用來權(quán)衡Precision 及Recall 兩個指標(biāo)的,屬于綜合評價指標(biāo),Precision、Recall、F-measure 及G-mean 對類分布的改變較敏感;AUC 不受類分布的影響,適合評估類分布不平衡的數(shù)據(jù)集;MCC是一個較均衡的指標(biāo),即使缺陷數(shù)據(jù)集類分布嚴(yán)重不平衡,也可以使用MCC.
缺陷數(shù)的預(yù)測正好與缺陷傾向性相反,評價的是連續(xù)的數(shù)值.具體的評價指標(biāo)有:AAE、ARE、Measure of Completeness.
(1)AAE(average absolute error):平均絕對誤差,表示預(yù)測值與實際值之間的距離,在缺陷預(yù)測中表示預(yù)測的值與實際值之前的差值,其被定義為

(2)ARE(average relative error):平均相對誤差,表示預(yù)測的值與被測的實際值的比值,首先需要確定絕對誤差來計算相對誤差,具體的公式為

(3)Measure of Completeness:完整性測量,用來表示模型在預(yù)測過程中的完整程度,在軟件系統(tǒng)中,它是測量實際的缺陷值與預(yù)測缺陷值的一個比值.具體公式為

如果該值接近100%,表示這個模型可以接受,如果高于100%,表示該預(yù)測模型具有很高的假陽性率,需要額外的努力來修復(fù)錯誤,如果值小于100%,表示預(yù)測模型沒有預(yù)測到一些錯誤.
缺陷嚴(yán)重度預(yù)測主要是給開發(fā)人員反饋一個缺陷嚴(yán)重度的推薦列表,具體的評價指標(biāo)有:MAP、FPA、CE.
(1)MAP(mean acerage precision):平均精度均值,表示每個類別的平均準(zhǔn)確率的平均值.預(yù)測出來的嚴(yán)重度高的缺陷模塊越靠前,MAP 就越高.具體公式為

其中,q表示類別,0 表示無缺陷,1 表示有缺陷.AP(q)表示不同查全率的點上的正確率的平均.
(2)FPA(fault percentile average):平均缺陷百分比,表示Topm模塊中實際缺陷占整個系統(tǒng)缺陷的比例的平均值[122].FPA 的值越大,表明排序越好.具體公式為

其中,k表示模塊的數(shù)量,ni表示根據(jù)預(yù)測的排序i模塊的實際缺陷數(shù),n表示k個模型總的缺陷數(shù).
(3)CE(cost effectiveness):成本效益,該指標(biāo)是基于源代碼行數(shù)的Alberg 圖的概念.在Alberg 圖中,X軸表示從排序模塊中選擇模塊的累積代碼行數(shù)百分比,Y軸表示選擇模塊發(fā)現(xiàn)缺陷數(shù)的累積百分比[134].CEπ(m)的取值范圍為[–1,1],該值越大,代表該模型效果越好.其計算公式為

其中,Areaπ(m)是被評價模型的曲線面積,Areaπ(random model)是隨機選擇方法的曲線面積,Areaπ(optimal model)是根據(jù)實際項目排序的曲線面積.
本文對收集的117 篇文獻中的性能評價指標(biāo)的使用次數(shù)進行了統(tǒng)計,得到的結(jié)果見表2,從表中可以看出,對于缺陷傾向性預(yù)測,經(jīng)常使用的性能評價指標(biāo)是:F-measure、Precision、Recall 及AUC.其中,Recall 為預(yù)測的實際有缺陷模塊的比例,當(dāng)該值很高時,表明實際有缺陷模塊被挖掘;F-measure 及AUC 為綜合評價指標(biāo),能夠權(quán)衡Precision 及Recall 之間的關(guān)系,當(dāng)二者都很高時,表明這個模型性能好,所以使用比較多.MCC 是同時考慮了4 個指標(biāo)的評價指標(biāo),所以在后期的實驗比較中,加入MCC 更具有說服力.

Table 2 The statistics of performance measures表2 性能評價指標(biāo)統(tǒng)計
軟件缺陷預(yù)測(SDP)在測試過程之前預(yù)測軟件缺陷,從而有助于更好地利用測試資源,保證軟件質(zhì)量(SQA).因此,軟件缺陷預(yù)測近年來吸引了研究人員的注意.本文總結(jié)了軟件缺陷預(yù)測的相關(guān)工作,如缺陷度量元、數(shù)據(jù)集問題、缺陷預(yù)測方法及性能評價指標(biāo).從整理分析的文獻中可以看出,大部分的工作都集中在使用公共數(shù)據(jù)集的面向?qū)ο蠖攘吭瓦^程度量元上,而且主要是利用機器學(xué)習(xí)和統(tǒng)計方法來進行缺陷傾向性預(yù)測;在數(shù)據(jù)質(zhì)量問題上,高維度和類不平衡問題得到了廣泛的研究;大部分的工作是使用F-measure、Precision、Recall 及AUC等指標(biāo)來評估模型的性能.當(dāng)然,軟件缺陷預(yù)測模型還存在著大量值得進一步研究的問題.
(1)基于演化的缺陷預(yù)測模型值得關(guān)注
目前,大多數(shù)的軟件缺陷預(yù)測模型都是基于需求、設(shè)計等的文檔和代碼等相關(guān)的度量元,但是,軟件產(chǎn)品為了適應(yīng)需求的變化,不斷演化.在每次演化的過程中,一方面可能由于新增需求而新增加類代碼,另一方面可能由于需求變化而變動已有的類代碼,這些變更都會相應(yīng)地引入新的缺陷.因此,需要根據(jù)軟件產(chǎn)品的演化軌跡,挖掘出一些與演化有關(guān)的度量元,完善演化度量元集,并應(yīng)用在缺陷預(yù)測模型中.
一方面,可以分析不同粒度的演化度量元對演化缺陷預(yù)測模型的影響.粗粒度一般考慮的是事務(wù)或者文件級別的變更,通常針對多個語句進行修改,所以,在該級別預(yù)測出引入的缺陷,無法準(zhǔn)確定位.細(xì)粒度一般是類或者語句級別,能夠更精確地定位缺陷,縮小測試和審查范圍.
另一方面,提取演化度量元時可以考慮開發(fā)人員的經(jīng)驗.有研究者指出,開發(fā)人員對軟件項目的熟悉程度關(guān)系到變更的質(zhì)量[135,136].因此,提取演化度量元時需要關(guān)注人的因素,需要分析開發(fā)人員的經(jīng)驗對演化缺陷預(yù)測模型的影響.
(2)缺陷數(shù)預(yù)測或缺陷嚴(yán)重度預(yù)測模型值得關(guān)注
大部分研究者對軟件缺陷傾向性預(yù)測進行了大量研究,只有少數(shù)研究人員專注于缺陷數(shù)或者缺陷嚴(yán)重度度量.但是,從軟件開發(fā)者的角度來看,他們更想知道哪個模塊有更多的軟件缺陷,而不是這個模塊有沒有缺陷.這樣,他們就可以盡早地快速識別大部分的缺陷.所以,需要構(gòu)建更多的缺陷數(shù)、缺陷嚴(yán)重度的預(yù)測模型,并對這些模型提供合理的評價指標(biāo).
一方面,目前的研究大都集中在使用邏輯回歸的方法進行預(yù)測.深度學(xué)習(xí)方法具有擬合任何復(fù)雜函數(shù)的特點,可以進行非常復(fù)雜的非線性映射.因此,可以將多種深度學(xué)習(xí)方法進一步引入到缺陷數(shù)或嚴(yán)重度的預(yù)測中,發(fā)現(xiàn)軟件內(nèi)部度量元與缺陷數(shù)或嚴(yán)重度的非線性映射,從而形成具有良好效果的預(yù)測模型.
另一方面,目前的缺陷預(yù)測模型的評價指標(biāo)多集中在缺陷傾向性模型的評價上,缺陷數(shù)和缺陷嚴(yán)重度的評價指標(biāo)較少,而且目前的評價指標(biāo)大多是從缺陷的個數(shù)加以考慮,因此,設(shè)計出更合理的綜合評價指標(biāo)更有意義.
(3)異構(gòu)缺陷預(yù)測模型值得關(guān)注
傳統(tǒng)的缺陷預(yù)測模型需要源項目和目標(biāo)項目具體同分布,即只能進行同項目之間的預(yù)測.但在公司的早期,沒有這么多的歷史數(shù)據(jù),所以需要使用不同項目或者不同公司的歷史數(shù)據(jù)來構(gòu)建異構(gòu)缺陷預(yù)測模型.
一方面,需要進一步引入異構(gòu)遷移學(xué)習(xí)領(lǐng)域內(nèi)的最新研究成果,轉(zhuǎn)換特征集,縮小兩者之間的差異,構(gòu)建效果好的異構(gòu)缺陷預(yù)測模型.
另一方面,研究不同的轉(zhuǎn)換方向?qū)Ξ悩?gòu)缺陷預(yù)測模型的影響.在進行轉(zhuǎn)換時可以是源域向目標(biāo)域靠近,也可以是源域和目標(biāo)域轉(zhuǎn)變到共同的特征空間集,具體哪種方式可以得到更好的性能需要進一步加以研究.
(4)私有/商業(yè)項目的數(shù)據(jù)脫敏問題
目前,大部分的缺陷預(yù)測模型的研究是基于公共數(shù)據(jù)庫的,因為私有/商業(yè)項目涉及到公司內(nèi)部隱私問題,不能公開,但是公共數(shù)據(jù)庫和各個公司內(nèi)部的某些度量元可能會不同,所以,可以對某些私有/商業(yè)的項目進行去隱私化處理,這樣既能進行缺陷預(yù)測,也能不泄露內(nèi)部機密.Peters 等人[126]在這方面已進行了一些研究,提出了CLIFF+MORPH 的方法來去除隱私化.目前對該問題的研究工作較少,若能對該問題進行深入研究,則可以給商業(yè)項目提供更好的缺陷預(yù)測模型.