这几天忙着数学建模竞赛培训,刚好模拟题碰到了不均衡样本建模,那么今天就带大家来学习一下不平衡数据集处理的方法。
您是否曾经遇到过这样一个问题,即您的数据集中的正类样本太少而模型无法学习?
在这种情况下,仅通过预测多数类即可获得相当高的准确性,但是您无法捕获少数类,这通常是首先创建模型的关键所在。
这样的数据集很常见,被称为不平衡数据集。
不平衡的数据集是分类问题的特例,其中类别之间的类别分布不均匀。通常,它们由两类组成:多数(负)类和少数(正)类
可以找到各个领域中不同用例的不平衡数据集:
财务:欺诈检测数据集的欺诈率通常约为1-2%
广告投放:点击预测数据集也没有很高的点击率。
运输 / 航空公司:飞机会发生故障吗?
医疗:患者是否患有癌症?
内容审核:帖子中是否包含NSFW内容?
数学建模模拟赛题内容:运动员兴奋剂检测
那么我们如何解决这些问题呢?
这篇文章是关于解释可用于处理不平衡数据集的各种技术的。
1.随机欠采样和过采样
处理高度不平衡的数据集的一种被广泛采用且也许是最直接的方法称为重采样。它包括从多数类中删除样本(欠采样)和/或从少数类中添加更多示例(过采样)。
让我们首先创建一些不平衡数据示例。
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
我们现在可以使用以下方法进行随机过采样和欠采样:
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链接中删除了多数元素,这为分类器提供了更好的决策边界。
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(综合少数族裔过采样技术)中,我们在已经存在的元素附近合成少数族裔的元素。
from imblearn.over_sampling import SMOTEsmote = SMOTE(ratio='minority')X_sm, y_sm = smote.fit_sample(X, y)
包中还有许多其他方法可 imblearn
用于欠采样(Cluster Centroids,NearMiss等)和过采样(ADASYN和bSMOTE)。
明天和大家分享剩余的三种方法。