问题

正负样本极不平衡的问题?

回答
在机器学习的领域,我们常常面临一个棘手的挑战:数据不平衡,尤其是当你的正负样本比例严重失衡时。这就像是让一个班级里只有三个学生参加了一场有奖知识竞赛,而剩下的九十多个人只是围观一样。少数派的声音很容易被淹没,而模型也很容易偏向多数派。

举个例子,我们来想象一下训练一个识别罕见疾病的模型。假设我们收集了1000个病人的数据,其中990个是健康的(负样本),只有10个是患有这种罕见疾病的(正样本)。这时候,你的数据集就是极度不平衡的。

为什么数据不平衡是个大问题?

很多机器学习模型,尤其是那些以“准确率”(Accuracy)作为评价指标的模型,在面对这种不平衡数据时,会“偷懒”地去预测大多数的类别。它们会发现,如果模型总是预测“健康”,那么准确率也能达到99%。这看起来很高,但实际上,模型完全没有学到如何识别那个患有罕见疾病的少数群体,也就是我们真正关心的目标。

这就像那个知识竞赛,如果比赛的唯一评分标准是“答对题的数量”,而只有三个学生真的去答题,剩下的人都不答,那么即使这三个学生答错了很多题,但只要他们的答题数比“零”多,他们就比那些什么都没做的学生“表现好”。但这个评分标准显然无法衡量他们对知识的真正掌握程度。

具体来说,数据不平衡会影响模型的几个方面:

训练偏差(Training Bias): 模型在训练过程中会倾向于学习到多数类别的特征,而忽略或学不到少数类别的特征。它会花费大部分精力去理解“健康”是什么样的,而对于“患病”的细微信号可能根本没捕捉到。
误导性的评估指标(Misleading Evaluation Metrics): 如前所述,准确率在不平衡数据上会产生误导。即使模型在大多数情况下都猜对了,但对于我们真正关注的少数正样本的识别能力可能为零。
泛化能力差(Poor Generalization): 模型虽然在训练集上可能看起来准确率很高,但在面对新的、同样不平衡的数据时,它可能无法正确识别出少数样本,导致在实际应用中效果不佳。

我们该如何应对这个问题?

别担心,面对数据不平衡,我们有一系列“兵器”可以使用。这些方法可以大致分为两大类:数据层面的方法和算法层面的方法。

一、 数据层面的方法(Datalevel Approaches)

这就像我们去“调整”一下数据本身,让它看起来不那么“一边倒”。

1. 重采样(Resampling): 这是最直接的方法。

过采样(Oversampling): 简单来说,就是复制少数类别的样本,或者生成新的少数类别样本,直到与多数类别样本数量相当为止。
随机过采样(Random Oversampling): 就是简单地复制少数类别的样本。缺点是可能导致过拟合,因为模型会反复看到相同的样本。
SMOTE (Synthetic Minority Oversampling Technique): 这是更智能的一种过采样方法。它不是简单地复制,而是为少数类别样本生成“合成”的新样本。SMOTE会找到少数样本的K个最近邻,然后在它们之间的连线上随机选择一点作为新的合成样本。这样可以增加数据的多样性,减少过拟合的风险。
ADASYN (Adaptive Synthetic Sampling): ADASYN是SMOTE的进一步改进。它会根据样本的“难易程度”来生成合成样本。对于那些更难被分类的少数样本(周围多数样本比较多),ADASYN会生成更多的合成样本,以帮助模型更好地学习它们。

欠采样(Undersampling): 与过采样相反,我们是随机删除多数类别的样本,直到与少数类别样本数量相当为止。
随机欠采样(Random Undersampling): 直接随机删除多数类的样本。优点是训练速度会快很多,因为数据量减少了。但缺点是可能会丢弃一些有用的信息,因为我们直接“扔掉”了很多多数类的样本。
Tomek Links: 这是一种基于近邻的欠采样方法。它会找出那些 서로 다른 클래스에 속하면서 거리가 매우 가까운 샘플 쌍 (Tomek Links)을 제거한다. 이렇게 함으로써 클래스 경계를 더 명확하게 만들고, 다수 클래스의 유용한 샘플을 보존하는 데 도움이 된다.
NearMiss: 这个方法会选择与少数类样本距离较近的多数类样本,来保留更多的多数类信息。它有不同的版本,比如选择距离最近的K个多数样本,或者选择平均距离最近的多数样本等。

组合采样(Combination Sampling): 结合过采样和欠采样,例如先用SMOTE过采样少数类,再用Tomek Links欠采样多数类,以达到更好的平衡效果。

二、 算法层面的方法(Algorithmlevel Approaches)

这种方法不直接修改数据,而是“告诉”模型如何更关注少数样本,或者调整模型的内部机制。

1. 调整评估指标(Adjusting Evaluation Metrics): 既然准确率不行,我们就换个更合适的。
精确率(Precision)和召回率(Recall): 精确率衡量的是模型预测为正的样本中有多少是真的正样本,召回率则衡量的是所有真实正样本中有多少被模型成功预测出来了。对于不平衡数据,我们通常更关注召回率(我们不想漏掉任何一个患病的人)和F1Score(精确率和召回率的调和平均值)。
ROC曲线和AUC值(Receiver Operating Characteristic Curve and Area Under the Curve): ROC曲线显示了在不同阈值下,真阳性率(Recall)和假阳性率(False Positive Rate)之间的权衡。AUC值是ROC曲线下的面积,越接近1表示模型区分正负样本的能力越强。
混淆矩阵(Confusion Matrix): 直接查看模型在每个类别上的预测情况,包括真正例(TP)、假正例(FP)、真负例(TN)、假负例(FN)。

2. 代价敏感学习(CostSensitive Learning): 我们可以给不同类型的错误分配不同的“代价”。对于不平衡数据,通常我们会给误将少数类预测为多数类(假负例,FN)的情况更高的代价,让模型更加努力地去避免这种情况。
一些算法(如支持向量机、逻辑回归)本身就支持设置类别权重,可以直接将少数类的权重调高。
如果算法不支持直接设置权重,我们也可以通过修改损失函数来实现。

3. 集成学习(Ensemble Learning): 结合多个模型来提高整体性能。
Bagging(如Random Forest): 在随机选择数据子集和特征子集的情况下构建多个模型,然后将它们的结果结合起来。这可以一定程度上缓解不平衡问题。
Boosting(如AdaBoost, Gradient Boosting): AdaBoost会关注那些被错误分类的样本,每次迭代都会给它们更高的权重。这样,后来的模型就会更专注于学习那些难分的样本(通常是少数类)。
专门为不平衡数据设计的集成方法: 例如EasyEnsemble和BalanceCascade,它们会结合欠采样和Boosting思想,多次进行欠采样然后训练多个模型,最后将它们集成起来。

4. 改变模型本身(Modifying the Model):
一些模型结构本身更适合处理不平衡数据,或者可以进行调整。例如,在决策树中,可以修改分裂准则,使其更倾向于关注少数类。

选择哪种方法?

没有万能的解决方案。最佳方法取决于你的具体数据集、问题的性质以及你对模型性能的要求。通常需要进行实验和比较:

从小数据集开始: 如果数据量巨大,先尝试在数据子集上验证不同的方法。
尝试多种方法: 不要局限于一种方法,可以组合使用数据层面的和算法层面的方法。
仔细评估: 始终使用合适的评估指标(如召回率、F1Score、AUC)来衡量模型性能,而不仅仅是准确率。
理解业务场景: 有时候,业务上的考量会指导你选择哪种错误更“可接受”。例如,在医疗诊断中,漏诊(假负例)的代价远高于误诊(假正例)。

处理正负样本极不平衡的问题,是一个需要耐心和细致的过程。它要求我们不仅要关注模型的“数量”上的准确率,更要关注模型在“质量”上对少数重要样本的识别能力。通过理解问题的根源和掌握各种应对策略,我们就能构建出更加鲁棒和有效的机器学习模型。

网友意见

user avatar

1 通过过抽样和欠抽样解决样本不均衡

抽样是解决样本分布不均衡相对简单且常用的方法,包括过抽样和欠抽样两种。

过抽样

过抽样(也叫上采样、over-sampling)方法通过增加分类中少数类样本的数量来实现样本均衡,最直接的方法是简单复制少数类样本形成多条记录,这种方法的缺点是如果样本特征少而可能导致过拟合的问题;经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本,例如SMOTE算法。

欠抽样

欠抽样(也叫下采样、under-sampling)方法通过减少分类中多数类样本的样本数量来实现样本均衡,最直接的方法是随机地去掉一些多数类样本来减小多数类的规模,缺点是会丢失多数类样本中的一些重要信息。

总体上,过抽样和欠抽样更适合大数据分布不均衡的情况,尤其是第一种(过抽样)方法应用更加广泛。

2 通过正负样本的惩罚权重解决样本不均衡

通过正负样本的惩罚权重解决样本不均衡的问题的思想是在算法实现过程中,对于分类中不同样本数量的类别分别赋予不同的权重(一般思路分类中的小样本量类别权重高,大样本量类别权重低),然后进行计算和建模。

使用这种方法时需要对样本本身做额外处理,只需在算法模型的参数中进行相应设置即可。很多模型和算法中都有基于类别参数的调整设置,以scikit-learn中的SVM为例,通过在class_weight : {dict, 'balanced'}中针对不同类别针对不同的权重,来手动指定不同类别的权重。如果使用其默认的方法balanced,那么SVM会将权重设置为与不同类别样本数量呈反比的权重来做自动均衡处理,计算公式为:n_samples / (n_classes * np.bincount(y))。

如果算法本身支持,这种思路是更加简单且高效的方法。

3 通过组合/集成方法解决样本不均衡

组合/集成方法指的是在每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法(例如投票、加权投票等)产生分类预测结果。

例如,在数据集中的正、负例的样本分别为100和10000条,比例为1:100。此时可以将负例样本(类别中的大量样本集)随机分为100份(当然也可以分更多),每份100条数据;然后每次形成训练集时使用所有的正样本(100条)和随机抽取的负样本(100条)形成新的数据集。如此反复可以得到100个训练集和对应的训练模型。

这种解决问题的思路类似于随机森林。在随机森林中,虽然每个小决策树的分类能力很弱,但是通过大量的“小树”组合形成的“森林”具有良好的模型预测能力。

如果计算资源充足,并且对于模型的时效性要求不高的话,这种方法比较合适。

4 通过特征选择解决样本不均衡

上述几种方法都是基于数据行的操作,通过多种途径来使得不同类别的样本数据行记录均衡。除此以外,还可以考虑使用或辅助于基于列的特征选择方法。

一般情况下,样本不均衡也会导致特征分布不均衡,但如果小类别样本量具有一定的规模,那么意味着其特征值的分布较为均匀,可通过选择具有显著型的特征配合参与解决样本不均衡问题,也能在一定程度上提高模型效果。

提示 上述几种方法的思路都是基于分类问题解决的。实际上,这种从大规模数据中寻找罕见数据的情况,也可以使用非监督式的学习方法,例如使用One-class SVM进行异常检测。分类是监督式方法,前期是基于带有标签(Label)的数据进行分类预测;而采用非监督式方法,则是使用除了标签以外的其他特征进行模型拟合,这样也能得到异常数据记录。所以,要解决异常检测类的问题,先是考虑整体思路,然后再考虑方法模型。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有