分类编码后处理不平衡数据

dealing with imbalanced data after encoding for classification

我最初有一个维度为 (13961,48) 的数据,经过一次热编码和数据的基本按摩后,观察到的维度约为 (13961,862)。数据不平衡,有两类 'Retained' 约 6% 和 'not Retained' 约 94%。

虽然 运行 逻辑、knn、决策树、随机森林等任何算法,即使没有进行任何特征选择过程,数据也会产生非常高的准确度,准确度超过 94%,除了大部分'Naive bias classifier'.

这似乎是奇数和偶数,因为随机具有任何两个特征 --> 给出的准确度超过 94%,这在一般情况下似乎不现实。

也应用 SMOTE,即使对于上述任何算法的基线模型,如逻辑、knn、决策树、随机森林,也能提供超过 94% 的准确率结果,

同样去除前 20 个特征后,这给出了超过 94% 的良好结果的准确率(检查以了解真实性)

 g = data[Target_col_Y_name]
 df = pd.concat([g.value_counts(), 
            g.value_counts(normalize=True).mul(100)],axis=1, keys=('counts','percentage'))

print('The % distribution between the retention and non-retention flag\n')

print (df)

# The code o/p to show the imbalance is

 The % distribution between the retention and non-retention flag

              counts  percentage
Non Retained   13105   93.868634
Retained         856    6.131366

我的数据有 7 个数值变量,例如月份、金额、利率和所有其他(大约 855)作为单热编码转换的分类变量。

有什么方法可以在基线、特征选择或不平衡优化技术上处理此类数据?请通过查看每个级别的维度和不平衡计数来指导。

一般而言,准确性不是一个很好的衡量标准,尤其是对于不平衡 类。我会推荐 this other Whosebug answer,它解释了何时使用 F1 分数以及何时使用 AUROC,这两者都是比准确性更好的衡量标准;在这种情况下,F1 更好。

几点整理一下:

  • 对于随机森林这样的模型,你不应该为了提高准确率而移除特征,因为它只会将它们视为无关紧要的特征。我推荐随机森林,因为它往往非常准确 (except in some cases),并且只需使用 clf.feature_significances_(如果使用 scipy 随机森林)就可以显示重要特征。

  • 决策树的性能几乎总是比随机森林差,因为随机森林是许多聚合的决策树。

除了 Elias 的回答,我还想补充一些内容。

首先,您必须明白,即使您创建了 "dumb classifier",它总是预测 "not retained",您仍有 94% 的时间是正确的。因此,在这种情况下,准确性显然是一个较弱的指标。

您绝对应该了解混淆矩阵和随之而来的指标(如 AUC)。

其中一个指标是 F1 分数,它是精确率和召回率的调和平均值。不平衡 class 设置的准确性更好,但是......它不一定是最好的。 F1 会青睐那些具有相似精度和召回率的。但这不是必需的,对您来说很重要。

例如,如果您要构建 SFW 内容过滤器,您可以将某些 SFW 内容标记为 nsfw(负面 class),这会增加假阴性率(并降低 recall),但您希望确保只保留安全的(高精度)。

在你的情况下,你可以推断出更糟糕的情况:保留不好的东西或放弃好的东西,然后以这种方式选择指标。

就策略而言:有很多方法可以处理 class 不平衡:采样技术(尝试除 SMOTE 或 ROSE 之外的下采样、上采样)并检查您的 验证分数(单独的训练指标几乎没有用)得到改善。一些模型有特殊的超参数来更多地关注罕见的 class(例如在 xgboost 中有 scale_pos_weight 参数)。

祝你好运