5种主要采样算法


处理数据-处理数据处理算法。


而且我不得不每天与最多样化的人一起工作,因此我决定列出一系列出版物中最受欢迎的一个。


本文重点介绍用于处理数据的最常见采样技术。





简单随机抽样


假设您要进行选择,其中每个元素被选择的可能性相等。


下面我们从数据集中选择100个这样的元素。


sample_df = df.sample(100) 



分层抽样



假设我们需要估算选举中每位候选人的平均票数。 投票在三个城市进行:


一百万工人居住在A


200万艺术家住在B城市


300万老年人居住在C


如果我们尝试在整个人口中抽取同样可能的60个人样本,那么相对于不同城市,他们肯定会不均衡,因此存在偏差,这将导致预测中的严重错误。


如果我们分别从城市ABC分别抽取10、20和30个人作为样本,那么误差将很小。


在Python中,可以这样完成:


 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, test_size=0.25) 



储层采样



我喜欢这个问题的表述:


假设您有一堆未知大小的元素,只能重复一次。


创建一种算法,从流中随机选择一个元素,就好像可以等概率选择任何元素一样。


怎么做?


假设我们需要从一个无限流中选择5个对象,以便可以平等地选择流中的每个元素。


 import random def generator(max): number = 1 while number < max: number += 1 yield number #    stream = generator(10000) #    k=5 reservoir = [] for i, element in enumerate(stream): if i+1<= k: reservoir.append(element) else: probability = k/(i+1) if random.random() < probability: #    ,    reservoir[random.choice(range(0,k))] = element print(reservoir) ------------------------------------ [1369, 4108, 9986, 828, 5589] 

从数学上讲,有可能证明每个元素的选择可能性均等。


怎么了


在数学方面,最好尝试以一种特殊情况开始解决方案。


因此,让我们看一下由3个元素组成的流,我们只需要选择2个即可。


我们看到第一个元素,将其保存在列表中,因为储罐中仍有空间。 我们看到第二个元素,将其保存在列表中,因为储罐中仍有空间。


我们看到第三个要素。 在这里变得更加有趣。 我们将以2/3的概率保存第三个元素。


现在让我们看一下保存第一个元素的最终可能性:


第一个元素从储层中移位的概率等于要选择的第三个元素的概率,乘以是将被选择用于移位的两个元素中第一个元素的概率。 那就是:


2/3 * 1/2 = 1/3


也就是说,将保存第一个元素的最终概率:


1-1/3 = 2/3


可以将相同的逻辑应用于第二个元素,将来随着存储量的增加将其扩展到更多个元素。


也就是说,每个元素将以2/3的概率保存,或者通常情况下为k / n




随机欠采样和过采样


来源

生活中经常会出现不平衡的数据集。


这种情况下广泛使用的方法称为重采样(有时在俄语翻译中称为“重采样”-大约翻译) 。 它的本质在于从太大的集合中删除元素(欠采样)和/或在不足够大的集合中添加更多元素(过采样)。


让我们从创建一些不平衡的集合开始。


 from sklearn.datasets import make_classification X, 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) #   undersampled_data = pd.concat([ X[X['target']==0].sample(num_1) , X[X['target']==1] ]) print(len(undersampled_data)) #   oversampled_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 



使用不平衡学习进行Andersamping和过采样


不平衡学习 (imblearn)是一个python库,用于处理不平衡数据集的问题。


它包含几种不同的重采样方法。


一个 使用Tomek链接进行Andersampling:


提供的一种方法称为Tomek链接。 在这种情况下,“链接”是来自附近不同类别的元素对。


使用该算法,我们最终将从更大的集合中删除对元素,这将使分类器更好地工作。


来源


 from imblearn.under_sampling import TomekLinks tl = 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 SMOTE smote = SMOTE(ratio='minority') X_sm, y_sm = smote.fit_sample(X, y) 

但是在imblearn中,还有其他欠采样方式(集群质心,NearMiss等)和过采样方式(ADASYN和bSMOTE),它们也可能有用。




结论


算法是数据科学的血液。


采样是处理数据中最重要的领域之一,上面仅给出了简要的概述。


精心选择的抽样策略可以使整个项目顺利进行。 选择不当会导致错误的结果。 因此,必须明智地做出选择。

Source: https://habr.com/ru/post/zh-CN461285/


All Articles