Watanabe08 CPDP復現
來自專欄宇先生說軟體工程
?論文《Adapting a fault prediction model to allow inter language reuse》由Shinya Watanabe等人於2008年發表,距今已有10個年頭。按理說,時隔這麼多年的期刊,其中的技術想必已經跟不上時代的步伐。但是,這篇論文中的CPDP方法,仍然能在CPDP預測中發揮不錯的作用。
我們知道在CPDP(Cross-project defect prediction)中,因為源數據與目標數據雖然有著相同的度量(metric),但是由於數據分布的不同,會導致在預測過程中效果不理想。因此Watanabe 等人提出了一種應對上述問題的方法。
在原文第四章INTER PROJECT BUG PREDICTION中,提到了一種解決方案:
上式中 表示在目標集 中第 個樣本的第 個度量的屬性值, 表示在目標集 中第 個度量的平均值。
從上式可以看出,對於目標集中每一個樣例的每一個度量值,可以轉換為該值乘以一個權值,該權值為目標集中該度量的平均值與源數據集中該度量的平均值之比。經過這種變換,就相當於改變了目標集中的數據分布,使其更加契合訓練集。
以下是用Python實現的代碼:
import numpy as npdef metric_compensation(source, target): # 遍歷每一個度量屬性 for j in range(target.shape[1]): # 計算每個度量屬性的均值 metric_mean_source = np.mean(source[:, j]) metric_mean_target = np.mean(target[:, j]) # 遍歷每一個樣例 for i in range(target.shape[0]): target[i, j] = (target[i, j] * metric_mean_source) / metric_mean_target return target
原文使用C4.5作為分類器。
以下是我用NASA數據集(CM1, JM1, KC1, KC2, PC1)對該方法進行復現的結果。因為類不平衡問題比較嚴重,我在數據集處理部分使用了SMOTE重採樣。
顯然,類不平衡過於嚴重導致結果不是很好(在經過較健壯的處理之後,效果能提升10個百分點以上)。比起原文中的結果差了10個百分點左右,究其原因,是因為數據差異導致的。原文中使用的數據是兩個編輯器(櫻花編輯器&jEdit)的源碼進行提取的數據,而我選用的是NASA的數據(後者類不平衡問題更嚴重)。
經過搜尋,在2017一篇名為《A Comparative Study to Benchmark Cross-project Defect Prediction Approaches》的期刊發表在TSE上,提出了對上述方法的改進。
作者的思路是:我用目標集去適應訓練集的數據分布,還不如我訓練的時候就適應目標集的數據分布。代碼實現過程相似:
import numpy as npdef metric_compensation_adopt(source, target): # 遍歷每一個度量屬性 for j in range(source.shape[1]): # 計算每個度量屬性的均值 metric_mean_source = np.mean(source[:, j]) metric_mean_target = np.mean(target[:, j]) # 遍歷每一個樣例 for i in range(source.shape[0]): source[i, j] = (source[i, j] * metric_mean_target) / metric_mean_source return source
使用上文同樣的實驗設置,得到以下結果:
實驗結果相類似。
總結:該方法巧妙地使用加權的思想,使CPDP中源與目標的數據分布盡量相似,來提高預測能力。
源碼參見githubWatanabe08
更多資訊,關注公眾號:宇先生說
http://weixin.qq.com/r/Wj8FHcrE3JejrY5_92pI (二維碼自動識別)
推薦閱讀:
※【譯】重新定義「數據科學家」
※梯度下降法理論與實踐
※面向前端工程師的機器學習引導課
※【機器學習·基本功】-1決策樹 | 演算法原理介紹
※訓練卷積神經網路下五子棋