--是否还在纠结不平衡集呢?现在有办法了
我在邮件中随时都能发现不平衡数据集,例如:
I have a binary classification problem and one class ispresent with 60:1 ratio in my training set. I used the logistic regression andthe result seems to just ignores one class.
还有这个:
I am working on a classification model. In my dataset Ihave three different labels to be classified, let them be A, B and C. But inthe training dataset I have A dataset with 70% volume, B with 25% and C with5%. Most of time my results are overfit to A. Can you please suggest how can Isolve this problem?
我曾经写过一串长长的技术列表尝试去解决这个问题,最后我发现最好的给我学生的建议是:
也许一个即将到来的文章可以解决训练模型执行针对高度不平衡的数据的问题,并概述一些技术和期望的问题。
不平衡的数据可能会产生很多挫折感。当你发现你的数据有不平衡的类时,并且你认为你得到的结果是谎言,你会感到非常沮丧。在又一次挫折的时候,书,文章和博客似乎都没有给你关于处理数据不平衡的良好建议。很有可能,您也可以为不平衡数据构建预测模型。
不平衡数据通常指的是分类问题,其中的类没有被平等地表示。例如,您可能有一个具有100个实例(行)的2分类(binary)问题。总共80个实例被标记为类-1,剩余的20个实例被标记为类-2。这就是一个不平衡的数据集,Class-1和Class-2实例的比例为80:20或更简洁地4:1。你现在有了一个关于2分类问题的类不平衡问题以及多类分类问题。剩下的讨论将假定一个2分类问题,因为它更容易思考和描述。
大多数分类数据集在每个类中没有完全相同数量的实例,但是小的差异通常并不重要。有一些问题,其中类不平衡不只是平常的,而是可预期的。例如,在那些表征欺诈交易的数据集中,会存在不平衡。绝大多数的交易将在“非欺诈”类中,少数人在“欺诈”类中。另一个例子是客户流失数据集,其中绝大多数客户保留服务(“No-Churn”类),少数客户会取消他们的订阅(“Churn”类)。当有一个适度的类不平衡时,如在上面的例子中的4:1,可能会导致问题。
这是你的精度测量会告诉你会有极好的精度(如90%),但精度只反映基础类分布的情况。这是非常常见的,因为分类精度通常是我们在评估模型分类问题时使用的第一个措施。
当我们训练一个不平衡数据集时,我们的模型会发生吗?正如你可能已经猜到的,我们在不平衡数据(90%的第1类实例)中获得90%准确度的原因是因为我们的模型会审视数据,并巧妙地决定最好的做法是始终预测“Class-1”,以实现高精度。这在使用简单的基于规则的算法时是最好的。如果在最终模型中输出规则时,您将看到它很可能只预测一个类,不管需要预测的数据是什么。
我们现在知道什么是类不平衡,为什么它会误导分类准确性。那么我们的选择是什么?
你可能会认为它是愚蠢的,但收集更多的数据这方法几乎总是会被忽视。你能收集更多的数据吗?花一秒时间思考你是否能够收集更多关于你的问题的数据。更大的数据集可能会暴露不同的,但也许更平衡的角度的类。当我们审视重采样数据集时,更少的小类的样本可能会变得有用。
当你使用不平衡数据集时,精度不会是要使用的指标。 我们已经看到它可能会误导结果。有一些指标旨在告诉你在使用不平衡类时更真实的故事。
您可以更改用于构建预测模型的数据集,以获得更平衡的数据。此更改被称为对数据集进行抽样,有两个主要方法可用于均匀化类:
这些方法通常很容易实现和运行速度很快。 他们都有一个很好的起点。事实上,我建议你可以对所有的不平衡数据集尝试这两种方法,只是看看它是否给你一个提升你的首选的精度措施。
Some Rules of Thumb
生成合成样本的一种简单方法是从少数类中的实例随机抽取属性。您可以在数据集中根据经验对它们进行抽样,或者可以使用像Naive Bayes这样的方法,它们在反向运行时可以单独对每个属性进行抽样。您将有更多的不同数据,但属性之间的非线性关系可能不会保留。有一些算法可以用来生成合成样本。最流行的这种算法称为SMOTE(the Synthetic Minority Over-sampling Technique)。顾名思义,SMOTE是一种过采样方法。 它通过从minor类创建合成样本,而不是创建副本。 该算法选择两个或更多个类似的实例(使用距离测量),并且通过在差异内的随机量与相邻实例一次扰乱实例的一个属性。
一如既往,我强烈建议你不要使用你最喜欢的算法解决每个问题。 你应该至少在给定问题上试试各种不同类型的算法。话虽如此,决策树通常在不平衡数据集上表现良好。如果有疑问,尝试一些流行的决策树算法,如C4.5,C5.0,CART和随机森林。
惩罚分类对训练期间在少数类上造成分类错误的模型增加了额外成本。这些惩罚可以使模型偏向于更多地关注少数类。
通常,类惩罚或权重的处理专用于学习算法。存在有惩罚版本的算法,例如惩罚SVM和惩罚LDA。
还可以具有用于惩罚模型的通用框架。例如,Weka有一个CostSensitiveClassifier,它可以包装任何分类器,并对缺少分类应用自定义惩罚矩阵。
如果确定了特定算法,并且无法重采样或者您的结果不佳,则使用惩罚是可取的。它提供了另一种方式来“平衡”类。设置惩罚矩阵可能是复杂的。你很可能要尝试各种惩罚,来看看什么最适合你的问题。
有专门研究不平衡数据集的领域。他们有自己的算法,度量和术语。
两个你可能想考虑的是异常检测和变化检测。
异常检测是检测罕见事件。这可能是通过其振动或由其系统调用序列指示的程序的恶意活动指示的机器故障。与正常操作相比,这事件是罕见的。
这种思维的转变是将小类作为离群类,可能帮助你想到分离和分类样本的新方法。
变化检测类似于异常检测,除了寻找其正在寻找变化或差异的异常之外。这可能是用户的行为的变化,如使用模式或银行交易所观察到的。
这两种转变对分类问题采取更实时的态度,可能给你一些新的思考你的问题的方法,或许还有一些更多的技巧。
想想如何把它分解成更容易处理的更小的问题。对于灵感,看看Quora的非常有创意的答案“在分类,你如何处理不平衡的训练集?例如:将您的较大类分解为较小数目的其他类......使用一类分类器...(例如对待异常检测)...将不平衡训练集重新采样为不是一个平衡集,而是几个。 在这些集合上运行分类器的集合可以产生比单独的分类器更好的结果,这些只是一些有趣的和创造性的想法,你可以多尝试的几个。