不平衡学习:在实例硬度阈值方法中如何计算阈值?

问题描述

我正在从不平衡学习中查看InstanceHardnessThreshold转换器的源代码,这里:https://github.com/scikit-learn-contrib/imbalanced-learn/blob/12b2e0d/imblearn/under_sampling/_prototype_selection/_instance_hardness_threshold.py#L167

我想知道阈值是如何精确计算的,其原理是什么?

解决方法

在与不平衡学习包的维护者讨论后,我了解到:

阈值确定如下:

threshold = np.percentile(
            probabilities[y == target_class],(1.0 - (n_samples / target_stats[target_class])) * 100.0,)

其中 n_samples 是来自多数类的最终数据集中所需的样本数,而 target_stats[target_class] 是原始数据集中存在的多数类的总数。

我们需要找到一个概率阈值,使得高于该阈值的样本数与 sampling_strategy 中请求的样本数一致。默认情况下,它将是少数类中的样本数,除非用户另有声明。

实例硬度是一个观察被漏分类的概率。换句话说,它是 1 - 类的概率。

这个想法是估计器给出的概率与样本属于该类的确定性有关。因此,百分位数为 0.0 意味着我们选择了所有样本,而百分位数为 1.0 意味着我们将选择单个样本(概率最大的那个)。因此,阈值对应于选择 N 个最确定的样本属于 C 类,如每个估计器所见。 N 由sampling_strategy 参数定义(例如,预期平衡率)。

此方法可能返回比用户请求的更多的观察结果。文档中提到了这一点。