数据科学家需要了解的 5 种采样方法


5 种采样方法

根据AI科学与技术评论,采样问题是数据科学中的常见问题。为此,WalmartLabs数据科学家Rahul Agarwal分享了数据科学家需要了解的五种抽样方法。雷锋人工智能技术评论汇编编制如下。

数据科学实际上是在研究算法。

我每天努力学习很多算法,所以我想列出一些最常见和最常用的算法。

本文介绍了在处理数据时可以使用的一些最常用的采样技术。

简单随机抽样

假设您要选择组的子集,其中以相同的概率选择子集的每个成员。

下面我们从数据集中选择100个采样点。

n

Sample_df=df.sample(100)

n

分层采样

n

n

假设我们需要估计每个候选人在选举中的平均票数。现在假设该国有3个城镇:

n n n

A镇有100万工人,

B镇有200万工人,

C镇有300万退休人员。

我们可以选择在整个群体中随机抽取60个样本的样本,但在这些城镇中,随机样本可能不太平衡,因此存在偏差,导致较大的估计误差。

相反,如果我们选择从A,B和C镇提取10,20和30个随机样本,那么我们可以在相同的总样本量下产生较小的估计误差。

这可以通过python轻松完成:

n n

来自sklearn.model_selection import train_test_split

n

X_train,X_test,y_train,y_test=train_test_split(X,y,stratify=y,test_size=0.25)

n

水塘采样

n

n

我喜欢这句话:

n n

假设您有一个很大且未知的项目流,因此我们只能迭代一次。

n

创建一个从该流中随机选择项目的算法,以便每个项目具有相同的选择可能性。

n

我们应该怎么做?

n

假设我们必须从无限流中提取5个对象,并且选择每个元素具有相同的概率。

n n

导入randomdef生成器(最大):

n

数字=1,而数字<1。最大:数+=1字节数#创建为stream generatorstream=generator()#从streamk=5reservoir=[]进行储层采样,对于i,枚举(流)中的元素为:如果i + /(i + 1)if random.random()&lt;概率:#选择流中的项目并删除已选中的k项之一[random.choice(range(0,k))]=elementprint(reservoir)---------------- -------------------- [1369,4108,9986,828,5589]

n

可以在数学上证明,在样本中,以相同的概率选择流中的每个元素。为什么是这样?

n

谈到数学问题,从一个小问题开始思考总是有帮助的。

n

所以让我们考虑只有3个项目的流,我们必须保留其中的2个。

n

当我们看到第一个项目时,我们把它放在列表中,因为我们的池有空间。当我们看到第二个项目时,我们把它列入清单,因为我们池塘里还有空间。

n

现在我们看到第三个项目。事情开始变得有趣。我们将第三项放在列表中的概率为2/3。

n

现在让我们看看第一个项目的选择概率:

n n

移除第一项的概率是选择项3的概率乘以项1被随机选择作为池中两个元素的替代的概率。这个概率是:

n

2/3 * 1/2=1/3

n

因此,选择项目1的概率是:

n

1-1/3=2/3

n

我们可以为第二个项目使用完全相同的参数,并将其扩展到多个项目。

n

因此,每个项目的选择概率相同:2/3或使用通用公式表示为K/N

n

随机欠采样和过采样

n

n

我们经常遇到不平衡的数据集。

n

一种广泛使用的处理高度不平衡数据集的技术称为重采样。它包括从大多数类中删除样本(欠采样)或向几个类添加更多示例(过采样)。

n

让我们先创建一些不平衡数据的例子。

n n

从sklearn.datasets导入make_classificationX,y=make_classification(

n

N_classes=2,class_sep=1.5,权重=[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

n

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

n n

Num_0=len(X [X ['target']==0])

n

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

n

使用 imbalanced-learn 进行欠采样和过采样

n

imbalanced-learn(imblearn)是一个用于解决不平衡数据集问题的python包。它提供了几种欠采样和过采样方法。

n

a. 使用 Tomek Links 进行欠采样:

n

由imbalanced-learn提供的一种方法称为Tomek Links。 Tomek Links是邻近的两个相邻类的示例。

n

在这个算法中,我们最终从Tomek Links中删除了大部分元素,这为分类器提供了更好的决策边界。

n

n n

来自imblearn.under_sampling导入TomekLinks

n

Tl=TomekLinks(return_indices=True,ratio='most')X_tl,y_tl,id_tl=tl.fit_sample(X,y)

n

b. 使用 SMOTE 进行过采样:

n

在SMOE(Synthetic Minority Oversampling Technique)中,我们在现有元素附近合并了几个类的元素。

n

n n

从imblearn.over_sampling导入SMOTE

n

Smote=SMOTE(比率='少数')X_sm,y_sm=smote.fit_sample(X,y)

n

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

n

结论

n

算法是数据科学的命脉。

n

抽样是数据科学中的一个重要主题,但我们实际上还没有充分讨论过。

n

有时,良好的抽样策略将大大推进项目。不正确的采样策略可能会给我们带来错误的结果。因此,在选择采样策略时应该小心。

n

如果您想了解更多有关数据科学的知识,我想向您推荐Andrew Ng的优秀课程。本课程是我开始使用数据科学的法宝。你必须检查出来。

n

通过:

n n n n n n n n