【机器学习】处理样本不平衡的问题

这篇具有很好参考价值的文章主要介绍了【机器学习】处理样本不平衡的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

样本不均衡的概念及影响

机器学习中,样本不均衡问题经常遇到,比如在金融风险人员二分类问题中,绝大部分的样本均为正常人群,可用的风险样本较少。如果拿全量样本去训练一个严重高准确率的二分类模型,那结果毫无疑问会严重偏向于正常人群,从而导致模型的失效,所以说,训练样本比例均衡对模型的结果准确性至关重要。
首先来看概念:
【样本不均衡】所谓的样本不平衡问题指的是数据集中正负样本比例极不均衡,样本比例超过4:1的数据就可以称为不平衡数据。

样本不均衡的解决方法

常用的解决方法主要从样本层面、损失函数层面、模型层面以及评价指标等4方面进行优化。

样本层面

欠采样 (undersampling)

imblearn
imblearn库中的欠采样方法包含:
【机器学习】处理样本不平衡的问题,深度学习入门,机器学习,机器学习快速入门,机器学习,人工智能

  1. 随机欠采样
    下面是一个使用随机欠采样的示例代码:
from imblearn.under_sampling import RandomUnderSampler

# 创建RandomUnderSampler对象
sampler = RandomUnderSampler(random_state=42)

# 对训练数据进行欠采样
X_resampled, y_resampled = sampler.fit_resample(X_train, y_train)

在上述代码中,X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回欠采样后的特征和标签。

2.集群中心欠采样
集群中心选择欠采样(Cluster Centroids Undersampling):这是一种基于聚类的欠采样方法,它通过聚类算法将多数类别样本聚集到少数类别样本的中心点,从而减少多数类别的数量。同样地,可以使用imbalanced-learn库来实现集群中心选择欠采样。

下面是一个使用集群中心选择欠采样的示例代码:

from imblearn.under_sampling import ClusterCentroids

# 创建ClusterCentroids对象
sampler = ClusterCentroids(random_state=42)

# 对训练数据进行欠采样
X_resampled, y_resampled = sampler.fit_resample(X_train, y_train)
在上述代码中,X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回欠采样后的特征和标签。

这些方法都可以根据具体情况选择合适的欠采样策略。值得注意的是,欠采样可能会导致信息丢失,因此在应用欠采样之前,需要仔细评估其对模型性能的影响,并选择适当的评估指标来评估模型的效果。

过采样

过采样(Oversampling)是一种处理样本不均衡问题的方法,它通过增加少数类别样本的数量来平衡数据集。在Python中,有多种过采样方法可供选择。以下是几种常用的过采样方法及其示例代码:

1. 复制样本(Duplicate Samples):这是一种简单直接的过采样方法,它通过复制少数类别样本来增加其数量。

import numpy as np

# 找出少数类别样本的索引
minority_indices = np.where(y == minority_class_label)[0]

# 复制少数类别样本
duplicated_samples = X[minority_indices]

# 将复制的样本添加到原始数据集中
X_oversampled = np.concatenate((X, duplicated_samples), axis=0)
y_oversampled = np.concatenate((y, np.ones(len(duplicated_samples))), axis=0)

在上述代码中,X和y分别表示原始数据集的特征和标签。minority_class_label是少数类别的标签。通过复制少数类别样本并将其添加到原始数据集中,我们可以实现过采样。

2.SMOTE(Synthetic Minority Over-sampling Technique):SMOTE是一种基于合成样本的过采样方法,它通过在特征空间中插入新的合成样本来增加少数类别样本的数量。

from imblearn.over_sampling import SMOTE

# 创建SMOTE对象
smote = SMOTE(random_state=42)

# 对训练数据进行过采样
X_oversampled, y_oversampled = smote.fit_resample(X_train, y_train)
在上述代码中,X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回过采样后的特征和标签。

3. ADASYN(Adaptive Synthetic Sampling):ADASYN是一种基于合成样本的自适应过采样方法,它根据样本密度来生成合成样本,更关注于那些在决策边界附近的少数类别样本。

from imblearn.over_sampling import ADASYN

# 创建ADASYN对象
adasyn = ADASYN(random_state=42)

# 对训练数据进行过采样
X_oversampled, y_oversampled = adasyn.fit_resample(X_train, y_train)
在上述代码中,X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回过采样后的特征和标签。

这些方法都可以根据具体情况选择合适的过采样策略。需要注意的是,过采样可能会导致模型对少数类别样本过拟合的问题,因此在应用过采样之前,需要仔细评估其对模型性能的影响,并选择适当的评估指标来评估模型的效果。

数据增强

损失函数层面

损失函数层面主流的方法也就是常用的代价敏感学习(cost-sensitive),为不同的分类错误给予不同惩罚力度(权重),在调节类别平衡的同时,也不会增加计算复杂度。如下常用方法:
这最常用也就是scikit模型的’class weight‘方法,If ‘balanced’, class weights will be given by n_samples / (n_classes * np.bincount(y)). If a dictionary is given, keys are classes and values are corresponding class weights. If None is given, the class weights will be uniform.,class weight可以为不同类别的样本提供不同的权重(少数类有更高的权重),从而模型可以平衡各类别的学习。如下图通过为少数类做更高的权重,以避免决策偏重多数类的现象(类别权重除了设定为balanced,还可以作为一个超参搜索。示例代码请见github.com/aialgorithm):
【机器学习】处理样本不平衡的问题,深度学习入门,机器学习,机器学习快速入门,机器学习,人工智能

clf2 = LogisticRegression(class_weight={0:1,1:10})  # 代价敏感学习

模型层面

模型方面主要是选择一些对不均衡比较不敏感的模型,比如,对比逻辑回归模型(lr学习的是全量训练样本的最小损失,自然会比较偏向去减少多数类样本造成的损失),决策树在不平衡数据上面表现相对好一些,树模型是按照增益递归地划分数据(如下图),划分过程考虑的是局部的增益,全局样本是不均衡,局部空间就不一定,所以比较不敏感一些(但还是会有偏向性).

采样+集成学习

BalanceCascade
BalanceCascade基于Adaboost作为基分类器,核心思路是在每一轮训练时都使用多数类与少数类数量上相等的训练集,然后使用该分类器对全体多数类进行预测,通过控制分类阈值来控制FP(False Positive)率,将所有判断正确的类删除,然后进入下一轮迭代继续降低多数类数量。
在Python中,BalanceCascade是一个用于处理样本不均衡问题的集成学习方法,它基于级联分类器。BalanceCascade通过多次迭代地训练和删除错误分类的样本来减少多数类别的数量,从而实现欠采样。

你可以使用imbalanced-learn库来实现BalanceCascade方法。下面是一个使用BalanceCascade的示例代码:

python

from imblearn.ensemble import BalanceCascade
from sklearn.tree import DecisionTreeClassifier

# 创建BalanceCascade对象,并指定基分类器
bc = BalanceCascade(estimator=DecisionTreeClassifier(random_state=42))

# 对训练数据进行欠采样
X_resampled, y_resampled = bc.fit_resample(X_train, y_train)
在上述代码中,X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回欠采样后的特征和标签。

BalanceCascade方法会自动进行多轮迭代,每轮迭代都会训练一个基分类器,并删除错误分类的样本。这样,多数类别的样本数量会逐步减少,直到达到平衡。

请注意,BalanceCascade方法可能需要较长的时间来运行,因为它涉及多轮迭代和训练多个分类器。此外,选择合适的基分类器也是很重要的,你可以根据具体情况选择适合的分类器。

你可以在imbalanced-learn官方文档中找到更多关于BalanceCascade方法的详细信息和示例代码。

EasyEnsemble
EasyEnsemble也是基于Adaboost作为基分类器,就是将多数类样本集随机分成 N 个子集,且每一个子集样本与少数类样本相同,然后分别将各个多数类样本子集与少数类样本进行组合,使用AdaBoost基分类模型进行训练,最后bagging集成各基分类器,得到最终模型。示例代码可见:http://www.kaggle.com/orange90/ensemble-test-credit-score-model-example
在Python中,EasyEnsemble是一种用于处理样本不均衡问题的集成学习方法。它通过将原始数据集划分为多个子集,并在每个子集上训练一个基分类器来实现欠采样。

你可以使用imbalanced-learn库来实现EasyEnsemble方法。下面是一个使用EasyEnsemble的示例代码:

from imblearn.ensemble import EasyEnsemble
from sklearn.tree import DecisionTreeClassifier

# 创建EasyEnsemble对象,并指定基分类器和子集数量
ee = EasyEnsemble(n_estimators=10, base_estimator=DecisionTreeClassifier(random_state=42))

# 对训练数据进行欠采样
X_resampled, y_resampled = ee.fit_resample(X_train, y_train)
在上述代码中,X_train和y_train分别表示训练数据的特征和标签。n_estimators参数表示要生成的子集数量,base_estimator参数表示用于训练每个子集的基分类器。

EasyEnsemble方法会生成多个子集,并在每个子集上训练一个基分类器。最终的预测结果是所有基分类器的投票结果或平均结果,以达到平衡样本不均衡的效果。

请注意,EasyEnsemble方法可能需要较长的时间来运行,因为它涉及生成多个子集并训练多个分类器。同样地,选择合适的基分类器也是很重要的,你可以根据具体情况选择适合的分类器。
你可以在imbalanced-learn官方文档中找到更多关于EasyEnsemble方法的详细信息和示例代码。

通常,在数据集噪声较小的情况下,可以用BalanceCascade,可以用较少的基分类器数量得到较好的表现(基于串行的集成学习方法,对噪声敏感容易过拟合)。噪声大的情况下,可以用EasyEnsemble,基于串行+并行的集成学习方法,bagging多个Adaboost过程可以抵消一些噪声影响。此外还有RUSB、SmoteBoost、balanced RF等其他集成方法可以自行了解。

决策及评估指标

在处理不平衡样本问题时,传统的评价指标(如准确率)可能会给出误导性的结果。因此,为了更准确地评估模型在不平衡数据上的性能,我们通常使用以下评价指标:

1.混淆矩阵(Confusion Matrix):混淆矩阵是一个二维矩阵,用于显示分类器在每个类别上的预测结果。它包含四个重要的指标:真阳性(True Positive, TP),真阴性(True Negative, TN),假阳性(False Positive, FP)和假阴性(False Negative, FN)。根据这些指标,可以计算其他评价指标。

2.精确率(Precision):精确率是指模型预测为正例的样本中,实际为正例的比例。它可以通过以下公式计算:Precision = TP / (TP + FP)。精确率越高,表示模型对于正例的判断越准确。

3.召回率(Recall):召回率是指实际为正例的样本中,模型正确预测为正例的比例。它可以通过以下公式计算:Recall = TP / (TP + FN)。召回率越高,表示模型对于正例的识别能力越强。

4.F1值(F1-Score):F1值是精确率和召回率的调和平均值,用于综合评估模型的性能。它可以通过以下公式计算:F1 = 2 * (Precision * Recall) / (Precision + Recall)。F1值越高,表示模型在精确率和召回率之间取得了更好的平衡。

5.ROC曲线和AUC(Receiver Operating Characteristic Curve and Area Under the Curve):ROC曲线是以假阳性率(False Positive Rate, FPR)为横轴,真阳性率(True Positive Rate, TPR)为纵轴绘制的曲线。AUC表示ROC曲线下的面积,用于衡量模型在不同阈值下的分类性能。AUC的取值范围在0到1之间,越接近1表示模型性能越好。

以上评价指标可以帮助我们更全面地评估模型在不平衡样本上的性能。根据具体问题的需求,选择适当的评价指标来评估模型的效果是非常重要的。文章来源地址https://www.toymoban.com/news/detail-631540.html

到了这里,关于【机器学习】处理样本不平衡的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第34步 机器学习实战DLC:不平衡数据处理(上)

    失踪人口回归的第一期,来说一说不平衡数据。 一、不平衡数据的概念 什么是不平衡数据?我们先来看看小Chat怎么说的:   顾名思义,就是你的因变量1和0的样本数差距有点大, 大到影响了模型性能。举个栗子,一个盒子里有100个红球,10个黄球,我们随机盲抽一个球,然

    2024年02月08日
    浏览(29)
  • 【机器学习】样本不均衡(class-imbalance)——解决方案与问题思考

    机器学习的老师在一次作业中给出了这几个思考的问题,本文从前两个问题着手,若有不全或者意思错误的地方请向我指出(谢谢!) 这个问题也可以拓展为:哪种分类器比较不会受到样本不均衡的影响,或者说得不均衡到哪种程度,会对分类器的影响。 这个问题也就可以

    2023年04月08日
    浏览(31)
  • 深度学习如何入门,如何快速理解深度学习

    深度学习是机器学习的一个分支,它使用深度神经网络来模拟人脑的工作方式,通过学习样本数据的内在规律和表示层次,让机器能够具有类似于人类的分析学习能力。深度学习的最终目标是实现人工智能的普及化,使机器能够识别、处理、分析和理解各种数据,如文字、图

    2024年01月24日
    浏览(26)
  • 机器学习入门教学——人工智能、机器学习、深度学习

    1、人工智能 人工智能相当于人类的代理人,我们现在所接触到的人工智能基本上都是弱AI,主要作用是正确解释从外部获得的数据,并对这些数据加以学习和利用,以便灵活的实现特定目标和任务。 例如: 阿尔法狗、智能汽车 简单来说: 人工智能使机器像人类一样进行感

    2024年02月09日
    浏览(63)
  • 【深度学习】pytorch——快速入门

    笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ PyTorch是一个开源的机器学习框架,它提供了丰富的工具和库,用于构建和训练深度学习模型。下面是一些关于PyTorch的基本信息: 张量(Tensor)操作 :PyTorch中的核心对象是张量,它是一个多维数组。PyTorch提供了广泛的

    2024年02月06日
    浏览(32)
  • 深度学习快速入门系列---损失函数

    在深度学习中,损失函数的作用是量化预测值和真实值之间的差异,使得网络模型可以朝着真实值的方向预测,损失函数通过衡量模型预测结果与真实标签之间的差异,反映模型的性能。同时损失函数作为一个可优化的目标函数,通过最小化损失函数来优化模型参数。在本篇

    2024年02月12日
    浏览(28)
  • 快速入门Unity机器学习:三:

    目录 1.目的 1.1 记录一下,方便下次直接查看博客 2.参考 1.我的博客 3.注意 4. 课时 12 : 109 - 随机Target的位置并收集观察结果 5.  课时 13 : 110 - 收集观察结果完成前期训练准备 6.  课时 14 : 111 - 让红球可以一直吃到绿球  7. 课时 15 : 112 - 开始训练模型  7.1 解决报错:已解决 7

    2024年02月05日
    浏览(28)
  • 研0或研一|如何快速入门深度学习?

    1️⃣课程篇 直接上手B站【 小土堆PyTorch深度学习快速入门教程 】,共计9h50min左右,预计一周就可以学完,比较偏向理论和实践相结合 跟李沐学AI B站【 动手学深度学习 PyTorch版 】 刘二大人B站【 PyTorch深度学习实践 】,共计11h56min,比较偏向原理理论 2️⃣ 网站篇 推荐使用

    2024年01月17日
    浏览(35)
  • PyTorch深度学习快速入门教程【小土堆】 学习笔记

    PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】 anaconda 卸载环境 :conda uninstall -n yyy --all anaconda 安装路径:D:anaconda3 创建环境: conda create -n pytorch python=3.9 切换环境 : conda activate pytorch 查看目前已经安装的工具包:pip list Q 安装pytorch? 进入pytorch首页 下拉,http

    2024年02月07日
    浏览(42)
  • Gradio快速搭建机器学习模型的wedui展示用户界面/深度学习网页模型部署

    官网 Gradio 是一个开源 Python 包,可让您快速为机器学习模型、API 或任何任意 Python 函数构建演示或 Web 应用程序。然后,您可以使用 Gradio 的内置共享功能在几秒钟内共享演示或 Web 应用程序的链接。无需 JavaScript、CSS 或网络托管经验! 只需几行 Python 代码就可以创建一个像上

    2024年04月23日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包