張 肖,王黎明
(鄭州大學 信息工程學院,鄭州 450001)
隨著社會的發展,軟件的多樣性以及普遍性已經滲入到人們的生活中,軟件的可靠性是人們進行日常交易的重要保證,導致軟件系統不可靠的主要原因之一是軟件缺陷[1].軟件缺陷預測分為動態缺陷預測和靜態缺陷預測,靜態軟件缺陷預測是指在不運行程序的情況下,根據軟件的歷史開發數據以及已發現的缺陷,借助機器學習等方法來預測軟件系統中的缺陷數目和類型等[2].
在軟件缺陷預測中,標記樣本難以獲取,無標記樣本數量較多且容易收集.半監督學習利用標記樣本訓練模型,同時利用未標記樣本加強學習過程,不僅提高了分類器的性能,而且使標記樣本匱乏的問題得以緩解.在軟件測試中,80%的缺陷集中分布于20%的模塊內,因此軟件缺陷數據集是高度類不平衡的[3].集成方法[4]、代價敏感方法[5]以及抽樣方法[6]是解決分類不平衡問題的有效途徑.
為了解決標記樣本較少以及分類不平衡問題對預測模型造成的影響,提出一種基于半監督集成學習算法的軟件缺陷預測模型.將半監督Tri_training算法應用到集成學習算法AdaBoost中對缺陷數據集進行分類預測.預測算法分為兩個階段:
1) 利用Tri_training算法以及欠采樣方法對無標記樣本進行標記,將新標記的樣本添加到已標記樣本中形成標記樣本集.
2)利用SMOTE算法對新的標記樣本集進行采樣,再使用AdaBoost集成學習方法對采樣后的標記樣本集進行預測.
在第一階段中,半監督算法可以充分利用無標記樣本解決標記樣本不足的問題,在第二階段中,集成算法能更好的解決分類不平衡的問題,并且能取得較好的預測效果.
半監督學習能夠充分利用少量的有標記樣本和大量的未標記樣本提高分類模型的性能,而集成學習通過對幾個分類器的組合能夠有效提高分類器的泛華性能,同時也能有效解決分類不平衡的問題.因此,很多半監督學習和集成學習方法已經被廣泛應用于軟件缺陷預測領域.
文獻[7]對Tri-training算法進行了改進,將隨機下采樣方法與Tri-training進行結合,有效的降低了分類不平衡和標記樣本不足對預測模型性能的影響.文獻[8]等人研究利用了樸素貝葉斯方法建立了半監督缺陷預測模型,其結果表明樸素貝葉斯算法是構建小規模數據集半監督缺陷預測模型的最佳選擇,提出的兩階段YATSI方法可以提高樸素貝葉斯在大規模數據集上的性能.文獻[9]提出了一種迭代的半監督方法FTF,首先使用模型為所有的未標記實例設置標簽,以確保樣本中所有的實例都帶有標簽,然后在整個數據集上實現經典的監督過程.結果表明,與傳統的監督方法相比,FTF有比較明顯的優點.文獻[10]利用期望最大化(Expectation Maximization,EM)算法對半監督學習進行研究,使用有限的缺陷傾向性數據評估軟件質量.實驗表明,基于EM的半監督分類提高了軟件缺陷預測模型的泛化性能. 此外,半監督軟件缺陷預測模型通常會產生比利用已知故障傾向性模塊訓練的決策樹模型更好的性能.
集成學習方法通過構建并結合多個分類器進行訓練和分類,其泛化性能通常會優于單個分類器的性能.文獻[11]提出一種基于軟件度量元的集成KNN軟件缺陷預測方法,實驗結果表明集成KNN缺陷預測模型的性能與廣泛采用的預測方法相比有明顯的提高.文獻[12]提出一種分類不平衡影響分析方法,設計了一種新的數據集構造算法,將原不平衡數據集轉化為一組不平衡率依次遞增的新數據集,實驗結果表明代價敏感學習和集成學習在分類不平衡時的性能更優.文獻[13]提出一種多分類不平衡的方法,將特征選擇與Boosting進行結合,實驗結果表明,所提出的算法分類精確率更高.
隨著半監督方法和集成方法的不斷發展,如何將二者結合應用到軟件缺陷預測中,成為一個值得探究的內容.文獻[14]提出一種基于半監督集成學習的軟件缺陷預測方法SSEL,利用軟件中大量存在的未標記樣本進行學習,并采用訓練樣本集權重向量更新策略提升模型的預測性能,實驗結果表明,SSEL模型具有較好的預測效果.文獻[15]提出一種基于非負稀疏圖的SemiBoost軟件缺陷預測方法NSSB,由標記數據、未標記數據、非負稀疏相似度矩陣組成一個提升框架,同時使用集成分類器Adaboost 提升模型的性能.實驗結果表明,NSSB方法能有效解決分類不平衡以及標記樣本不足的問題.文獻[16]提出一種基于搜索的半監督集成跨項目軟件缺陷預測方法S3EL,實驗結果表明,S3EL方法在多個公開數據集上與多種典型的跨項目缺陷預測方法相比均能獲得較好的預測性能,并且能有效提高樸素貝葉斯的預測能力.
上述方法大部分只針對軟件缺陷預測中存在的一個問題進行研究,即只研究標記樣本不足或者類分布不平衡的情況,綜合考慮兩種情況的研究還較少.而且,在軟件缺陷預測中,綜合利用Tri_training方法、采樣方法與集成方法的研究還相對較少.本文創新性地將半監督Tri_training方法與集成AdaBoost方法進行結合,同時在預標注樣本的過程中加入欠采樣方法,并且在對新樣本進行預測之前加入SMOTE過采樣方法.半監督方法能有效利用未標記樣本提升分類器的預測性能,而采樣方法與集成方法在解決分類不平衡問題方面能取得較好的效果.結合這些方法的優勢對軟件缺陷的傾向性進行分類預測,從而有效提高分類模型的性能.
軟件缺陷預測是一個二分類問題,其分類結果可以分為有缺陷模塊和無缺陷模塊,通常使用機器學習方法構建軟件缺陷預測模型,如圖1所示.

圖1 基于機器學習的軟件缺陷預測過程
圖1展示了靜態軟件缺陷預測的一般過程,其中預測模型通常使用機器學習方法構建.基于機器學習的軟件缺陷預測過程如下:
1)數據獲取:在獲取缺陷數據的過程中,首先利用版本控制系統以及缺陷跟蹤系統對軟件歷史倉庫中的項目進行屬性度量,然后對數據進行歸一化、過濾等數據預處理操作.
2)特征選擇:數據規模過大會對分類結果產生一定的影響,選擇合適的特征數據集有助于減少計算量并且能提升分類模型的性能.
3)缺陷預測:使用經過調整后的分類模型對每個新的測試模塊進行預測,輸出結果為True或者False,開發人員可以根據預測結果對缺陷模塊進行檢查并修改.
假設L={(x1,y1),(x2,y2)…(xl,yl)}表示有標記樣本集,U={xl+1,xl+2,…,xu+l}表示無標記樣本集.x?X代表軟件模塊,x由一組軟件度量元m={d1,d2,d3,…,dn}(di∈Rd)組成.y代表與模塊相對應的缺陷標記,其中Y={true,false},true表示有缺陷模塊,false表示無缺陷模塊.假設缺陷模塊數為D,無缺陷模塊數為N.則軟件系統中缺陷率和不平衡率定義如下:
定義1.(缺陷率)軟件系統的缺陷率DP為缺陷模塊數與總模塊數的比值:
(1)
定義2.(不平衡率)軟件系統中的不平衡率IP為無缺陷模塊數與有缺陷模塊數的比值:
(2)
從缺陷率以及不平衡率的定義中能夠看出,缺陷模塊數越多,缺陷率就越高,數據集的不平衡程度就越小.
軟件缺陷預測結果一般分為有缺陷和無缺陷兩類,并沒有具體到某一種缺陷類別.為了更深入的探究軟件缺陷預測模型能否對具體缺陷類別的數據集進行預測,本文使用兩種類型的數據集對模型進行驗證.一種是NASA MDP數據集,另一種是基于開源項目的包含有空指針引用缺陷的數據集.
空指針引用缺陷(Null Pointer Defect,NPD)是一種常見的代碼級別的缺陷.文獻[17]將空指針引用缺陷定義為:引用了可能為null的變量.以java語言為例,其產生的主要原因如下:
1)當一個對象不存在時,調用其方法會產生異常,比如object是一個不存在的對象,當調用object.method時會產生空指針異常.
2)當訪問或修改一個對象不存在的字段時會產生異常.比如method對象不存在,則訪問object.method時會產生空指針異常.
本文初次嘗試針對特定的缺陷類別進行探究.以java開源項目為例,使用靜態分析工具SourceMonitor和缺陷檢測工具Findbugs對項目中的缺陷進行檢測,將檢測結果分為:空指針引用缺陷(NPD)模塊、無缺陷(No)模塊.經Findbugs檢測后的開源項目缺陷數量極少,其缺陷率均低于5%,同時這些缺陷中包含多種不同類別的缺陷.由于本文只針對空指針缺陷進行研究,因此提出一種將空指針引用缺陷注入開源項目中的方法.將原缺陷數據集轉化為只含有一種空指針缺陷類別的數據集.其處理過程如圖2所示.

圖2 空指針缺陷數據集生成過程Fig.2 Generation process of null pointer defect datasets
為模擬實際項目中不平衡程度較低和較高兩種情況,將實驗選取的兩個開源項目中的空指針引用缺陷率設定為P,P取兩個不同的值P1和P2,P1和P2的范圍分別設定為:0< P1<10%,10%< P2<20%.引入空指針缺陷的算法如下:
算法1.空指針缺陷數據集構造算法
輸入:SourceDataSet -開源項目數據集
輸出:New SourceDataSet -含有空指針引用缺陷的開源項目數據集
1.將SourceDataSet分為Defect、NoDefect、NullDefect //將源數據集分為缺陷、無缺陷、空指針缺陷數據集
2.DNum=Defect.size() //有缺陷樣本數
3.NNum=NoDefect.size() //無缺陷樣本數
4.NPDNum= NullDefect.size() //空指針缺陷樣本數
5.OtherNum= DNum- NPDNum //非空指針的其他缺陷樣本數
6.DNum= NPDNum +OtherNum //項目中的缺陷數為空指針缺陷數量和非空指針缺陷數量的和


9.P=Pi(i=1,2) //設定注入空指針后總的空指針缺陷率為P
10.if (Dp<=P) //開源項目中的缺陷率小于設定的P值
11. if (Defect has noNPD) //缺陷數據集中沒有空指針缺陷
12. add Dpand P-DpNPD into Defect and NoDefect //將一定比例的空指針缺陷注入缺陷和無缺陷數據集中
13. end if
14. else if (Defecthas NPD)
15. add (P- NPDp) NPD into Defect and NoDefect
16. end if
17.end if
18.if (Dp>P) //開源項目中的缺陷率大于設定的P值
19. if(Defecthas no NPD)
20. add PNPD into Defect
21. delete (Dp-P) NPD //刪除Dp-P比例的空指針缺陷
22. end if
23. if(Defect has NullDefect and P>=NPDp)
24. add (P- NPDp) NPD into Defect
25. end if
26.end if
27.更新數據集 New SourceDataSet
在算法第12、15、20、24步中注入空指針引用缺陷數據集時,選擇符合以下規則的模塊進行添加:根據開源項目中代碼的特征及結構,選擇源代碼中被賦值為null的對象并注入空指針缺陷.在Java中每個類都默認繼承Object類,除非聲明繼承某個類.而Object類中有一個叫做toString的方法.該方法返回的是該Java對象的內存地址經過哈希算法得出的int類型的值再轉換成十六進制.這個輸出的結果可以等同的看作Java對象在堆中的內存地址.比如有如下代碼,
(1) if (arg == null)
sb.append("nil");
else
return 0;
則將引入空指針后的代碼改為:
(2) if (arg == null)
arg.toString();
sb.append("nil");
else
return 0;
以上述方式引入的空指針引用缺陷不會破壞代碼的整體結構和功能,同時Findbug能夠報告出空指針異常,以此使更新后的實驗數據集更具有真實性.
Tri-training算法由Zhou and Li[18]提出,是對1998年A.Blum和T.Mitchell[19]提出的協同訓練算法Co-training的改進.Co-training算法要求數據集有兩個充分冗余的視圖,但是在實際應用中很難達到這一要求.Tri-training算法不要求充分冗余視圖、也不要求使用不同類型的分類器,因此其適用范圍更加廣泛.Tri-training算法使用投票法將三個分類器進行組合之后對未標記樣本進行預測,投票法能有效減少不相關特征和冗余特征對預測模型性能的影響.
Tri-training算法擴充標記樣本時,首先由其中任意兩個分類器h1和h2對任意一個無標記樣本x∈U進行標記.如果兩個分類器對x的標記結果相同,則將其中一個標記結果作為分類器h3的訓練樣本,即:h1(x)=h2(x),則將Li={ (x,h2(x))},x∈U加入h3的訓練集中.
h3在訓練的過程中若能達到較高的準確度,則訓練結果會得到優化;反之,會將噪聲引入h3的訓練集中,降低分類器的標記性能.基于此,Zhou等人[18]作出如下證明:
(3)
在PAC可學習框架下,如果新標記的訓練樣本足夠多并且能夠滿足公式(3)中的條件,那么h3再次進行訓練時所得假設的分類性能會提高.其中,
Lt:第t次迭代時h1、h2為h3新標記的訓練樣本

ηL:初始訓練集L的噪聲率
第t輪迭代后的分類噪聲率可由如下公式表示:
(4)

(5)
因此,公式(3)可變換如下:
(6)
對標記樣本進行擴充的過程中,可用公式(6)判斷經分類器h1和h2標記的樣本{x,h2(x)}能否加入分類器h3中作為新一輪的訓練樣本.
由于Tri-training對樣本進行預標注時需要使用少量的標記樣本和大量的未標記樣本,但是標記樣本不僅數量少,而且也是分類不平衡的.為了提高預標注樣本的準確率,在Tri-training算法中加入欠采樣方法.通過隨機刪除訓練集中的無缺陷樣本提升預標注樣本的準確率.欠采樣方法的偽代碼如下:
算法2.UnderSampling算法
輸入:訓練數據集S
輸出:采樣后的訓練集S_deal
1.正類樣本集Y,負類樣本集N,S=Y+N
2.for xi∈N do
3. for xj∈N do
4. for xk∈S do
5. Find=false
6. if d(xi,xk) 7. Find=true 8. break 9. end if 10. end for 11. if (Find==true) 12. delete xj//刪除多數類樣本 13.end if 14. end for 15.end for 16.更新數據集S,S_deal=S SMOTE(Synthetic Minority OverSampling)算法由Chawla在2002年提出[20].SMOTE是基于隨機過采樣算法的一種改進方案,其基本思想是對少數類樣本進行分析并根據少數類樣本人工合成新樣本添加到數據集中.由于經過擴充后的樣本依然是一個不平衡的數據集,因此,為了提高預測模型的性能,在對新數據集進行分類預測之前,使用SMOTE算法對其進行采樣. AdaBoost(Adaptive Boost)算法由Freund和Schapire在1996年提出[21].AdaBoost是一種集成學習算法,集成學習就是通過綜合多個分類器的預測結果來提高分類準確率.該算法的核心思想是針對同一個訓練集訓練不同的弱分類器,它根據每次訓練集中每個樣本的分類是否正確,以及樣本的分類誤差,來確定下一次迭代時每個樣本的權值.最后將每次訓練得到的分類器按一定的權重融合到一起,形成強分類器并將其作為最終的決策分類器. AdaBoost算法使用加法模型,如公式(7)所示.損失函數為指數函數,如公式(8)所示.學習算法使用前向分步算法,強學習器通過前向分步算法得到. 加法模型: (7) 損失函數: Ly,f(x)=exp(-yf(x)) (8) AdaBoost能夠提高分類的準確性可能有如下兩個原因: 1)通過將具有較高誤分類率的分類器進行組合,減少了最終分類器的誤分類率.Freud在文獻[22]中證明:假設AdaBoost每一輪迭代中生成的子分類器錯誤率分別為:1,2,…,R,,則集成分類器H的訓練錯誤率有上界: (9) 2)最終組合分類器的方差小于弱分類器的方差. 結合半監督算法Tri_training與集成算法Adaboost的優勢,對AdaBoost算法進行改進,提出一種新的分類算法Tri_AdaBoost(Tri_training and Adaboost).該算法隨機選取一部分未標記數據,利用Tri-Training算法以及欠采樣方法對未標記數據集進行預標注,將預標注的數據集擴充到原始的已標記數據集中形成新的標記樣本;再利用SMOTE算法對新的樣本集進行采樣,然后使用采樣后的數據集訓練AdaBoost分類器;最后,對測試集進行預測并分類.Tri_AdaBoost預測模型如圖3所示. 在集成算法AdaBoost中,隨著分類器的增加,損失函數會逐漸減小,即偏差會越來越小,方差逐漸增大.因此與構成AdaBoost的基礎分類模型相比,AdaBoost更容易過擬合,但是當構成AdaBoost的基分類模型比較簡單時,AdaBoost模型很難發生過擬合,因此本文將單層決策樹DecisionStump作為基礎分類器.使用SMOTE方法對新數據集進行采樣時,過采樣倍率N設置為1,k值取5. Tri_AdaBoost分類算法步驟如算法3所示. 算法3.Tri_AdaBoost算法 輸入:有標記訓練集L={(x1,y1),(x2,y2)...(x1,y1)},無標記訓練集U={(xl+1),(xl+2)...(xl+u)},監督學習算法Learn 1.S_deal=L+U 2.UnderSampling (L) →L′ 3.Bootstrap(L′) → L1′,L2′,L3′ 4.use Learn and L1′,L2′,L3′ train classifier h1,h2,h3 5.e1′=e2′= e3′=0.5,l1′= l2′= l3′=0 6. repeat training h1,h2,h3 8.fori{1…3} do 9.ei←MeasureError(hj&hk)(j,k≠i) 12. end if 13. untilhjno longer changes 15.end for 17.SMOTE(D,N,k) //D為正類樣例數目,N為采樣倍率,k為最近鄰數 18.L={Lj=1/n′| j=1,2,…,n′} //設置標記樣本L中每個樣本的權值,經SMOTE采樣后的標記樣本數量設為n′ 19.for i=1 to T do // T表示迭代次數 20. train weak classifier ht 23.end for 圖3 Tri_AdaBoost分類模型的過程Fig.3 Process of Tri_AdaBoost classification model 實驗數據集由兩部分組成. 1)選取開放軟件缺陷數據庫PROMISE庫[23]中4個項目的缺陷數據集進行實驗,分別是:PC1,PC3,PC4,KC2,這些數據集均由美國航空航天局(NASA)提供.項目分別采用C語言或java語言實現,其中包含了對數據集中各模塊有缺陷或者無缺陷標注情況的描述以及對數據集的屬性說明,數據集中的屬性由McCabe、Halstead等度量方法生成,McCabe、Halstead能客觀的表征與軟件質量相關聯的質量特征.表1給出了4個項目的基本信息,包括項目名稱、度量元個數、模塊總數、缺陷模塊數以及缺陷率. 表1 NASA MDP數據集基本信息Table 1 Basic information of NASA MDP datasets 2)使用Findbugs缺陷檢測工具對aTunes、Nutch兩個開源項目進行檢測,經過分析總結之后其缺陷數據集信息如表2所示,經過算法1更新后的實驗數據集如表3所示. 表2 開源項目數據集基本信息 表3 更新后的開源項目數據集基本信息Table 3 Basic information updated open source project datasets 表4 混淆矩陣 軟件缺陷預測的結果可以用含混矩陣表示.如表4所示,以TP、TN、FP、FN表示分類結果.TP表示被正確分類的正類樣本,TN表示被正確分類的負類樣本,FP表示實際為負類的樣本被錯誤分類為正類樣本,FN表示實際為正類的樣本被錯誤分類為負類樣本.預測結果為正類則表示模塊是有缺陷的,預測結果為負類則表示模塊是無缺陷的. 為了有效評價分類器的性能及分類不平衡對分類結果的影響,采用召回率、精確度、F-measure值、準確率和AUC值5個評價指標對實驗結果進行分析.AUC作為數值可以直觀的評價分類器的性能,是用來衡量缺陷預測模型好壞的一個標準.各評價指標可表示如下: 1)召回率(Recall):被模型正確預測的正類樣本占實際總的正類樣本的比例 (10) 2)AUC:受試者工作特征(Receiver Operating Characteristic,ROC)曲線下方的面積.ROC曲線的橫坐標為FPR (false positive rate),即實際為負類的樣本被錯誤分類為正類的樣本占實際總的負類樣本的比例.縱坐標為TPR (true positive rate),即被正確分類的正類樣本占實際總的正類樣本的比例.ROC曲線越接近左上角,代表結果越好.即AUC值越大,分類器性能越好. 3)準確率(Accuracy):被模型正確分類的樣本(正類和負類)占實際總樣本數的比例 (11) 4)精度(Precision):被模型正確分類的正類樣本占被正確分類的正類樣本與被錯誤分類的負類樣本和的比例 (12) 5)F-measure:召回率和精度有時候會出現矛盾的情況,這樣就需要綜合考慮二者.最常見的方法是F-measure,它是召回率和精度的加權調和平均值.F-measure值較高時,說明模型性能較好. (13) 本節分別對NASA MDP數據集和基于開源項目生成的空指針缺陷數據集進行分析.選取J48、NaiveBayes兩種經典機器學習方法[24]以及Adaboost、RandomForest兩種集成學習方法與Tri_Adaboost算法進行對比,實驗所用對比方法的運行參數均取weka中的默認值. 本文實驗設置如下,將每一個數據集按照3∶2的比例劃分成訓練集和測試集,再根據特定的標記率L將訓練集劃分成有標記樣本和無標記樣本,本文將L的標記率分別設定為0.2、0.3、0.4三種.對于本文的方法以及選用的對比方法采取10折交叉驗證的方式重復進行10次實驗.比如,對于Tri_Adaboost方法,假設數據集中有100個數據樣本,從這些樣本中隨機選取60個樣本作為半監督階段的訓練集,對其余的40個樣本進行標記,最后對所有帶標記的樣本進行10折交叉驗證,選取其中9份作為訓練集,1份作為測試集. 5.3.1 NASA MDP數據集實驗結果及分析 如表5所示為各分類模型在NASA MDP數據集上的實驗結果. 從表5中可以看出,在3種標記率下進行的共60次評估結果中,半監督集成學習算法(Tri_Adaboost)共獲得52次最優值,占比86.7%.其中, 1)在PC1數據集上,與其他四種方法相比,Tri_Adaboost方法在三種標記率下均獲得最優值. 2)在PC3數據集上,雖然Tri_Adaboost方法不能一直獲得最優值,但是其Accuracy和Recall值與其他幾種方法的差值最大分別為0.033(0.878-0.845)、0.126(0.690-0.564),依然能得到與對比方法可比的結果.由于三種標記率下,Tri_Adaboost在AUC以及F-measure上均獲得最優值.因此,總體來說,Tri_Adaboost的預測性能優于其他四種方法. 3)在PC4數據集上,Tri_Adaboost方法在Accuracy和Precision上不能一直獲得最優值,但是其AUC以及F-measure值均高于對比方法.因此,Tri_Adaboost的預測性能依然優于其他四種方法. 4)在KC2數據集上,Tri_Adaboost方法在三種標記率下均獲得最優值.從平均值能夠看出,Tri_Adaboost方法在各個評價指標上的均值都高于其他幾種方法. 圖4 各方法在三種標記率下的F-measure平均值Fig.4 F-measure mean of each method under three mark rates 圖5 各方法在三種標記率下的AUC平均值Fig.5 AUC mean of each method under three mark rates 為了更直觀的看出各分類模型的分類效果,以折線圖表示各分類模型在幾種標記率下的F-measure和AUC平均值.從圖4和圖5中可以看出,與其他幾種方法相比,Tri_Adaboost方法的F-measure和AUC最優.同時,其F-measure和AUC值分別至少提高了0.344(0.779-0.435)、0.099(0.952-0.853).結合表5中的實驗結果可以得出,標記樣本的擴充以及未標記樣本的使用在一定程度上能提升預測模型的性能,Tri_Adaboost方法是一種有效的半監督集成學習方法,并且具備比其他幾種方法較強的學習能力. 5.3.2 基于開源項目下的空指針引用缺陷數據集實驗結果及分析 如表6所示為各分類方法在引入空指針缺陷數據集后的實驗結果. 從表6中可以看出,Tri_Adaboost在大部分情況下的評價指標值都高于其他方法.aTunes和Nutch在三種標記率下的AUC值都高于其他方法,即使在Nutch的不平衡率較高的情況下,本文的方法依然能獲得較高的AUC值,說明Tri_Adaboost方法能有效的解決分類不平衡的問題.同時,aTunes和Nutch在三種標記率下的F-measure值均優于對比方法,說明本文所提出的模型性能較好. 表5 不同樣本標記率下各分類方法在NASA MDP數據集上的實驗結果Table 5 Experimental results of various classification methods on NASA MDP datasets under different sample labeling rates 表6 不同樣本標記率下各分類方法在開源項目數據集上的實驗結果Table 6 Experimental results of various classification methods on data setsof open source projects under different sample mark rates 以折線圖表示各分類方法在兩個空指針缺陷數據集上的F-meausre和AUC平均值.從圖中可以看出,與其他幾種方法相比,Tri_Adaboost方法在兩個評價指標上的平均值能獲得最高值.因此,在空指針引用缺陷數據上的實驗結果依然能表明本文方法的有效性. 針對軟件缺陷預測中標記樣本難以獲取以及類別分布不平衡的情況,本文提出了一種基于半監督Adaboost集成方法的軟件缺陷預測模型,將Tri_training與AdaBoost兩種算法進行結合形成一種新的分類框架.同時在擴充標記樣本的過程中加入欠采樣方法,以降低Tri_training標記樣本時的錯誤率;在分類預測之前,對擴充樣本集進行SMOTE采樣,以降低新樣本集的不平衡率,提升模型的性能.實驗中除使用NASA MDP數據集進行驗證外,首次嘗試使用基于開源項目生成的空指針引用缺陷數據集進行了實驗. 圖6 各方法在三種標記率下的F-measure平均值Fig.6 F-measure mean of each method under three mark rates圖7 各方法在三種標記率下的AUC平均值Fig.7 AUC mean of each method under three mark rates 從實驗結果可以看出,本文提出的Tri_AdaBoost方法在不同比例的標記樣本下的預測效果均優于J48、NaiveBayes、Adaboost以及RF.下一步工作的重點將探究度量元對軟件缺陷預測的影響,并且將嘗試加入其它類別的軟件缺陷進行實驗,同時會進一步探究無監督方法與集成方法或者半監督方法與Bagging等集成方法的結合對軟件缺陷預測模型的影響.4.3 Tri_AdaBoost分類模型
4.4 Tri_AdaBoost分類算法






5 實 驗
5.1 數據集




5.2 評價指標
5.3 數據集實驗結果及分析



6 結束語

