八大战术,对抗不平衡类数据   

1) 可以扩大数据样本吗?

    你可能会认为这样做很愚蠢,但扩大样本数据总是容易被忽视。你能收集更多的数据吗?花一秒钟,想想你是否能够收集更多和问题相关的数据。在集合中,一个更大的数据集,就有可能挖掘出不同的或许更平衡的方面。之后当我们寻找重复采集的数据样本时,一些小样本类数据的例子可能是有帮助的。

2) 试着改变你的绩效标准

        精度是一个不适用于不平衡的数据集的绩效指标。正如我们已经看到的,这是一种误导。在处理不平衡类时,有些更加理想的指标可以给你更加具有说服力的结果。

    在我的文章中,我给更多的建议和措施去选择不同的绩效标准:“Classification Accuracy is Not Enough: More Performance Measures You Can Use”。在这篇文章里我主要着重于讲述如何对乳腺癌患者复发这个不均衡数据集进行分类。

    这篇文章中我推荐了以下几个绩效标准,相比于传统的精确度,这些绩效标准可以更加深入地洞察模型的准确率:

  • 混淆矩阵:将要预测的数据分到表里来显示正确的预测(对角线),并了解其不正确的预测的类型(哪些类被分配了不正确的预测);

  • 精度:一种分类准确性的处理方法;

  • 召回率:一种分类完整性的处理方法;

  • F1分数(或F-分):精度和召回率的加权平均。

同时,我还推荐你关注一下以下几点:

  • Kappa(或者Cohen’s kappa):根据数据中集合数据的不平衡点来标准化分类精度;

  • ROC曲线:类似于精度和召回率,准确性被分为敏感性和特异性,并且可以基于这些值的平衡阈值来选择模型。

    在我们的文章“Assessing and Comparing Classifier Performance with ROC Curves”中你可以学到更多关于运用ROC曲线来比较分类准确度的方法。

    你是不是仍然无法确定呢?试着运用Kappa,他会告诉你一些究竟如何处理分类准确度的建议和方法。

3)尝试对你的数据重新抽样

    你可以改变将要用来建立预测模型的数据集来获得更加平衡的数据集。

    这种变化被称为抽样数据集,您主要可以运用以下两种方法来使数据分类更加均衡:

1.您可以从代表性不足的类(又称为过抽样或者更加正式的抽样来代替)添加实例的副本

2.您可以从过度代表类里删除实例,称为抽样不足

    这些方法往往很容易实现,而且运行速度也很快。因此我认为他们都是不错的出发点。事实上,我会建议你最好尝试以上提到的两种不平衡数据集的处理方法,这样便于你比较一下基于你的首选准确度处理方法上,另一种方法是否效果更好,或者是否有所促进作用。

    你可以通过维基百科题为“Oversampling and undersampling in data analysis”的文章了解更多相关咨询。

一些经验的规则:

  • 当你的数据量很大时可以考虑测试抽样不足(一万或者十万条记录或更多)

  • 当你没有大量的数据时可以考虑测试抽样过度(一万条记录或更少)

  • 考虑测试随机和非随机的抽样方案(如分层)。

  • 考虑用不同的重抽样率进行测试(例如,在一个二元分类问题中,您不必一定要针对1:1的比例,可以尝试其他比例)

4) 尝试生成人工样本

    一种简单生成人工样本的方法是从在少数类的实例中随机抽样属性

    在数据集中,你可以根据经验对它抽样或者你可以使用类似于朴素贝叶斯这种可以在反向运行时,对每个属性进行独立抽样的模型。你将有更多的不同的数据,但可能不会保留其属性之间的非线性关系。

    这里有一些系统方法可以用来生成人工演变。其中最流行的算法被称为SMOTESynthetic Minority Over-sampling技术。

    正如其名,SMOTE是过度抽样的方法。它的工作原理是从小类的数据中生成人工样本,而不是创建副本。该算法选择两个或更多个类似的例子(使用距离度量),然后随机干扰一个实例中的一个属性,比较其差异。

    想要了解更多关于SMOTE方法,请搜索2002年名为“SMOTE: Synthetic Minority Over-sampling Technique”的原文章。

    现在有很多的SMOTE算法的实现方法,例如:

  • 在Python,一起来看看在“UnbalancedDataset”模块。它提供了许多SMOTE实现方法,以及各种其他再抽样技术,你都可以尝试;

  • 在R中,DMwR 包提供SMOTE的实现方法;

  • 在Weka中,你可以使用SMOTE supervised filter

5) Try Different Algorithms

    通常来说,我会强烈建议你对于所有问题不要总是使用自己最喜欢的模型。对于所给的问题你至少应该用不同类型的算法对其进行抽查。

    欲了解更多关于抽查的方法,请参阅我的文章“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。

        话虽这么说,决策树往往在处理不平衡类数据集表现不错。在创建树的过程中使用类变量的分裂规则,可以强制地将两个类很好的进行处理。

    如果有疑问,请尝试一些流行的决策树算法,如C4.5,C5.0,CART和随机森林。

    对于使用决策树的一些R代码,请参阅我的文章,标题为“Non-Linear Classification in R with Decision Trees”。

    例如,对于Python和scikit-learn中使用CART的一个例子,请参考我的文篇,名为“Get Your Hands Dirty With Scikit-Learn Now”的文章。

6) 尝试名义变量模型

    您可以使用相同的算法,但是在不同问题中他们可能会给出不同的观点。

    因为在训练过程中,对于小类数据会产生分类错误,因此名义变量分类会产生额外费用。这些名义变量会使模型偏向于更加注重少数类数据。

    通常来说掌握一类名义变量或者权重是为了学习方法。例如一些方法的名义变量penalized-SVM和penalized-LDA。

    另外,对于名义变量模型也具有通用框架。例如,Weka中有一个CostSensitiveClassifier,它可以封装任何分类和自定义分类应用中错过的名义变量矩阵。

    如果你锁定到一个特定的算法并且无法重新取样或是你得到的结果不好时,使用名义变量是可取的。它提供了另一种方法来“平衡”类。建立名义变量矩阵是很复杂的,也许您将不得不尝试各种设置名义变量的方法,看看什么方法是最适合用来解决你的问题。

7) 尝试从不同的观点进行思考

    对于研究不平衡数据集的邻域。他们有自己的算法,措施和术语。    从这些观点处罚,纵观和思考你的问题,有时一些想法会有所改变。两个你可能想要考虑的是异常检测和变化检测。

    异常检测是罕见事件的检测。这可能是根据一系列的系统调用,通过它的振动或一个由程序指示的恶意活动而产生的机器故障。这样的事件相比正常操作是罕见的。这种思维的转变在于考虑以小类作为异常值类,它可以帮助你获得一种新方法来分离和分类的样本。

    除了变化检测是找寻找它的变化而不是差异以外,变化检测类似于异常检测。这可能是在观察使用模式或银行交易过程中用户的行为变化。

    对于分类的问题,这两个转变具有更加实时的角度,它可能会给你一些新的方式去思考你的问题以及让你尝试更多新的技术。

8) 尝试一些新的创意

    在你的问题里面挖掘并思考如何把它分解成更小的问题,这些问题更容易处理。为了寻找灵感,看一看别人对于问题:“In classification, how do you handle an unbalanced training set?”给出的一些有创意的答案。

例如:

    分解你的大类变成小类…

    使用一类分类…(比如像将其作为异常检测对待)

    不是将不平衡类训练集重抽样成一组平衡集,而是一些平衡集。在这个集合中,同时运行所有集产生的结果可能比只运行一个集的结果更好。

    这些只是一小部分你可以尝试的有趣的和创造性的想法。对于更多的想法,请搜索reddit 文章——“Classification when 80% of my training set is of one class”的评论。


选择一种方法,然后实际操作它

    你没有必要去做一个精通所有方法的奇才或者统计学家建立一个精确并且可靠的不平衡类数据集模型。以上我们已经讲述了许多可以用在不平衡类数据集模型的技术和方法。但愿这里有一到两个方法的模型你可以快速地较好地理解并且运用,例如:改变你精确度的指标和重新对你的数据集进行抽样。这两个方法都是比较快速的并且对问题影响会很明显。

    那么你想要尝试哪一个方法呢?


总结

    记住,我们不可能知道哪一个方法会得出最好的结果。

    你可以发散地选择这个方法或者那个方法,但是,在最后我给你的最好的建议是“变成科学家”并且根据经验测试每一个方法,选择结果做好的那一个。

    从点点滴滴开始做起,根据自己现有的知识一步一步完善。