如何最大化少数类的召回率?

数据挖掘 机器学习 深度学习 数据挖掘 预测建模 评估
2022-03-04 16:03:29

我有一个包含 4.7k 记录和 60 个特征的数据集。指示标签记录1558条,指示标签1记录3554条0正在解决一个二元分类问题。我使用 SMOTEtraining data来平衡数据

我应用了各种特征选择算法

1) RFECV - 根据我使用的模型返回最佳的 30-40 个特征

2) SelectFromModel -n根据我键入的内容返回顶级功能。我尝试了 n=15 和n=10

3) Kbest -n根据我键入的内容返回顶级功能。我尝试了 n=15 和n=10

我的问题

1) 特征选择算法 1、2、3 的输出提供的特征略有不同。我的意思是从算法 2 和算法 3 来看,大约 10 个特征是相同的,但其余 5 个是不同的。这意味着什么?看到这样的差异是否正常?还是我在这里犯了任何错误?

2)我尝试使用SMOTE并应用 Gridsearchcv 重新采样少数类,但我仍然没有看到少数类的良好召回值(现在已过采样)。请在下面找到指标的屏幕截图

3) Gradientboosting, xtreamegradientboosting,catboost算法是否不需要我们选择特征?他们是否足够聪明,可以选择特征并帮助我们提高准确性?我应该按原样传递数据(所有功能)吗

您能帮我了解如何将两个类的指标值都提高到 90 以上吗?

目前我只尝试使用 15-20 个特征,因为来自特征选择输出的某些特征是相关的,所以我删除了它们并且只使用了 15-20 个特征。

你能提供一些建议吗?CATboost运行了很长时间。

在此处输入图像描述

1个回答

这是我的两分钱。

1)虽然有些事情你可能想做不同的事情(见第 2 部分),但你观察到的是正常的。如果你在一个简单的景观中遇到了一个小问题,那么所有的方法都会集中在一个特征子集上。然而,现实世界中的特征选择很少是一个微不足道的问题(只要您正在寻找“真正的”最优性而不是“足够好”的解决方案)。您正面临一个大小为的搜索空间,无法对其进行全面评估,因此导航方法会有所不同。是一种自上而下的方法,它试图根据 CV 分数去除尽可能多的弱特征,依赖于估计器的内部目标来进行选择,而默认形式是一个简单的过滤器,用于计算260RFECVSelectFromModelSelectKBest不考虑特征交互的方差分析 F 值。由于标准如此不同,您最终会得到不同的特征子集——每种方法都在被其目标函数“扭曲”的环境中运行。您发现的子集相交的事实表明,共同特征具有某种最优性(当考虑所有使用的方法时)。当您使用它时,请考虑顺序特征选择方法,尤其是浮动方法(自下而上和自上而下),因为它们比普通RFE/更有效KBest

2)SMOTE用于平衡训练数据。从您的问题陈述来看,您似乎是在特征选择之前引入合成数据点。如果是这种情况,请考虑其含义:对于RFECV(如果您执行类似的操作rfecv.fit(X_train, y_train)),验证样本不是来自原始分布,而是来自已经受合成数据影响的分布,因此驱动选择的 CV 分数不是基于特征的真实质量。这种差异可能太小而无法真正影响任何事情,但事实仍然存在。在您的情况下,班级平衡是 70/30,这还不错。你真的观察到平衡后性能有任何提高吗?就指标而言,该区域无论余额如何,Precision-Recall 曲线下都是稳定的。

3) 决策树(广泛用于多种风格,包括您提到的XGBoostCatBoost )在学习过程中嵌入了特征选择。这意味着您只需将全功能数据插入学习器,并让它完全自行找出最重要的功能。它非常有效,通常就足够了。但是,为了在集成中获得各种意见,森林方法(无论如何,大多数都是)会给所有特征一个平等的机会被使用,所以很可能你最终会遇到所有特征都有一些的情况重要性——你仍然需要决定保留哪些。带有噪声的弱特征与您的标签纯属偶然相关,可能会影响模型的泛化能力,甚至会诱使您保持它们有用。此外,当您的样本量有限(而且总是如此)时,增加特征的数量也无助于您评估的信心。如果没有足够的观察,你怎么能确定标签是因为一个特征而不是其他十个特征?因此,在没有任何初步或后续步骤的情况下将其全部委托给森林不一定是最佳行动方案。


帖子一般问题的答案:如何最大化少数类的召回率?

这很简单。将少数类的召回定义为您的目标,即让它成为您提供给特征选择算法的评分函数的输出。对于sklearn 的特征选择方法,它是score_func参数,对于mlextend的 SFS,它是score 生成的特征子集可能包含一些感兴趣的东西。

只有在对最佳特征进行彻底搜索,为您的问题选择最佳模型并调整其超参数之后,如果您仍然出于任何原因想要进一步提高精度/召回率,您可能需要研究堆叠——这个将以牺牲模型复杂性为代价挤出最后一点性能。但很有可能它真的不值得。