【问题标题】:dealing with imbalanced data after encoding for classification分类编码后处理不平衡数据
【发布时间】:2019-12-25 16:55:40
【问题描述】:

我最初有一个维度为 (13961,48 ) 的数据,经过一次热编码和基本的数据按摩后,在 (13961,862) 周围观察到维度。数据不平衡,两类“保留”约占 6%,“未保留”约占 94%。

在运行任何算法(如逻辑、knn、决策树、随机森林)时,即使没有执行任何特征选择过程,数据也会产生非常高的准确率,并且除了“朴素偏差分类器”之外,准确率大多超过 94%。

这看起来很奇怪,甚至随机包含任意两个特征-->准确率超过 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 个)作为 one-hot-encoding 转换的分类变量。

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

【问题讨论】:

  • 准确性不是(高度)不平衡数据集的合适评估指标,因为结果由多数类确定,而少数类被忽略。在您的情况下,请考虑对于任何输入的常量分类器,预测输出是 Non Retained 类。准确度是多少?

标签: python classification feature-selection imbalanced-data smote


【解决方案1】:

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

澄清几点:

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

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

【讨论】:

    【解决方案2】:

    除了 Elias 的回答之外,我还想添加一些内容。

    首先,您必须了解,即使您创建了“哑分类器”,它总是预测“不保留”,您仍然有 94% 的时间是正确的。所以在这种情况下,准确率显然是一个弱指标。

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

    其中一个指标是 F1 分数,它是准确率和召回率的调和平均值。不平衡类设置的准确性更好,但是......它不一定是最好的。 F1 将偏爱具有相似精度和召回率的那些。但这不是对你很重要的事情。

    例如,如果您要构建 sfw 内容过滤器,您可以将一些 SFW 内容标记为 nsfw(负类),这会增加误报率(并降低 召回率),但您希望确保只保留安全的(高精确度)。

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

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

    祝你好运

    【讨论】:

    • # deonardo_licaprio,感谢您的详细解释。
    猜你喜欢
    • 2020-06-27
    • 2017-04-19
    • 2019-07-13
    • 1970-01-01
    • 2023-03-17
    • 2017-11-03
    • 2013-12-26
    • 2016-06-19
    • 1970-01-01
    相关资源
    最近更新 更多