从大型数据集中采样

Posted

技术标签:

【中文标题】从大型数据集中采样【英文标题】:Sampling from a large dataset 【发布时间】:2021-08-08 21:14:48 【问题描述】:

我有一个包含 112k 行和 2 列的数据集。如何从这个数据集中平均采样以获得一个大约 10k 行的小数据集?

我的意思是相等,因为这个数据集有 56k 行,列名为 True=1,56k 行,列名为 ``´True=0```。

所以我想用True=1 列采样 10k 行和 5k 列,用True=0 采样 5k。

谢谢

【问题讨论】:

你能分享一个小样本吗,你试过用熊猫sample吗? 【参考方案1】:

这被称为具有相等分配的分层随机样本(即每组的样本大小相同)在这种情况下也发生比例分配(每组的样本成比例到组的大小)。

可以使用groupby.sample实现:

df.groupby("my_column").sample(n=5000)

关于这个主题有一个fewearlierquestions,但它们涉及稍微复杂一些的情况,并且似乎在pandas v1.1中引入groupby.sample方法之前已经得到了回答。

【讨论】:

【参考方案2】:

For dataset split StratifiedKFold would help

This cross-validation object is a variation of KFold that returns stratified folds. The folds are made by preserving the percentage of samples for each class.

用法

>>> from sklearn.model_selection import StratifiedKFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([0, 0, 1, 1])
>>> skf = StratifiedKFold(n_splits=2)
>>> skf.get_n_splits(X, y)
2
>>> print(skf)  
StratifiedKFold(n_splits=2, random_state=None, shuffle=False)
>>> for train_index, test_index in skf.split(X, y):
...    print("TRAIN:", train_index, "TEST:", test_index)
...    X_train, X_test = X[train_index], X[test_index]
...    y_train, y_test = y[train_index], y[test_index]
TRAIN: [1 3] TEST: [0 2]
TRAIN: [0 2] TEST: [1 3]

【讨论】:

以上是关于从大型数据集中采样的主要内容,如果未能解决你的问题,请参考以下文章

从大型数据集中提取唯一数据

对从大型数据集中聚合的数据使用 Altair

从大型数据集中识别被遮挡的纹理补丁

R:从R中的大型数据集中根据列中的值删除行[重复]

在 BigQuery 中订购大型时间序列数据集以进行导出

对于大型数据库,从 Impala 采样的最佳查询是啥?