不平衡样本数据的救星:数据再分配策略

打印 上一主题 下一主题

主题 2129|帖子 2129|积分 6387

在机器学习范畴,数据是模型练习的基础,而数据的分布情况每每会对模型的性能产生重要影响。
不平衡样本数据是我们在实际项目中经常会遇到的问题,它可能导致模型对多数类过分拟合,而对少数类的猜测本领不敷。
本文将详细介绍不平衡样本数据的常见场景、处理方法以及在实践中需要留意的问题,资助你在模型练习前有效地举行数据再分配。
1. 常见场景

不平衡样本数据是指在分类问题中,不同类别的样本数量存在显著差别的情况。
以下是一些常见的不平衡样本数据场景:

  • 金融范畴:在名誉卡欺诈检测中,正常交易的数量远远超过欺诈交易的数量。正常交易可能占总交易的99%以上,而欺诈交易仅占1%左右。这种不平衡的数据分布使得模型容易方向于猜测正常交易,而忽略欺诈交易。
  • 医疗范畴:在疾病诊断中,某些稀有疾病的患者数量远少于常见疾病的患者数量。例如,在癌症筛查中,正常人群的数量可能比癌症患者多几十倍乃至上百倍。如果直接使用不平衡的数据练习模型,可能导致模型对稀有疾病的诊断本领不敷。
  • 网络安全范畴:在入侵检测系统中,正常网络访问的流量通常宏大于异常流量。正常流量可能占总流量的99%以上,而异常流量仅占1%左右。这种不平衡的数据分布使得模型容易方向于猜测正常流量,而忽略异常流量。
  • 电商范畴:在客户流失猜测中,大多数客户是活跃的,而流失的客户数量相对较少。如果直接使用不平衡的数据练习模型,可能导致模型对流失客户的猜测本领不敷。
2. 应对策略

在模型练习前,面临不平衡的样本数据,我们通常使用以下几种方法举行处理。
2.1. 欠采样(Undersampling)

欠采样是指从多数类中随机抽取部门样本,使得多数类和少数类的样本数量达到平衡。
这种方法的长处是简朴易实现,缺点是可能会丢失一些重要的信息,尤其是当多数类的样本数量较多时。
当数据集较大且多数类的样本数量远多于少数类时,可以使用欠采样方法。
例如,在名誉卡欺诈检测中,正常交易的数量远远超过欺诈交易的数量,可以通过欠采样减少正常交易的样本数量,使数据集达到平衡。
比如,下面的代码天生了一个数据集,其中包含了不平衡的两类数据:
  1. from sklearn.datasets import make_classification
  2. from imblearn.under_sampling import RandomUnderSampler
  3. # 生成不平衡数据
  4. X, y = make_classification(
  5.     n_classes=2,
  6.     class_sep=2,
  7.     weights=[0.99, 0.01],
  8.     n_informative=3,
  9.     n_redundant=1,
  10.     flip_y=0,
  11.     n_features=20,
  12.     n_clusters_per_class=1,
  13.     n_samples=1000,
  14.     random_state=10,
  15. )
  16. # 欠采样
  17. rus = RandomUnderSampler(random_state=42)
  18. X_resampled, y_resampled = rus.fit_resample(X, y)
  19. print("原始数据中各类样本数量:", sum(y == 0), sum(y == 1))
  20. print("欠采样后各类样本数量:", sum(y_resampled == 0), sum(y_resampled == 1))
复制代码
欠采样之后,两类数据的数量都是10:
  1. 原始数据中各类样本数量: 990 10
  2. 欠采样后各类样本数量: 10 10
复制代码
2.2. 过采样(Oversampling)

过采样是指通过复制少数类样本或天生新的少数类样本来增长少数类的样本数量,使多数类和少数类的样本数量达到平衡。
常见的过采样方法有随机过采样和SMOTE(合成少数类过采样技能)。
少数类样本数量较少且数据集较小或中等大小时,可以使用过采样方法。
例如,在医疗范畴,某些稀有疾病的患者数量较少,可以通过过采样增长少数类样本数量,使数据集达到平衡。
下面的示例中,数据集仍然使用上一节中天生的测试数据,只是将采样方式做一个修改:
  1. from imblearn.over_sampling import SMOTE
  2. # 过采样
  3. smote = SMOTE(random_state=42)
  4. X_resampled, y_resampled = smote.fit_resample(X, y)
  5. print("原始数据中各类样本数量:", sum(y == 0), sum(y == 1))
  6. print("过采样后各类样本数量:", sum(y_resampled == 0), sum(y_resampled == 1))
复制代码
运行之后,两类数据的数量都变成了990:
  1. 原始数据中各类样本数量: 990 10
  2. 过采样后各类样本数量: 990 990
复制代码
2.3. 混合采样(Hybrid Sampling)

混合采样是指同时使用欠采样和过采样方法来处理不平衡样本数据。
通常先对多数类举行欠采样,再对少数类举行过采样,以达到更好的平衡效果。
当数据集较大且多数类和少数类的样本数量差别较大时,可以使用混合采样方法。
例如,在网络安全范畴,正常网络访问的流量宏大于异常流量,可以通过混合采样方法使数据集达到平衡。
下面的示例联合了过采样欠采样(SMOTE+ENN)
  1. from imblearn.combine import SMOTEENN
  2. # 混合采样
  3. smoteen = SMOTEENN(random_state=42)
  4. X_resampled, y_resampled = smoteen.fit_resample(X, y)
  5. print("原始数据中各类样本数量:", sum(y == 0), sum(y == 1))
  6. print("混合采样后各类样本数量:", sum(y_resampled == 0), sum(y_resampled == 1))
复制代码
运行结果:
  1. 原始数据中各类样本数量: 990 10
  2. 混合采样后各类样本数量: 878 990
复制代码
2.4. 类别权重调解(Class Weight Adjustment)

类别权重调解是指在模型练习过程中,为不同类别的样本分配不同的权重,使得模型在练习时更加关注少数类样本。
这种方法不需要对数据举行采样,而是通过调解权重来平衡类别之间的差别。
当数据集较大且不希望对数据举行采样时,可以使用类别权重调解方法。
例如,在电商范畴,客户流失猜测中,大多数客户是活跃的,而流失的客户数量较少,可以通过类别权重调解方法使模型更加关注流失客户。
代码示例:
  1. from sklearn.ensemble import RandomForestClassifier
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.metrics import classification_report
  4. from sklearn.datasets import make_classification
  5. # 生成不平衡数据
  6. X, y = make_classification(
  7.     n_samples=1000,
  8.     n_features=20,
  9.     n_classes=2,
  10.     weights=[0.9, 0.1],
  11.     n_informative=3,
  12.     n_redundant=1,
  13.     flip_y=0,
  14.     random_state=42,
  15. )
  16. # 划分训练集和测试集
  17. X_train, X_test, y_train, y_test = train_test_split(
  18.     X, y, test_size=0.2, random_state=42
  19. )
  20. # 类别权重调整
  21. weights = {0: 1, 1: 100}  # 为少数类分配更高的权重
  22. clf = RandomForestClassifier(class_weight=weights, random_state=42)
  23. clf.fit(X_train, y_train)
  24. # 评估模型
  25. y_pred = clf.predict(X_test)
  26. print(classification_report(y_test, y_pred))
复制代码
运行结果如下:

类别权重调解方法可以不采样,直接练习,但是要给少数数据赋予更高的权重:weights = {0: 1, 1: 100}。
2.5. 其他方法

除了上述方法外,还有一些其他方法可以处理不平衡样本数据,例如:

  • 集成学习方法:如 EasyEnsemble 和 BalanceCascade,通过构建多个子数据集并练习多个模型来提高少数类的猜测本领。
  • 异常检测方法:将少数类视为异常样本,使用异常检测算法举行建模。
  • 数据加强方法:通过对少数类样本举行数据加强(如图像旋转、缩放等)来增长少数类样本的数量。
3. 留意事项

在处理不平衡样本数据时,需要重点留意再分配数据时可能带来的问题。
使用欠采样方法时,可能会丢失一些重要的信息,尤其是当多数类的样本数量较多时。
因此,在使用欠采样方法时,需要谨慎选择采样比例,尽量保留重要的信息。
使用过采样方法可能会导致模型对少数类样本过拟合,尤其是在少数类样本数量较少时。
为了制止过拟合,可以联合交叉验证等方法对模型举行评估和调解。
此外,不同的模型对不平衡样本数据的敏感度不同。
例如,决议树模型对不平衡样本数据的敏感度较低,而逻辑回归模型对不平衡样本数据的敏感度较高。
在选择模型时,需要根据数据的特点和问题的需求举行选择。
最后,在评估模型性能时,不能仅仅使用准确率作为评估指标,因为准确率可能会受到不平衡样本数据的影响。
可以使用召回率、F1分数、ROC曲线下面积等指标来评估模型的性能。
4. 总结

本文介绍了欠采样过采样混合采样类别权重调解其他几种处理不平衡样本数据的方法,并通过 scikit-learn 示例代码展示了这些方法的实现过程。
在处理不平衡样本数据时,还需要留意信息丢失、过拟合、模型选择和评估指标等问题。
希望本文能够资助各人更好地理解和应用这些方法,提高模型的性能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表