Research on Software Defect Prediction Based on PCA-Smote-XGBoost
With the increasing complexity of software systems, software defect prediction has become an important means to ensure software quality. This study proposes a software defect prediction model based on PCA-Smote-XGBoost, aiming to improve the accuracy and efficiency of defect prediction. This article uses Principal Component Analysis (PCA) for data dimensionality reduction, retaining 95% of the variance to reduce the number of features and extract key information; uses Smote oversampling method to solve the problem of data imbalance; builds a prediction model using the XGBoost algorithm and validates its effectiveness through experiments. Among the eleven commonly used datasets for software defect prediction, experimental results show that the model has the highest accuracy ACC and F1 compared to the other eight benchmark models in software defect prediction, and can effectively assist software development teams in identifying potential defect risks.
Software Defect Prediction
软件缺陷预测作为软件工程中的关键环节,对于提高软件质量和降低维护成本具有重要意义。随着机器学习技术的发展,基于数据驱动的方法为软件缺陷预测提供了新的视角和强大的工具。传统的软件测试方法依赖于人工经验和规则,这些方法在面对大规模、高复杂性的软件系统时显得力不从心。随着机器学习技术的进步,基于数据驱动的软件缺陷预测方法开始受到重视。这些方法通过分析历史数据,学习缺陷模式,从而在软件开发的早期阶段预测潜在的缺陷。然而,软件数据的高维性和复杂性给特征提取和模型构建带来了挑战,如何从众多特征中识别出与缺陷高度相关的信息,是提高预测模型性能的关键。
针对这一挑战,本文提出了一种基于PCA-Smote-XGBoost的软件缺陷预测模型。该模型结合了主成分分析(PCA)的降维能力、合成少数过采样(Smote)技术以及XGBoost算法的强大预测性能。PCA作为一种经典的线性降维技术,能够从原始数据中提取出最重要的特征,从而简化模型并减少计算复杂度。Smote作为一种过采样方法,能够平衡数据集中的类别分布,尤其适用于处理不平衡数据集,增强模型对少数类别的识别能力。XGBoost算法则是一种基于梯度提升的决策树算法,它通过迭代优化来提高模型的预测准确性,尤其在处理结构化数据方面表现出色。
本研究的目标是构建一个高效、准确的软件缺陷预测模型,以便在软件开发过程中及时发现潜在的缺陷,从而提高软件的质量和可靠性。我们通过PCA进行数据降维,利用Smote过采样方法处理软件缺陷数据集中的类别不平衡问题,结合XGBoost算法构建预测模型。本文通过十一个项目下的八种基准模型实验对比出了PCA-Smote-XGBoost模型的优越性,证明了该模型在软件缺陷预测方面的有效性和实用性。
软件缺陷是由于开发或维护过程存在的错误产生的,导致计算机无法正常运行的错误或功能性缺陷。传统的软件缺陷检测方法有手动测试、自动化分析、静态分析、代码审查,这些方法都局限于人力资源与时间资源,而基于机器学习和深度学习的缺陷预测具有高效率、低成本的优点。目前面临的挑战主要有以下六个方面:数据集的来源与处理、代码向量的表征方法、预训练模型的提高、深度学习模型的探索、细粒度预测技术、预训练模型的迁移。
软件缺陷预测框架如下
1) 数据集处理
从大型开源软件项目、软件缺陷公共仓库、开源社区收集缺陷数据。
2) 定义与软件缺陷高度相关的度量元,提取程序模型的软件度量特征或者使用神经网络提取源代码的语法语义特征(模型搭建),利用机器学习或深度学习构建预测模型。
3) 使用性能评价指标对构建的预测模型进行评价。
软件缺陷数据集从包含软件项目开发周期的软件仓库里收集。然而,在挖掘软件历史仓库的过程中,数据集中包含一些降低预测模型性能的不必要的信息,如异常值、高维度、类不平衡、数据差异等。
通常,软件产品大致符合二八原则,80%的缺陷集中在20%的程序模块中,缺陷数据分布不均匀,有缺陷的模块要远少于无缺陷模块,即类不平衡问题。类不平衡严重影响了分类模型的性能,无缺陷的实例支配着数据样本,分类器会偏向于无缺陷的实例。而在软件测试中,有缺陷的模块被误报为无缺陷的模块会给软件公司带来更大的损失。
纪晨辉等
Rajbahadur等
本次实验使用的十一个项目为AEEEM
以AEEEM数据集下的EQ项目
项目的平均值
projects |
EQ |
|
模型数量 |
1862 |
|
缺陷模型 |
13.15% |
|
1 |
ck_oo_number of private methods numeric |
1.01 |
2 |
LDHH_lcom numeric |
0.002 |
3 |
LDHH_fanIn numeric |
0.007 |
4 |
number of non-trivial bugs found until: numeric |
3.65 |
5 |
WCHU_number of public attributes numeric |
0.037 |
6 |
WCHU_number of attributes numeric |
0.469 |
7 |
CvsW Entropy numeric |
0.027 |
8 |
LDHH_number of public methods numeric |
0.001 |
9 |
WCHU_fanIn numeric |
1.007 |
10 |
LDHH_number of private attributes numeric |
0.002 |
这项工作面临数据高度不平衡
该算法由Chawla提出,其原理是通过少数类样本与其N个近邻样本之间的线性插值
对每个少数类样本,计算其与其他少数类样本的欧式距离,得到N个近邻。
从N个近邻中随机选择一个少数类样本,合成新的少数类样本。合成公式如式(1)所示:
(1)
其中,xi为第i个少数类样本,xzi为xi的随机近邻样本。如上
SHAP (SHapley Additive exPlanations)是一种基于博弈论中Shapley值的方法,用于解释机器学习模型的预测。它通过分配每个特征对预测结果的独特贡献,提供了模型决策的透明度。在软件缺陷预测中,SHAP能帮助识别导致缺陷的关键因素,辅助开发人员进行有效的缺陷管理和质量控制。SHAP的通用性使其适用于多种模型,增强了模型预测的可解释性。见
如上面的summary_plot
在机器学习中,特征选择对提升模型性能和解释性至关重要。本实验利用XGBoost算法对AEEEM公开数据集的EQ项目进行特征重要性分析和选择。XGBoost是一种高效的梯度提升决策树算法,它通过迭代优化损失函数,适用于大规模和高维数据,且能输出特征重要性评分。如下
我们采用基于特征重要性的过滤方法,通过XGBoost的“plot_importance”函数可视化特征重要性,并设置阈值筛选出关键特征。实验结果显示,通过选取重要性高的特征子集,模型在保持准确率的同时减少了特征数量,增强了模型的解释性并提升了性能。
选择的特征子集对模型预测的贡献显著,且模型准确率未因特征减少而下降,反而有所提升,这一发现证实了XGBoost在特征选择上的有效性。
主成分分析(PCA)是多元统计分析中一种重要的降维技术,旨在通过减少数据集的维度来简化数据,同时保留最大的方差信息。该方法通过线性变换将原始数据投影到新的坐标系中,新坐标的基向量(主成分)捕捉数据中的主要变异。
PCA的基本步骤包括:首先,构建原始数据矩阵X;其次,对数据进行零均值化处理;然后,计算协方差矩阵以评估变量间的相关性;接着,求解协方差矩阵的特征值和特征向量;之后,根据特征值的大小对特征向量进行排序,并选择前k个特征向量组成投影矩阵P;最后,通过P将原始数据映射到k维空间,得到降维后的数据。
方差描述一个数据的离散程度:
(2)
协方差描述两个数据的相关性,接近1就是正相关,接近−1就是负相关,接近0就是不相关。
(3)
下面,我们以向量个数等于3为例,我们转变为矩阵的表示形式:
(4)
从矩阵中会发现协方差矩阵其实就是由对角线的协方差与非对角线的协方差构成,所以协方差矩阵的核心理解:由向量自身的方差与向量之间的协方差构成。这个定义延伸到更多向量时同样受用。
在线性代数中给定一个方阵A,它的特征向量v在A变换的作用下,得到的新向量仍然与原来的v保持在同一条直线上,且仅仅在尺度上变为原来的 倍。则称v是A的一个特征向量, 是对应的特征值,即:
(5)
这里的特征向量v也就是矩阵A的主成分,而 则是其对应的权值也就是各主成分的方差大小。
至此,我们的目的就是寻找主成分,所以问题就转变成了寻找包含主成分最多的特征向量v,但是这个v并不好直观的度量,由此我们可以转变为寻找与之对应的权值 , 越大,则所对应的特征向量包含的主成分也就越多,所以问题接着转变为了寻找最大值的特征值 。
通过计算向量矩阵得到其协方差矩阵,然后特征分解协方差矩阵得到包含主成分的特征向量与对应的特征值,最后通过特征值的大小排序后依次筛选出需要用于降维的特征向量个数。
1) 准备数据,对目标变量进行编码,标出有缺陷值。
2) 划分训练集与测试集,测试集不动,对训练集进行Smote过采样合成样本。
3) 将处理后的数据集导入到基准模型-Smote模型中进行训练。
4) 保存基准模型-Smote模型,对测试集进行预测,并计算ACC (精确度)、F1。
1) 归一化和标准化处理数据集。
2) 划分训练集与测试集,测试集不动,对训练集进行Smote过采样合成样本。
3) PCA降维处理后,以AEEEM下的EQ项目为例,特征从61个降到23个,保留95%的方差。
4) 将处理后的数据集导入到PCA-Smote-XGBoost模型中进行训练。
5) 保存PCA-Smote-XGBoost模型,对测试集进行预测,并计算ACC (精确度)、F1。
我们还使用精确度Accuracy (ACC)和F1指标来评估所考虑模型的有效性。F1指标是精确度和召回率之间的调和平均值。
TP (True Positive):正确的视为异常样本。
FP (False Positive):错误的视为异常样本。
FN (False Negative):错误的视为正常样本。
TN (True Negative):正确的作为正常样本。
注:P:异常样本;N:正常样本;T:正确的;F:错误的。
Accuracy:正确分类的样本数占总样本数的比例。
(6)
Precision:真实有缺陷占预测为有缺陷样本的比例。
(7)
Recall:正确视为有缺陷的样本占所有异常样本的比例。
(8)
F1:综合了Precision和Recall两指标。
(9)
如
项目 |
Smote |
ADASYN |
Smote_Tomek |
Smote_ENN |
ACTUAL |
MW1 |
0.862 |
0.843 |
0.843 |
0.784 |
0.823 |
KC1 |
0.834 |
0.812 |
0.793 |
0.725 |
0.834 |
PC1 |
0.936 |
0.914 |
0.914 |
0.783 |
0.918 |
PC5 |
0.732 |
0.718 |
0.702 |
0.663 |
0.718 |
项目 |
Smote |
ADASYN |
Smote_Tomek |
Smote_ENN |
ACTUAL |
camel-1.2 |
0.676 |
0.672 |
0.669 |
0.553 |
0.645 |
ivy-1.4 |
0.759 |
0.759 |
0.759 |
0.670 |
0.759 |
poi-1.5 |
0.730 |
0.711 |
0.689 |
0.685 |
0.730 |
redktor |
0.788 |
0.765 |
0.788 |
0.657 |
0.727 |
以AEEEM数据集下的EQ项目为例,为了提高模型的训练速度,使用PCA算法对特征进行降维,如下
本研究同时以ACC和F1作为评价指标,在软件缺陷数据集的十一个项目中,与八种基准模型(AdaBoost自适应增强这里简称为AB、CatBoost Categorical Boosting这里简称为CB、Decision Tree决策树这里简称为DT、Gradient Boosting梯度提升这里简称为GB、K-Nearest Neighbor近邻这里简称为KNN、RandomForest随机森林这里简称为RF、SVM支持向量机、XGBoost、Ridge岭回归)进行对比实验,如下
模型/ 项目 |
velocity- 1.4 |
ant- 1.4 |
jedit- 4.0 |
jedit- 4.3 |
log4j- 1.0 |
poi- 2.5 |
EQ |
MW1 |
AR1 |
AR4 |
camel-1.0 |
平均值 |
GB |
0.82/ 0.82 |
0.58/ 0.57 |
0.67/ 0.68 |
0.91/ 0.92 |
0.62/ 0.66 |
0.77/ 0.78 |
0.69/ 0.69 |
0.80/ 0.79 |
0.88/ 0.86 |
0.81/ 0.80 |
0.86/ 0.88 |
0.76/ 0.76 |
RF |
0.85/ 0.84 |
0.66/ 0.65 |
0.70/ 0.70 |
0.92/ 0.93 |
0.66/ 0.69 |
0.71/ 0.72 |
0.67/ 0.67 |
0.78/ 0.76 |
0.84/ 0.84 |
0.77/ 0.73 |
0.92/ 0.91 |
0.77/ 0.76 |
CB |
0.87/ 0.87 |
0.69/ 0.67 |
0.70/ 0.70 |
0.91/ 0.92 |
0.70/ 0.72 |
0.75/ 0.75 |
0.67/ 0.67 |
0.78/ 0.75 |
0.84/ 0.84 |
0.81/ 0.80 |
0.92/ 0.91 |
0.78/ 0.78 |
DT |
0.85/ 0.83 |
0.63/ 0.61 |
0.72/ 0.72 |
0.93/ 0.93 |
0.77/ 0.79 |
0.81/ 0.81 |
0.69/ 0.69 |
0.74/ 0.74 |
0.92/ 0.92 |
0.77/ 0.73 |
0.85/ 0.88 |
0.78/ 0.78 |
AB |
0.85/ 0.84 |
0.66/ 0.65 |
0.67/ 0.67 |
0.92/ 0.93 |
0.66/ 0.69 |
0.71/ 0.72 |
0.63/ 0.63 |
0.76/ 0.74 |
0.80/ 0.81 |
0.86/ 0.83 |
0.92/ 0.91 |
0.76/ 0.76 |
RD |
0.70/ 0.70 |
0.69/ 0.71 |
0.59/ 0.62 |
0.72/ 0.81 |
0.77/ 0.79 |
0.72/ 0.73 |
0.66/ 0.65 |
0.82/ 0.78 |
0.84/ 0.84 |
0.86/ 0.85 |
0.79/ 0.84 |
0.74/ 0.75 |
KNN |
0.62/ 0.63 |
0.58/ 0.59 |
0.66/ 0.67 |
0.80/ 0.81 |
0.59/ 0.62 |
0.64/ 0.66 |
0.66/ 0.65 |
0.60/ 0.63 |
0.76/ 0.80 |
0.68/ 0.69 |
0.79/ 0.85 |
0.67/ 0.69 |
SVM |
0.67/ 0.58 |
0.66/ 0.66 |
0.74/ 0.72 |
0.84/ 0.89 |
0.70/ 0.72 |
0.50/ 0.52 |
0.64/ 0.64 |
0.78/ 0.77 |
0.84/ 0.84 |
0.72/ 0.70 |
0.72/ 0.80 |
0.71/ 0.71 |
PCA- XGB |
0.87/ 0.87 |
0.72/ 0.72 |
0.75/ 0.74 |
0.93/ 0.93 |
0.77/ 0.79 |
0.83/ 0.83 |
0.70/ 0.70 |
0.82/ 0.81 |
0.96/ 0.95 |
0.86/ 0.85 |
0.92/ 0.91 |
0.83/ 0.82 |
为了更加直观地分析实验结果,本文由
针对软件缺陷预测中成本高效率低和数据集的类不平衡问题,本文从软件缺陷数据集的特征入手,首先对XGBoost下的特征重要性进行了分析,比较了四种采样方法,得出了XGBoost-Smote的优越性,然后在基准模型-Smote的基础上进行对比实验,给XGBoost-Smote加入PCA,降低维度提高性能指标,提出了PCA + Smote + XGBoost模型,在软件缺陷数据集的十一个项目上验证了该模型的有效性。