王文彪,張春英,馬英碩
(1. 華北理工大學 理學院,河北 唐山 063210;2. 河北省數(shù)據(jù)科學與應用重點實驗室,河北 唐山 063210;3. 唐山市工程計算重點實驗室,河北 唐山 063210)
人工智能時代背景下,對于軟件行業(yè)來說軟件缺陷預測是驗證軟件質量的一個有效途徑[1]?;跈C器學習的軟件缺陷預測是一個二分類問題,是對軟件“有缺陷”與“無缺陷”的判定[2]。同時,機器學習方法是利用歷史軟件缺陷數(shù)據(jù)進行一次性建模[3]。與傳統(tǒng)的人工測試方法相比,在軟件行業(yè)中利用機器學習方法測試軟件是否有缺陷,不僅提高了效率,還節(jié)省了不少的人力和財力[4]。在這種高效率的驅動下,軟件缺陷技術得到了很大的發(fā)展。然而,軟件每天都在產生大量的數(shù)據(jù)。面對與日俱增的“新數(shù)據(jù)”,傳統(tǒng)的機器學習方法需要重新進行多次建模,即使在耗費時間的情況下也難以保證較好的效果。因此,有研究者提出了增量式機器學習,以解決現(xiàn)有軟件缺陷預測中存在的問題[5]。
集成式增量學習注重對海量數(shù)據(jù)的全面的學習。例如典型的Learning++算法[6-10],這種算法的主要思想是在保留所有數(shù)據(jù)的前提下基于基模型對數(shù)據(jù)進行訓練,由于Learning++算法保留了“之前數(shù)據(jù)”與“新增數(shù)據(jù)”,而“新增數(shù)據(jù)”與“之前數(shù)據(jù)”存在類不平衡問題,這種算法未對數(shù)據(jù)的不平衡進行處理,只是對基模型的簡單集成,因此直接影響到了分類器的分類效果。
針對上述問題,提出了類不平衡的緩解方法SCS算法(Class Imbalance Mitigation Algorithms),以時間序列為前提獲取軟件數(shù)據(jù)流,將過采樣技術與代價敏感技術相結合,以此提升預測模型對潛在缺陷數(shù)據(jù)的搜索范圍。通過實驗比較,表明該方法可有效提升算法的分類精度,在召回率指標上表現(xiàn)優(yōu)異。
代價敏感學習是通過給不同類型的樣本賦予不同的權值,使其能夠進行機器學習[11-19]。在常規(guī)的學習任務中,樣本的權重基本相同,但在一些特殊的任務中,也可以對樣本賦予不同的權重。對風險控制和入侵檢測來說,這2種類型的數(shù)據(jù)都存在著嚴重的不均衡性,比如風險控制模式[20],算法重點放在壞人的分類上,增加壞人的查全率,但是也可能把好用戶分類為壞用戶,降低壞用戶分類的查準率。
在軟件故障的歷史資料中[21],只有少量的故障數(shù)據(jù)和大量的無故障數(shù)據(jù),即存在著嚴重的不平衡。對不均衡的數(shù)據(jù)直接訓練,得出的預測結果會對大部分的小類別數(shù)據(jù)產生較大的偏差,導致預測效果不佳。由于分類誤差在實際中的影響很難估計,故采用成本敏感技術來減輕這種不均衡[22]。
代價敏感性技術是由于算法對目標項的錯誤分類成本不同而導致的[23]?;谧畲箢惖乃惴ê突诔杀久舾行约夹g的分類誤差成本,通過調整2種分類結果的不同權值,實現(xiàn)了少類和多類的均衡。表1所示為軟件缺陷預測問題的代價矩陣。
表1中的C(x1,x2)為代價因子表達式,x通過符號“1”,“0”表示,“1”表示軟件模塊有缺陷,“0”表示軟件模塊無缺陷。當x1=x2時,代價表達式α為0,即預測結果正確;當x1≠x2時,說明預測結果錯誤,文獻[24]最早提出在軟件缺陷預測中不同的分類錯誤造成的代價是不同的,當把缺陷模塊預測為無缺陷時,則此缺陷在軟件中一直存在,使得軟件不可靠;當把無缺陷模塊預測為有缺陷,會導致無用測試,浪費資源,但不會有致命的損失,所以有代價表達式C(1,0)>C(0,1)C(1,0)>C(0,1)。當α= 1 時,表示錯誤分類的代價相等,當α> 1時,表示將有缺陷模塊預測為無缺陷的代價要高。其中C(1,0)表示將有缺陷模塊預測為無缺陷,C(0,1)表示將無缺陷模塊預測為有缺陷。
當分類器錯分時,設代價函數(shù):F(x)=P{(x,1)}*C(0,1)+P{(x,0)}*C(1,0)其中代價函數(shù)F(x)表示對軟件模塊x進行缺陷預測的期望代價,對于模塊x,最小化F(x)等同于選擇最優(yōu)的缺陷預測分類結果,P{(x,i)}表示把模塊x預測為i類的概率;C(x1,x2)表示代價矩陣中對應模塊的代價因子表達式。
SMOTE算法的思想是合成新的少數(shù)類樣本,合成的策略是對每個少數(shù)類樣本a,從它的最近鄰中隨機選一個樣本b,然后在a、b之間的連線上隨機選一點作為新合成的少數(shù)類樣本[25]。圖1所示為SMOTE過采樣示意圖。
圖1 SMOTE采樣示意圖
對于少數(shù)類中每一個樣本x,以歐氏距離為標準計算它到少數(shù)類樣本集中所有樣本的距離,得到其k近鄰。
根據(jù)樣本不平衡比例,設置一個采樣比例以確定采樣倍率N,對于每一個少數(shù)類樣本x,從其k近鄰中隨機選擇若干個樣本,假設選擇的近鄰為xn。對于每一個隨機選出的近鄰xn,分別與原樣本,按照如下的公式構建新的樣本。
xnew=x+rand(0,1)×(xn-x)
(1)
類不平衡緩解算法SCS(Class Imbalance Mitigation Algorithms)以時間序列為前提獲取軟件數(shù)據(jù)流,融合過采樣與代價敏感技術,構建代價敏感與過采樣的增量模型,提升預測模型對潛在缺陷數(shù)據(jù)的搜索范圍。
軟件數(shù)據(jù)窗口通過設定的過采樣技術緩解軟件數(shù)據(jù)窗口中的類不平衡問題,最終得到用于訓練基分類器的軟件數(shù)據(jù)窗口。SCS算法通過對軟件數(shù)據(jù)進行采樣后訓練基分類器加入集成模型之后完成對集成模型的更新。SCS算法框架流程如圖2所示。
圖2 算法流程圖
(1)軟件數(shù)據(jù):軟件數(shù)據(jù)以數(shù)據(jù)流的形式到達,設置存儲空間保留數(shù)據(jù)流,并統(tǒng)計數(shù)據(jù)流數(shù)量,當存儲空間到達閾值M時完成其中一個數(shù)據(jù)塊的構建。
(2)代價敏感權重設置:普通基分類器對于數(shù)據(jù)分布不平衡的情況沒有較好的處理效果,所以SCS算法中通過設置敏感代價因子,將不同類型的樣本數(shù)據(jù)賦予不同的權重,重點關注分類錯誤但損失大的樣本,來減緩權重的遞減速度,從而達到更好的分類效果。
(3)進行采樣:因為軟件數(shù)據(jù)流具有隨機性與不平衡性,因此基于時間序列構建的數(shù)據(jù)塊中正類樣例和負類樣例的占比嚴重失衡,為緩解不平衡數(shù)據(jù)集給分類模型帶來的困擾,SCS算法中引入Smote過采樣使得正類樣例與負類樣例占比相等。對于少數(shù)類的每一個樣本x計算其與少數(shù)類樣本集中其他所有樣本的歐式距離,并隨機選出近鄰xn,與原樣本構建新的樣本。
(4)訓練基分類器加入集成模型:數(shù)據(jù)塊隨著數(shù)據(jù)流的不斷產生而持續(xù)增加,利用采樣后的數(shù)據(jù)塊直接訓練基模型,若基分類器的數(shù)量小于集成模型中的基分類器數(shù)量閾值M時,訓練結束的基分類器可直接加入集成模型中。
(5)完成集成模型更新:當集成模型中基分類器個數(shù)等于閾值M時,每當有最新的基分類器加入,則刪除最原始的基分類器,保證集成模型中的基分類器數(shù)量始終等于閾值M,完成更新。
(6)若存在數(shù)據(jù)流持續(xù)流入則重復操作,否則輸出集成模型。
在解決數(shù)據(jù)類不平衡問題上,從算法層面提出了代價敏感。在軟件缺陷預測中,將有缺陷數(shù)據(jù)誤判為無缺陷數(shù)據(jù)需要付出更大代價。因此,通過設置代價敏感因子對軟件數(shù)據(jù)集做平衡處理,在模型學習階段,選擇代價因子進行實驗,并采用十折交叉驗證方法對測試集進行驗證,得出最優(yōu)的軟件缺陷類不平衡采樣比例。通過代價敏感方法對數(shù)據(jù)集的不平衡處理可有效提升模型性能。
代價因子的取值與采樣比例的確定決定著模型的預測性能,為保證取值的科學有效性,分別設置代價因子α的取值實驗以及采樣比例的實驗。由于缺陷預測的準確率可直觀展示分類器的預測性能,因此選擇準確率作為參數(shù)確定的標準。
實驗1給出實驗中代價因子α的選擇過程。在采用SCS算法構建預測模型時,代價因子α≥1。當α=1時,表示錯誤分類的代價相等;當α>1時,表示將有缺陷模塊預測為無缺陷的代價要高。為了得到準確率較高的代價因子α,分段設置不同的α參數(shù),通過對比實驗,發(fā)現(xiàn)當α=30的時候,其獲得的準確率數(shù)值相對較高,所以選取α=30作為最終代價敏感因子。表2中所示為不同代價因子取值時所獲得的準確率數(shù)值。
同代價因子α的選擇過程一樣,在選擇采樣比例的時候也是通過對比實驗進行,發(fā)現(xiàn)當采樣比例1:1時,其準確率數(shù)值相對較高。實驗2給出不同采樣比例下,分類模型的準確率,具體詳細結果見表2所示。
表2 參數(shù)確定實驗
3.1.1實驗環(huán)境
操作系統(tǒng):Windons10;顯卡:GTX1060-4G;CPU:intel i7 9700r;內存:12G;硬盤:256G SSD;編譯環(huán)境:PyCharm2021.1.1;Python庫:Anaconda、Sklearn。
3.1.2評價指標
利用混淆矩陣對軟件缺陷預測中的評價指標進行定義,混淆矩陣如表3所示。
表3 混淆矩陣
(1)預測率PD(Probability of detection)
(2)
預測率PD和召回率的計算方式相同,它在一定程度上反應了尋找缺陷模塊的整體情況,當PD值越大時表現(xiàn)為預測模型發(fā)現(xiàn)缺陷模塊的能力越強;當PD值越小時表現(xiàn)為預測模型發(fā)現(xiàn)缺陷模塊的能力越弱。
(2)誤報率PF(Probability of alarm)
(3)
誤報率PF為把軟件中無缺陷模塊預測為缺陷模塊的數(shù)量占整體缺陷模塊個數(shù)的比例。當誤報率PF值越大時表現(xiàn)為錯將無缺陷模塊預測為缺陷模塊的概率越大,但在一定條件下可犧牲一定的誤報率保證預測率。
(3)AUC(Area under the curve)
(4)
AUC的值是ROC(Receive operating characteristic)曲線下的面積。ROC是描述PD、PF的一種曲線,ROC以PF作為坐標系橫軸、PD作為坐標軸縱軸。以AUC的取值范圍0 3.2.1數(shù)據(jù)集 NASA數(shù)據(jù)集是美國航空航天局公開的數(shù)據(jù)集,在軟件領域具有很強的權威性。采用NASA公開數(shù)據(jù)集中的7組數(shù)據(jù)集進行實驗,保證了實驗的有效性與可用性。同時也有利于其他研究人員對軟件缺陷實驗進行參考和實驗對比。表4所示為實驗的NASA數(shù)據(jù)集。 表4 實驗數(shù)據(jù)集 3.2.2驗證SCS算法有效性設計 利用多組實驗驗證SCS算法對不平衡軟件數(shù)據(jù)流的分類有效性。第一組為利用隨機過采樣算法與SCS算法對軟件數(shù)據(jù)流的分類比較;第二組為利用欠采樣算法與SCS算法對軟件數(shù)據(jù)流的分類比較;第三組為利用代價敏感算法與SCS算法對軟件數(shù)據(jù)流的分類比較。在實驗中采用的模型分別為傳統(tǒng)靜態(tài)機器學習算法樸素貝葉斯、動態(tài)增量學習Learning++。為了提高實驗數(shù)據(jù)的可靠性,共進行5次實驗對多個數(shù)據(jù)集進行了測試 ,并取得了各種算法在這些數(shù)據(jù)集上的平均性能和每種算法的分類結果平均值。 實驗采用的模型分別為傳統(tǒng)靜態(tài)機器學習算法樸素貝葉斯和動態(tài)增量學習Learning++,其中每組模型分別用代價敏感、欠采樣、過采樣和SCS算法對軟件數(shù)據(jù)流進行分類比較。圖3所示為不同算法在指標PD上的實驗結果。 圖3 PD實驗結果圖 從靜態(tài)的錯誤預報與動態(tài)的遞進式(NB與Learning++)的角度看,SCS與上述2類方法有不同程度的改進。在NB方法中,SCS算法隨著PD值隨著數(shù)據(jù)量的增多而升高,從0.65升至0.98,平均值在0.9左右。NB過采樣方法均值在0.85左右;NB欠采樣方法均值在0.80左右;NB代價敏感方法均值在0.70左右。在Learning++方法中,SCS算法的PD值在0.53左右,Learning++過采樣方法均值在0.43左右;Learning++欠采樣方法均值在0.50左右;NB代價敏感方法均值在0.48左右。 總體而言,在NB算法下SCS方法的準確率高出其它三種方法10%-20%;在Learning++方法中SCS方法的準確率高出其它3種方法5%-10%; 圖4所示為不同算法在指標PF上的實驗結果。 圖4 PF實驗結果圖 從靜態(tài)軟件缺陷預測和動態(tài)增量學習的比較角度來看(NB和Learning++算法),可以看出SCS算法相對于這2種算法來說有一定的提升,并且2種算法的表現(xiàn)結果相似。對于NB算法而言,在4種不同方法中,SCS方法表現(xiàn)最好PF值在0.175左右,其次是代價敏感方法PF值在0.24左右,欠采樣表現(xiàn)最差PF值在0.325左右。對于Learning++算法而言,SCS方法、代價敏感方法和過采樣方法隨著數(shù)據(jù)量的增多PF值穩(wěn)定在0.15左右,欠采樣方法的PF值在0.20左右。 總體來看,這2種算法對于采樣后的擾動反應較為穩(wěn)定。因此,可以看出SCS算法相對于欠采樣、隨機過采樣和代價敏感方法來說,在指標PF上的表現(xiàn)有所提升,并且優(yōu)于這些方法。其PF值低于其它方法5%-15%左右。 圖5所示為不同算法在指標AUC的實驗結果。 圖5 AUC實驗結果圖 從靜態(tài)軟件缺陷預測與動態(tài)增量學習的缺陷預測比較中(NB、Learning++)角度來看,SCS算法對這2個算法的提升是顯然的,2種算法的表現(xiàn)結果相似。對于NB算法而言,SCS算法對其有提升效果但其表現(xiàn)并不穩(wěn)定,平均值大約在0.63-0.64之間。對于Learning++算法而言,Learning++算法結合SCS算法依然表現(xiàn)出良好的結果,平均值大約在0.73左右。但總體而言,兩種算法對于采樣后的擾動后表現(xiàn)穩(wěn)定。 (1)針對類不平衡對軟件缺陷預測增量模型中基分類器分類效果不明顯問題,提出了SCS算法可有效緩解類不平衡問題,進而提升分類算法的精度。 (2)以PD、PF、AUC作為評價指標,SCS算法的準確率優(yōu)于傳統(tǒng)機器學習算法10%-20%,優(yōu)于動態(tài)增量學習算法5%-10%;SCS算法的誤報率低于其它學習算法5%-15%左右;SCS的AUC值對這2個算法的表現(xiàn)結果相似,穩(wěn)定在在0.63-0.73左右。3.2 實驗設計
3.3 實驗結果與分析
4結論