您的位置:首页 > 其它

特征工程(补充)--机器学习数据集里的不均衡数据问题

2017-05-13 12:37 387 查看
开头我们举个例子。

例如:“现在我正在运行一个分类模型。在我的数据集里面一共有3类数据,这里我们称它们分别为A,B和C,但是在我的训练数据集里面A,B和C三类数据分别占了90%,5%和5%。在大多数情况下,结果都过度拟合A类数据。”

在数据不均衡的情况下,我们得到90%的准确率(比如包含90%的数据类型一的实例)是因为我们的模型观察数据并且智能地总是根据数据类型一的数据进行预测(A类数据),并且尽量达到最高精度。  当我们规则基于这个方法进行的时候似乎得到的是最好的答案。但是如果你在最后的模型中仔细考察这个规则,你会发现似乎这个方法是忽略其他数据在对一类数据进行预测。

所以我们的应对解决方法是什么呢?  

1) 可以扩大数据样本

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

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

精度是一个不适用于不平衡的数据集的绩效指标。正如我们已经看到的,这是一种误导。  

在处理不平衡类时,有些更加理想的指标可以给你更加具有说服力的结果。文章“Classification Accuracy is Not Enough: More Performance Measures You Can Use”中,有更多的建议和措施去选择不同的绩效标准,文章链接为:http://machinelearningmastery.com/classification-accuracy-is-not-enough-more-performance-measures-you-can-use/。

在这篇文章里主要着重于讲述如何对乳腺癌患者复发这个不均衡数据集进行分类。这篇文章中作者推荐了以下几个绩效标准,相比于传统的精确度,这些绩效标准可以更加深入地洞察模型的准确率:

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

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

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

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

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

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

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

你可以改变将要用来建立预测模型的数据集来获得更加平衡的数据集。这种变化被称为抽样数据集,您主要可以运用以下两种方法来使数据分类更加均衡:

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

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

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

一些经验的规则:

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

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

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

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

4) 尝试生成人工样本 

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

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

这里有一些系统方法可以用来生成人工演变。其中最流行的算法被称为SMOTE或Synthetic Minority Over-sampling技术。正如其名,SMOTE是过度抽样的方法。它的工作原理是从小类的数据中生成人工样本,而不是创建副本。该算法选择两个或更多个类似的例子(使用距离度量),然后随机干扰一个实例中的一个属性,比较其差异。现在有很多的SMOTE算法的实现方法,例如:

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

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

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

5) Try Different Algorithms 

通常来说,强烈建议对于所有问题不要总是使用自己最喜欢的模型.对于所给的问题你至少应该用不同类型的算法对其进行抽查。决策树往往在处理不平衡类数据集表现不错。在创建树的过程中使用类变量的分裂规则,可以强制地将两个类很好的进行处理。  如果有疑问,请尝试一些流行的决策树算法,如C4.5,C5.0,CART和随机森林。 

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

对于研究不平衡数据集的邻域。他们有自己的算法,措施和术语。  从这些观点处罚,纵观和思考你的问题,有时一些想法会有所改变。

两个你可能想要考虑的是异常检测和变化检测。异常检测是罕见事件的检测。这可能是根据一系列的系统调用,通过它的振动或一个由程序指示的恶意活动而产生的机器故障。这样的事件相比正常操作是罕见的。这种思维的转变在于考虑以小类作为异常值类,它可以帮助你获得一种新方法来分离和分类的样本。除了变化检测是找寻找它的变化而不是差异以外,变化检测类似于异常检测。这可能是在观察使用模式或银行交易过程中用户的行为变化。对于分类的问题,这两个转变具有更加实时的角度,它可能会给你一些新的方式去思考你的问题以及让你尝试更多新的技术。

总结:

你没有必要去做一个精通所有方法的奇才或者统计学家建立一个精确并且可靠的不平衡类数据集模型。选择上述的一种方法,然后实际操作它。改变你精确度的指标和重新对你的数据集进行抽样。这两个方法都是比较快速的并且对问题影响会很明显。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐