前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >处理不平衡数据集的5种最有用的技术(1)

处理不平衡数据集的5种最有用的技术(1)

作者头像
计算机与AI
发布2020-12-14 15:24:37
2.3K0
发布2020-12-14 15:24:37
举报
文章被收录于专栏:计算机与AI

这几天忙着数学建模竞赛培训,刚好模拟题碰到了不均衡样本建模,那么今天就带大家来学习一下不平衡数据集处理的方法。

您是否曾经遇到过这样一个问题,即您的数据集中的正类样本太少而模型无法学习?

在这种情况下,仅通过预测多数类即可获得相当高的准确性,但是您无法捕获少数类,这通常是首先创建模型的关键所在。

这样的数据集很常见,被称为不平衡数据集。

不平衡的数据集是分类问题的特例,其中类别之间的类别分布不均匀。通常,它们由两类组成:多数(负)类和少数(正)类

可以找到各个领域中不同用例的不平衡数据集:

财务:欺诈检测数据集的欺诈率通常约为1-2%

广告投放:点击预测数据集也没有很高的点击率。

运输 / 航空公司:飞机会发生故障吗?

医疗:患者是否患有癌症?

内容审核:帖子中是否包含NSFW内容?

数学建模模拟赛题内容:运动员兴奋剂检测

那么我们如何解决这些问题呢?

这篇文章是关于解释可用于处理不平衡数据集的各种技术的。

1.随机欠采样和过采样

处理高度不平衡的数据集的一种被广泛采用且也许是最直接的方法称为重采样。它包括从多数类中删除样本(欠采样)和/或从少数类中添加更多示例(过采样)。

让我们首先创建一些不平衡数据示例。

代码语言:javascript
复制
from sklearn.datasets import make_classificationX, y = make_classification(
n_classes=2, class_sep=1.5, weights=[0.9, 0.1],
n_informative=3, n_redundant=1, flip_y=0,
n_features=20, n_clusters_per_class=1,
n_samples=100, random_state=10
)X = pd.DataFrame(X)
X['target'] = y

我们现在可以使用以下方法进行随机过采样和欠采样:

代码语言:javascript
复制
num_0 = len(X[X['target']==0])
num_1 = len(X[X['target']==1])
print(num_0,num_1)# random undersampleundersampled_data = pd.concat([ X[X['target']==0].sample(num_1) , X[X['target']==1] ])
print(len(undersampled_data))# random oversampleoversampled_data = pd.concat([ X[X['target']==0] , X[X['target']==1].sample(num_0, replace=True) ])
print(len(oversampled_data))------------------------------------------------------------
OUTPUT:
90 10
20
180

2.使用不平衡学习的欠采样和过采样

imbalanced-learn(imblearn)是一个Python软件包,用于解决不平衡数据集的问题。

它提供了多种方法来进行欠采样和过采样。

a.使用Tomek链接进行欠采样:

它提供的此类方法之一称为Tomek链接。Tomek链接是成对的相近类别的对示例。

在该算法中,我们最终从Tomek链接中删除了多数元素,这为分类器提供了更好的决策边界。

它提供的此类方法之一称为Tomek链接。Tomek链接是成对的相近类别的对示例。

在该算法中,我们最终从Tomek链接中删除了多数元素,这为分类器提供了更好的决策边界。

代码语言:javascript
复制
from imblearn.under_sampling import TomekLinkstl = TomekLinks(return_indices=True, ratio='majority')X_tl, y_tl, id_tl = tl.fit_sample(X, y)

b.使用SMOTE进行过采样:

在SMOTE(综合少数族裔过采样技术)中,我们在已经存在的元素附近合成少数族裔的元素。

代码语言:javascript
复制
from imblearn.over_sampling import SMOTEsmote = SMOTE(ratio='minority')X_sm, y_sm = smote.fit_sample(X, y)

包中还有许多其他方法可 imblearn 用于欠采样(Cluster Centroids,NearMiss等)和过采样(ADASYN和bSMOTE)。

明天和大家分享剩余的三种方法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 计算机与AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.随机欠采样和过采样
  • 2.使用不平衡学习的欠采样和过采样
  • b.使用SMOTE进行过采样:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档