雷锋网 AI 科技评论按,采样问题是数据科学中的常见问题,对此,WalmartLabs 的数据科学家 Rahul Agarwal 分享了数据科学家需要了解的 5 种采样方法,雷锋网 AI 科技评论编译整理如下。

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

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

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

简单随机抽样

假设您要选择一个群体的子集,其中该子集的每个成员被选择的概率都相等。

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

sample_df = df.sample(100)

分层采样

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

  • A 镇有 100 万工人,

  • B 镇有 200 万工人,以及

  • C 镇有 300 万退休人员。

我们可以选择在整个人口中随机抽取一个 60 大小的样本,但在这些城镇中,随机样本可能不太平衡,因此会产生偏差,导致估计误差很大。

相反,如果我们选择从 A、B 和 C 镇分别抽取 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 randomdef generator(max):

number = 1

while number number += 1

yield number# Create as stream generator

stream = generator(10000)# Doing Reservoir Sampling from the stream

k=5

reservoir =

for i, element in enumerate(stream):

if i+1 reservoir.append(element)

else:

probability = k/(i+1)

if random.random # Select item in stream and remove one of the k items already selected

reservoir[random.choice(range(0,k))] = elementprint(reservoir)

------------------------------------

[1369, 4108, 9986, 828, 5589]

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

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

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

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

现在我们看到第三个项目。这里是事情开始变得有趣的地方。我们有 2/3 的概率将第三个项目放在清单中。

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

移除第一个项目的概率是项目 3 被选中的概率乘以项目 1 被随机选为水塘中 2 个要素的替代候选的概率。这个概率是:

2/3*1/2 = 1/3

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

1–1/3=2/3

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

因此,每个项目被选中的概率相同:2/3 或者用一般的公式表示为 K/N

随机欠采样和过采样

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

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

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

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

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

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

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

imbalanced-learn 提供的一种方法叫做 Tomek Links。Tomek Links 是邻近的两个相反类的例子。在这个算法中,我们最终从 Tomek Links 中删除了大多数元素,这为分类器提供了一个更好的决策边界。

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 进行过采样:

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

from imblearn.over_sampling import SMOTE

smote = SMOTE(ratio='minority')

X_sm, y_sm = smote.fit_sample(X, y)

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

结论

算法是数据科学的生命线。

抽样是数据科学中的一个重要课题,但我们实际上并没有讨论得足够多。

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

如果你想了解更多有关数据科学的知识,我想把 Andrew Ng 的这门优秀课程推荐给你,这个课程是我入门数据科学的法宝,你一定要去看看。

via:https://towardsdatascience.com/the-5-sampling-algorithms-every-data-scientist-need-to-know-43c7bc11d17c

雷锋网雷锋网

python 欠采样_数据科学家需要了解的 5 种采样方法相关推荐

  1. python 欠采样_欠采样-Python数据科学技术详解与商业项目实战精讲 - python自学网...

    欠采样欠采样 Db类支持原生SQL查询操作,主要包括下面两个方法: query方法 query方法用于执行SQL查询操作,和select方法一样返回查询结果数据集(数组). 使用示例:Db::quer ...

  2. dijkstra算法代码_数据科学家需要知道的5种图算法(附代码)

    在本文中,我将讨论一些你应该知道的最重要的图算法,以及如何使用Python实现它们. 作者:AI公园 导读 因为图分析是数据科学家的未来. 作为数据科学家,我们对pandas.SQL或任何其他关系数据 ...

  3. 西雅图治安_数据科学家对西雅图住宿业务的分析

    西雅图治安 介绍 (Introduction) Airbnb provides an online platform for hosts to accommodate guests with shor ...

  4. 每周一本书之《Python大战机器学习:数据科学家的第一个小目标》

    数据科学家可谓是当下炙手可热的职业,机器学习则是他们的必备技能.机器学习在大数据分析中居于核心地位,在互联网.金融保险.制造业.零售业.医疗等产业领域发挥了越来越大的作用且日益受到关注. Python ...

  5. 自序-----《Python大战机器学习:数据科学家的第一个小目标》

    自序 <Python大战机器学习:数据科学家的第一个小目标>本书以快速上手.四分理论六分实践为出发点,讲述机器学习的算法和Python 编程实践,采用"原理笔记精华+ 算法Pyt ...

  6. 独家 | 数据科学家应该避免的5种统计陷阱(附链接)

    作者:Matthew Mayo 翻译:冯羽 校对:陈雨琳 本文长度约为2500字,建议阅读5分钟 本文介绍了数据科学家应该避免的五种统计陷阱. 标签:偏见,谬误,辛普森悖论,统计 这篇文章讲了五种统计 ...

  7. python下载文件到本地-Python下载网络文本数据到本地内存的四种实现方法示例

    本文实例讲述了Python下载网络文本数据到本地内存的四种实现方法.分享给大家供大家参考,具体如下: import urllib.request import requests from io imp ...

  8. 推荐 :数据科学家应该避免的5种统计陷阱

    作者:Matthew Mayo  翻译:冯羽  校对:陈雨琳 本文长度约为2500字,建议阅读5分钟 本文介绍了数据科学家应该避免的五种统计陷阱. 标签:偏见,谬误,辛普森悖论,统计 这篇文章讲了五种 ...

  9. python 调用gpu算力_数据科学家需要算力,GPU 如何实现?-控制器/处理器-与非网...

    数据科学家需要算力.无论您是用 pandas 处理一个大数据集,还是用 Numpy 在一个大矩阵上运行一些计算,您都需要一台强大的机器,以便在合理的时间内完成这项工作. 在过去的几年中,数据科学家常用 ...

最新文章

  1. python调用另一个类的返回值_python – 在OpenERP中调用另一个表单的方法返回值
  2. 「图解」ThreadLocal 在并发问题中的应用
  3. oracle客户端没有deinstall.bat,Oracle数据库11gR2的卸载 - deinstall
  4. 浏览器兼容性问题解决方案· 总结
  5. MPLS-L3×××中的公网访问
  6. hdu2844 Coins(普通的多重背包 + 二进制优化)
  7. linux 目录提权,【安全科普】Linux提权——利用可执行文件SUID
  8. 傻瓜式操作的三个网络赚零花钱的小项目
  9. Java 将base64图片字符串转化为File类型文件
  10. 数据库在线自生成ER图
  11. 数据挖掘近年来的研究方向、方法总结
  12. 点云数据的类型主要分为_点云数据处理方法概述
  13. word插入公式及编号右对齐
  14. 【Henu ACM Round #13 A】 Hulk
  15. fir高通滤波器matlab程序,FIR数字滤波器的Matlab实现[高等教育]
  16. jpeg jpg 格式_JPG / JPEG的完整格式是什么?
  17. android手机运行win10,Win10可以直接运行你手机里的安卓APP了:三星率先支持
  18. 单人扑克游戏:地城恶棍的Python实现(附实现代码)
  19. html5 刮刮乐 源码,HTML5 canvas实现刮刮乐功能
  20. Python - 升级pip时提示拒绝访问

热门文章

  1. Spring自学日志01
  2. Centos yum 安装JDK及配置环境变量
  3. 漫谈Servlet(一)
  4. Java对象初始化执行顺序
  5. 类Array对象中是否该直接使用Array的原型方法?
  6. SIM800C Couldn't pair with xxx because of an incorrect PIN or passkey
  7. setResult详解
  8. Web开发中你注意这些前台开发问题了吗?(前台构架篇)
  9. LVM源码分析2-libdaemon
  10. pip 更改源   pip加速