# software_defect_prediction **Repository Path**: liuhuo-antares/software_defect_prediction ## Basic Information - **Project Name**: software_defect_prediction - **Description**: 特征选择和基于集成学习的软件缺陷预测 - **Primary Language**: Python - **License**: AFL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2022-09-03 - **Last Updated**: 2024-10-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ①探究特征选择算法的优劣 为什么要选择特征? 数据集中,并不是所有的特征都是有用的,有一些特征是冗余的、无关的。 举个简单的例子,现在有身高、体重、学校、籍贯、民族等特征的数据,要预测一个人的性别。身高和体重这两个特征是有用的,因为女生的身高和体重偏低,学校这个特征也是有用的,因为不同学校的性别比例显然不同,但是籍贯和民族这两个特征,显然就是**无关的**,在预测性别时多添加这两个特征,不仅会增大计算量,而且还可能会适得其反,降低预测的准确度。 上面说的也仅仅是一个方面,从另一方面来讲,如果用5个特征就可以确定性别,那我为什么要再添加其他5个特征(**冗余的**),也就是说我们要用最少的特征来达到最好的预测结果。 对比```[pearson, fisher, greedy]```三种特征选择算法。 - pearson算法:评估**单个特征**与**是否有缺陷**的**关联性**,计算公式(涉及到概率论知识): $$ p = \frac{cov(X_{i},Y)}{\sqrt{var(X_{i})*var(Y)}} $$ p的范围在[-1, +1],分别代表负相关、不相关、正相关。选择p的绝对值较大的特征添加到特征集中。 - fisher算法:和pearson类似,只是评估的标准不同 $$ F(X_i) = \frac{(\hat{X}^{1}_i-\hat{X}^{2}_i)^2}{(S^1_i)^2-(S^2_i)^2} $$ - greedy算法:首先选择**获得最高分类性能**的特征,然后在此基础上再选择第2个最佳特征使其获得最高的分类性能,依此类推 ![image-20220903194513535](https://i0.hdslb.com/bfs/album/3f89d847c7960731d97672ca000190a3d9dae00d.png) 具体过程: - 首先用**特征选择算法**选择出**指定数量的特征** - 之后用```SVC(class_weight='balanced', probability=True)```这个模型(模型的一系列**参数的设置我也不清楚**)在数据集的指定特征上进行训练和测试,得到评价指标。 ``` -fs pearson fisher greedy -s [AUC, GMeans] -d [KC3, PC2, PC4, Ant, Camel, MC1] ``` **KC3数据集** ![image-20220903195148574](https://i0.hdslb.com/bfs/album/cbc9c5cad6a85b91ec4eb5c5bb3037aa8f3991ae.png) **PC2数据集** ![image-20220903200300145](https://i0.hdslb.com/bfs/album/34f54883b83c839724c50da016ecc5303ea78df1.png) **PC4数据集** ![image-20220903200514275](https://i0.hdslb.com/bfs/album/1d488ee60a6a281c2d19335ff243b1e280898821.png) **Ant数据集** ![image-20220903195642618](https://i0.hdslb.com/bfs/album/de913fa320967dfa22372a6cada953462bb1d5e0.png) **Camel数据集** ![image-20220903201041073](https://i0.hdslb.com/bfs/album/616733a33a7fcb5e16af481035f9c653a925846c.png) **MC1数据集** ![image-20220903203603222](https://i0.hdslb.com/bfs/album/8ae7cdfeb8fdda73e4686a126b91c66f769ffb87.png) ------ ## 为什么我说参数的设置很重要? 我上面提到过,在使用特征选择的算法选取特征后,我们使用```SVC(class_weight='balanced', probability=True)```这个模型在指定的特征上训练和测试,但是当我**把这个模型稍微变动一下**,改成```SVC(class_weight='{1:10}', probability=True)```,最后的结果就有所变动,如下: **KC3数据集** ![image-20220903191114702](C:\Users\Antares\AppData\Roaming\Typora\typora-user-images\image-20220903191114702.png) **PC2数据集** ![image-20220903191858493](C:\Users\Antares\AppData\Roaming\Typora\typora-user-images\image-20220903191858493.png) **PC4数据集** ![image-20220903193139031](https://i0.hdslb.com/bfs/album/cb2fbfe24b31c3281b6dcdb65b42d24bac91c376.png) **Ant数据集** ![image-20220903191021220](C:\Users\Antares\AppData\Roaming\Typora\typora-user-images\image-20220903191021220.png) **Camel数据集** ![image-20220903191218046](C:\Users\Antares\AppData\Roaming\Typora\typora-user-images\image-20220903191218046.png) **MC1数据集** ![image-20220903192518286](https://i0.hdslb.com/bfs/album/7cf2808bb2d9a9dce0745342131b67999e9c2edc.png) --- ## 我的总结 greedy算法好像是好那么一点点,尤其是在**保留特征数比较少的时候,greedy往往能够选择出最优的特征集**。但是优势也没那么大,而且greedy相比于另外两个**效率太低**了,greedy每次选择下一个要添加的最优特征,就要把所有未添加特征穷举一遍。 --- # ②探究基于集成学习的APE模型的优势 三种模型: - 文中提出的APE是由7个基分类器(随机森林、梯度提升、随机梯度下降、逻辑回归、多项式朴素贝叶斯、伯努利朴素贝叶斯、支持向量机)构成的集成模型。 ```python classifiers = [SVC(probability=True), MultinomialNB(alpha=0.001), BernoulliNB(alpha=0.001), RandomForestClassifier(n_estimators=20), GradientBoostingClassifier(n_estimators=300), SGDClassifier(alpha=.0001, loss='log', n_iter_no_change=50, penalty="elasticnet", max_iter=10000), LogisticRegression(penalty='l2', max_iter=10000)] ``` APE是同时对这7个模型进行训练,在预测时,取7个模型预测的**平均值**来作为最终的预测值。 - 随机森林是由若干个决策树组成的森林,每棵决策树不同,在做预测时,采用**投票**的方法来作为最终输出 - W-SVMs是由若干支持向量机(SVM)组成的集成模型,这个我不太了解。 实验过程: - 首先,采用上面3种特征选择算法的某一种选择出特征集 - 让APE、RF(随机森林)、W-SVMs这三个模型在相同的特征集上训练和测试。 ``` -fs [greedy pearson fisher] -s [AUC GMeans] -d [KC3, PC2, PC4, Ant, Camel, MC1] -e 1 -m APE RF W_SVM ``` 实验结果: ## 使用greeady算法来选取特征 这个跑得实在太慢了,从下午到晚上,跑了7个5个小时左右才跑出一个数据集上的结果,主要是**greedy太低效**了!!! 其他数据集上的结果你们可以跑跑看,参数示例 ``` -fs greedy -s AUC -d [KC3, PC2, PC4, Ant, Camel, MC1] -e 1 -m APE RF W_SVM ``` **Ant数据集(这一张图片跑了5小时)** ![image-20220903220440900](https://i0.hdslb.com/bfs/album/e9a01d5d78b0b7f59a3a65e417c9c1608e3c65e5.png) ## 使用pearson算法来选取特征 **KC3数据集** ![image-20220903203729790](https://i0.hdslb.com/bfs/album/94d498bfd2f1d8f84ed6cc2e3c15f2c733079007.png) **PC2数据集** ![image-20220903213820019](https://i0.hdslb.com/bfs/album/d74e3d57c18094578a707c278cb6fb91dac9f6b6.png) **PC4数据集** ![image-20220903220342812](https://i0.hdslb.com/bfs/album/ea2b5aa7c8c91b39af92e99821de2cb913cad7eb.png) **Ant数据集** ![image-20220903214425624](https://i0.hdslb.com/bfs/album/df03375d04cfa921b6bb7a83a0d21d090d2de9a7.png) **Camel数据集** ![image-20220903215331676](https://i0.hdslb.com/bfs/album/9bbc6451e63a1a6302cb0c52a08c0cded2da4351.png) **MC1数据集** ![image-20220903222904329](https://i0.hdslb.com/bfs/album/37a4ac0a4a09be3a146b66265b891b8b5deb4f02.png) ------ ## 使用fisher算法来选取特征 **KC3数据集** ![image-20220903203758729](https://i0.hdslb.com/bfs/album/5d4ad98721d0a72e71a611c54651e000bf824462.png) **PC2数据集** ![image-20220903205148303](https://i0.hdslb.com/bfs/album/b7cceb866b842ea67ac4b9a2a0bdd08a5a13b601.png) **PC4数据集** ![image-20220903211259141](https://i0.hdslb.com/bfs/album/c536ed4a533c98fb36507cda55b11f79b60ee53a.png) **Ant数据集** ![image-20220903212018082](https://i0.hdslb.com/bfs/album/e7a6875bcdd3c551692168416b638b4ba4e678d8.png) **Camel数据集** ![image-20220903212249389](https://i0.hdslb.com/bfs/album/48d6740c66d42d320a84ca3f16385a987463f96b.png) **MC1数据集** ![image-20220903215014468](https://i0.hdslb.com/bfs/album/3f987350fbc8a6d86180819059e0e6759026e7e1.png) ------ ## 我的总结 没看出APE有优势,APE≈RF>W_SVM ----- # ③评价指标详述 ## AUC 最常用的一个指标,为ROC曲线与x轴围成的面积,其值越大,代表**分类性能**越好。 | | (真实)肯定 | (真实)否定 | | ---------------- | ------------ | ------------ | | **(预测)肯定** | TP | FP | | **(预测)否定** | FN | TN | ROC曲线是随**阈值P**变化,点(FPR, TPR)所形成的曲线。 - 阈值P:只要模型给出的预测值大于P,就做出为A(例如无缺陷)的预测,否则做出为B(例如有缺陷)的预测 - $$ TPR = \frac{TP}{TP+FN}\\FPR=\frac{FP}{FP+TN} $$ AUC的具体解释见https://www.bilibili.com/video/BV1wz4y197LU --- ## G-Mean 在数据不平衡的时候,这个指标很有参考价值(不知道为什么,后期可以研究一下)。对于软件缺陷这样的问题,就存在数据偏斜问题,即缺陷的占少数、无缺陷的占大多数。 使用传统的衡量指标可能存在不严谨的问题,就比如,在数据集中99%的数据为无缺陷,1%的数据为有缺陷,如果模型只简单地预测为无缺陷,就可以达到0.99的准确率(Accuracy)和0.5的AUC。而如果使用G-Mean这个指标,该模型就是0分。 计算方法: $$ 召回率:Recall = \frac{TP}{TP+FN}\\特异度:Specificity=\frac{FP}{TN+FP}\\G-meam=\sqrt{Recall*Specificity} $$ ----- ## 使用G-Mean重新评估算法 只需要将```-s AUC```改为```-s GMean```,然后重新跑一边上面的测试。