TowardsDataScience-博客中文翻译-2020-六十四-
TowardsDataScience 博客中文翻译 2020(六十四)
如何从头开始实现 Adam 优化器
没你想的那么难!
TL;博士如果你想跳过教程。这里是我创作的笔记本。
Adam 是一种基于自适应矩估计优化随机目标函数的算法。Adam 的更新规则是 momentum 和 RMSProp 优化器的组合。
规则很简单。从头开始编写 Adam 代码,无需借助任何外部 ML 库,如 PyTorch、Keras、Chainer 或 Tensorflow。只允许我们使用的库是numpy和math。
(っ‿)っ(っ‿)っ(っ‿)っ(っ‿)っ(っ‿)っ(っ‿)っ
第一步:理解亚当是如何工作的
学习亚当作品最简单的方法就是看吴恩达的 视频 。或者,你可以阅读亚当的 原论文 来更好地理解背后的动机和直觉。
亚当依赖的两个值是 β ₁和 β ₂. β ₁是一阶矩估计的速率的指数衰减,其文献值为 0.9。β是二阶矩估计的指数衰减率,文献值为 0.999。这两个文献值适用于大多数数据集。

使用参数β1 和β2 计算移动平均值
在给定的迭代 t 上,我们可以根据参数 β ₁、 β ₂和梯度 gt 计算移动平均。由于 SGD 和 RMSProp 等大多数依赖于移动平均值的算法都存在偏差,因此我们需要额外的步骤来纠正偏差。这被称为偏差校正步骤:

移动平均线的偏差修正
最后,我们可以根据计算出的移动平均值,以步长 η 更新参数(权重和偏差):

步骤 2:用 Python 实现 Adam
总结一下,我们需要定义几个变量:一阶指数衰减 β ₁,二阶指数衰减 β ₂,步长 η 和一个小值 ε 防止零除。此外,我们将m_dw、v_dw、m_db和v_db定义为权重和偏差dw和db的梯度的前一时间步的均值和无中心方差。
回想一下,Adam 依赖于两个重要的矩:均值的一阶矩估计和方差的二阶矩估计。使用这些矩估计,我们可以在给定适当步长的情况下更新权重和偏差。
步骤 3:测试实现
为了测试我们的实现,我们首先需要定义一个损失函数及其各自的梯度函数。梯度函数可以通过简单地对损失函数求导来获得。例如:
注意,我们还定义了一个额外的函数来检查收敛性,这是基于当达到收敛时权重不会改变的事实。最后,我们可以使用构建的 Adam 优化器迭代更新权重和偏差,并查看它们是否收敛:
查看结果,在 750 次迭代下达到收敛。大获成功!

请随意查看我的其他故事和 github 项目。祝你今天开心!玩的开心!

如何使用 Fastai-v2 和 Albumentations 实现多光谱卫星图像分割的增强
通过多光谱图像增强和 Fastai v2 提高深度学习算法的性能

图 1:应用于 Landsat 8 补丁及其相应的云掩膜的增强。图片作者。
更新
关于课程科学家 Python 入门 ( 可在 YouTube ) 和其他类似文章的信息,请访问我的网站cordmaur.carrd.co。
介绍
我们知道图像增强是计算机视觉任务的一个关键因素。它有助于算法避免过度拟合,也限制了对庞大训练数据集的需求[1]。大多数深度学习框架都有一个实现增强“开箱即用”的视觉模块,如 Keras、PyTorch 和 Fastai 库的情况。当我们需要向模型提供与 3 通道标准(RGB)不匹配的图像时,问题就出现了。这是大多数遥感应用的情况(例如图 1)和许多其他区域。
为了克服这一限制,我将展示如何使用白蛋白库[2]实现多光谱增强,并将其插入 Fastai v2 数据块以供进一步培训。关于如何为卫星图像创建数据块的原则可以在我之前的故事“如何使用 Fastai-v2 为多光谱卫星图像分割创建数据块”中找到。
1-数据集
我们将使用的数据是 Kaggle 提供的公共数据集,名为“95 云:卫星图像上的云分割” ,,包含从 57 个 Landsat 8 场景中提取的训练补丁。事实上,这个数据集是以前的 Kaggle 数据集的扩展,该数据集用于训练一个非常简单的 Fastai v1 模型(此处为)。这些贴片的尺寸为 384x384,包含 4 个波段——红、绿、蓝和近红外。此外,还有一个标记云的地面真相补丁。由于我们的目标只是展示如何实现增强,没有进一步考虑准确性,我们将只使用最新版本。

图 2— Kaggle 数据集。图片来自 ka ggle(https://www . ka ggle . com/sorour/95 cloud-cloud-segmentation-on-satellite-images)
为了方便起见,这里显示的所有代码都可以在 Kaggle 笔记本中使用(这里是),所以我们将从安装必要的依赖项开始:
# update torch and torch vision
!pip install -q torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f [https://download.pytorch.org/whl/torch_stable.html](https://download.pytorch.org/whl/torch_stable.html)# install kornia, we will give it a try to accelarate our preprocessing
!pip install -q --upgrade kornia
!pip install -q allennlp==1.1.0.rc4# and install fastai2
!pip install -q --upgrade fastai
2-打开图像
除了视觉库不支持多通道图像的问题,该数据集将每个波段保存在单独的文件夹中。因此,为了打开一个图像,我们首先需要纠正每个波段的路径,然后将它们整理成一个单一的 4 通道图像。不像我们在之前的故事中那样子类化 TensorImage 类,我将尝试使事情变得更简单,并将图像作为张量打开。这种方法的缺点是我们不能像DataLoader.showbatch()一样使用 Fastai 的内部可视化功能,因为它不知道如何显示 4 个波段。
第一步是创建三个基本函数:
- 打开一个 TIF 文件,并将其作为 PyTorch 张量返回;
- 给定一个文件名(假设是红色波段),返回其他三个波段(绿色、蓝色和 Nir)的名称;
- 一次打开 4 个波段,将它们整理成一个图像。为此,我们将使用第一维(或轴)连接图像
一旦我们的函数被定义,我们将通过传递一个项目到管道来测试它们。管道是应用于一个项目的一系列功能,以我们想要的方式转换它。
为了加载项目,我们将考虑我们的基础图像在红色文件夹中,然后我们将自动获取其他波段。因此,我们的管道将由两个功能组成:1- get_filenames 和 2- open_ms_tif。我们的最终图像将有形状(4, 384, 384)。用 matplotlib 显示它会在维度上做最后的排列,把通道放在最后一个轴上成为(384, 384, 4),并且用[…, :3]切掉 Nir 波段。
考虑到我们的最终目标是分割图像中的云,我们必须将相同的增强应用于地面真相。因此,将进行类似的程序来打开面罩。
torch.Size([4, 384, 384]) torch.Size([384, 384])

图 3:显示补丁和相应云遮罩的代码输出。图片作者。
如我们所见,我们的管道运行良好。我使用 TensorMask 的.show() 方法和 context ctx参数,只是为了说明在 Fastai 中可以将输出强制到任何上下文。另一个有趣的命令是 partial,它返回对预先填充了一组给定参数的函数的引用。
3-创建数据集和数据加载器
在进行扩充之前,我们将首先创建一个数据集和一个数据加载器,只是为了检查是否一切都按预期工作。注意,我们不需要在数据块中指定 get_items 函数,因为我们的源已经是一个条目列表。我们还将定义一个函数show_img()来显示多通道张量。
torch.Size([4, 4, 384, 384]) torch.Size([4, 384, 384])

图 4:显示一个批处理样本的代码输出。(上)RGB 图像|(下)云遮罩。图片作者。
4-扩充
为了扩充,我们将使用白蛋白库。有一个巨大的可能的增强列表,分为不同的类,如像素级和空间级变换。对于本教程,我们将保持简单,只使用基本的移动,翻转,缩放,旋转,亮度和对比度。完整的列表可以通过他们的在线文档获得(此处)。
白蛋白库的一个重要方面是它支持分割和对象检测的增强。这意味着它可以将应用于图像的相应增强应用于其目标(遮罩或边界框)。这是至关重要的一点,因为我们需要保持我们的云遮罩与增强图像相匹配。
Fastai 将对一个元组(X,Y)应用增强,其中 X 是图像,Y 是遮罩。为了让它在框架内工作,有必要子类化 ItemTransform 类并创建encodes()方法。为了使它通用,我们的子类将在实例创建时接收期望的转换,如下所示:

图 5:代码输出显示:(左)原始项目(图像和遮罩)|(右)图像和遮罩的增强版本。图片作者。
注意,在这个类中定义了一个split_idx=0。这就是告诉 Fastai 只增加训练数据集,而不是验证数据集。现在我们已经建立了我们的转换类,让我们在数据块中使用它。我们将重新创建数据块,现在将item_tfms参数设置为aug。然后,我们将要求数据加载器多次创建一个项目,以查看它是如何进行的。

图 6:代码输出演示了在通过数据加载器时应用于同一个补丁的增强。图片作者。
结论
正如我们在这个故事中看到的,实现多光谱卫星图像的数据增强只是找到正确工具的问题。在这方面,白蛋白是一个很好的伴侣,因为它可以处理许多渠道,并增加目标。
如前所述,包含所有代码的笔记本可以在 Kaggle ( 此处)找到。在那里,还可能找到有和没有增强的学习准确度的比较。
希望你喜欢。
参考
[1] Shorten,c .,Khoshgoftaar,T.M .,2019 年。面向深度学习的图像数据增强综述。j 大数据 6、60。https://doi.org/10.1186/s40537-019-0197-0。
[2] Buslaev,a .,Iglovikov,V.I .,Khvedchenya,e .,Parinov,a .,Druzhinin,m .,Kalinin,A.A .,2020。快速灵活的图像增强。信息 11125。【https://doi.org/10.3390/info11020125
如何使用 PyCaret 在 Power BI 中实现集群

Power BI 中的集群仪表板
在我们的上一篇文章中,我们展示了如何通过将异常检测器与 PyCaret 集成,在 Power BI 中构建异常检测器,从而允许分析师和数据科学家在他们的报告和仪表板中添加一层机器学习,而无需任何额外的许可成本。
在这篇文章中,我们将看到如何使用 PyCaret 在 Power BI 中实现聚类分析。如果你以前没有听说过 PyCaret,请阅读这个公告以了解更多信息。
本教程的学习目标
- 什么是集群?聚类的类型。
- 在 Power BI 中训练和实现无监督聚类模型。
- 在仪表板中分析结果和可视化信息。
- 如何在电力 BI 生产中部署集群模式?
开始之前
如果您以前使用过 Python,很可能您的计算机上已经安装了 Anaconda 发行版。如果没有,点击这里下载 Python 3.7 或更高版本的 Anaconda 发行版。

https://www.anaconda.com/products/individual
设置环境
在我们开始在 Power BI 中使用 PyCaret 的机器学习功能之前,我们必须创建一个虚拟环境并安装 pycaret。这是一个三步走的过程:
✅ 步骤 1——创建一个 anaconda 环境
从开始菜单打开 Anaconda 提示符并执行以下代码:
conda create --name **myenv** python=3.7
✅ 第二步—安装 PyCaret
在 Anaconda 提示符下执行以下代码:
pip install pycaret
安装可能需要 15-20 分钟。如果您在安装时遇到问题,请查看我们的 GitHub 页面,了解已知问题和解决方案。
✅t22】第三步——在 Power BI 中设置 Python 目录
创建的虚拟环境必须与 Power BI 链接。这可以使用 Power BI Desktop 中的全局设置来完成(文件→选项→全局→ Python 脚本)。默认情况下,Anaconda 环境安装在以下位置:
C:\Users\ 用户名\ AppData \ Local \ Continuum \ anaconda 3 \ envs \ myenv

文件→选项→全局→ Python 脚本
什么是集群?
聚类是一种将具有相似特征的数据点分组的技术。这些分组对于探索数据、识别模式和分析数据子集非常有用。将数据组织成簇有助于识别数据中的底层结构,并在许多行业中找到应用。集群的一些常见业务用例有:
以营销为目的的✔客户细分。
促销和折扣的✔顾客购买行为分析。
✔在诸如新冠肺炎的流行病爆发中识别地理群集。
聚类的类型
考虑到集群任务的主观性,有各种算法适合不同类型的问题。每种算法都有自己的规则和计算聚类背后的数学原理。
本教程是关于使用名为 PyCaret 的 Python 库在 Power BI 中实现聚类分析的。对这些算法背后的具体算法细节和数学的讨论超出了本教程的范围。

Ghosal A .、Nandy A .、Das A.K .、Goswami S .、Panday M. (2020)对不同聚类技术及其应用的简短回顾。
在本教程中,我们将使用 K-Means 算法,这是最简单和最流行的无监督机器学习算法之一。如果你想了解更多的 K-Means,你可以阅读这篇论文。
设置业务环境
在本教程中,我们将使用来自世界卫生组织全球卫生支出数据库的当前卫生支出数据集。该数据集包含 2000 年至 2017 年 200 多个国家的卫生支出占国民生产总值的百分比。
我们的目标是通过使用 K-Means 聚类算法在这些数据中找到模式和组。

样本数据点
👉我们开始吧
现在,您已经设置了 Anaconda 环境,安装了 PyCaret,了解了集群分析的基础知识,并且有了本教程的业务上下文,让我们开始吧。
1.检索数据
第一步是将数据集导入 Power BI Desktop。您可以使用 web 连接器加载数据。(Power BI 桌面→获取数据→来自 Web)。

Power BI 桌面→获取数据→其他→ Web
链接到 csv 文件:
https://github . com/py caret/power bi-clustering/blob/master/clustering . CSV
2.模特培训
为了在 Power BI 中训练聚类模型,我们必须在 Power Query Editor 中执行 Python 脚本(Power Query Editor→Transform→Run Python script)。将以下代码作为 Python 脚本运行:
from **pycaret.clustering** import *
dataset = **get_clusters**(dataset, num_clusters=5, ignore_features=['Country'])

超级查询编辑器(转换→运行 python 脚本)
我们使用 ignore_features 参数忽略了数据集中的“ Country 列。可能有许多原因导致您不想使用某些列来训练机器学习算法。
PyCaret 允许您隐藏而不是删除数据集中不需要的列,因为您可能需要这些列用于以后的分析。例如,在这种情况下,我们不想使用“国家”来训练算法,因此我们在 ignore_features 下传递它。
PyCaret 中有超过 8 种现成可用的聚类算法。

默认情况下,PyCaret 训练一个具有 4 个聚类的 K 均值聚类模型。默认值可以很容易地更改:
- 要更改模型类型,使用 get_clusters() 中的 模型 参数。
- 要更改簇号,使用 num_clusters 参数。
参见具有 6 个集群的 K 模式集群的示例代码。
from **pycaret.clustering** import *
dataset = **get_clusters**(dataset, model='kmodes', num_clusters=6, ignore_features=['Country'])
输出:

聚类结果(执行 Python 代码后)

最终输出(点击表格后)
包含分类标签的新列被附加到原始数据集。然后,所有年份列都被取消透视以规范化数据,这样它就可以用于 Power BI 中的可视化。
下面是 Power BI 的最终输出。

Power BI Desktop 中的结果(应用查询后)
3.仪表盘
一旦您在 Power BI 中有了集群标签,以下是一个如何在 dashboard 中可视化集群标签以获得洞察力的示例:

仪表板的摘要页面

仪表板的详细信息页面
你可以从我们的 GitHub 下载 PBIX 文件和数据集。
👉在生产中实施集群
上面展示的是在 Power BI 中实现集群的一种简单方法。但是,需要注意的是,每当 Power BI 数据集被刷新时,上面显示的方法都会训练聚类模型。这可能是一个问题,原因有二:
- 当使用新数据重新训练模型时,分类标签可能会改变(例如,在重新训练时,先前被标记为分类 1 的一些数据点可能被标记为分类 2)
- 你不想每天花几个小时的时间重新训练模型。
在 Power BI 中实现集群的一种更有效的方法是使用预先训练的模型来生成集群标签,而不是每次都重新训练模型。
事前培训模型
你可以使用任何集成开发环境(IDE)或笔记本来训练机器学习模型。在此示例中,我们使用 Visual Studio 代码来训练一个聚类分析模型。

Visual Studio 代码中的模型定型
然后将训练好的模型保存为 pickle 文件,并导入到 Power Query 中以生成分类标签。

群集管道保存为 pickle 文件
如果您想了解更多关于使用 PyCaret 在 Jupyter 笔记本中实现聚类分析的信息,请观看这个 2 分钟的视频教程:
https://www.youtube.com/watch?v=2oxLDir7foQ
使用预先训练的模型
以 Python 脚本的形式执行以下代码,从预训练的模型中生成标签。
from **pycaret.clustering** import *
dataset = **predict_model**('c:/.../clustering_deployment_20052020, data = dataset)
它的输出将和我们上面看到的一样。不同之处在于,当您使用预训练模型时,标签是使用同一模型在新数据集上生成的,而不是重新训练模型。
让它在 Power BI 服务上发挥作用
一旦你上传了。pbix 文件到 Power BI 服务,还需要几个步骤来实现机器学习管道到数据管道的无缝集成。其中包括:
- 为数据集启用计划刷新—要使用 Python 脚本为包含您的数据集的工作簿启用计划刷新,请参见配置计划刷新,其中还包括关于个人网关的信息。
- 安装个人网关 —你需要一个个人网关安装在文件所在的机器上,并且安装了 PythonPower BI 服务必须能够访问 Python 环境。您可以获得关于如何安装和配置个人网关的更多信息。
如果您有兴趣了解更多关于聚类分析的知识,请查看我们的笔记本教程。
PyCaret 1.0.1 来了!
我们收到了来自社区的大力支持和反馈。我们正在积极改进 PyCaret,并准备我们的下一个版本。 PyCaret 1.0.1 会更大更好。如果您想分享您的反馈并帮助我们进一步改进,您可以在网站上填写此表格或者在我们的 GitHub 或 LinkedIn 页面上发表评论。
关注我们的 LinkedIn 并订阅我们的 Youtube 频道,了解更多关于 PyCaret 的信息。
重要链接
用户指南/文档
GitHub 资源库 安装 PyCaret
笔记本教程
贡献于 PyCaret
想了解某个特定模块?
从第一个版本 1.0.0 开始,PyCaret 有以下模块可供使用。点击下面的链接,查看 Python 中的文档和工作示例。
另请参见:
笔记本中的 PyCaret 入门教程:
你愿意投稿吗?
PyCaret 是一个开源项目。欢迎每个人都来投稿。如果您愿意投稿,请随意处理个未决问题。dev-1.0.1 分支上的单元测试接受拉请求。
如果你喜欢 PyCaret,请给我们 GitHub 回购的⭐️。
中:【https://medium.com/@moez_62905/】T4
领英:https://www.linkedin.com/in/profile-moez/
推特:https://twitter.com/moezpycaretorg1
如何在 TensorFlow(Keras)中实现自定义正则化
技术的
了解如何使用 TensorFlow 和 Keras 相对轻松地实现自定义神经网络正则化技术。

萨法尔·萨法罗夫在 Unsplash 上拍摄的照片
介绍
本文介绍了神经网络中的正则化主题。它包括机器学习工程师和数据科学家如何实施定制正则化技术的细节。
正则化技术通过限制网络中权重值的范围来降低神经网络过拟合的可能性。
下面的文章介绍了传统的正则化技术以及它们是如何在 TensorFlow(Keras)中实现的。下面的参考文章是针对那些喜欢神经网络内正则化主题的深入概述的读者。
理解用于减轻深度神经网络中过拟合问题的传统技术。
towardsdatascience.com](/regularization-techniques-and-their-implementation-in-tensorflow-keras-c06e7551e709)
实现自定义正则项
在我们继续之前,值得注意的是,在大多数情况下,您不需要实现您的自定义正则化技术。
tensor flow、Keras 和 PyTorch 等流行的机器学习库内部实现了标准的正则化技术。
我将要实现的正则化技术是 L2 正则化技术。
L2 正则化惩罚权重值。对于较小的权重值和相对较大的权重值,L2 正则化将这些值转换为接近 0 但不完全 0 的数字。
L2 惩罚权重的平方和,因此我们将在 python 函数中实现这个逻辑。

L2 正则化
def custom_l2_regularizer(weights):
return tf.reduce_sum(0.02 * tf.square(weights))
上面的代码是我们自定义的 L2 正则化技术。
使用 TensorFlow 的数学运算,我们可以计算传入函数的权重的平方和。
- tf.reduce_sum :数学运算,其结果是传递给函数的值的总和。
- tf.square :对其参数中的值进行平方的数学运算
这就是全部了。
为了利用我们的自定义正则项,我们将其传递到神经网络层,如下所示:
keras.layers.Dense(200, activation='relu', kernel_regularizer=custom_l2_regularizer),
Keas 神经网络层可以在其'kernel _ regulator'参数内接受自定义函数。
把所有的放在一起
为了了解所实现的自定义正则化技术的效果,我们将构建一个简单的神经网络,并执行图像分类这一简单任务。
这一节将包括执行一些常见神经网络实现任务的代码片段,并且 GitHub repo 链接也是可用的这里包括本文中的所有代码。
为了实现我们的神经网络和加载数据集,我们将利用以下工具和库:Keras、TensorFlow 和 NumPy。
import tensorflow as tf
from tensorflow import keras
import numpy as np
将数据集加载并划分到测试、验证和培训中。
还需要将数据集中图像的像素强度从 0–255 到 0–1 的值范围进行归一化。
数组' class_names '被初始化以保存数据集中图像所表示的服装的商品标签。
(train_images, train_labels),(test_images, test_labels) = keras.datasets.fashion_mnist.load_data()train_images = train_images / 255.0
test_images = test_images / 255.0validation_images = train_images[:5000]
validation_labels = train_labels[:5000]class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat", "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
这里,我们按照前面的解释定义了自定义正则项。
def custom_l2_regularizer(weights):
return tf.reduce_sum(0.02 * tf.square(weights))
下一步是实现我们的神经网络及其层。这里为每一层分配适当的参数,包括我们的自定义正则化。
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28,28]),
keras.layers.Dense(200, activation='relu', kernel_regularizer=custom_l2_regularizer),
keras.layers.Dense(100, activation='relu', kernel_regularizer=custom_l2_regularizer),
keras.layers.Dense(50, activation='relu', kernel_regularizer=custom_l2_regularizer),
keras.layers.Dense(10, activation='softmax')
])
为了确保我们的神经网络正确训练,我们利用随机梯度下降优化算法,并设置一些任意的超参数,如时期和学习率。
sgd = keras.optimizers.SGD(lr=0.01)
model.compile(loss="sparse_categorical_crossentropy", optimizer=sgd, metrics=["accuracy"])
model.fit(train_images, train_labels, epochs=60, validation_data=(validation_images, validation_labels))
在训练之后,在测试数据集上对训练的模型进行评估。评估数据必须包含模型在训练期间没有遇到的数据。
model.evaluate(test_images, test_labels)
为了验证我们的模型的准确性,我们可以获取测试图像的子集,并运行推理来验证它们的结果。
practical_test_images = test_images[:10]
predictions = model.predict_classes(practical_test_images)
print(predictions)
print(np.array(class_names)[predictions])
使用 Keras 实现神经网络的定制组件(如正则化器)非常容易;您甚至可以更进一步,探索如何使用 Keras 实现定制指标、激活函数、损失函数以及更多功能。

我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
- 订阅我的 YouTube 频道 即将发布的视频内容 这里
- 跟我上 中
- 通过 LinkedIn 联系我
如何实现 Kohonen 的自组织地图
安|索姆| SOFM | MATLAB
用 MATLAB 玩和学 SOMs

巴黎艾菲尔铁塔——照片由丹尼斯·内沃扎伊在 Unsplash 上拍摄
人工神经网络(ANN)的灵感来自大脑早期的感觉处理模型。可以通过在计算机中模拟模型神经元网络来创建人工神经网络。通过应用模拟真实神经元过程的算法,我们可以让网络“学习”解决许多类型的问题。—安德斯·克拉夫(自然生物技术)
在后现代生活中,我们在每一项活动中都参与了大量惊人的人工神经网络应用,但我们对它们的能力和复杂性一无所知。人工神经网络已被用于解决从语音识别到蛋白质二级结构预测、癌症分类和基因预测等难题。由于对这些高级性能的认识在不久的将来将是必要的,我们应该对这些有更好的了解,并且我们可以从简单的水平开始我们理解 ann 的旅程。
作为一种基本类型的人工神经网络,让我们考虑一种自组织映射(SOM) 或自组织特征映射(SOFM) ,使用无监督学习对其进行训练,以产生训练样本输入空间的低维离散化表示,称为映射。
自组织地图?
它将高维数据之间的非线性统计关系转化为它们在低维显示器上的图像点的简单几何关系,通常是规则的二维节点网格。因为 SOM 由此压缩信息,同时在显示器上保留主要数据元素的最重要的拓扑和/或度量关系— Teuvo Kohonen
🔎为什么是 SOM?
基本上,SOMs 被表征为高维输入数据流形到常规低维数组元素的非线性、有序、平滑映射。在训练 SOM 的神经元之后,我们得到高维输入数据的低维表示,而不会扰乱数据分布的形状和每个输入数据元素之间的关系。自组织映射不同于其他人工神经网络,因为与误差校正学习(梯度下降反向传播等)相比,自组织映射应用无监督学习,并且自组织映射使用邻域函数来保持输入空间的拓扑属性。由于它的简单性,我们可以很容易地解释和演示它的功能。详细的解释请参考 Teuvo Kohonen 的自组织地图。
💡SOM 是如何工作的?

SOM 学习数据表示——在第 1、10、50 和 100 时段,输入用蓝点表示,模型的神经元值用红点表示(图片由作者提供)
上图给出了学习过程的简单说明,我们可以很容易地从这种表示中理解 SOMs 的特性。最初,输入数据(蓝点)在 2D 空间占据特殊分布,未学习的神经元(权值)(红点)随机分布在一个小区域内,神经元经过输入的修改和学习后,在学习过程中逐步得到输入数据分布的形状。此外,每个神经元代表一个小的输入数据空间集群。因此,在这个演示中,我们能够用 100 个神经元表示 1000 个数据点,保留输入数据的拓扑结构。这意味着我们已经在高维数据和低维表示(map)之间建立了联系。对于进一步的计算和预测,我们可以利用这几个神经元值来表示巨大的输入数据空间,这使得处理速度更快。
📄学习算法
作为 SOM 的基本模型,我们将从'N '-维输入数据空间映射到一个二维神经元阵列(' N '个神经元)。该 SOM 可以使用以下过程来实现:
🛠设置:
- "P" 输入矢量数量可用。(i= 1,2,…,P)
- 第 I 个输入向量有 n 个元素: Xᵢ = (xᵢ1,xᵢ2,…,xᵢn)
- “N”神经元数量(节点或权重)可用。(i= 1,2,…,N)
- 第 I 个神经元向量有 n 个元素: mᵢ = (mᵢ1,mᵢ2,…,mᵢN)
- 这些神经元向量排列成 2D 矩阵来表示。
- 假设所有向量元素都是实数。

SOM 基本模型的建立—输入向量和神经元矩阵(图片由作者提供)
🔖活动动态:
对于给定的输入 Xᵢ ,找到离给定输入最近(最小欧氏距离)的神经元,并用 c 表示该神经元。

✏️学习动力公司:
对于给定的输入 Xᵢ ,在找到 mc 神经元后,仅更新 mc 的邻域神经元集合:

对于 t = 0,1,2,… T 。(t 是模型将被更新的迭代次数,并且 mᵢ (0) 可以是初始的任意向量)。函数 hci(t) 是所谓的邻域函数,在格点(矩阵元素)上定义的平滑核。
由于我们只有需要更新 mc 神经元周围的邻近神经元,首先我们需要找到神经元 mc 周围矩阵点的邻域集合。下面给出了一个简单的拓扑邻域查找方法,更高级的平滑邻域查找方法可以在文献中找到。

在 Nc(t) 内寻找数组点的邻域集——绿色神经元是 mc 神经元,蓝色神经元是神经元的邻域集,只会更新(图片由作者提供)
标记为 Nc(t) 的圆内的所有神经元,我们认为它们是‘MC’神经元的邻域集合。神经元的邻域集合半径 Nc(t) 通常在迭代(t)中单调递减。我们通常从 Nc(0) = √N/2 开始,我们需要在每次迭代中减小半径。
在找到需要更新的邻域神经元集后,我们可以使用下面的 hci(t) 函数,更新 mc 周围的神经元。

在这个方程中, || rc — ri|| 定义了神经元的 2D 矩阵位置之间的距离( √N x √N 矩阵)。 α(t) 的值被识别为学习率因子(0 < α(t) < 1)。 α(t) 和 σ(t) 都是时变的单调递减函数,如下:

对每个输入数据向量( P 个输入数据向量)进行学习。然后在相同的输入数据向量上重复进行相同的过程 T 次迭代。经过 T 次迭代后,你将得到一个完全学习过的神经元矩阵,它映射了我们的输入数据值。
📦MATLAB 实现
使用上述算法,Teuvo Kohonen 的《自组织地图》一书中提到的几个有趣的例子已经使用 MATLAB 实现,您可以将其复制到您的本地计算机,如下所示:
git clone [https://github.com/KosalaHerath/kohonen-som.git](https://github.com/KosalaHerath/kohonen-som.git)
让我们将存储库的 home 定义为 < REPO_HOME > 。然后,转到以下位置,您可以找到三个 MATLAB 实现示例,并且可以在您的计算机上使用任何 MATLAB 版本运行它们:
<REPO_HOME>/source/kohonen_examples
否则,您只需单击以下链接并转到实施库:
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/KosalaHerath/kohonen-som.git)
这些例子从均匀随机分布的二维( n=2 )输入数据向量开始。共有 1000 个输入数据值( P=1000 )。此外,我们将神经元的数量定义为 N = 10 x 10 = 100 ,迭代次数定义为 T = 300 。您可以更改这些参数,并使用上面的实现来处理模型。
📍示例 1:平方输入分布
这个例子的输入数据值是在 2 维空间上随机分布的正方形。

方形输入分布的 SOM 学习数据表示-输入以蓝点表示,模型的神经元值以红点表示,时间为 1、50、250 和 300(图片由作者提供)
📍示例 2:三角形输入分布
该示例的输入数据值是在二维空间上随机分布的三角形。

三角形输入分布的 SOM 学习数据表示——在第 1、50、250 和 300 时段,输入用蓝点表示,模型的神经元值用红点表示(图片由作者提供)
📍示例 3:具有 1D 神经元阵列的三角形输入分布
这个例子的输入数据值是在 2 维空间上的正方形形状的随机分布,并且特别地,我们考虑 1D 神经元阵列而不是 2D 矩阵。因此,由神经元阵列所作的线将试图覆盖如下的所有输入数据分布。

1D 神经元阵列的 SOM 学习数据表示——在第 1、50、250 和 300 时段,输入用蓝点表示,模型的神经元值用红点表示(图片由作者提供)
因此,现在您可以通过不同的输入和修改来学习和使用这些实现,并且您尝试的越多,您会理解得越好。请在此 处提出任何修改来改进 的这些实现。
干杯!🍺
🗞参考
[1] Krogh,A. (2008 年)。什么是人工神经网络?自然生物技术,26(2),第 195–197 页。
人工神经网络已被应用于从语音识别到蛋白质预测等问题
www.nature.com](https://www.nature.com/articles/nbt1386)
[2] Teuvo Kohonen (2001 年)。自组织地图。纽约斯普林格。
[## 自组织地图| Teuvo Kohonen | Springer
自从这本书的第二版在 1997 年初出版以来,在……
www.springer.com](https://www.springer.com/gp/book/9783540679219)
如何用 NumPy 实现线性回归
更好地理解线性回归并提高您的数字技能

作者图片
我们先简单回忆一下什么是线性回归:
L 线性回归是根据一些其他已知变量以线性方式估计未知变量。视觉上,我们通过我们的数据点拟合一条线(或更高维的超平面)。
如果你对这个概念不太适应,或者想更好地理解它背后的数学原理,你可以阅读我以前写的关于线性回归的文章:
线性回归背后的数学详细解释
towardsdatascience.com](/understanding-linear-regression-eaaaed2d983e)
现在,让我们把重点放在实现上。
首先,很明显,我们需要导入一些库。我们导入numpy,因为它是我们用于实现的主要内容,matplotlib用于可视化我们的结果,以及来自sklearn的make_regression函数,我们将使用它来生成一个回归数据集作为示例。
**import** **numpy** **as** **np****import** **matplotlib.pyplot** **as** **plt****from** **sklearn.datasets** **import** make_regression
然后我们将使用以下方法创建一个LinearRegression类:
.fit()—该方法将实际学习我们的线性回归模型;在这里,我们将找到最佳权重.predict()—这个将用于预测;它将返回我们的线性模型的输出.rmse()—用给定的数据计算我们的模型的均方根误差;这个指标有点像“从我们的模型估计值到真实 y 值的平均距离”
我们在.fit()中做的第一件事是将一个额外的 1 列连接到我们的输入矩阵 x。这是为了简化我们的数学,并将偏差视为一个始终为 1 的额外变量的权重。
.fit()方法将能够通过使用封闭公式或随机梯度下降来学习参数。为了选择使用哪一个,我们将有一个名为method的参数,它需要一个字符串“solve”或“sgd”。
当method设置为“求解”时,我们将通过以下公式获得模型的权重:

这要求矩阵 X 具有满列秩;因此,我们将检查这一点,否则我们会显示一条错误消息。
我们的第一部分.fit()方法是:
注意method之后的其他参数是可选的,仅在我们使用 SGD 的情况下使用。
该方法的第二部分处理method = ‘sgd’的情况,它不要求 X 具有完整的列秩。
我们的最小二乘线性回归的 SGD 算法概述如下:

我们将通过将 weights 类属性初始化为一个 numpy 向量来开始此算法,该向量的值取自均值为 0、标准差为 1/(列数)的正态分布。我们将标准偏差除以列数,以确保在算法的初始阶段不会得到太大的输出值。这是为了帮助我们更快地收敛。
在每次迭代的开始,我们随机地打乱我们的数据行。然后,对于每一批,我们计算梯度并将其从当前权重向量中减去(乘以学习率),以获得新的权重。
下面是我们.fit()方法的后半部分:
我们从这个方法返回self,以便能够像这样连接构造函数和.fit()的调用:lr = LinearRegression().fit(X, y, ‘solve’)。
.predict()方法相当直接。我们首先检查之前是否调用了.fit(),然后将一列 1 连接到 X,并验证 X 的形状允许与权重向量相乘。如果一切正常,我们只需返回 X 和权重向量相乘的结果作为预测。
在.rmse()中,我们首先使用.predict()获得模型的输出,然后如果预测期间没有错误,我们计算并返回均方根误差,该误差可以被认为是“从我们的模型估计值到真实 y 值的平均距离”。
下面是LinearRegression类的完整代码:
在一个例子中使用我们的LinearRegression类
为了展示我们的线性回归实现,我们将使用来自sklearn的make_regression()函数生成一个回归数据集。
X, y = make_regression(n_features=1,
n_informative=1,
bias=1, noise=35)
让我们绘制这个数据集,看看它是什么样子的:
plt.scatter(X, y)

作者图片
make_regression()返回的 y 是平面向量。我们将把它改造成一个列向量,用于我们的LinearRegression类。
y = y.reshape((-1, 1))
首先,我们将使用method = ‘solve’来拟合回归线:
lr_solve = LinearRegression().fit(X, y, method='solve')plt.scatter(X, y)plt.plot(X, lr_solve.predict(X), color='orange')

作者图片
上述回归模型的均方根误差为:
lr_solve.rmse(X, y)
# 35.59874949855057
然后,我们也使用method = ‘sgd’,我们将让其他参数具有它们的默认值:
lr_sgd = LinearRegression().fit(X, y, method='sgd')plt.scatter(X, y)plt.plot(X, lr_sgd.predict(X), color='orange')

作者图片
如你所见,上面两幅图中方法“solve”和“sgd”的回归线几乎相同。
使用“sgd”时,我们得到的均方根误差为:
lr_sgd.rmse(X, y)
# 36.34038690848635
这是 Jupyter 笔记本,包含所有代码:
我希望这些信息对您有用,感谢您的阅读!
这篇文章也贴在我自己的网站这里。随便看看吧!
如何用 PyTorch 实现线性回归
通过实现线性回归学习 PyTorch 基础知识

作者图片
很可能,用 PyTorch 实现线性回归是大材小用。这个库是为神经网络、复杂的深度学习架构等更复杂的东西而创建的。尽管如此,我认为使用它来实现一个更简单的机器学习方法,比如线性回归,对于那些想开始学习 PyTorch 的人来说是一个很好的练习。
在其核心,PyTorch 只是一个类似于 NumPy 的数学库,但是有两个重要的改进:
- 它可以使用 GPU 来加快运算速度。如果您正确配置了兼容的 GPU,只需做一些更改,就可以让代码在 GPU 上运行。
- 它能够自动区分;这意味着对于基于梯度的方法,您不需要手动计算梯度,PyTorch 会为您完成。
你可以把 PyTorch 想象成服用类固醇的 NumPy。
虽然这两个功能对于我们在这里想要做的事情(线性回归)来说似乎不是很大的改进,因为这不是非常昂贵的计算,并且手动计算梯度非常简单,但它们在深度学习中有很大的不同,在深度学习中,我们需要大量的计算能力,并且手动计算梯度非常困难。
在着手实现之前,让我们先简单回忆一下什么是线性回归:
线性回归是通过一些其他已知变量以线性方式估计未知变量。视觉上,我们通过我们的数据点拟合一条线(或更高维的超平面)。
如果你对这个概念不太适应,或者想更好地理解它背后的数学原理,你可以阅读我以前写的关于线性回归的文章:
线性回归背后的数学详细解释
towardsdatascience.com](/understanding-linear-regression-eaaaed2d983e)
现在,让我们跳到编码部分。
首先,很明显,我们需要导入一些库。我们导入torch,因为它是我们用于实现的主要内容,matplotlib用于可视化我们的结果,sklearn中的make_regression函数,我们将使用它来生成一个回归数据集作为示例,以及 python 的内置math模块。
**import** **torch****import** **matplotlib.pyplot** **as** **plt****from** **sklearn.datasets** **import** make_regression**import** **math**
然后我们将使用以下方法创建一个LinearRegression类:
.fit()—该方法将实际学习我们的线性回归模型;在这里,我们将找到最佳权重.predict()—这个将用于预测;它将返回我们的线性模型的输出.rmse()—用给定的数据计算我们的模型的均方根误差;这个指标有点像“从我们的模型估计值到真实 y 值的平均距离”
我们在.fit()中做的第一件事是将一个额外的 1 列连接到我们的输入矩阵 x。这是为了简化我们的数学,并将偏差视为一个始终为 1 的额外变量的权重。
.fit()方法将能够通过使用封闭形式的公式或随机梯度下降来学习参数。为了选择使用哪个,我们将有一个名为 method 的参数,该参数需要一个字符串“solve”或“sgd”。
当method设置为“求解”时,我们将通过以下公式获得模型的权重:

这要求矩阵 X 具有满列秩;因此,我们将检查这一点,否则我们会显示一条错误消息。
我们的第一部分.fit()方法是:
注意method之后的其他参数是可选的,仅在我们使用 SGD 的情况下使用。
该方法的第二部分处理method = ‘sgd’的情况,它不要求 X 具有完整的列秩。
我们的最小二乘线性回归的 SGD 算法概述如下:

我们将通过将 weights 类属性初始化为一个张量来开始此算法,该张量是一个列向量,其值取自均值为 0、标准差为 1/(列数)的正态分布。我们将标准偏差除以列数,以确保在算法的初始阶段不会得到太大的输出值。这是为了帮助我们更快地收敛。
在每次迭代的开始,我们随机地打乱我们的数据行。然后,对于每一批,我们计算梯度并将其从当前权重向量中减去(乘以学习率),以获得新的权重。
在上面描述的 SGD 算法中,我们已经展示了手动计算的梯度;就是那个表达式乘以 alpha(学习率)。但是在下面的代码中,我们不会显式地计算这个表达式;相反,我们计算损失值:

然后我们让 PyTorch 为我们计算梯度。
下面是我们.fit()方法的后半部分:
为了计算损失相对于权重的梯度,我们需要在self.weights张量上调用.requires_grad_(True)方法,然后我们根据上面给出的公式计算损失。计算损失后,我们在损失张量上调用.backward()方法,该方法将计算梯度并将其存储在self.weights的.grad属性中。在我们完成更新后,我们调用.detach()来获得一个新的张量,上面没有记录任何运算,这样下次我们计算梯度时,我们将只基于单次迭代中的运算。
我们从这个方法返回self,以便能够像这样连接构造函数和.fit()的调用:lr = LinearRegression().fit(X, y, ‘solve’)。
.predict()方法非常简单。我们首先检查之前是否调用了.fit(),然后将一列 1 连接到 X,并验证 X 的形状允许与权重向量相乘。如果一切正常,我们只需返回 X 和权重向量相乘的结果作为预测。
在.rmse()中,我们首先使用.predict()获得模型的输出,然后如果预测期间没有错误,我们计算并返回均方根误差,该误差可以被认为是“从我们的模型估计值到真实 y 值的平均距离”。
下面是LinearRegression类的完整代码:
在一个例子中使用我们的LinearRegression类
为了展示我们的线性回归实现,我们将使用来自sklearn的make_regression()函数生成一个回归数据集。
X, y = make_regression(n_features=1, n_informative=1,
bias=1, noise=35)
让我们绘制这个数据集,看看它是什么样子的:
plt.scatter(X, y)

作者图片
make_regression()返回的 y 是平面向量。我们将把它重新整形为一个列向量,用于我们的LinearRegression类。
y = y.reshape((-1, 1))
首先,我们将使用method = ‘solve’来拟合回归线:
lr_solve = LinearRegression().fit(X, y, method='solve')plt.scatter(X, y)plt.plot(X, lr_solve.predict(X), color='orange')

作者图片
上述回归模型的均方根误差为:
lr_solve.rmse(X, y)# tensor(31.8709, dtype=torch.float64)
然后,我们也使用method = ‘sgd’,我们将让其他参数有它们的默认值:
lr_sgd = LinearRegression().fit(X, y, method='sgd')plt.scatter(X, y)plt.plot(X, lr_sgd.predict(X), color='orange')

作者图片
如你所见,上面两幅图中方法“solve”和“sgd”的回归线几乎相同。
使用“sgd”时,我们得到的均方根误差为:
lr_sgd.rmse(X, y)# tensor(31.9000, dtype=torch.float64)
这是 Jupyter 笔记本,包含所有代码:
我希望这些信息对你有用,感谢你的阅读!
这篇文章也贴在我自己的网站这里。随便看看吧!
如何实现深度 Q 网络的优先化体验重放
学习如何训练一个智能代理人降落飞船
在本文中,我们将使用名为 Lunar Lander 的 OpenAI 环境来训练一个代理像人类一样玩!为了做到这一点,我们将实现一个名为优先体验重放的深度 Q 网络算法版本。

SpaceX 在 Unsplash 上拍摄的
为了对我们想要完成的事情有一个概念,让我们看一个未经训练的代理人玩这个游戏。当目标落在两个黄旗之间时,我们可以看到代理仍有许多要学习的地方!

首先,让我们回忆一下,把事情放在上下文中。什么是深度 Q-网络(DQN ),我们为什么要使用它?在全球范围内,我们想要解决什么样的问题?
深度 Q 网络属于强化学习算法家族,这意味着我们将自己置于环境能够与代理交互的情况下。代理能够采取一个动作,将它从一个状态带入另一个状态。然后,环境会为达到这种新状态提供奖励,奖励可以是积极的,也可以是消极的(惩罚)。我们想要解决的问题是能够为每个状态选择最佳行动,从而使我们的总累积回报最大化。

归功于 Lilian Weng @ Lilian Weng . github . io/
对于强化学习算法来说,给定一个状态,提供最佳累积奖励的动作不应该依赖于过去访问过的状态。这个框架被称为马尔可夫决策过程。通过多次访问各州,并用我们实际获得的奖励来更新我们的预期累积奖励,我们就能够找出对每一种环境状态采取的最佳行动。这是 Q 网络算法的基础。
现在,当我们有有限数量的状态时,这是非常好的,例如当一个代理在一个网格中移动时,状态是由它所在的情况定义的。我们现在希望解决的问题是非有限状态变量(或动作)的情况。例如,机器人手臂的环境状态是关节位置和速度的列表。由于状态是不确定的,所以我们不太可能多次访问一个状态,从而无法更新对最佳行动的估计。我们需要某种东西,在给定两个与我们当前状态足够接近的已知状态的情况下,能够预测在我们当前状态下应该采取的最佳行动。你猜对了,解决方案是某种形式的插值。当线性插值只是“在两个状态之间画一条线”时,我们需要能够以更高的复杂度进行预测。这就是神经网络登场的地方。神经网络为我们提供了利用非线性模型预测给定已知状态(及其最佳行动)的最佳行动的可能性。这就是深度 Q 网。DQN 提出了几个与神经网络的训练部分相关的实现问题。这个“技巧”被称为经验重放,基本上是指我们偶尔停止访问环境,以首先收集一些关于过去访问状态的数据,然后根据收集的经验训练我们的神经网络。换句话说,它在探索阶段和训练阶段之间交替,将这两个阶段解耦,从而允许神经网络向最优解收敛。
既然我们已经很好地理解了是什么把我们带到了 Q-Network,那就让乐趣开始吧。在本文中,我们想要实现一个名为优先体验重放的 DQN 的变体(参见发布链接)。这个概念非常简单:当我们对经验进行采样以输入神经网络时,我们假设一些经验比其他经验更有价值。在一个统一的抽样 DQN 中,所有的经历都有相同的概率被抽样。因此,在培训结束时,每项经验的使用次数都大致相同。如果我们用权重进行采样,我们可以让一些更有益的体验平均被采样更多次。现在我们如何分配每次经历的权重呢?该出版物建议我们计算一个抽样概率,该概率与神经网络正向传递后获得的损失成比例。这相当于说,我们希望保留那些导致预期奖励和实际获得的奖励之间存在重要差异的经历,或者换句话说,我们希望保留那些让神经网络学到很多东西的经历。
好了,现在我们有了概念,是时候在一个真实的案例场景中实现了。我们将尝试解决名为“月球登陆者”的 OpenAI 健身房环境。在这个环境中,代理人是一艘受到重力作用的宇宙飞船,它可以采取 4 种不同的行动:什么也不做或启动左、右或底部引擎。如果宇宙飞船降落在正确的位置,我们会得到奖励,如果着陆器坠毁,我们会受到惩罚。每次我们使用底部油门时,我们也会受到一点惩罚,以避免收敛到人工智能将着陆器保持在空中的情况。
现在我们可以质疑我们解决这个问题的方法。这里为什么要用深 Q 网?这种环境的状态由 8 个变量描述:x,y 坐标和速度,着陆器的旋转和角速度,以及两个布尔变量来说明着陆器的腿是否与地面接触。正如我们所看到的,大多数变量是连续的,因此 Q 网络的离散方法是不够的,我们需要能够插入我们期望在一个状态下获得的总回报,以选择最佳行动,这里使用神经网络。
现在出现了另一个问题,在这种情况下,对一些经历进行优先排序如何帮助我们获得更好或更快的结果?当我们开始训练我们的算法时,着陆器很可能会在大多数情况下崩溃。然而,着陆器可能会在不坠毁的情况下接触地面,或者在极少数情况下正确着陆。在这种情况下,预期结果(负回报)和实际产出(正回报)之间的差异将是显著的,导致这种体验被抽样的概率高得多。在某种意义上,我们希望多次使用这种经验来训练神经网络,作为什么在起作用以及我们应该采取什么方向来提高网络权重的例子。
太好了,我们现在确信我们的方法是有效的。让我们深入研究一下实现的细节。我们将把重点放在类“ReplayBuffer”上,因为它包含了与优先体验重放相关的大部分实现,但其余代码可在 GitHub 上获得。我们将设定的目标是提高算法的快速性(能够用更少的情节来解决环境),而不会由于额外的计算复杂性而牺牲运行时间。为了做到这一点,我们将会小心使用哪些类型的容器来存储我们的数据,以及我们如何访问和整理数据。该出版物引用了两种存储优先级的方法,一种是使用常规容器,另一种是使用 sum 树,sum 树是一种自定义数据类型,可以在复杂度为 o(1)的优先级上授予写和访问权限。在这里,我们将尝试把重点放在使用常规容器的实现上,因为优化以降低复杂性似乎更具挑战性,这提供了一个很好的编码练习!
这里,我们假设深度 Q 网络的实现已经完成,也就是说,我们已经有了一个代理类,它的作用是通过在每一步将经验保存在重放缓冲器中来管理训练,并且不定期地训练神经网络。神经网络也已经被定义,这里我们选择了一个神经网络,其具有两个分别具有 256 和 128 大小的具有 ReLu 激活的神经元的隐藏层,以及最后的线性激活层。
在统一采样 DQN 中,我们通过线性分布随机采样体验,这意味着我们只需要一个容器来存储体验,而不需要任何额外的计算。对于优先体验重放,我们确实需要将每个体验与附加信息、其优先级、概率和权重相关联。
根据神经网络前向传递后获得的损失更新优先级。概率是从经验优先级中计算出来的,而权重(校正在神经网络反向传递期间由不均匀采样引入的偏差)是从概率中计算出来的。论文引入了另外两个超参数α和β,它们控制了我们想要优先化的程度:在训练结束时,我们想要统一采样,以避免由于一些经验被不断优先化而导致的过度拟合。这些等式可以在下面找到:

P =优先级,P =概率,w =权重,N =经历次数
根据作者的说法,仅在优先体验重放的情况下,权重可以被忽略,但是当与双 Q 网络(另一种 DQN 实现)相关联时,权重是强制性的。这里仍将实现权重,以用于与双 Q 网络结合的潜在用途。
因此,与统一的 DQN 相比,我们现在有 3 个与体验相关联的值。更糟糕的是,我们需要能够更新这些变量。在实现方面,这意味着在随机抽样我们的经验后,我们仍然需要记住我们从哪里获得这些经验。具体地说,就是在我们采样的时候记住容器中经验的索引(啊,如果我们有指针就好了)。所以我们现在有 4 个相关的变量。我们选择的容器是一本字典。实际上有两个字典,一个用于体验本身,一个用于相关数据,这很好,因为我们无论如何都需要记住索引。因为我们需要在神经网络中处理完数据后再找回来,所以字典是一个很好的选择,因为它的访问器的复杂度是 o(1)量级,因为我们不需要浏览整个容器。对于这两个字典,值都是命名元组的形式,这使得代码更加清晰。我们还添加了一个小的 for 循环来初始化字典索引。
接下来,让我们剖析一下可能是计算量最大的一步,随机采样。这是很昂贵的,因为为了进行加权采样,我们可能需要对包含概率的容器进行排序。为了进行采样,我们使用 random.choices 函数,让我们看看这是如何实现的。
如果我们浏览 Python 文档中的平分函数,我们可以看到这一点:“该模块支持按排序顺序维护列表,而不必在每次插入后对列表进行排序”。答对了。无需深入研究代码,该函数确实需要在每次调用 random.choices 时至少对容器排序一次,这相当于 o(n)量级的复杂性。我们的字典有 10e5 大小,这一点远非微不足道。我们真的负担不起对每个样品进行分类,因为我们每四步取样一次。解决这个问题的一个方法是在 prevision 中对多个神经网络训练一次采样多个批次。我们看到 random.choices 是用 bissect 函数实现的,它确保容器只排序一次,因此对更多批次进行采样不会增加任何复杂性。
这种方法有两个缺点:
- 当我们对第一批以外的其他批次进行采样时,我们使用的优先级不是最新的。这实际上是没问题的,因为下一批采样的优先级仍然是更新的,所以在多次采样迭代后不会看到这种差异。
- Python 的 random.choices 将对相同的值进行多次采样。如果我们只对收集的状态的一部分进行采样,这实际上并没有什么不同,但是如果我们一次对太多批次进行采样,一些状态将会被过度采样。对实现进行的测试表明,采样大小为 2000(与大小为 10e5 的容器相比)显示出最好的结果。
让我们看看这是如何在 ReplayBuffer 类中实现的:
这里,变量 update_mem_every 和 update_nn_every 分别表示我们希望计算一组新的经验批次的频率以及我们希望训练网络的频率。current_batch 变量表示当前用于向神经网络提供数据的批次,此处重置为 0。
我们现在能够用概率权重有效地对经验进行抽样。让我们看一下 PER 算法,以了解如何将我们的采样包含在更大的画面中。

我们可以注意到对于计算复杂度优化来说很棘手的两件事:能够记住每一步的最大优先级和最大权重。这看起来很容易做到,基本上只是在每一步比较新更新的值和最大值。但这忘记了容器是固定大小的,这意味着每一步我们还将删除一个体验,以便能够再添加一个。现在,如果我们删除最大值,我们如何找到第二高的值?我们应该总是跟踪容器中值的顺序吗?当然不是!这意味着每一步的复杂度为 o(n)。实际上,每次删除最大值时,我们可以简单地找到最大值。因此,我们跟踪最大值,然后将每个删除的条目与它进行比较。通常,要删除的体验已经被使用过几次了,所以它们的优先级应该很低,因为它实际上是最大值的机会。所以我们可以偶尔对容器进行分类。请参见下面第 9 行的代码:
要指出的是,我们还有一个名为 priorities_sum_alpha 的变量。从抽样概率的定义中可以看出,每次都需要计算所有记录的经验优先级的总和的α次方。当然,我们不希望每次都从头开始计算这个值,所以我们会跟踪它,并在添加/删除体验时更新它。
我们的代码被优化了很多,总的来说我们应该有 o(n/T)的复杂度,T 是我们一次采样的批次数量。当然,复杂性取决于那个参数,我们可以利用它来找出哪个值会导致最佳效率。
是时候测试我们的实现了!我们运行了两个测试,一个使用优先体验重放实现,另一个使用统一采样 DQN。我们绘制了如下所示的图表:

优先体验重放分数的演变

均匀抽样得分的演变
不,这不是一个错误,均匀抽样优于优先抽样!两种算法都使用相同的超参数运行,因此可以比较结果。我们发现,通过使用优先采样,我们可以在大约 800 集内解决环境问题,而在均匀采样的情况下,我们可以在大约 500 集内解决环境问题。尽管我们研究了理论,发现优先化经验是有益的!有几个原因可以解释这里的问题:
- 我们可以从出版物中看到,优先化体验在多种环境中有不同的结果。特别地,在基于等级和比例的两种提出的方法之间已经存在性能上的差距。还不确定月球着陆器是否会从优先体验中受益。
- 在该出版物中,所有的实验都是在双 Q 网络算法的基础上优先考虑体验。作者没有详细说明这种实现对 PER 结果的影响。有可能实现两个决斗 Q 网络将使优先体验重放释放其全部潜力。
- 我们不能不注意到,月球着陆器是一个相当简单的解决环境,大约需要 400 次经验。Atari 系列的其他游戏可能需要多几个数量级的体验才能被考虑解决。毕竟,在我们的情况下,最重要的经历,比如说在没有摔倒的情况下获得高额奖励,并不罕见。对它们进行过多的优先排序会使神经网络过度适应这一特定事件。换句话说,你将学会正确地接触地面,但不知道如何接近地面!
事实上,我们试图调整算法,以便只优先考虑积极的体验。这背后的原因是,当学习如何玩时,算法崩溃的可能性比正确着陆的可能性大得多,而且由于我们可以在比我们可以着陆的更广的区域崩溃,我们往往会记住更多的崩溃经历。为此,我们尝试进行如下调整:我们查看神经网络实际输出和期望值之间的符号差。如果是积极的,我们实际上获得了比预期更好的回报!然后我们应用一个 ReLu 函数,如果差值为负,则赋为 0,否则不做任何事情。在重放缓冲器中,为了不仅仅删除具有负差异的体验,我们给它们分配平均优先级。
从理论上来说,这将导致简单地优先考虑更多具有高积极回报差异(着陆)的经历。在实践中,这是一个不同的故事…算法甚至不再收敛!说实话,对经历进行优先排序是一个危险的游戏,很容易产生偏见,也很容易一遍又一遍地对相同的经历进行优先排序,从而导致网络过度适应一部分经历,无法正确地学习游戏。该出版物确实建议将 alpha 值(控制您对优先级的依赖程度)退火为 0,以便我们倾向于使用均匀采样,但在我们的情况下,这只会导致算法在足够的迭代后收敛。
即使该算法没有带来更好的学习性能,我们仍然可以验证我们的另一个目标,降低计算复杂性,是满足。为此,我们将使用我们所知的解决环境问题的统一采样算法,以及优先化经验实现的一个修改版本,其中参数α被赋值为 0。这样,我们可以统一采样,同时保持区分经验优先级的复杂性:我们仍然需要加权采样,更新每个训练批次的优先级,等等。由于这两个实验是相似的,我们可以安全地直接比较训练持续时间

优先和均匀采样的经验处理中计算时间的演变
正如我们所看到的,我们的实现确实将求解环境的总计算时间从 2426 秒增加到了 3161 秒,这相当于大约增加了 34%。考虑到我们要做的事情的复杂性,这是一个可以接受的代价(在每次迭代中访问和修改容器的元素,命令容器经常从中采样)。从图表中可以看出,在 300 集之前,这两种算法需要的处理时间大致相同,但之后就出现了分歧。这是可以理解的,因为 10e5 元素的容器大约在这个阶段变满。还记得如果我们删除了最高优先级值,就必须更新所有容器的小细节吗?这没关系,因为这几乎不会发生。在这里,所有的优先级都是一样的,所以每次容器装满时都会发生。因此,为了进行真正的比较,我们可以将自己限制在前 300 次体验中,这两种实现之间几乎没有区别!要注意的是,该出版物提到它们用和树的实现导致大约 3%的额外计算时间。看来我们的实现可以提供类似的结果,这是相当令人满意的。
当然,这些结果取决于为优先化体验重放实现选择的超参数,即您想要一次采样多少批次,以及您想要多频繁地更新参数α和β(需要更新缓冲区中的每个概率)。这两个值越大,算法的计算速度就越快,但这可能会对训练产生不可忽略的影响。由于我们的算法在这一部分没有提供好处,因此很难定义最佳参数,但应该可以对一组参数进行基准测试,并确定最佳的整体折衷方案。
在这个实验中我们能得出什么结论?首先,我们能够在几乎没有额外计算复杂度的情况下实现深度 Q 网络的优先化体验重放。第二,这种实现似乎没有提高代理在这种环境下的学习效率。那么接下来我们能做什么呢?
- 实施决斗 Q-网络和优先体验重放。
- 在其他环境中尝试这个代理,看看在给定的实现下,优先化的体验重放是否可以提高结果。
- 实施基于等级的优先体验重放(使用 sum 树的那种),因为它声称可以提供更好的结果。
最后但同样重要的是,让我们观察一个训练有素的代理玩游戏!经过那些可怕的计算后,我们应该得到这些。当然,我们使用优先内存重放实现中训练有素的代理,这花费了更多的时间,但它仍然训练有素!

为了提高…
完整代码:https://github.com/Guillaume-Cr/lunar_lander_per
出版地:【https://arxiv.org/abs/1511.05952
如何从零开始用 Python 实现一个高斯朴素贝叶斯分类器?

你有没有问过自己最古老的机器学习算法是什么?
今天,我们有很多机器学习算法,从简单的 KNN 到集成算法,甚至神经网络。有时它们看起来如此复杂,以至于你可以认为它们是最近几年开发的,而机器学习,总的来说,是一种新事物。但是第一个算法出现的时间比你想象的要早。
朴素贝叶斯算法。
朴素贝叶斯算法是最古老的机器学习形式之一。贝叶斯理论(该算法的基础)和统计学基础是在 18 世纪发展起来的。从那以后,直到 50 年代,计算都是手工完成的,直到出现了第一台计算机实现这种算法。
但是这个算法有什么简单到可以手动使用的呢?
该算法的最简单形式由两个主要部分组成:
- 朴素贝叶斯公式(定理)。
- 和分布(在这种情况下是高斯分布)。
朴素贝叶斯理论。
朴素贝叶斯理论在大多数情况下可以简化为一个公式:

朴素贝叶斯公式[来源—https://miro . medium . com/max/640/1 * 7lg _ ul M8 _ 1 fygjxpbtrqfq . png]
这个公式意味着事件 A 发生的概率知道事件 B 已经发生了..
不知何故,对朴素贝叶斯理论的解释超出了本文的范围,这就是为什么我强烈推荐你阅读这篇关于 NB 理论的文章。
什么是发行版?
分布,基本上是显示数值是如何在数列中分散的,以及它们在这个数列中出现的频率。这里有一个例子:

从上图中可以看出,高斯分布或正态分布取决于一个系列的两个参数——平均值和标准差。知道这两个参数的序列,我们可以找到它的分布函数。它有下一种形式:

高斯分布函数[来源—https://i.stack.imgur.com/bBIbn.png
但是,我们为什么需要这个功能呢?很简单,世界上大多数数据都表示为连续值,但是你猜怎么着,你不能计算 X 值的概率来得到 v 值,它会是 0。为什么?从技术上来说,当你将某物除以无穷大时,你会得到什么?正确——零。
那么,我们该如何解决这个问题呢?当然,使用高斯分布函数,如上图所示。输入一个序列的平均值和它的标准偏差,而不是 x 值,你可以找出 x 值出现的概率。瞧。
那么这一切是如何协同工作的呢?
我不知道为什么,但对我个人来说,有时候通过在代码中实现算法会更容易理解算法是如何工作的。让我们开始吧:
- 首先,让我们导入所有的依赖性:
# Importing all needed libraries
import numpy as np
import math
就这些,是的,我们需要纯粹的数字和数学库。
2.现在让我们创建一个类,该类将实现算法和第一个函数,该函数将按类分离我们的数据集。
# gaussClf will be the class that will have the Gaussian naive bayes classifier implimentation
class gaussClf:
def separate_by_classes(self, X, y):
*''' This function separates our dataset in subdatasets by classes '''* self.classes = np.unique(y)
classes_index = {}
subdatasets = {}
cls, counts = np.unique(y, return_counts=True)
self.class_freq = dict(zip(cls, counts))
print(self.class_freq)
for class_type in self.classes:
classes_index[class_type] = np.argwhere(y==class_type)
subdatasets[class_type] = X[classes_index[class_type], :]
self.class_freq[class_type] = self.class_freq[class_type]/sum(list(self.class_freq.values()))
return subdatasets
separate_by_classes 函数按类分离出数据集,分别为每个类计算每列的平均值和标准偏差。
3.拟合函数。
def fit(self, X, y):
*''' The fitting function '''* separated_X = self.separate_by_classes(X, y)
self.means = {}
self.std = {}
for class_type in self.classes:
# Here we calculate the mean and the standart deviation from datasets
self.means[class_type] = np.mean(separated_X[class_type], axis=0)[0]
self.std[class_type] = np.std(separated_X[class_type], axis=0)[0]
接下来是拟合函数,我们只计算每一类每一列的平均值和标准差。
4.高斯分布函数。
def calculate_probability(self, x, mean, stdev):
*''' This function calculates the class probability using gaussian distribution '''* exponent = math.exp(-((x - mean) ** 2 / (2 * stdev ** 2)))
return (1 / (math.sqrt(2 * math.pi) * stdev)) * exponent
calculate_probability 函数使用一个序列的平均值和标准差来计算一个函数在一个序列中出现的概率。
5.预测函数。
def predict_proba(self, X):
*''' This function predicts the probability for every class '''* self.class_prob = {cls:math.log(self.class_freq[cls], math.e) for cls in self.classes}
for cls in self.classes:
for i in range(len(self.means)):
print(X[i])
self.class_prob[cls]+=math.log(self.calculate_probability(X[i], self.means[cls][i], self.std[cls][i]), math.e)
self.class_prob = {cls: math.e**self.class_prob[cls] for cls in self.class_prob}
return self.class_prob
这个函数返回一个字典,其中包含样本属于某个类的概率。在经典的 sklearn 估计器中,predict_proba 函数获取样本列表并返回标签列表。为了使它更容易使用,我决定只在一个例子中实现它。
同样,在这个函数中,我不计算先验概率,以避免无用的计算,因为对于每个类估计,你需要除以上面得到的相同值。
6.预测函数。
def predict(self, X):
*''' This funtion predicts the class of a sample '''* pred = []
for x in X:
pred_class = None
max_prob = 0
for cls, prob in self.predict_proba(x).items():
if prob>max_prob:
max_prob = prob
pred_class = cls
pred.append(pred_class)
return pred
在这里,我决定使用经典的实现方法。列出来,列出来。
你可以在我的 github 库上看到代码。
对比 sklearn。
现在让我们将我们的实现与 sklearn one 进行比较。在 sklearn 库中,Gaussian Naive Bayse 实现为 GaussianNB 类,要导入它,您应该编写以下代码:
from sklearn.naive_bayes import GaussianNB
我们会让你来实施,你可以在那里找到怎么做。那么在虹膜数据集上有什么结果呢?
我们的实现:0.00000000001
Sklearn 实现:1.0 精度。
发生这种情况是因为 sklearn 模型使用了一个比我们使用的模型稍多的其他实现,你可以在 sklearn 网站上阅读更多内容。
结论。
因此,在本文中,我向您展示了如何实现实际上最古老的机器学习算法的最简单形式——高斯朴素贝叶斯算法,并简要介绍了它的工作原理。我强烈建议您学习 sklearn 实现的工作原理,并尝试自己实现 BernoulliNB。
谢谢你。
如何将 CSV 文件导入 MySQL Workbench
入门指南
没有错误

如果你熟悉求职过程,你可能已经注意到一些公司喜欢用带回家的作业来决定候选人是否合适。因为大多数公司都使用 SQL,所以他们通常想看看你是否能使用 SQL 解决问题。然而,并不是所有的公司都会给你提供数据集。很可能一家公司只提供了一个表模式,您可能想知道您的查询是否能实际运行。因此,将数据集导入数据库会非常有帮助。
在本文中,我将介绍如何一步一步地安装 MySQL Workbench 并将数据导入 MySQL Workbench。
入门指南
MySQL Workbench 是数据库架构师、开发人员和 DBA 的统一可视化工具。在这篇文章中,我将使用 Mac OS X 系统。要开始,你需要安装 MySQL 和 MySQL Workbench 。
使用软件包安装程序安装 MySQL:
下载包含 MySQL 包安装程序的磁盘镜像(.dmg)文件(社区版本可从这里获得)。连按文件以装载磁盘映像并查看其内容。

MySQL 安装页面(作者截图)

不要忘记这个密码,因为您稍后将需要它来登录您的 MySQL workbench!(作者截图)
安装完MySQL和 MySQL Workbench 之后,现在就可以打开 MySQL Workbench 了。我犯了一个错误,没有安装 MySQL,因为我忘记了我安装的 SQL 是 Postgresql。如果你没有安装 MySQL,你将无法连接到数据库。

MySQL Workbench 检测不到任何 MySQL → 下载 MySQL 的时间。(作者截图)
如果您成功下载 MySQL,您将看到一个弹出窗口,输入您之前设置的相同密码。输入密码后,您应该会看到类似这样的内容:

耶!你连上了 MySQL(作者截图)
现在,您可以点击进入 MySQL 实例。
如果在安装 MySQL 后仍然看到这个错误,可以点击屏幕右上角的“停止按钮或者点击“启动/关机”按钮。

未建立连接错误消息(作者截图)

(作者截图)
****创建一个模式/表
如果您想让表格更有条理,可以为您正在处理的每个项目创建一个模式。这样,您将更容易为每个项目找到不同的表格。您可以简单地右键单击并选择创建模式。"

如何创建模式(作者截图)
现在您已经创建了一个模式,您可以选择“创建表或“表** 数据导入向导”来在模式中构建一个表。**

如何创建表格(作者截图)
下面是您创建表格时将看到的内容:

创建空表格(作者截图)
导入 CSV 文件
首先,找到要导入的 CSV 文件的文件路径。

找到数据的路径(作者截图)

您可以创建一个新表,也可以添加到现有的表中(作者截图)
不幸的是,我无法导入数据,因为“表格数据导入向导在 UTF-8 编码的带 BOM 的文件上失败。”我不明白为什么会这样,因为我确实将文件保存为 UTF-8 CSV 格式。
最后,我发现对于 Mac OSX 系统,我们需要使用数字/记事本、打开 CSV 或 excel 文件,然后将文件导出为。csv 格式。

将文件保存为 CSV 文件(作者截图)

有时候只有把编码改成别人才管用(作者截图)
恭喜你!!!你做到了!现在您已经成功地将 CSV 文件加载到 MySQL workbench,您可以开始编写查询了!

简单查询的结果(作者截图)
如果你觉得这很有帮助,请关注我,看看我的其他博客。❤️
下次见,快乐学习!👩🏻💻
举例说明最常见的离散概率分布
towardsdatascience.com](/understanding-and-choosing-the-right-probability-distributions-with-examples-5051b59b5211) [## 作为分析师如何准备商业案例面试?
作为数据分析师或数据科学家,我们不仅需要知道概率和统计,机器学习算法…
towardsdatascience.com](/how-to-prepare-for-business-case-interview-as-an-analyst-6e9d68ce2fd8) [## 为电子商务建立一个产品推荐系统:第一部分——网络搜集
今天,如果我们想到机器学习在商业中最成功和最广泛的应用,推荐者…
medium.com](https://medium.com/@kessiezhang/building-a-product-recommendation-system-for-e-commerce-part-i-web-scraping-798b6251ab51) [## 如何将 Jupyter 笔记本转换成 PDF
用几行代码将 Jupyter 笔记本转换为 pdf(调试“500:内部服务器错误”)
towardsdatascience.com](/how-to-convert-jupyter-notebooks-into-pdf-5accaef3758)**
如何使用 pandas read_csv 命令导入数据
熊猫基础:读取数据文件

马库斯·斯皮斯克在 Unsplash 上拍摄的照片
在任何数据分析项目中,我们都试图从一组给定的数据中发现有用的、可操作的见解。如果我们幸运的话,这些数据可能已经为我们打包好了;如果没有,我们可能需要自己收集。无论哪种方式,一旦数据被存储,我们将需要把它读入一个程序来执行分析。
软件包 pandas 经常用于此目的。这是一个功能强大的库,可以与 Python 编程语言一起工作。在 pandas 中,选择读入数据文件的工具是无处不在的read_csv函数。
在本文中,我们将探索 pandas 的
read_csv命令的基础:标题选项、指定子目录(如果适用的话)、使用逗号以外的分隔符、标识要用作索引的列、定义字段类型以及处理缺失值。
数据
与任何熊猫项目一样,我们首先使用标准别名pd导入熊猫。让我们也使用数字包 NumPy 的标准别名来导入它。
对于我们的例子,让我们读入股票价格数据。这个数据集列出了交易的日期、开盘价、收盘价、最高价和最低价、交易量以及交易代码。
在电子表格程序中显示的前几行数据如下所示。

什么是. csv 文件?
如果我们在文本编辑器中查看数据文件(与上面的电子表格程序相反),前几行如下。
date,open,high,low,close,volume,Name
2013–02–08,15.07,15.12,14.63,14.75,8407500,AAL
2013–02–11,14.89,15.01,14.26,14.46,8882000,AAL
2013–02–12,14.45,14.51,14.1,14.27,8126000,AAL
2013–02–13,14.3,14.94,14.25,14.66,10259500,AAL
2013–02–14,14.94,14.96,13.16,13.99,31879900,AAL
我们看到第一行由列名组成,也称为字段名称。包含列名的这一行被称为标题。接下来的行列出了对应于该行中每个字段的数据。因此,第一行数据的日期为 2013 年 2 月 8 日,开盘价为 15.07 美元,以此类推。每个数据点与下一个数据点之间用逗号分隔,因此称为“逗号分隔值”(csv)文件。
标题选项
pandas 命令从文件中读取数据并将其存储在一个名为stocks_df的数据帧中,这是一个简单的命令行程序。
为了确保该命令按预期工作,让我们使用head检查数据帧的前几行。
您可能不会对。csv 文件。在这种情况下,通过使用usecols选项指定想要读入数据框的列。例如,如果您只对日期、成交量和股票名称感兴趣,请指定usecols=['date', 'volume', 'Name']。
正如预期的那样,只有我们指定的列包含在数据框中。
默认情况下,pandas 假设数据的第一行是一个标题。当然,并不是每个数据文件都有标题。例如,假设我们有一个没有标题的数据文件,如下所示。
2013-02-08,15.07,15.12,14.63,14.75,8407500,AAL
2013-02-11,14.89,15.01,14.26,14.46,8882000,AAL
2013-02-12,14.45,14.51,14.1,14.27,8126000,AAL
2013-02-13,14.3,14.94,14.25,14.66,10259500,AAL
2013-02-14,14.94,14.96,13.16,13.99,31879900,AAL
如果我们像以前一样尝试读取文件,我们将不会得到我们想要的结果。
pandas 假定第一行是一个标题,并照此读入。在这种情况下,这不是我们想要的,因为第一行是数据。幸运的是,修复很容易——只需指定选项header=None。
现在熊猫从 0 开始给这些列编号。如果您喜欢使用命名列,使用names选项来指定您自己的列名。
目录
在上面的例子中,我将数据文件保存为与我的 Python 程序相同的目录中的stocks.csv。为了保持有序,通常将数据文件保存在子目录中。在这种情况下,在read_csv语句中指定数据子目录。
像以前一样,让我们检查前几行,以确保一切顺利。
分隔符
并非所有数据文件都使用逗号分隔值。可以使用制表符、空格或任何其他字符。例如,我们的数据文件可能是用分号而不是逗号设置的。
date;open;high;low;close;volume;Name
2013-02-08;15.07;15.12;14.63;14.75;8407500;AAL
2013-02-11;14.89;15.01;14.26;14.46;8882000;AAL
2013-02-12;14.45;14.51;14.1;14.27;8126000;AAL
2013-02-13;14.3;14.94;14.25;14.66;10259500;AAL
2013-02-14;14.94;14.96;13.16;13.99;31879900;AAL
要指定逗号以外的分隔符,使用sep选项。
指定要作为索引的列
如果不需要默认索引,可以指定一列作为数据框的索引。例如,要将索引指定为date列,可以使用index_col='date'。
现在,根据需要,日期列就是索引。
类型
让我们检查每个列的类型。
假设我们想要将数字数据存储为 32 位类型以节省空间。为此,将选项dtype设置为一个字典,其中键是列,值是所需的类型。
尽管我们知道数据由日期组成,但是date列是作为通用对象类型读入的。要以日期类型读取列,使用设置为包含列索引的列表的parse_dates选项。
缺少值
数据包含缺失值是很常见的。用某种指示符(如问号或单词“missing ”)来指示缺失值也很常见。
如您所见,第一行数据中缺少两个值,第二行缺少一个值。此外,第三个数据行的一个条目中有一个问号。我们该如何应对?
正如我们所预料的那样,缺失的值被 pandas 读入为“非数字”(NaN),所以我们对这些值没有进一步的要求。然而,pandas 不知道如何处理表示缺少值的问号。为了纠正这种情况,我们可以将列表中被视为缺失值的值列表传递给na_values选项。
现在问号已经被念成 NaN 了。
进一步阅读
read_csv命令非常灵活,有很多选项。要进一步了解这些选项,请参考文档。
如何使用 Google 的 API v4 (2020)将 Google Sheets 数据导入熊猫数据框架

图片来自 Pixabay
将 Google 工作表数据导入熊猫数据框架
Google Sheets 是一种共享数据和远程协作的有用方式。但是定期将数据转移到 Python 这样的环境中会很麻烦。这篇文章将介绍如何为 Python 设置最新的 Google Sheets API,即 2020 年 6 月的 v4。我们还将介绍如何从 Google 工作表范围(甚至整个工作表)中提取数据到 Pandas 数据框中。
开始之前:
开始之前,您需要以下材料:
- Python 2.6 或更高版本(建议使用 Python 3)
- Pip/pip3 包管理工具(Python 2 >= 2.7.9 或 Python 3 >= 3.4 的标准配置)
- 一个谷歌账户(和包含你感兴趣的数据的谷歌表单)。
API 设置:
首先,你需要在你的 Gmail 账户上启用 Google Sheets API,Google Sheets 就存储在这里。登录您的 Gmail 帐户,访问Google Sheets API Python 快速入门指南。你会看到一个蓝色的“启用 Google Sheets API”按钮。点击按钮(下图中标为[1]):

作者图片
从下拉菜单中选择“桌面应用程序”(下图中标为[2]),然后单击“创建”(下图中标为[3])。这将创建一个客户端配置,我们需要通过 API 设置初始连接:

作者图片
单击蓝色的“下载客户端配置”按钮(在下图中标为[4])。

作者图片
您现在应该已经下载了一个名为“ credentials.json 的文件。您需要将该文件移动到您的工作目录中。
安装 Google 的客户端库:
接下来,我们需要使用 pip 安装 Google 的客户端库:
pip install — upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
注意:我们将使用他们脚本的修改版本,而不是运行 Google 在其指南中提供的示例 Python 代码。
生成我们的 API 用户令牌:
首先,我们将设置我们的 gsheet_api_check() 函数。它查找现有的令牌。pickle 文件(存储我们的用户访问和刷新令牌)。如果没有找到 token.pickle 文件,该功能将提示您登录您的 Google Gmail 帐户。您的工作目录中必须有 credentials.json 才能启动 token.pickle 创建/刷新。该函数生成我们将用来进行 API 调用的凭证:
import pickle
import os.path
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Requestdef gsheet_api_check(SCOPES):
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token) if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0) with open('token.pickle', 'wb') as token:
pickle.dump(creds, token) return creds
注意:完成初始凭证设置后,我们可以丢弃 gsheet_api_check()和在以后的 api 调用中直接加载我们的令牌。或者,保留 gsheet_api_check() 可能是有益的,因为该函数检查我们的令牌是否过期和/或丢失。如果令牌过期/丢失, gsheet_api_check() 将开始刷新用户令牌(通过提示您重新登录您的 Google 帐户)。您可以决定是继续使用 gsheet_api_check() 还是直接加载令牌。
进行 API 调用:
接下来,我们将定义一个函数,该函数进行 API 调用并从 Google Sheets 中提取我们想要的数据。 pull_sheet_data() 函数建立 API 调用,拉取我们想要的数据。如果没有找到数据,该函数将显示“没有找到数据”,否则它将通过打印“完成:数据已复制”来确认数据已被检索,并返回我们的数据:
from googleapiclient.discovery import builddef pull_sheet_data(SCOPES,SPREADSHEET_ID,DATA_TO_PULL):
creds = gsheet_api_check(SCOPES)
service = build('sheets', 'v4', credentials=creds)
sheet = service.spreadsheets()
result = sheet.values().get(
spreadsheetId=SPREADSHEET_ID,
range=DATA_TO_PULL).execute()
values = result.get('values', [])
if not values:
print('No data found.')
else:
rows = sheet.values().get(spreadsheetId=SPREADSHEET_ID,
range=DATA_TO_PULL).execute()
data = rows.get('values')
print("COMPLETE: Data copied")
return data
注意: 可以修改 pull_sheet_data() 来定义其他 API 任务,比如将数据追加到 google 工作表,更新现有数据,或者创建新的电子表格。
运行我们的 API 调用并将数据保存为 Pandas DataFrame:
接下来,我们需要两条信息。首先,我们需要找到并复制感兴趣的电子表格的 ID。这可以在您的谷歌电子表格的 URL 中找到(在下图中标记为[5]):

作者图片
其次,我们需要从中提取数据的电子表格选项卡的名称。或者,如果希望从电子表格中提取特定的数据部分,可以明确定义要检索的单元格范围(下面提供了示例):
#Pulls data from the entire spreadsheet tab.
DATA_TO_PULL = 'spreadsheet_tab_name'or#Pulls data only from the specified range of cells.
DATA_TO_PULL = 'spreadsheet_tab_name!A2:C6'
最后,我们将通过指定 pull_sheet_data() 参数,运行函数,然后将检索到的数据存储到 Pandas DataFrame 中,从而将所有代码组合在一起。确保用您复制的电子表格 ID 替换'电子表格 _url_ID ,并替换'电子表格 _tab_name!'以及您的电子表格选项卡名称(如有必要,还有范围):
import pandas as pdSCOPES = ['[https://www.googleapis.com/auth/spreadsheets'](https://www.googleapis.com/auth/spreadsheets')]
SPREADSHEET_ID = 'spreadsheet_url_ID'
DATA_TO_PULL = 'spreadsheet_tab_name'data = pull_sheet_data(SCOPES,SPREADSHEET_ID,DATA_TO_PULL)
df = pd.DataFrame(data[1:], columns=data[0])df
现在,您可以在 Python 中探索检索到的数据,而无需手动下载或导入数据集!
如何改进机器学习算法:偏差、方差和正则化
偏差和方差都是机器学习中的常见问题。它们也可以被称为欠拟合和过拟合。本文解释了如何诊断偏差和方差,以及如何调整算法来解决偏差和方差问题。
如果机器学习算法不像你预期的那样工作,几乎所有的时间都是因为偏差或方差而发生的。该算法可能会出现欠拟合或过拟合,或者两者兼而有之。重要的是找出问题来改进算法。
偏差与方差
想想多项式回归。众所周知,如果增加多项式的次数,精度会更高。但是这个精度是在训练集上的。如果多项式的次数足够高,则算法可以很好地学习训练数据,从而可以完美地适应训练数据集。看下图。多项式的次数越高,训练误差变得越低。

来源:作者
交叉验证数据在这里扮演了一个有趣的角色。当多项式的次数较低时,训练误差和验证误差都将较高。这被称为高偏置问题。你也可以称之为不适应问题。因此,高偏差问题的标志是,训练集精度和验证集精度都很低。
另一方面,当多项式的次数太高时,训练数据将非常适合算法。所以,训练误差会很低。但是该算法在交叉验证数据上表现很差。所以,交叉验证误差会很大。这被称为高方差问题或过拟合问题。过度拟合问题或高方差问题的标志是,训练集精度将非常高,而交叉验证集精度将很差。
正规化
正则化有助于处理过拟合或欠拟合问题。选择正则化参数λ可能是关键的。

这是多项式回归的假设方程(顶部)和成本函数(底部)。如果我们选择太大的λ,例如 10000,除了θ0 之外的θ值将是不重要的。因为所有的θ值都是 0 到 1 之间的随机初始化值。在这种情况下,假设将是:

因此,我们将面临高偏差(欠拟合)问题。如果λ太小,在高阶多项式中,我们会遇到通常的过拟合问题。所以,我们需要选择一个最佳的λ。
如何选择正则化参数
花一些时间选择一个好的正则化参数是值得的。我们需要从零开始取几个λ值。以下是一步一步的过程:
- 选择一些λ值,如 0,0.02,0.04,0.08,0.1,…10.24.
- 使用这些 lambdas,并使用训练集训练模型,使成本最小化。因此,我们将得到最小化的成本和每个λ值的θ值。
- 使用优化的θ值并计算交叉验证数据集的成本函数。
- 找出交叉验证集中哪个 lambda 值的成本最小。λ值应该是我们最终的正则化参数。在下图中,比如说,j-cv(3)是最小的。最终的正则化参数λ将是 0.04。在这张图表中,我试图列出所有的步骤。

5.最后,检查正则化参数和θ值,找出它在测试数据集上表现如何。
我希望这是有帮助的。
推荐阅读:
如何提高机器学习的数据质量?
建立更好模型的秘密。

弗兰基·查马基在 Unsplash 上拍摄的照片
The ultimate goal of every data scientist or Machine Learning evangelist is to create a better model with higher predictive accuracy. However, in the pursuit of fine-tuning hyperparameters or improving modeling algorithms, data might actually be the culprit. There is a famous Chinese saying “工欲善其事,必先利其器” which literally translates to — To do a good job, an artisan needs the best tools. So if the data are generally of poor quality, regardless of how good a Machine Learning model is, the results will always be subpar at best.
为什么数据准备如此重要?

由 Austin Distel 在 Unsplash 上拍摄的照片
众所周知,数据分析过程中的数据准备是一项重要但不重要的任务,超过一半的数据科学家认为清理和组织数据是他们工作中最不愉快的部分。
数据科学家和专家的多项调查确实证实了常见的 80/20 比喻——即 80%的时间陷入准备数据的琐碎家务中,从收集、清理到发现数据的洞察力(数据争论或咀嚼);只留下 20%用于建模和构建算法的实际分析工作。
因此,数据分析过程的致命弱点实际上是花费在数据准备上的不合理的时间。对于数据科学家来说,这可能是构建有意义模型的生产力的一大障碍。对于企业来说,这可能是对资源的巨大打击,因为对数据分析的投资只能看到剩余五分之一的分配专用于最初的意图。

听说过 GIGO(垃圾进,垃圾出)?这正是这里发生的事情。数据科学家带着一组给定的数据完成一项任务,并期望构建最佳模型来实现任务的目标。但是在任务进行到一半时,他意识到无论模型有多好,他都不可能获得更好的结果。经过反复研究,他发现数据质量存在问题,并开始清理数据,使其“干净可用”。当数据最终再次拟合时,日期线正在慢慢到来,资源开始枯竭,他只剩下有限的时间来构建和完善他被雇佣的实际模型。
这类似于产品召回。当发现已经上市的产品存在缺陷时,往往为时已晚,不得不召回产品以确保消费者的公共安全。在大多数情况下,缺陷是供应链中使用的组件或成分的质量控制疏忽的结果。例如,笔记本电脑因电池问题被召回,或者巧克力因乳制品污染被召回。无论是物理产品还是数字产品,我们在这里看到的惊人的相似之处是,总是原材料受到指责。
但是如果数据质量是个问题,为什么不直接改善它呢?
要回答这个问题,我们首先要了解什么是数据质量。
数据质量的定义有两个方面。第一,独立质量作为基于固有特性和特征的呈现的数据视图和真实世界中的相同数据之间的一致性的度量;第二,依赖于的应用的质量——衡量数据是否符合用户预期目的的需求。
假设你是一名大学招聘人员,试图招聘应届毕业生从事初级工作。你有一份相当准确的联系人名单,但当你浏览名单时,你意识到大多数联系人都是 50 岁以上的人,认为你不适合接近他们。通过应用这个定义,这个场景只实现了完整定义的前半部分——这个列表具有准确性,并且包含了良好的数据。但是它不符合第二个标准——无论多么精确的数据都不适合应用程序。
在本例中,准确性是我们用来评估数据内在质量的维度。还有更多不同的维度。为了让您了解同行评审文献中通常研究哪些维度,在研究了涉及 32 个维度的 15 种不同的数据质量评估方法后,这里有一个直方图显示了前 6 个维度。

数据质量评估的系统方法

如果你没有计划,你就计划失败。没有良好的规划,一个好的系统方法是不可能成功的。要有一个好的计划,你需要对业务有一个彻底的理解,尤其是在与数据质量相关的问题上。在前面的例子中,应该意识到联系人列表虽然是正确的,但是具有数据质量问题,不适用于实现所分配任务的目标。
问题明确后,需要调查的数据质量维度应该是定义的。这可以使用经验方法来完成,如在利益相关者中进行调查,以找出哪个维度对数据质量问题最重要。
一套评估步骤也应随之进行。设计一种实现方式,以便这些步骤可以将基于所选维度的评估映射到实际数据。例如,以下五项要求可用作示例:
[1]时间范围—决定收集调查数据的时间间隔。
[2]定义—定义如何区分好数据和坏数据的标准。
[3]汇总—如何量化评估数据。
[4]可解释性——评估数据的数学表达式。
[5]阈值—选择一个分界点来评估结果。
一旦评估方法到位,就该动手进行实际评估了。在评估之后,可以建立一个报告机制来评估结果。如果数据质量令人满意,则数据适合于进一步分析。否则,必须修改数据,并可能再次收集数据。下图中可以看到一个例子。

结论
对于所有的数据质量问题,没有一个放之四海而皆准的解决方案,正如上面概述的定义,数据质量方面有一半是高度主观的。然而,在数据质量评估的过程中,我们总是可以使用系统的方法来评估和评价数据质量。虽然这种方法很大程度上是客观的,并且相对通用,但是仍然需要一些领域知识。例如在数据质量维度的选择中。对于用例 A,数据的准确性和完整性可能是数据的关键方面,但是对于用例 B,这些方面可能不太重要。
如何用 WSL2 提升 Docker
WSL 为 docker 带来了显著的性能提升,但是在开启之前需要知道一些事情
Docker 被认为是建立本地开发环境的领先解决方案。由于 docker-compose 文件的简单性,您可以为每个项目创建一个独立的环境,它反映了生产环境的相同配置。
此外,该解决方案使开发独立于您拥有的操作系统。在 poo word 中,即使你的容器将是 Linux 镜像,你也可以使用 Windows 或 Mac 进行开发。
无论如何,在某些设置中,性能可能会降低,从而影响生产率。
从上一次 Docker 更新开始,Docker 工程师增加了使用 WSL2 技术提升性能的可能性,在所有平台上提供相同的开发体验,包括 windows。
本文解释了为什么我们在 Windows 上可能会有性能问题,以及如何正确安装 WSL2 来提高性能。

由 Unsplash 上的 CHUTTERSNAP 拍摄
WSL2 如何改变 Docker
docker 如何工作
Docker 是领先的容器解决方案,自 2013 年开始使用。我不想花太多时间讨论 docker 是什么。如果您在这里,可能已经使用过它,所以我将花一些时间来介绍 WSL2 克服的限制。无论如何,如果你想了解更多关于 docker 的信息,你可以阅读这篇文章,我试图用简单的语言解释“到底是什么 docker ”。
关于 Docker 要注意的中心部分是它在 windows 下是如何工作的。因为它共享操作系统,而不是硬件,所以你不能在 Windows 上有任何基于 Linux 的容器。那就是。但是每个人都在 windows 上使用 Linux 容器,这怎么可能呢?Docker 工程师用一招解决了这个问题。我们不能在 windows 上有一个 Linux 容器,但是我们可以通过使用一个管理程序把 Linux 放在 Windows 机器上。因此,解决方案很快被创造出来。Docker Desktop for windows 使用虚拟机管理程序(通常是 Microsoft HyperV)来运行虚拟机,它将 VM OS 共享给 Docker 容器。事情就是这样运作的,我试图用图表来解释。

docker 开发如何在“Linux over Windows”模式下工作。作者是❤️from。
这种架构的主要问题是:
- 资源限制。虽然 docker 是为共享操作系统而设计的,但管理程序仍然使用硬件,你需要为它分配资源。这导致了我们在使用虚拟机时遇到的同样的性能问题。
- 磁盘开销。容器映像位于虚拟机内部,它将文件存储在卷中,但您可能希望从 Windows 环境中共享文件夹,尤其是在开发时。这是图中的红色箭头往返及其影响性能。
作为在 Windows 上运行 Linux 容器的 Docker,如果主要在开发环境中使用,性能不是很重要。事实上,大多数解决方案一次处理一个请求只需要很少的资源。无论如何,有些情况下这种性能很重要。
具有应用程序状态的平台,其中可执行文件被编译和加载一次,不提供太多关于磁盘延迟的信息。发展中。net 或 java,你只需按下播放按钮,等一分钟,然后你的应用程序准备好进行测试,所有编译的源代码或多或少都在 RAM 中,你不需要给硬盘增加压力。
相反,对于 PHP 或 Python 应用程序,情况就不同了。由于它们没有任何应用程序状态,每个请求都是独立解释的,所以每次都需要扫描并加载所有需要的文件。这意味着大量的文件读取,因此大量的文件会增加您的延迟。
对于这个系统,在 windows 上使用体积映射是非常昂贵的,并且会降低性能。您可以使用挂载到 Linux 操作系统的卷,但是在这种情况下,从 Windows UI 进行编辑会有问题。
这就是为什么在大多数情况下,我们接受了最慢的性能(大多数情况下对于开发环境来说是可以接受的),或者在其他情况下,我们被迫切换到 Linux,抵消了使用 Docker 获得多操作系统可用性的优势。
什么是 WSL2
WSL (Windows Subsystem for Linux)是一个兼容层,用于在 Windows 上本地运行 Linux 二进制可执行文件。它从 Windows 10 开始工作,让你在不使用虚拟机的情况下在 Windows 内部使用 Linux。自 2019 年 6 月以来,Windows 10 提供了 WSL 的增强版本(WSL 2)。此更新通过一组优化的 Hyper-V 功能带来了大量性能改进。
简而言之,你现在在你的 Windows 机器中有一个比运行虚拟机更快的 Linux 发行版。
好消息是 Docker 桌面支持它,它可以提升你的容器。
WSL2 如何改变 Docker
使用 WLS2 和 Docker 组合,我们几乎跳过了一个步骤。
windows 和 Linux 文件系统是相互共享的:您可以从 Windows 访问共享驱动器\WSL$\看到 Linux,或者从/mtn/c 看到 Windows)
docker 容器使用 Linux WSL,没有任何资源限制,性能更好。

Docker 如何使用 WSL2 工作。作者和❤️一起做的
在这种情况下,有巨大的坏消息。共享 windows 文件夹仍然是可能的,但是比标准情况下的性能更差。这在 Java 或者。或者说是一个可以忍受的问题,但是却使得 PHP 开发变得不可行。
幸运的是,有一个解决方案将使用 WSL2 的好处和良好的开发体验结合在一起。事实上,Visual Studio 代码能够远程处理 WSL2 子系统,因此您可以执行以下操作:
- 将 WSL2 中的卷保持为常规卷挂载,以便获得文件系统访问的最佳性能。
- 像往常一样,在 Windows 上工作,在 Linux 上编辑代码。
很明显,如果您在双击 IDE 中的某个项目或保存它时会为访问该文件支付更多的费用,这是一个非常好的解决方案。这个问题伴随着大量的文件加载而来,而这并不是一个开发人员同时写十几个时间的代码的情况。
总之,Visual Studio 做得更好。它有一个扩展,可以与他们的远程子系统远程交互,所以您可以将 UI 保留在 Windows 中,但从 Linux 中的实例使用引擎。因此,作为开发人员,您的用户体验是安全的。

如何使用 WSL2 编码?作者和❤️一起做的
好吧,一旦我们理解了如何以及为什么我们可以提高 Docker 的性能,我们只需要遵循一些简单的步骤来完成事情。
我们需要执行几个步骤,但是,从更高的角度来看,我们必须:
- 启用 WSL2 环境
- 配置 IDE 并开始编码。
启用 WSL2 环境
本节解释了如何安装 WSL2 版本,并为使用 Docker 和 WSL2 开始编码做好准备。
启用 WSL
第一步是启用窗口子系统。您必须使用管理权限在命令行上运行它。
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
启用 WSL 虚拟机
第二个命令激活虚拟机平台(是的,WSL 仍然使用 hyper-v)。如果您的电脑没有开启虚拟化功能,您可能需要从 BIOS 进行设置。
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
在第二步之后,欢迎重新启动。
安装 WSL2 更新
安装和配置 WSL2 的最后一步是安装更新。这是一个简单的 MSI 包,所以你可以下载它并双击安装。
文件托管在这里来自微软。
将 WSL2 设置为默认值
一旦我们确定了 WSL2,只需将版本 2 设置为所有子系统的默认版本。
wsl --set-default-version 2
从微软市场安装 ubuntu
要在子系统上运行 Docker,我们需要下载一个 Linux 发行版。既然微软+开源现在已经成为现实,那就有可能直接从微软商店获得。我用的是 Ubunto,它只有 440MB,所以不用担心用完你的磁盘空间。
在这一步之后,您将看到所有的操作系统都作为一个子系统安装。
wsl --list --verbose
你应该在 WSL 2 上看到 docker,docker-data,ubuntu。
激活 Docker WSL2 扩展
在 Docker Desktop 中,只需检查配置并启用 WSL2 特性。它可能需要一些 docker 重启或 PC 重启。
警告:当您从标准模式切换到 WSL2 时,您将需要重新下载所有的图像(您已经位于 Hyper-v VM 中,而不是 WSL2 中)。此外,命名卷中的数据存储在 VM 中,所以您不会在新的 WSL2 机器中找到它们。所以,首先,从 Docker 容器中提取并备份所有相关数据。根据您的本地设置,您可能会丢失数据。
第一步是检查“使用基于 WSL2 的引擎”。

激活 WSL2 功能。作者和❤️一起做的
然后你解锁 WSL 集成面板,在那里你可以激活 Ubuntu 发行版。

激活 ubuntu 发行版。作者和❤️一起做的
安装 VsCode 扩展
最后一步是安装和下载 Visual Studio 插件。通常,您可以通过从网站或 Visual Studio 代码用户界面单击“安装”来完成此操作。

从 Visual Studio 代码扩展安装远程 WSL。作者和❤️一起做的
你也可以在这里找到的扩展。
WSL2 用法
这时候所有的步骤都完成了,就可以开始编码了。当你看到表演时,你会感谢这段时间的!最后的平衡将是仅仅在工作的第一天节省大量的时间。
对于开始编码,您有两种选择:从 WSL 开始或者从 Windwsow 开始。
就我个人而言,我更喜欢第二个,因为它非常独立。
表单命令行:
1.打开 WSL 终端或在 shell 中输入命令“WSL”。由于 Ubunto 是首选的子系统,你将在其中。
2.键入“代码”这将在您的 windows 计算机上打开 Visual Studio 代码。
从用户界面:
1.打开 visual studio 代码。
2.单击 WSL 框(左下角,底部工具栏的绿色按钮)或 F1 + Remore WLS+ New Window

从 Visual Studio 代码扩展安装远程 WSL。作者和❤️一起做的
3.新窗口与 Linux 操作系统连接
从那时起,您就可以使用 Visual Studio 代码做所有您需要的事情了。事实上,您可以从文件树中打开一个终端。终端将位于 WSL 机器内部,如果您运行 docker-compose up,您将激活主机 docker 系统上的容器。您还可以使用 git 工具来处理提交,所以这可能就是您开始编码所需的全部内容。
摘要
出于多种原因,许多开发人员使用 Windows 作为开发环境。这是获得最佳程序兼容性或比 Linux 更好的用户体验的常见选择。其他人使用 Windows 来获得比 Mackbook 更便宜的笔记本。
Docker 有助于在所有操作系统上获得相同的开发体验,但在某些情况下可能会导致 Windows 上的性能问题。
WSL2 提高了性能,但是需要注意将文件放在哪里以及如何创建卷。
一旦完成了这些步骤,您就可以获得与在 Linux 中相同的性能,同时获得舒适的 Windows 用户体验。
免责声明:我不想将 Linux、Windows 和 Mac 支持者之间的分组主义动画化。每个开发人员应该可以自由选择他们喜欢的操作系统,拥有相同的用户体验。这不是 Docker 的主要目的,而是一个令人舒服的副作用。本文的目的只是为喜欢使用 Windows 的人打开一个新的机会,避免被迫更换操作系统。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Daniele Fontani
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
daniele-fontani.medium.com](https://daniele-fontani.medium.com/membership)
参考文献:
如何用机器学习改善假期行程
用这个超棒的策略完善你的旅行计划——省时、省力、省钱!

希腊圣托里尼岛的 Oia【图片由洪晶
【2019 年 10 月,我和我的朋友们正在计划我们在希腊和阿马尔菲的史诗假期。我们计划完美假期行程的方式是使用谷歌地图。我们搜索要去的地方,并在谷歌地图上标出我们可能感兴趣的景点。
对我来说,最大限度地优化我们的假期,尽可能多地去旅行;我有三个问题:
- 我应该在一个地方呆几天?
- 我每天应该去哪些景点/地点?
- 从一个地方到另一个地方的最佳路线是什么?
让我给你看看我的算法为我们提出的路线。它每天都在推荐最佳的旅游地点。

从雅典、圣托里尼和克里特岛开始,然后是阿马尔菲、拉韦洛、索伦托和那不勒斯。
- 从雅典出发,参观雅典卫城和其他历史古迹。这是一个很好的开始!
- 前往圣托里尼岛(Santorini)旅行,这是一个美丽的岛屿,有粉刷一新的房屋和完美的日落。
- 航行到克里特岛,进行一生一次的公路旅行冒险,探索隐蔽的角落,品尝最好的希腊美食。
- 飞往意大利,前往阿马尔菲和拉韦洛,那里的梯田沿着悬崖与最壮观的海岸风景融为一体。
- 前往索伦托和那不勒斯,尽情享用最好的意大利面、披萨、柠檬酒和冰淇淋。
很棒的假期行程,不是吗?!这个位置序列完全由算法生成。你想在下一个假期试试这个吗?我已经为你准备好了的代码。
在这篇文章中,我将向你展示如何在你的下一个假期中做到这一点。

在前往拉韦洛的徒步旅行中,阿特拉尼的日出景色
准备
P 在谷歌地图上的位置。访问我的地图,为您的下一个度假目的地创建新地图。寻找你想去的地方。景点?主题公园?餐馆?通过搜索这些地方并用标记填满您的地图,然后“添加到地图”。继续这样做,直到你在地图上找到所有你想去的地方。我会等你。


E 导出地图并上传至 Colab。经过研究和确定要去的地方的艰苦工作后,我们准备导出地图。选择“出口到 KML/KMZ ”,记得勾选“出口为 KML ”。你将下载一个 KML 文件。



接下来进入 Colab ,一个由 Google 维护的优秀笔记本环境。打开左边的文件抽屉,上传你下载的 KML 文件。稍后我们将加载这个带有 BeautifulSoup 的 KML 文件。
Get Google API 键。我们将在谷歌地图上绘制标记,所以我们需要一个 API 键。你可以从开发者 API 页面获取。按照说明操作,您应该会得到一个如下所示的密钥:
ZIzkSyDwhp5B0_3eLYmPLY_tH1$Is@fAkeAp1keY
Psst:这是一个假的 API 密匙🙃

意大利阿马尔菲【图片来自英
Colab 上的代码演练
你可以获取代码并在 Colab 上运行它。
D定义参数。让我们为你期待已久的假期设置 API 键、KML 文件名和期望天数。
API 键用于在 Colab 上绘制交互式谷歌地图。KML 文件包含您在谷歌地图上标注的名胜。最后,算法会根据你设定的天数来决定你每天应该去哪里。

在 Colab 上定义参数代码
L oad 数据。 KML 文件是 XML,我们可以用 BeautifulSoup 解析它。我们感兴趣的地方在“地标标签内,所以我们将从每个“地标”中提取“名称”和“坐标”。
让我们看看数据框中是否包含我们计划去的地方。
G 按接近程度分组位置。利用数据帧中每个位置的坐标,我们可以将它们分组。如果两个地方彼此靠近,它们将在同一个集群中。聚类有几种方法,我将介绍 K-Means、谱和均值漂移聚类。
K-Means 聚类 旨在将数据点划分成指定数量的簇。其中每个数据点属于它最接近的聚类。
谱聚类 在单个聚类的结构高度非凸的时候很有用。它先执行降维,然后在更少的维度上进行聚类。
均值漂移聚类 是一种基于质心的算法,旨在发现平滑密度的数据点中的斑点。它的工作原理是将候选质心更新为区域内点的平均值。
我最后用的是哪一个?K-表示。因为它很简单,也是最常见的一种。但是你可以随意选择你喜欢的,这三个我都试过了。你也可以开发自己的并与我分享。
P在谷歌地图上拍吧!现在,我们准备在谷歌地图上绘制出 12 个主要区域(因为我们计划度假 12 天)。如果你在 Colab 上运行这个,这个地图是交互式的。



左图:雅典。中间:圣托里尼岛和克里特岛。右图:阿马尔菲和那不勒斯。
聚类算法在按邻近程度分组位置方面做得很好。接下来,我对找出从一个地区到另一个地区的最佳路线感兴趣。
找到每个集群的中间。我们可以用熊猫函数:places.groupby(‘cluster’).mean()来做到这一点。这将为我们提供一个数据框架,其中每一行代表一组位置,以及经度和纬度。
F查找集群之间的距离。我们可以使用每个聚类的中点,用 Scipy cdist函数计算聚类之间的距离。
这将为我们提供一个数据框架,显示每个星团与其他星团之间的距离。让我们称这个矩阵为距离矩阵,其中每个值代表两个簇之间的距离。较小的值意味着两个集群彼此更接近。
找到最短的路线。有了这个距离矩阵,我们就可以找到最短的路径了。下面是计算最短路径的代码。
最初,我使用的是旅行推销员算法,但是我发现代码的有点矫枉过正和过于复杂,所以我自己写了。这是基于最短路径算法的结果,一个簇到一个簇的序列。
2 -> 1 -> 6 -> 10 -> 9 -> 3 -> 11 -> 7 -> 4 -> 5 -> 8 -> 0
S 如何推荐行程。现在我们准备在谷歌地图上标出我们的标记。它推荐我们从雅典、圣托里尼和克里特出发。然后到阿马尔菲、拉韦洛、索伦托和那不勒斯。如果你在 Colab 上运行这个,这个地图是交互式的。





从雅典、圣托里尼岛开始,然后是克里特岛。去阿马尔菲,拉韦洛,索伦托和那不勒斯。
如果你喜欢看表格形式的,你可以用熊猫来展示。
pd.set_option(‘display.max_rows’, None)
places.sort_values(by=[‘days’])

希腊圣托里尼岛的 Oia【照片由 Clement Lim 拍摄】
有哪些可以改进的地方?
该算法不考虑一个区域中景点的数量。例如,我们绝对不想在一天之内探索雅典的一切!仅仅在圣托里尼呆一天是不够的。
我们需要一种聚类算法来限制一个聚类中的最大点数。使得每个集群应该具有大约相同数量的位置。如果一个集群变得过于密集,它会将该集群分成两个或更多个集群。如果你有,一定要和我分享。🤝
但是如果你在一个城市旅行,结果可能是有希望的。这是为纽约市生成的路线。随意下载我的行程自己试试。

纽约市

纽约市的日落,从洛克斐勒中心的岩石顶端[照片由洪晶 ]
资源
你想在你的下一个假期尝试这个吗?这里是代码。不客气。😉
如果你喜欢这件作品,你可能也会喜欢这件。
用电影海报确定电影的类型和收益
towardsdatascience.com](/predict-movie-earnings-with-posters-786e9fd82bdc) [## 数据科学家:21 世纪最肮脏的工作
40%的吸尘器,40%的看门人,20%的算命师。
towardsdatascience.com](/data-scientist-the-dirtiest-job-of-the-21st-century-7f0c8215e845)
不确定去希腊或者阿马尔菲哪里玩?继续使用我们的希腊 x 阿马尔菲旅程。
不确定在纽约市去哪里玩?
感谢阅读。😃
希望你能像我准备这篇文章时一样喜欢它。
如何提高体育博彩赔率 Python 中的分步指南
我用数据科学策略在体育上赌了 20,000 美元。

来源:突发
W 当我还是一名学习统计学的学生时,我尝试过用数据科学技术进行体育博彩。通过这样做,我在那一年从体育博彩中获利 20,000 美元。
体育博彩可能不仅仅是利用你的直觉。通过增加适当的数据分析和预测模型,你可以有更大的胜算。
本指南将向你展示使用 Python 的一步一步的算法,以及更多的技巧。
让我们开始吧!
来源:giphy.com
传统方法
首先,让我们回顾一下体育网站上的传统统计数据。
想象今天是本赛季的最后一场比赛。A 队要面对 c 队了,你觉得哪个队夺冠的胜算更大?你会把赌注压在谁身上?
以下是甲队和丙队的季后赛记录。

像 NHL.com 这样的体育网站经常提供这样的统计数据:

W —总赢数,L —总输数,T —总平手数
传统的球队排名方法是看输赢百分比,也就是赢的比赛占总比赛的百分比。在这种情况下,A 队将与 C 队打成平手,因为他们都有相同的 50%的胜率。
但当你仔细观察比赛数据时,C 队击败 B 队(7–0)的次数多于 A 队击败 B 队(1–0)的次数。所以 C 队这次打败 A 队的几率应该比较大。
当游戏数量很少时,研究每个结果是很容易的。但是当有很多球队和比赛的时候,我们需要一个系统的方法来分析数据。
我们如何整合过去比赛中的进球差异等细节,以获得更好的球队排名?
如果决赛在 A 队的主场进行呢?主队通常比客队受益。有了这条额外的信息,你觉得现在哪个队胜算更大?
我们如何在评估游戏时融入主场优势?
统计方法—逐步
为了回答上面的问题,我们使用 NHL 数据(从曲棍球参考网站下载)建立了一个统计模型。你也可以为其他运动进行修改。

来源:曲棍球参考
用于模拟评级的算法被称为调整后的正/负评级系统。你可以在这里阅读系统的详细描述。或者按照下面的三个步骤来实现它。
步骤#1:加载数据
- 下载 CSV 格式的数据
该数据有 640 行,包括 2019 年 10 月 2 日至 2020 年 1 月 3 日之间的比赛结果。它有五个变量— 日期、访问者、访问者 _ 目标、住宅和住宅 _ 目标。
例如,下面的行记录了 2019 年 12 月 6 日的比赛。蒙特利尔加拿大人队(客队)和纽约流浪者队(主队)比赛,最终比分是 2 比 1。

- 将数据读入 Python
步骤# 2:转换数据
- 添加新功能
首先,我们创建 goal_difference 变量作为 home_goals 和 visitor_goals 之间的差异。当主队获胜时大于 0,当主队失败时小于 0,当两队打平时为 0。
我们还增加了两个指标 home_win 和 home_loss 来考虑主场优势对球队的影响。
数据看起来像这样:

- 转换数据
接下来,我们创建两个虚拟变量矩阵 df_visitor 和 df_home 来记录客队和主队。
df_visitor 的头是这样的:

这是一个矩阵,以球队名称为列,每场比赛的客队虚拟变量为行。行 0 具有值为 1 的列 Vancouver Canucks 和值为 0 的其他列。它显示了在这场比赛中客队是温哥华加人队。
df_home 矩阵具有类似的结构,但是指示相应游戏中的主队。
接下来,我们进一步转换这两个矩阵,以成为最终的数据集。
- 合并之前的结果以获得最终数据集
我们从 df_home 中减去 df_visitor,得到最终的数据集叫做 df_model 。df_model 的每一行都显示客队的值为-1,而主队的值为 1。
此外,我们从原始数据集 df 添加回变量 goal_difference。
最终数据集 df_model 如下所示:

例如,第 4 行说阿纳海姆鸭队(主队)对阵亚利桑那狼队(客队)。而阿纳海姆鸭队(主队)以一球的优势赢得了比赛。
通过这种方式,最终数据集包括关于目标差异和主场优势因素的信息。
现在我们准备将数据输入到模型中!
步骤# 3:建立预测模型
我们用岭回归模型作为演示。
这是一个线性回归模型,增加了一项作为惩罚。由于自变量之间的多重共线性,传统的线性回归不能产生稳定的结果。
- 拟合岭回归模型
我们使用 goal_difference 特性作为目标变量。
- 显示结果
让我们打印模型的系数。
结果如下:

每个团队的这些系数可以被认为是对每个团队的评级。
系数/等级越高,队伍越强。
根据这个模型,科罗拉多雪崩队是收视率最高的最佳球队。我最喜欢的多伦多枫叶队也被模特评为优秀团队!
来源:giphy.com
你做到了!
也就是说,在将这种算法应用于体育博彩之前,让我们考虑几件其他事情。
这种方法与传统方法相比如何?
统计方法似乎比传统方法更复杂。但是性能如何比较?
让我们看看另外三种常规方法:
方法#1:输赢百分比
正如我们在本文前面部分所讨论的,这是一个经常出现在体育网站上的基本统计数据。对于每个特定的团队,输赢百分比=赢的游戏总数/玩的游戏总数。
方法二:主队获胜
正如这个方法的名字所暗示的,它是一个总是选择主队获胜的赌注。
方法 3:利用主场优势净胜球
这是一个复杂的方法,包含了关于净胜球和主场优势的信息。
然而,当提出团队评级时,它并不考虑团队对手的实力。岭回归的方法会考虑这一点,因为它把所有的球队和所有的比赛放在一起看。
*** 如果你讨厌公式,跳过这些 ***
首先,对于每个特定的团队、,我们计算:
球队每场净胜球=(球队进球-球队允许进球)/(球队出场场次)
接下来,我们使用所有过去的比赛结果来获得一个关于该队所有主场优势的统计数据:
主场优势净胜球=(所有主队进球-所有客队进球)/(所有球队比赛场次)
有了这些统计数据,我们可以预测主队或客队是否会赢得某场比赛。
再次使用开头的例子。A 队(主队)将和 C 队(客队)比赛。我们使用下面的统计数据来预测结果:
Margin =**A 队场均净胜球——C 队场均净胜球+主场优势净胜球
如果 Margin > 0,那么我们赌 A 队(主队)赢。如果余量< 0, we choose Team C (the visiting team).
To compare these methods, we use 交叉验证进行评估。
我们的统计模型是赢家!
它预测曲棍球比赛结果的准确率高达 60%!

但是,在赛季的初始阶段,最好依靠其他指标。因为模型的结果只会随着赛季的进行(当有更多的数据可用时)而改进,变得比其他方法更好。
还有哪些可以进一步改善结果的技巧?
当然,我们的预测结果仍有改进的余地。
提示 1:考虑团队最近几天的日程安排
考虑到球队最近的赛程,你可以增加一些变数。在过去的几天里,球队有没有打比赛或者休息?团队是否经常外出旅行?
技巧 2:权衡游戏结果
球队的情况总是随着赛季的变化而变化。所以最近的比赛应该比早期的比赛更有知识性。为此增加一个指标会有所帮助。
技巧 3:使用不同的模型
我们以岭回归模型为例。然而,为了获得更好的结果,您可以测试并结合其他机器学习/统计模型,如神经网络、 GBM 。
技巧 4:加入你自己的判断
这些模型不能包含所有的信息。作为一个有经验的体育迷,你必须有宝贵的知识。结合统计方法和你的经验对于做出更好的预测是至关重要的。
体育博彩是一种在娱乐的同时练习数据科学技能的绝佳方式。
在芯片掉落前拟合模型!
祝大家好运!
来源:giphy.com
感谢您的阅读。我希望你发现这个体育博彩指南有帮助。
现在我想听听你要说什么。请随时在下面留下你的评论。
更多来自 Lianne & Justin 的数据科学文章:
应用 Elo 评级系统预测 UFC 246
towardsdatascience.com](/spoiler-alert-conor-mcgregor-vs-cowboy-who-will-win-7c3eee6389b0) [## 根据模拟,30 岁退休需要多少钱
很多人年纪轻轻就有辞掉工作的梦想,活在世上没有经济上的牵挂。怎么…
towardsdatascience.com](/how-much-do-you-need-to-retire-at-age-30-based-on-simulation-424fa9e0922b) [## 如何像老板一样在 Python 中操纵日期和时间
常用的日期时间函数及示例
towardsdatascience.com](/how-to-manipulate-date-and-time-in-python-like-a-boss-ddea677c6a4d)
如何通过采用 Levenshtein 距离的后处理来提高机器学习模型的性能
用作度量的 Levenshtein 距离通过验证条目中的每个命名实体来提高 NLP 模型的准确性
我目前正在开发一个 NLP 解决方案,用于匹配不同领域(广播、电视、音乐会)的音乐使用报告,以便正确分配音乐创作者的版税。对已经在音乐作品和版权所有者的数据库中使用的一段音乐的正确匹配的搜索是通过对文本进行矢量化并对最相似的向量进行向量搜索来完成的。(我可能稍后会写这部分解决方案)
矢量搜索解决方案做得很好,找到了由矢量化定义的最相似的条目。然而,这个用例也有一些非常具体的需求需要满足,以确保版税分配给正确的个人。这些要求中的一些可以通过简单的逻辑将报告与匹配的音乐作品进行比较来检查。在匹配可以被批准之前,必须进行检查,例如计算权利所有者的数量是否相同,出版商是否相同。此外,我们必须验证每个权利所有者都是高度可能的匹配。这比听起来要复杂一点,因为我们无法控制这些名字在数据集中的书写方式。可以先写姓,后写姓,或者相反的顺序。可以有缩写,昵称,拼写错误和错别字。如果我们需要一个字对一个字的精确匹配,我们将丢弃大部分建议的匹配,这些匹配实际上是正确的。“弗雷德里克·约翰逊”在报告中可能会拼成“约翰逊·弗雷德”。所以直接检查相同的文本是行不通的。此外,单词袋的比较也不会令人满意,因为单词本身在许多情况下并不相同。
那么,我们该怎么做呢?检查的要求是相似的名字应该被批准,而太不相似的名字应该被标记为不是同一个人,并且报告的音乐作品和登记的作品之间的匹配不应该被批准。

潜在匹配的示例,所有这些条目都有一个共同的标题。只有 1 和 2 可作为匹配被接受,因为作曲者和出版商是相同的,即使作曲者姓名的拼写不同。3 和 4 不应该被批准,因为它们的出版商是不同的,即使作曲者是相同的。
字符串之间差异的度量是编辑距离或 Levenshtein 距离(以苏联数学家 Vladimir Levenshtein 的名字命名)。简而言之,编辑距离是我们必须对一个字符串进行多少次更改才能将其转换为我们要比较的字符串的度量。举例来说," Frederic "和" Fred "之间的差别是 4,因为我们可以把" Frederic "改成" Fred ",去掉字母" e "、" r "、" I "和" c "。

总共需要 4 次编辑才能将“骆驼”变成“甜瓜”
使用 Levenshtein 距离作为度量并为 Levenshtein 距离设置阈值的一个挑战是,它的值只对差异的数量敏感,而对被比较的字符串的长度不敏感。例如,“波诺”和“邦·乔维”可以说是非常糟糕的匹配,具有 4 的编辑距离,而“埃尔顿·赫拉克勒斯·约翰爵士”和“埃尔顿·约翰爵士”具有 9 的编辑距离。直接使用 Levenshtein 距离进行比较显然不会有很好的效果。然而,如果我们通过除以两个字符串中最长的一个来“标准化”这一点,我们将获得一个相似性度量,这对于比较来说要方便得多。
当比较名字时,我们必须考虑到包含名字的字符串中单词的顺序可以是任意的,因为有不同的约定。为了避免将“John Smith”判断为与“Smith,John”完全不同的名字,我们需要对每个字符串中的单词进行排序,以相同的方式进行比较。最简单的方法是按字母顺序排列字符串中的标记。按字母顺序排列标记后,不同的约定将不再是比较的问题。
在可用的数据中,报告名称的顺序是任意的,那么我们如何知道应该比较哪些字符串呢?事实上,我们永远无法确切知道,但这个问题的解决是相当顺利的。如果我们计算报道的姓名和来自匹配作品的姓名之间的所有可能匹配之间的 Levenshtein 距离,我们可以建立匹配矩阵。

从这里开始,很容易找到最佳匹配=最高分,然后通过屏蔽最高分的行和列从比较中删除匹配的名称。重复,直到矩阵中只剩下一个分数。这是示例中得分最低的字符串比较,因为我们已经确保从要比较的名称中选择了可能的最佳匹配。这将是我们需要考虑的分数,以决定比赛是否可以通过。

消除与集合中的最佳匹配相对应的分数的步骤,直到我们剩下一个活动分数来评估。最佳匹配以绿色突出显示。
现在我们只剩下一个数字要评估,以决定是否可以批准这个匹配,所以最后要决定的是如何设置阈值。由于这是针对特定问题的定制解决方案,因此我从系统用户那里获得了如下要求:
- 不接受虚假批准
- 应该允许省略中间名
- 应该允许其中一个名称的缩写
当然,在某个地方会有一个折衷,但是与用户讨论后处理步骤给了我一些非常重要的理解。因为我们的目标是自动化,所以不批准任何实际上不匹配的东西是最重要的。如果我们错过了一些可以被认可的比赛,这不是什么大问题。如果我们对所做的匹配有很高的信心,我们可以建立对系统的信任,并通过系统自动传递所有批准的匹配,从而节省大量劳动力。
为了给 Levenshtein 测量找到一个好的阈值,我收集了一个小样本的名字和它们的替代拼写,缺少中间名和缩写,并计算了它们的归一化 Levenshtein 距离,并使用这些来设置一个合理的阈值。我发现对于我的情况,0.5 是一个很好的阈值,其中一个缺少的名字或一个缩写的名字通常会允许匹配被批准,但是如果,例如,我们在相同的名字中有一个缺少的中间名和一个缩写,匹配通常不会被批准。
当归一化时,Levenshtein 距离可以有效地用于验证机器学习结果中列出的专有名称之间的匹配。对每个列出的名称进行额外的验证,即使是一个无序的列表,也能增强对结果的信心,实现查找过程的自动化。
关于我
我是梅塔咨询公司的数据科学家。专注于应用数据科学、人工智能,尤其是 NLP。
优步的机器学习让我失望
实时对抗优步黑客&给优步的建议

克林特·帕特森在 Unsplash 上拍摄的照片
TL;博士——在 6 个多小时里,我看着有人入侵了我的优步账户,并实时消费了 1000 多美元。优步的先进和著名的技术和 ML 解决方案在活动期间和之后都失败了。在这篇文章中,我回顾了我的经历,并提供了三组浅显的建议。对于数据科学家来说,这是一个很好的提醒:当遇到混乱的世界时,ML 可能会失败。
目录:
- 语境
- 如何修复全渠道客服
- 如何简化混合欺诈检测工作流程和算法
- 如何保护多目标和基于图的推荐系统
免责声明:所有观点都是我的,不代表我雇主的观点。
喜欢读什么? 跟我上 中LinkedIn,以及Twitter。**
从天堂到地狱的短暂旅程
尽管是新冠肺炎,但和许多人一样,我和我的狗决定冒险享受 2020 年 5 月 3 日的天气。多伦多海滨是一个天堂。

遛狗,作者照片
**
多伦多海滨的早晨和下午,作者自己的照片
当我们走向水边时,我的电话响了。是 UberEat 的通知。看来我妻子晚餐点了披萨。虽然比萨饼不是我们最喜欢的菜,但我太沉迷于对海滨的怀旧记忆了。
我把手机塞进口袋,开始带着我的狗向水边慢跑。与此同时,我的电话一直在响。
十分钟后,我再次看手机时陷入了地狱。时间停止了:笑声减弱了;太阳的温暖冻结了;我的狗消失了;短暂的自由消失了。
不可能的。有人黑了我的优步账户,即使有双因素验证。最糟糕(也是最有趣)的部分:我可以像观看直播一样观看。

作者手机截图,拍摄于 2020 年 5 月 3 日
困惑,害怕,孤独。一个新的通知不断传来:“杰森说谢谢你的提示!”
我发出了无声的沮丧和求助的呼喊。
吉菲
我深深吸了一口春天的新鲜空气。沉稳。我应该修改我的密码并注销黑客。预料到我歇斯底里的干扰,黑客改变了我的密码,把我锁在外面。我又慌了。
崩溃了。看起来唯一的选择是联系优步的客户服务。
与此同时,每份超过 100 美元的新 UberEat 订单的通知以及来自餐馆和司机的感谢不断涌入——我无法停止想象黑客嘲笑的脸。
问题和建议
我毫不怀疑优步(或万事达)会退款,他们最终也退款了。然而,这个过程既漫长又令人困惑。后果令人非常尴尬。
总的来说,考虑到优步的技术进步,这是一个令人不快的惊喜。
回想起来,我看到了三个问题:
- 优步的客户服务不够无缝和“智能”。
- 优步的欺诈检测解决方案太慢了。
- 优步的推荐引擎并不那么感同身受。
让我强调这些问题是有规律的,但是有爱心的,用户和作为有爱心的数据的极客 T21 提供一些建议。
1.客户服务
出现问题时,客户服务是第一联系点。这是所有公司中最关键、最复杂、最具挑战性的运营——优步也不例外。
A .手机 app 上没有客服。

UberEat app 截图,拍摄于 2020 年 5 月 10 日
在优步的帮助下很难找到合适的支持者。

优步求助网站截图,拍摄于 2020 年 5 月 10 日
来自其他渠道的缓慢且不连续的响应。

作者于 2020 年 5 月 10 日在脸书 Messager 上与 UberEat 的聊天记录截图
与此同时,我焦急地阅读了优步帮助上的选项,并在“我有一个未知的费用”下提交了一个请求这似乎是最相关的。
D .令人困惑的电子邮件支持。

邮件往来截图,作者拍摄于 2020 年 5 月 10 日
对客户服务的建议
以下是我改善优步客服体验的实用建议。
- 在 app 登陆页面添加客服移动界面。用户不需要登录就可以使用这个特性。
- 改进优步帮助上的内容标记。“黑客”或“欺诈”可能是低频搜索词,但它们具有紧迫性和巨大的财务影响。要求用户手动检查每个选项似乎不合理。
- (或许)连接通道。共享代表从非网络渠道对集中式用户信息和案例管理系统的访问。我不是 100%确定为什么脸书·梅桑格的优步代表找不到我的资料,并且花了很长时间才回复。我猜脸书频道不打算解决这样的问题。因此,它缺乏系统集成、培训和能力。
- 改进模板化邮件回复。以下是模板回复,以确认我报告的欺诈交易确实属于我的帐户。等等。什么?这有什么帮助?

回复截图,捕捉于 2020 年 5 月 10 日
我又提出了三个请求,又花了七个小时才弄明白我需要做些什么不同:我必须用优步文件上的同一个电子邮件地址提交请求和回复。优步本可以发送更明确的电子邮件指示或使用个人回复。如果设计不当,自动化会以牺牲用户的时间为代价来节省优步的时间。
2.欺诈检测系统
我长期关注优步工程博客。不断的技术突破和创新概念总是令人惊叹。
根据优步的博客,该公司收集 GPS 数据,并使用最先进的混合工作流、行为分析和深度学习模型(行为特征被编码到 LSTM 模型中)。
注 :这是针对优步乘车的解决方案,而不是针对 UberEats。我假设解决方案的许多组件是共享的。

基于 GPS 的欺骗检测,优步工程博客

优步的欺诈检测工作流程,优步工程博客

行为分析,优步工程博客

LSTM 编码和模型,优步工程博客
然而,即使没有我的干预,一家低技术含量的加拿大银行也能在一半的时间里发现并纠正欺诈行为。我不能停下来想为什么。是不是工程过度了?
对优步欺诈检测的建议
除了花哨的工程设计,我们都应该同意一件事:检测和应对欺诈应该快速有效。否则,对所有参与者来说成本都更高(例如,用户的时间和信心、公司的运营努力和声誉)。
我对优步的建议是保持简单和愚蠢(接吻原则)并牢记 80/20 原则 。
根据我为低技术银行设计和部署欺诈引擎的经验,基于规则的引擎往往比复杂的洗钱解决方案更好用,原因有二:a)简单的解决方案往往更快、更容易更新(KISS ); b)一小组规则通常可以捕获大多数欺诈案例(80/20 原则)
一些欺诈者可能很老练。因此,必须有一个更新规则的过程。优步可以通过每月或每季度回顾遗漏的案例来做到这一点。然后,团队可以相应地更新规则。
看看我的案例,下面是我对一个基于规则的解决方案的谦逊和天真的建议,它分析了优步秩序的三个基本方面。

作者的分析
订单位置有意义吗?
- 订单是否送达用户所在城市?
- 用户经常出差吗?
- 用户不在的时候会点 UberEat 吗?
我住在多伦多,我去过几次旅行,但是我从来没有在我主要居住地以外的城市点过 UberEat。黑客发出的所有命令都在我的家乡城市之外。所以,不,我的位置说不通。
用户偏好背景下的食物有意义吗?
- 用户是探索型的吗?(例如,不同菜肴的数量、相对于其他用户的排名等。)
- 食物是否符合用户的喜好?(例如,菜肴、平均订单规模等。)
举例:我不是探索型的;我通常在多伦多我家附近的 4-6 家餐馆点日本和韩国食物。我的平均订单大小约为 30-40 加元,黑客的平均订单大小为 108 美元。所以,不,食物细节说不通。
用户是否在做一些奇怪的事情?
- 用户是否在短时间内下单过多?(查看用户的平均订购频率)
- 用户是否在可疑地点下单?(检查到用户主要城市的餐馆和送货地点、最后 X 个订单中不同城市的数量等。)
例如:我一个月通常订购 1-2 次,黑客在 5 个小时内订购了 11 次(每月约 1650 个订单)。黑客从至少 5 个美国城市的餐馆点餐,这些城市相距数千英里。所以,是的,用户显然在做一些奇怪的事情。
最后,这个分析能在近实时的时间内完成吗,比如 30-60 分钟,这样我就不用被黑客折磨 6 个小时了。许多计算都很简单,它们不需要很长时间来收集足够的数据来做出决策,并且与基于 ML 的方法相比,它不需要大量的训练数据和很长的推理时间。
在看到优步推送表扬通知和反馈请求的速度后,我确信优步可以将这一技术发挥巨大作用!

作者手机截图,拍摄于 2020 年 5 月 10 日
尽管这次的支持经历很糟糕,但我对优步的工程团队充满信心,相信他们会做得更好。
3.不那么感同身受的提醒
自黑客事件以来,优步的推荐算法继续发挥着它的魔力:它在完美的时机发送通知和建议来满足我的胃口,只是这些建议都是基于黑客的品味,而不是我的。

过去两周的电子邮件和移动推荐,作者截图
最近两周收到的每一个 UberEat 推荐都让我觉得尴尬和沮丧。就好像黑客从来没有放过我,他(或她)不祥的存在依然在每一个频道,每时每刻萦绕着我。
由于我的专业经验和兴趣,优步的推荐设计和实现是我在优步工程博客上的最爱。创新的想法、创意的设计和清晰的解释总是给我留下深刻的印象。
下图描述了 UberEat 推荐引擎的核心组件和流程。

多目标推荐设计,优步的工程博客

基于图形的推荐系统,优步的工程博客

图-学习方程,优步工程博客

基于图的推荐器的损失函数,优步工程博客

基于图的推荐系统的工作流设计,优步工程博客
但是,抛开所有抽象的想法和复杂的设计,一些简单的东西似乎不见了。
对优步保荐制度的几点建议
- 添加或更新数据验证标准。通过将此添加到数据管道,步骤 1 可以从训练和/或推断中移除坏数据。优步应该把我的记录贴上例外的标签,把它们从军情六处的管道里移走。
- 调整模型训练和验证中的总预订权重。我使用 UberEat 已经三年多了。优步的建议是“正常的”但黑客入侵后一切都关闭了。这表明该模型对某些特征特别敏感。我相信总预订量(例如,根据工程博客文章所述,食客和餐厅之间的订单金额)可能会影响模型。黑客在所有的餐馆下了大订单(100 多美元,而我正常的订单是 30 美元)。
- 新增或更新保障业务逻辑。在我讨论人工智能最后一英里问题的文章中,我强烈建议企业在推理和服务之间建立一个业务逻辑层。这样做有助于避免像我这样的情况,即建议没有意义(例如地点和口味)。我们应该也能够在帮助用户探索使用 ML 和不无关(或错误)之间取得平衡。
- 启用用户驱动的推荐。目前,我没有办法改变优步的建议,除了不点击任何建议。我希望这样做将有助于系统的自我纠正。哦,等等,我确实打开了邮件或者点击了通知。我希望这不是他们对“成功建议”的定义如果这样,我就会陷入恶性循环。我强烈主张提供一个用户界面,让用户积极参与推荐过程。这是我的文章,提供了一个解决方案(这是一个不同的问题,但机制仍然适用)
最后的话
优步,你是一家伟大的公司。你们的成功故事和技术创新鼓舞了我和许多其他人。真心希望我的经历不会发生在其他用户身上。
随着我们适应新常态,我相信您的服务将成为许多行业和我们生活许多方面的核心组成部分。保持下去。
如果你们中的任何人看到了这篇文章,请将这篇文章转发给正确的团队。
喜欢读什么? 跟我上 中 , 领英 , 推特 。查看我的《 用机器学习影响 》指南。它帮助数据科学家更好地解决问题、设计和交流。
您可能也会喜欢这些文章:
数据科学家的 4 个现实职业选择
towardsdatascience.com](/the-most-realistic-data-science-career-guide-d12c4af87cc8) [## 下一个最佳数据科学工作
数据科学家最受欢迎的过渡路线
towardsdatascience.com](/the-best-data-science-transition-routes-e809254934d0) [## 最有用的 ML 工具 2020
每个懒惰的全栈数据科学家都应该使用的 5 套工具
towardsdatascience.com](/the-most-useful-ml-tools-2020-e41b54061c58) [## 被遗忘的算法
用 Streamlit 探索蒙特卡罗模拟
towardsdatascience.com](/how-to-design-monte-carlo-simulation-138e9214910a) [## 12 小时 ML 挑战
如何使用 Streamlit 和 DevOps 工具构建和部署 ML 应用程序
towardsdatascience.com](/build-full-stack-ml-12-hours-50c310fedd51) [## 数据科学很无聊
我如何应对部署机器学习的无聊日子
towardsdatascience.com](/data-science-is-boring-1d43473e353e) [## ML 和敏捷注定的联姻
如何不对 ML 项目应用敏捷
towardsdatascience.com](/a-doomed-marriage-of-ml-and-agile-b91b95b37e35)*
如何使用位置分析提高用户获取和转化
地理空间分析和洞察
对于“位置”至关重要的基于 app 的交付+物流+移动公司。

一家基于应用程序的送货公司可以随时将用户通过应用程序订购的任何东西送到用户的位置。按需公司,如食品配送公司、电子商务公司等供应链公司、超本地配送公司和移动公司都属于这一类别。
所有这些公司都有一个共同点:它们都在地面上运营和移动资产。因此,位置作为一个包含在策略和决策中的参数变得非常重要。
但是,我们如何利用位置分析来增加用户的获取、转化和保留呢?信不信由你,关于这些指标的地理模式可以告诉我们很多关于我们的业务和用户的信息。例如:
不是每个安装你的应用的人都使用它或者打开你的应用订单。在这种情况下,是否存在客户流失密度非常高的位置?
在这篇文章中,我们将讨论如何使用位置分析来了解如何提高我们的用户获取、转化和保留。

资料来源:优步
案例 1:用户获取
在已经有需求的地方获取用户将有助于我们降低 CAC(客户获取成本)。因此,在选择下一个扩张地点时,一个很好的问题是:
在应用程序安装、搜索、订单等方面,我已经看到很多潜在需求的位置在哪里??
我们可以利用这种洞察力来决定我们需要在哪个领域与商店或餐馆建立合作关系,或者在哪里开设新的车辆或充电站,或者在哪个位置提供服务。
同样,如果您是一家拥有大量高级用户的移动公司,您脑海中浮现的下一个问题是:
这些电力用户是如何移动的,他们从哪里来,去哪里?
理解这些特征可以决定我们需要加倍关注什么样的位置和用户角色。比如这些用户是上班族还是学生?

案例二:用户转化
转化的核心是客户流失的事实。今天,当人们做流失分析时,他们只看人物角色和漏斗的步骤。每一个没有转化的用户都是我们眼前的收入损失。
然而,分析客户流失发生在哪里是至关重要的,因为这有助于我们确定我们需要在哪里改善运营、提供供应或进行线下营销。
从用户打开应用程序到最终为订单付款,应用程序中有大量的步骤。
预约乘车:
输入目的地→搜索最近的自行车→选择自行车→开始行程。
点菜:
选择菜系→选择餐厅→选择菜品→结账→付款
例如,我们正在合作的一家食品杂货公司意识到,人们在看到 SLA 后,会从订购流程中大量生产,并且他们意识到他们可以在其他地方获得更好的 SLA!当我们绘制流失数据时,我们注意到一些城市中的高密度集群,团队开始专注于在这些地区提供更多的交付合作伙伴。

群组创建
案例三:用户留存
一旦转化了用户,如何确保可重复性和留存率?毕竟,我们都知道,保留是一个公司最重要的指标之一,因为它可以确保稳定的收入。但是,在这个世界上,用户只需点击一个按钮,就可以在多个竞争对手之间切换,而且他们要求最高质量的服务,因此确保留住客户越来越难。
不同的公司有不同的挽留策略。一些公司做向上销售:让用户以更高的频率订购同一目录,而一些公司做交叉销售:让用户订购不同的类别和目录。
位置可以帮助留住用户,也可以根据用户的位置和行为推出非常有针对性的促销活动。
例如,让我们回到我们的移动公司的例子。假设我们发现我们最有价值的用户是从宿舍到大学乘坐我们的车辆的学生。我们可以发起一场运动来补贴这些路线!

户外广告也是一种非常受欢迎的营销策略,用来培养和留住用户,这种策略的成功取决于正确的信息和位置。
你如何开始?
Locale 是一个位置分析平台,这意味着我们可以将所有数据库和格式的原始纬度数据转换为有意义的见解,以便决策者可以就其地面运营做出非常精确的数据驱动型决策。
网络分析工具已经利用点击流数据帮助你改善了这些指标。然而,对于在地面上有移动资产的公司来说,不从地理空间的角度看问题是非常有害的!让我们更深入地探讨如何使用位置分析来增加用户获取、转化和保留。
获得物ˌ获得
需求制图允许您叠加搜索数据并安装可用于分析不同区域的空间和时间趋势的数据。成长负责人可以利用这些见解来确定哪些领域尚未开发,以及不同类别的业务。
转换
流失分析有助于您分析不同事件在地理空间上发生的位置,以及人们在非常精细的级别上生产最多的位置。你是否需要开设一个车辆站枢纽来提供更多的站,或者给准备时间最长的餐厅经理打电话,或者做一些线下活动——决定权在你。
保留
工作流模块帮助您在达到特定指标和阈值时采取措施。公司利用这一点向他们的用户发送非常有针对性的地理促销信息,或者在他们的 KPI 观察到异常情况时收到警报。
在 场所 ,我们正在创建通过地理空间分析提高单位经济性、每次交付成本和利用率的公司范例。如果你是一名增长型经理,希望提高用户的获取、保留和转化,请在此处联系我进行演示或通过LinkedIn或Twitter联系我。
原贴 此处 。
类似阅读:
供求分析帮助你解码供求之间的差距出现在哪里,什么时候,为什么会出现。每单位的…
blog.locale.ai](https://blog.locale.ai/location-analytics-for-delivery-mobility-companies-with-ground-operations-2/) [## 在新冠肺炎期间使用 Locale.ai 为您的供应链进行位置分析
TL;DR:如果你是一家物流或送货公司,我们想帮助你监控和弥补差距…
blog.locale.ai](https://blog.locale.ai/location-analytics-for-your-supply-chain-using-locale-ai/)*
如何改进您的 DevOps 测试自动化策略
请继续阅读,了解如何自动化您的测试过程,以获得更高的灵活性和效率。

测试自动化策略通过将冗长且劳动密集型的测试过程转化为简化的自动化过程,增强了业务模型。公司正在将自动化安全测试作为开发过程的一个组成部分添加到他们的 DevOps 策略中。
强大的测试自动化套件使组织能够在每次执行 DevOps 管道时验证功能和简单的安全测试用例。公司可以更专注于日常活动,确保团队更高效地工作,而无需在重复性任务上投入太多时间。
但是如果您已经有了一个现有的 DevOps 测试自动化策略呢?您如何确保您的 DevOps 测试策略足以维护您的应用程序的良好安全性?
有几种方法可以创建和实现一个理想的 DevOps 测试自动化策略,帮助您早期识别应用程序的漏洞和弱点。
改进您的 DevOps 测试自动化策略的 5 种方法
在本文中,我们将解释构建可靠的 DevOps 安全测试自动化策略的要点,这将帮助您加强应用程序的安全性:
1.应用正确的测试自动化框架
框架是测试自动化策略的主要元素。它们提供了可重用的组件,不同的团队可以使用这些组件来创建定制的自动化测试。
一个构建良好的测试自动化套件可以作为您的组织的重要资产,并且是 DevOps 不可或缺的一部分。它促进了更快的交付、问题的早期检测,并简化了持续更新和执行的过程。
您可以使用开源软件或商业软件来构建满足您团队需求的测试套件。用于 DevOps 测试策略的开源软件和商业软件各有利弊。
例如,在使用 Selenium 或 OWASP ZAP (Zed 攻击代理)等开源软件时,您可以找到大量的故障排除、学习、支持和更新支持社区。
另一方面,像 Ranorex 这样的商业软件将为您提供一个端到端的空间来轻松构建、实现和执行您的自动化测试套件,并在您遇到问题时提供一个专用的支持机制。
DevOps 的开源工具,如 Zed Attack Proxy (ZAP)被广泛用于在开发和软件测试阶段识别与 web 应用程序相关的安全问题。
OWASP ZAP 也被认为是一个很棒的自动化安全工具,可以被有经验的测试人员用于手动安全测试。
测试自动化策略的框架允许你关注用户价值,而不仅仅是技术。它使团队能够超越应用程序的技术实现,以更好的方式为最终用户服务。正确实现的测试自动化框架有效地降低了开发过程中的测试套件维护成本。
2:了解应用程序的需求
吸收测试自动化需求,并选择正确的工具集来实现对于有效的开发运维来说是不够的。了解应用程序用户环境中的每个元素是非常重要的,例如配置、框架、最终用户目标、安全参数等。
您对应用了解得越多,就越容易在开发运维期间选择正确的自动化工具来测试您的应用的安全性。
如果自动化工具有助于应用程序的技术方面,但干扰了最终用户体验,那么您可能需要考虑不同的工具。
因此,对于处理 DevOps 自动化测试的团队来说,了解整个应用程序是至关重要的,这样他们就可以选择一个理想而有效的自动化安全工具。
通过考虑应用程序的各个方面,团队将能够不仅从技术角度,而且从客户的角度来理解应用程序。
例如,对于金融服务应用程序,安全性应该是重中之重。然后,自动化测试团队应该专注于创建支持应用程序的整体安全性的健壮策略,例如验证交易细节和负面测试用例的完整性,以确保用户看不到另一个用户的帐户细节,等等。
为此,组织应该鼓励开发和自动化测试团队的参与。
在 DevOps 测试中,来自开发团队的持续交付使得自动化测试团队成为每个模块的一部分。它有助于创建与项目开发相一致的更好的无缝 DevOps 测试策略。
通过与开发团队密切合作,自动化测试团队能够更新测试用例,以满足应用程序的最新功能,而没有太多的麻烦或延迟。他们将最新的代码集成到他们的测试案例中,以运行快速的安全测试,并确保及早识别和补救潜在的威胁和漏洞。
让自动化测试团队了解关于应用程序的每一次更新可以带来更好的 DevOps 测试。这不仅会改进软件测试过程,还会促进不同团队之间的顺畅交流。
3:对您的 DevOps 测试用例要有选择性
实现 DevOps 自动化测试策略的主要动机是覆盖简单的安全问题,并将更复杂的问题留给安全团队。
然而,由于代码过多,仅使用自动化安全测试来成功处理应用程序中的每个 DevOps 测试用例通常会变得很困难。因此,首先确定需要自动化的测试用例是很重要的。有许多事情可以考虑,例如需要多长时间运行一次 DevOps 测试用例,是否需要大量数据,是否需要大量逻辑,等等。
自动化测试有很多好处,特别是对于重复的测试用例以及连续的交付。而对于更复杂或者只执行几次的测试用例,手动测试是更好的选择。
接下来,我们将讨论 DevOps 的这些考虑事项,以帮助您理解和优先化您的测试用例。
为了从您的软件测试策略中获得最大的好处,您应该自动化测试:
- 本质上是重复的,经常运行
- 容易出现人工错误
- 如果手动执行,既昂贵又耗时
- 劳动密集型,需要大量的资源投入
您还可以利用测试自动化来测试以下案例:
- 在各种软件或硬件平台和配置上运行
- 需要大量数据
4:保持你的 DevOps 测试用例小
尽管一些质量分析师的目标是构建大型测试用例来处理复杂的代码结构,但是保持测试用例较小可能更有益。
当您创建小的测试用例时,您将能够明确地识别每个测试,并为预期的结果设置一个清晰的定义。然后你就会确切地知道什么失败了,什么成功了。测试用例将会更简单,更容易理解。
如果开发团队需要解决一个特定的测试用例,他们不需要很长时间就能理解测试用例的内容。
此外,你不需要浏览整个文档,只要在需要的时候查看它们,你就能够识别测试用例。
虽然保持测试用例小很重要,但是考虑负面测试用例也很重要。例如,您不应该能够使用其他用户的凭据访问他们的数据。
安全团队经常创建负面测试用例来确保更好的软件安全性,在这种情况下,用户不应该能够访问另一个用户的数据或利用输入验证。
这有助于检查 DevOps 策略中的无效数据或意外用户行为。例如,如果用户名仅由字母字符组成,而您输入了一个数值,系统应提示您再次正确输入输入值。
DevOps 测试自动化策略中较小的测试用例也倾向于严格遵循单一责任原则(SRP)。SRP 声明程序中的每个模块或类应该只负责程序功能的一部分。
因此,DevOps 测试的较小测试用例侧重于精确验证,以减少应用程序中漏洞的可能性。它鼓励不同团队之间更好的学习和理解,以更好地团结工作。
5:保持与 UI 无关的测试用例的灵活性
请记住,您的 DevOps 测试策略需要能够适应变化。
确保您的测试用例是灵活的,能够适应 UI 中的新变化,并且对将来的使用是可行的。
创建简单而强大的 DevOps 测试用例的最可靠的方法之一是用后端功能支持的动作术语来编写它们。
不要使用 JScript 之类的脚本语言,而要使用基于关键字的测试,这样就不需要依赖可能会随着开发的进行而改变的 UI 元素。
这是专门针对 DevOps 测试自动化策略的,在这种策略下,应用程序中会不断地进行更改和更新。
最后的想法
DevOps 不仅仅局限于技术实施和执行,它还能满足您的业务需求。将一套正确的工具和框架整合到您的测试自动化策略中可以改进您的软件开发过程。
任何投资于创建 DevOps 测试自动化策略的时间都是值得的。自动化技术可以提高整个安全测试过程的效率和有效性。关键是分析和创建可持续的测试用例,并随着 SDLC(软件开发生命周期)的进展保持相关性。
请记住,不恰当的测试自动化策略会对您的整个 DevOps 测试策略产生巨大的影响。因此,建议您与知识渊博的专业人员合作,构建并实现一个强大的 DevOps 测试自动化策略,该策略可以持续很长一段时间,并且几乎不受频繁的代码更改的影响。
关于作者:
Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是 Java/JEE 的 SANS DEV541 安全编码:开发可防御应用程序课程的讲师。
如何在你的预测模型中加入偏见
不要做这些事情,除非你想要一个有偏见的生产模型,做出不准确的,有时是昂贵的预测。

你真的不想让一个有偏见的模型为你做预测,是吗?尽管有大量高质量的机器学习(ML)实践者和技术进步,但现实生活中不乏 ML 失败。
让我们先回顾一下这些引人注目的 ML 和 AI 失败,其中潜在的偏差模型是失败的原因之一,如果不是主要原因的话,然后再讨论可能影响预测模型的偏差来源。
英国 GCSE 和 A-Levels 成绩惨败
由于新冠肺炎停课,英国学生今年没有参加 GCSE 和 A-Levels 考试。相反,英国考试监管机构 Ofqual 利用一种算法来确定学生的预期成绩,其基础是:
- 由学生的老师确定的估计分数
- 与同一所学校中具有相似估计分数的其他学生的相对排名
- 学校在过去三年中每一科目的表现
然而,在 8 月 13 日公布成绩的那一天,发生了一场彻底的灾难:将近 40%的 A-Levels 成绩低于老师的评估。这引起了相当大的骚动,导致政府在 8 月 17 日来了个 180 度大转弯,宣布将修改学生成绩,以反映最初老师的评估和模型输出中的较高者。
IBM 的“肿瘤学沃森”的失败
2013 年 10 月,IBM 与 MD 安德森癌症中心(MD Anderson)合作,基于其沃森超级计算机开发了一种人工智能解决方案来治疗癌症。然而,它辜负了人们的期望。
福布斯【2017 年 2 月报道称,MD Anderson 搁置了其 Watson for Oncology 项目,并积极寻找其他合作伙伴取代 IBM,继续其未来的研究。2018 年 7 月晚些时候,STAT 的一份报告显示,基于对 IBM 内部文件的分析,沃森提出了多项完全错误的癌症治疗建议,一些客户报告了“多个不安全和不正确治疗建议的例子”。
亚马逊的厌女症人工智能招聘
亚马逊的工程师在 2014 年开始开发一种自动化招聘工具,以审查求职者的简历。然而,路透社在 2018 年报道称,到 2015 年,“该公司意识到其新系统没有以性别中立的方式评估软件开发人员和其他技术职位的候选人”。
显然,该模型是根据 10 年来主要来自男性的求职申请进行训练的,这表明了当时男性在科技行业的主导地位。该项目随后被搁置,该团队于 2017 年初解散。
ML 模型中偏差的来源
特定的 ML 模型可能会以一种微妙的方式产生偏差,其他的则不会——如上所示。模型有偏差的一些潜在原因包括:
有偏数据/采样偏差
有偏见的训练数据最终会变成有偏见的模型——这是 GIGO 的格言!这在上面的亚马逊例子中很明显,训练数据中女性申请者的短缺迫使模型优先考虑男性申请者。该模型没有足够性别公正的数据来进行训练和学习。这些数据往往反映了社会的现状和当前的偏见(不管是好是坏)。
适当的数据收集和采样策略对于确保获得相关的、有代表性的、合适的和足够多样化的数据至关重要。数据科学家 80%的工作都围绕着数据收集和特性工程,这是有原因的。
算法偏差
ML 算法由于其各种与基础训练数据无关的数学和统计假设而具有其自身固有的偏差。有偏算法更严格,假设并要求严格定义的数据分布,并且更能抵抗数据中的噪声。然而,他们在学习复杂的数据时会有困难。相比之下,偏差较低的算法可以处理更复杂的数据,但通常不适用于生产中的数据。
这种冲突的情况通常被称为偏差/方差权衡。它需要 ML 从业者进行微妙的平衡,以确保最佳的偏差(根据定义,还有方差)。
排斥偏差
当我们从数据集中排除特定的特征或变量时,就会发生这种情况,因为我们错误地假设它们对手头的预测问题没有用,而没有首先验证该假设。
在丢弃任何特征之前,始终测试预测值和目标变量之间的相关性。我在之前的一篇文章中提到了针对各种变量类型的一些特征选择策略。
测量偏差
例如设备的错误测量会导致数据的系统性失真和测量偏差。例如,如果称重设备始终少报相同数量的重量,那么利用该故障设备产生的数据的任何模型都将是不准确的。带有“引导性”问题的设计不当的调查是测量偏差的另一个常见来源。
观察者偏差
当数据收集或特征工程策略受到数据分析师的先入为主(通常是错误的)观念的影响时,就会出现观察者偏差。例如,如果我对悉尼人有偏见(我不是),那么我可能会让我的偏见以潜意识的方式潜入我的数据。观察者偏见的一个经典例子是伯特事件。
检测观察者偏差通常很困难,但是可以通过结合培训和筛选策略以及明确定义和实施的政策和程序来防止。
反馈回路
考虑一个 ML 模型,它以某种方式影响数据的生成,然后被用于预测。因此,模型做出的预测会偏向于它有发言权的数据。然而,这种反馈循环也可以是一种设计特征,而不一定是一个值得关注的原因——通常在内容个性化和推荐系统中。
系统漂移
在这个上下文中,漂移指的是生成用于建模的数据的系统或应用程序随时间的变化。例如,延迟支付的业务定义的变化(在违约预测问题的情况下)或用户交互的新模式的增加。
通过适当的变更管理和错误跟踪实践以及定期的模型更新和培训,这种偏差是最容易防止和检测的。
结论
以上是可能影响预测模型性能的一些潜在偏差来源。根据我的经验,通过评估和重新评估数据收集和采样策略,以及彻底的测试/验证程序,可以充分处理上述大部分问题。
如果您想讨论任何与数据分析、机器学习、金融或信用分析相关的问题,请随时联系 me 。
下次见,摇滚起来!
如何提高 Azure Databricks 集群 vCPU 内核限制

Alexandre Debiève 在 Unsplash 上的照片
Azure Databricks“此帐户可能没有足够的 CPU 内核来满足此请求”警告的解决方案
我的客户经常会问我:
为什么我的 Azure Databricks 集群受到限制?
具体来说,对于一个默认的 PAYG Azure 订阅,当你想在 Azure Databricks 中创建一个集群时,你可能会被这样一个问题困扰:
此帐户可能没有足够的 CPU 核心来满足此请求
估计可用:10,请求:**
如下图所示。

即使您单击链接“了解更多关于 CPU 配额的信息”,该文档中也没有直接的答案。然而,如果你耐心地钻研官方文件,你会发现微软故意为所有 PAYG 订阅默认设置这些配额限制,以避免任何令人震惊的账单。
然而,这对于 Azure Databricks 集群来说非常不方便。vCPU 核心的数量被限制在 10 个,这也限制了 Azure Databricks 的能力。在大多数情况下,集群通常需要多个节点,每个节点可能至少有 4 个内核运行(推荐的工作虚拟机是 DS3 v2,它有 4 个虚拟内核)。
因此,集群将总是被限制为只有一个节点在运行,这变得毫无用处,因为 Spark 需要它的分布式特性来加速计算。请注意,如果我们选择“与 worker 相同”,驱动程序节点将需要另外 4 个内核。因此,发生了以下情况:
- 驱动节点(4 核)+1 *工作节点(4 核)= 8 核< 10 cores limitation
- Driver node (4 cores) +2 * Worker node (8 cores) = 12 cores > 10 核限制(不允许)
我们必须增加限制,数据块才能按预期运行。
解决这个问题的方法是增加配额,这并不复杂,但是我发现在官方文档页面上并没有直接说明。现在,我将演示如何增加配额和消除约束。
增加配额的步骤
- 进入 Azure 门户>点击搜索资源字段>输入“帮助”>选择“帮助+支持”

2.在左侧导航中,选择“新支持请求”。然后,在右侧窗格的“基础选项卡中,
- 发行类型:选择“服务和认购限额(额度)”
- 订阅:选择您的订阅
- 配额类型:选择“计算-虚拟机(核心-虚拟 CPU)订阅限额增加”
选择所有必填字段后,点击“下一步:解决方案> > ”。请注意,对此不会有任何“解决方案”,因为它需要一个支持人员来审查您的请求并手动批准它。所以“解决选项卡将被跳过,直接跳转到“详细信息”。

3.在“详细信息选项卡中,单击链接“提供详细信息”将“配额详细信息”刀片窗口移至右侧。然后,在窗口:
- 部署模式:选择“资源管理器”。
- 位置:选择您的位置。请注意,您可以一次请求增加多个地点的配额。
- 类型:选择“标准”。
- 标准:选择要增加配额的虚拟机系列。请注意,您可以一次为多个虚拟机系列请求配额增加
- 新 vCPU 限额:输入您想要增加的新配额
填写完所有要求的信息后,点击保存并继续。

4.现在,请求的配额增加显示在“请求摘要”中。还有一些其他需要填写的信息。根据自己的喜好输入即可,然后点击“下一步:审核+创建> > ”。

5.审核一切输入完毕后,点击创建创建该票。

来自 Azure 支持的响应
根据您选择的“严重程度”,工作人员会及时与您联系。通常,配额增加会在没有任何问题的情况下获得批准,随后会收到支持团队的电子邮件,以便在关闭票证之前进行确认。
总结和提示

事实上,微软 Azure 对各种服务设置了巨大的配额限制。您可以在这里找到详细信息:
[## Azure 订阅限制和配额— Azure 资源管理器
本文档列出了一些最常见的 Microsoft Azure 限制,有时也称为配额。为了学习…
docs.microsoft.com](https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/azure-subscription-service-limits)
当然,使用我在本文中演示的方法,您不仅可以增加 vCPU 核心的配额,还可以增加上面的官方文档中列出的其他服务配额。
现在,你的 Azure Databricks 集群没有任何限制,但请三思而后行,不要在以后产生令人震惊的账单:)
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
如何提高预测模型的可解释性
SHAP 价值观
从商业角度的实用见解。

作者创作的照片
准确性和可解释性据说是截然不同的。复杂的模型往往能达到最高的精度,而简单的模型往往更容易解释。
但是如果我们想两全其美呢?获得高精度是很酷,但是如果我们能理解模型不是很好吗?尤其是,如果预测对企业的成功至关重要?正如里贝罗等人所说:
“[……]如果用户不信任某个模型或预测,他们就不会使用它。”(里贝罗等人 2016 年,第 1 页)
假设的情况
让我们想象一下:我们在一家大型储蓄银行担任数据科学家。我们的工作是确保我们知道哪些客户很有可能流失。
我们的模型会发生什么?我们将使用我们的结果来创建具有不同流失率的客户群。
然后,具有最高流失率的客户群会接受有针对性的营销,这样他们就不会离开银行。
与获得新客户相比,留住客户的成本要低得多(Keaveney 1995)。因此,我们的工作对银行的成功至关重要!
我们必须实现两个目标:
- 营销团队必须获得尽可能准确的结果。为什么?因为银行是花钱留住这些客户的。如果客户无论如何都会留下来,银行就是在把钱扔出窗外。
- 我们必须让利益相关者相信他们可以信任我们的结果。祝你好运,向营销经理解释我们是如何创建我们的模型的…
所以我们假设营销老板不理解我们的模式,但是信任我们(不管什么原因)。因此,他们实现了我们的复杂模型。
- 该模型具有很高的预测能力。营销团队很高兴,因为他们看到所采取的措施有助于留住客户。我们很高兴,因为我们得到了该模型的积极反馈。
不错!我们可以就此收工,把精力集中在下一个任务上,为我们所做的伟大工作获得更多的荣誉。

但是停!坚持住!
准确性和可解释性不能用同一个模型来实现,对吗?
因此,我们只关注模型的准确性。但是如果模型有瑕疵呢?
我们可以在我们的模型中加入一个变量,这个变量实际上没有任何意义。不知怎么的,有一段时间是管用的,后来就不行了,也没人认了。
更糟糕的是:我们可能创造了一个性别歧视的算法,在社交媒体上引起轩然大波。你认为我在开玩笑吗?这种情况不知何故发生在苹果和高盛身上。
一个经理会为了几个更准确的点而拿他/她的职业生涯冒险吗?
在这里我可以给你一个浅显简单的答案……不会,管理者不会冒这个险。他们花了很多年建立自己的事业,对机器学习一窍不通。
当然,预测客户流失概率可能不是一个会在媒体上引起轩然大波的热门话题。但是,如果我们的模式因为我们未能正确理解而对我们不利,后果可能是痛苦的。
解决方案
可解释性是必不可少的,因为它促进了对我们模型的信心和信任。用户不会采用不能做到这一点的模型。此外,增强的可解释性有助于提高模型性能,并扩展我们可以从模型中获得的知识(Lundberg & Lee,2017)。
不错!通过增加可解释性,我们不仅能够理解我们的模型,还可以获得有价值的见解。也许营销团队想更多地了解他们的客户?
幸运的是,消除模型准确性和模型可解释性之间的权衡已经引起了研究人员的关注(Ribeiro 等人,2016 年 Lundberg & Lee,2017 年 Chen 等人,2018 年)。
他们的一个解决方案获得了很多关注:Lundberg & Lee (2017)引入的 SHapley 加法解释(SHAP)值。
SHAP 价值观源于博弈论。他们衡量一个变量的观察水平对个人最终预测概率的边际影响(Lundberg 等人,2019 年)。
通过这种方法,可以解释为什么客户会收到其流失预测值,以及这些特征如何有助于这种预测。这种局部可解释性增加了透明度。此外,将本地解释结合起来以获得全球可解释性也变得可行。
让我们使用这些神秘的 SHAP 值将一个复杂的模型转换成一个复杂的和可解释的模型。
和行动
记住,我们想知道哪些客户会流失。因此,我使用这个 Kaggle 数据集来预测银行客户的流失概率。
用于预测流失概率的前十行数据集。
对于预测,我使用了基本的逻辑回归和默认的 XGBoost 算法。为了让这篇文章可读性更好,我不会展示代码行。如果你有兴趣知道我是如何构建模型的,请看看我的 GitHub 库。在那里你可以找到你需要的一切。
因此,让我们快速比较 logit 模型和默认 XGBoost 模型的模型统计数据。
logit 模型达到 84.1%的测试准确度,而默认的 XGBoost 模型具有 86.6%的测试准确度。AUC 怎么样?这里,logit 模型的 AUC 为 82.3%,而默认 XGBoost 模型的 AUC 为 85.1%。
事实上,更复杂的模型更能预测谁会流失,谁会留在银行。
因此,我们通常可以使用 XGBoost 的三个不同的重要性度量,通过它们我们可以更详细地了解我们的模型。

XGBoost 模型的重要图。作者创造的情节。
我想到了什么?这三种重要性度量为要素分配了不同的重要性级别。
此外,我看不出自变量和客户流失之间的关系。更高的年龄是增加还是减少成为一个搅动者的概率?这些情节无助于回答这个问题。
因此,让我们看看如何使用 SHAP 值来解释我们的模型。
在下图中,特性按照它们对默认 XGBoost 模型的全局影响进行排序。较高的 SHAP 值表示客户退出银行的预测较高。圆点表示训练集的各个预测对模型输出的特征影响。根据特征值的不同,点的颜色从蓝色(低)到红色(高)。因此,我们可以探索特性影响的范围、强度和方向。

SHAP 概要图。作者用 SHAPforxgboost 创作的剧情。
年龄、NumOfProducts 和 IsActiveMember 具有最高的全局功能重要性。从这个概要图中,我们可以得出几个有趣的见解:
- 特征对预测的影响范围是广泛分布的。例如,年龄对一些客户的预测有很大的影响,而对另一些客户则只有很小的影响。
- 尽管有些变量的全局重要性较低,但该特征对某些个体的影响可能很大。例如,对于信用评分低的人来说,信用评分与流失有正预测关系。
- 乍一看,一些变量显示出与客户流失的直观关系,而对其他人来说,这是违反直觉的。例如,为什么产品数量越多,客户流失的可能性就越大?这有道理吗?
为了更深入地研究单个变量,我们可以使用依赖图。下图显示了年龄的 SHAP 依赖图。与汇总图一样,每个点都是一个客户。如图所示,年轻客户对流失的预测值较低,而年长客户对流失的预测值较高。但这不是线性关系!当达到 60 岁时,客户流失概率开始下降。

年龄的 SHAP 依赖图。作者使用 SHAPforxgboost 创建的情节。
祝你用 logit 模型探索这种关系好运…

基于与 XGBoost 模型相同的数据的逻辑回归的摘要输出。年龄变量突出显示。
要疯狂,还可以看看变量的交互作用效果。
在下面的左侧面板中,您可以看到年龄变量的相同依赖关系图。但这一次,我加入了性别变量,以观察年龄和性别如何相互作用。
在右边的图中,年龄和性别的交互作用表现得更为明显。不知何故(我缺乏解释这一点的领域知识),当与年龄配对时,男性和女性有不同的行为。例如,年轻女性的 SHAP 互动值为负值,这意味着年轻女性的 SHAP 值低于年轻男性。

年龄和性别的 SHAP 依赖性图(左图)和 SHAP 相互作用图(右图)。作者用 SHAPforxgboost 创作的情节。
到目前为止,一切顺利。但是,客户拥有的产品数量对客户流失预测的影响如何呢?至少对我来说,产品越多的客户越有可能翻盘,这似乎有悖常理。我们都知道终止合同有多难,尤其是银行合同。
当观察逻辑回归的系数值时,我们看到了同样的效果。不知何故,与拥有一个、三个或四个产品的客户相比,拥有两个产品的客户流失的可能性更低。

logit 模型的摘要输出基于与 XGBoost 模型相同的数据。突出显示 NumOfProducts2 变量。
因此,我假设这种趋势存在于数据中,而不是被我们的 XGBoost 模型随机使用。
我还担心吗?是的。我通常会做什么?
- 看文献。这种关系可能有意义,谁知道呢?
- 质疑数据的相关性。当我搜索数据集时,我已经想到了这个主题。我没有太多的选择,而且这个数据集没有版权。算法和数据一样好。
- 探索数据集。在建立模型之前进行解释性分析是非常可取的。也许,我可以找到一些模式来解释这个违反直觉的结果。
- 删除变量。如果我怀疑该变量不能提供有意义的结果并可能导致缺陷,我会删除它。即使这意味着损失一些准确性或 AUC 百分点。
到目前为止,我所做的分析可以用于每一个变量。我们需要完全理解我们的模型,对吗?但是因为这篇文章太长了(如果你到目前为止还没写完,就猛敲!),我就不赘述给你进一步分析了。
结论
理解我们的预测模型以及该模型捕捉数据的一般潜在趋势是至关重要的。否则,该公司将面临一颗定时炸弹。一切都很顺利,直到它不再顺利。
此外,我们需要能够向相关的利益相关者解释我们的结果。向一个理解基本统计学有困难的人解释预测模型,首先是 SHAP 值是很难的!尽管如此,这些利益相关者通常是决策者,所以我们必须确保我们可以让他们相信我们的模型在实践中确实有效。
除了通过增加对我们模型的信任来减少可能的风险,我们还可以获得更简单的模型所不能获得的额外的洞察力。这可能非常相关。尤其是对于总是有兴趣了解客户的营销部门来说。
如果您有任何问题或意见,欢迎在下方留下您的反馈。另外,如果你想和我联系,你可以通过LinkedIn联系我。
敬请期待,下期帖子再见!
如果你对我和 190 名学生如何学习数据科学感兴趣,请查看以下文章:
如何学习编码的可行策略?
towardsdatascience.com](/how-190-students-and-i-have-learned-data-science-55da9e0e5c6b)
[1] Ribeiro,M. T .,Singh,s .和 Guestrin,C. (2016),“我为什么要相信你?”:解释任何分类器的预测,见 B. Krishnapuram & M. Shah 编辑的“KDD 16:第 22 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集”,第 1135–1144 页。
[2] Keaveney,S. M. (1995),“服务业中的顾客转换行为:一项探索性研究”,《市场营销杂志》59,71–82。
[3] Lundberg,s .和 Lee,S.-I. (2017),解释模型预测的统一方法,载于 U. von Luxburg,I. M. Guyon,S. Bengio,H. M. Wallach 和 R. Fergus 编辑的《NIPS'17:第 31 届神经信息处理系统国际会议论文集》,第 4768-4777 页。
[4]陈,j .,,温赖特,M. J. &乔丹,M. I. (2018),学习解释:模型解释的信息论观点,载于 J. G. Dy & A. Krause 编辑的《第 35 届机器学习国际会议论文集》,第 882-891 页。
[5] Lundberg,S. M .,Erion,G. G. & Lee,S.-I. (2019),《树集合的一致个性化特征属性》,第 1–9 页。
如何用 Python 索引 Pandas 中的数据
如何在 Python 中使用 loc 和 iloc 方法

伊利亚·巴甫洛夫在 Unsplash 上的照片
介绍
为熊猫的数据帧建立索引是一项非常重要的技能。索引仅仅意味着在数据帧或系列中选择特定的行和/或列。在本教程中,我们将介绍 loc 和 iloc 方法,这是在 pandas 中索引数据帧的两种最常见的方法。我将使用在 jupyter 笔记本上这里找到的 ufo 目击数据集。
在我们开始之前,让我们将数据读入数据帧,看看 ufo 数据帧的前 5 行:

我们 ufo 数据帧的前 5 行
让我们看看关于我们的数据框架的其他一些信息:

我们使用 shape 和 columns 属性分别获取数据帧的形状(行数、列数)和列名。
锁定方法
索引数据帧最通用的方法可能是 loc 方法。loc 既是 dataframe 又是 series 方法,这意味着您可以对这些 pandas 对象中的任何一个调用 loc 方法。当在 dataframe 上使用 loc 方法时,我们使用以下格式指定我们需要的行和列:data frame . loc[指定的行:指定的列]。有不同的方法来指定我们想要选择的行和列。例如,我们可以传入单个标签、标签列表或标签数组、带标签的切片对象或布尔数组。让我们来看一下这些方法!
使用单一标签
我们可以指定我们想要的行和/或列的一种方法是使用标签。对于行,标签是该行的索引值,对于列,列名是标签。例如,在我们的 ufo 数据帧中,如果我们只想要第五行以及所有的列,我们将使用如下:
ufo.loc[4, :]

单一标签
因此,我们通过使用特定行的标签(即 4)来指定我们想要的行,因为我们想要所有的列,所以我们只需使用冒号。
注意:我们可以省略冒号,我们会得到相同的输出,但是,为了代码可读性,最好保留冒号,以明确显示我们需要所有列。
标签的列表或数组
假设我们需要多行和/或多列。我们如何指定它?使用标签,我们可以输入一个标签列表,或者使用类似于你可能熟悉的切片符号。
让我们从标签列表开始:

标签列表
注意我们如何用标签列表指定行和列标签。
使用流行的 Python 包添加智能进度条
better 编程. pub](https://betterprogramming.pub/display-progress-bars-using-tqdm-in-python-c81484be9390)
切片对象
我们也可以使用切片符号,格式如下:开始标签:停止标签。然而,与使用带列表或字符串的切片标记相比,开始和停止标签都包含在我们的输出中,如下所示:

带标签的切片对象
注意行标签 3、4 和 5 是如何包含在我们的输出数据帧中的。还要注意 City、Colors Reported 和 Shape Reported 列是如何包含在内的,即使我们使用 slice 对象停止在 Shape Reported。记住,ufo.columns 返回了一个列表,其顺序为城市、报告的颜色、报告的形状、州和时间。我们包括从城市标签到形状报告标签的所有内容,其中还包括颜色报告标签。
了解如何在 Python 中分割列表和字符串
towardsdatascience.com](/a-skill-to-master-in-python-d6054394e073)
布尔数组
最后,我们可以使用一个布尔值数组。但是,这个布尔值数组的长度必须与我们使用它的轴的长度相同。例如,根据我们上面使用的 shape 属性,我们的 ufo dataframe 的形状为(18241,5),这意味着它有 18241 行和 5 列。因此,如果我们想使用一个布尔数组来指定我们的行,那么它需要有 18241 个元素的长度。如果我们想使用一个布尔数组来指定我们的列,它需要有 5 个元素的长度。创建这个布尔数组最常见的方法是使用条件。
例如,假设我们希望只选择包含阿比林的行,该城市是 ufo 目击事件发生的城市。我们可以从以下情况开始:
ufo.City == ‘Abilene’

注意这是如何返回长度为 18241 并且由布尔值(真或假)组成的熊猫序列(或类似数组的对象)的。这是我们需要使用这个布尔数组来使用 loc 方法指定我们的行的值的确切数目。想象你把这一系列真值和假值覆盖在我们的 ufo 数据帧的索引上。只要这个序列中有一个真的布尔值,这个特定的行将被选中并显示在我们的数据帧中。在这里,我们可以看到索引或标签 3 为真(在第 4 行),这意味着一旦我们使用 loc 方法使用这个布尔值数组,我们将看到的第一行是标签为 3 的行(或 ufo 数据帧中的第 4 行)。
ufo.loc[ufo.City == ‘Abilene’, :]

阿比林的不明飞行物目击事件
这正是我们所看到的!我们已经使用长度等于原始数据帧中的行数的布尔值数组指定了我们想要的行。
请记住,我们可以组合这些不同的指定行和列的方法,这意味着我们可以对行使用一种方法,对列使用另一种方法。例如:
ufo.loc[ufo.City == ‘Abilene’, ‘City’:’State’]

注意我们如何使用返回布尔值数组的条件来指定行,以及如何使用标签来指定列的切片对象。
Python 中制表和熊猫数据帧函数的性能比较
towardsdatascience.com](/two-ways-to-create-tables-in-python-2e184c9f9876)
iloc 方法
iloc 方法也是数据帧和序列方法,可用于索引数据帧(或序列)。iloc 中的 I 代表整数,因为我们使用基于行和列位置的基于整数位置的索引,而不是标签。就像使用 loc 方法一样,我们可以输入一个整数或整数列表、一个带有整数位置的 slice 对象或一个布尔数组。让我们来看一下 loc 和 iloc 方法之间的一个关键区别:
在我们的 ufo 数据帧中,我们没有改变索引,所以数据帧的默认索引只是我们行的整数位置。但是,让我们尝试使用 slice 对象通过 iloc 方法来指定我们的行:
ufo.iloc[3:5, :]

请注意,在 iloc 方法中使用 slice 对象时,停止整数位置不包含在我们的数据帧中。所以我们只能看到第 3 行和第 4 行,而看不到第 5 行。这与 loc 方法形成对比,在 loc 方法中,开始和停止标签都包含在我们的数据帧中。
让我们使用 iloc 方法来指定我们想要的列:
ufo.iloc[3:5, 1:3]

如果我们查看数据帧的列作为参考,我们可以看到我们正在从索引 1(或报告的颜色)到索引 2(报告的形状)对列进行切片。我们不包括站点的索引,在本例中,State 的值为 3。
注意:我们可以为 loc 或 iloc 方法使用一个可调用的函数,返回一个有效的索引输出(我们上面讨论的任何输入)。然而,我们将把它留到另一个教程中。
本教程中使用的所有代码都可以在这里看到:
本教程中使用的所有代码
使用 Python 的 JSON 和 API 介绍
towardsdatascience.com](/json-and-apis-with-python-fba329ef6ef0)
如果你喜欢阅读这样的故事,并想支持我成为一名作家,考虑注册成为一名媒体成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你用我的 链接 注册,我会赚一小笔佣金。
阅读卢艾·马塔尔卡的每一个故事(以及媒体上成千上万的其他作家)。您的会员费直接支持…
lmatalka90.medium.com](https://lmatalka90.medium.com/membership)
结论
在本教程中,我们学习了如何使用 loc 和 iloc 方法索引数据帧。我们学习了 loc 方法如何主要处理行和列的标签,而 iloc 方法处理整数位置。我们还看到了如何使用布尔数组来索引或指定我们的行和列。
如何使用 IBM Watson NLC 服务推断预训练的图像分类器
使用预先训练的模型进行推理

约翰·西门子的图片——Unsplash
分类
图像分类是属于数据科学和机器学习的另一项任务,其中我们为每个图像分配一个或多个类别或种类。
推理
在 IBM Watson 上创建一个项目。您应该能够看到您的项目列表。单击其中一个项目开始。

单击“添加到项目”以添加服务

选择【视觉识别模式】

如果这是您的第一次,那么您将被重定向到创建服务。点击【此处】

您可以选择一个以前的服务(如果有)或创建一个新的服务。

选择一个符合你需求的计划。

您可以选择更改区域、计划、资源组等。我更喜欢默认值。

之后,您应该能够看到三种不同的训练模型,您可以使用。

先说“将军”。点击“常规”后,会看到三个选项卡。概览将显示型号信息。

点击“测试”开始推理模型

拖放你想要推论的图像。每幅图像都将显示其相关类别及其置信度得分。

点击“实现”,将提供几种使用终端远程推断您的模型的方法。

让我们试试【食物】模式。

【显式】模型预测

资源
- IBM Watson AutoAI 文档
- Youtube 上的 IBM 沃森学习中心
如何在数据科学中创新
分享我对创新的想法,以及 2014 年最喜欢的一个数据科学项目

由 Unsplash 上的absolute vision拍摄
世界上每天都有数百万的创新发生。创新创造新产品、服务、商业模式、技术,甚至新的科学领域;如果没有创新,我们将生活在一个完全不同且无聊的地方。创新在数据科学领域也至关重要:数据科学家将数据转化为可操作的产品/见解,这种转化不断要求人们超越现状进行创新。
创新是生产或采用、吸收和利用一种在经济和社会领域中具有附加值的新奇事物;产品、服务和市场的更新和扩大;开发新的生产方法;以及建立新的管理系统。(维基百科)
同时,创新不是自然的:是的,我们都有自己的观点和想法,但是,创新是一种“增值的新奇事物”;因此,“新奇”本身并不等于“创新”。那么,创新有哪些类型,我们怎样才能把创新发展成一种技能呢?
两种类型的创新
在我看来,创新有两种类型:
- 类型 1。找出更好的替代方案来解决现有问题
- 类型 2。将现存的问题重新定义成一个更有意义的问题,用任何方法解决它
这里有一个例子可以更好地说明这些概念。假设:你想要一台计算能力更强的计算机,一个已知的问题是 CPU 速度慢。第一类创新是通过将半导体制造尺寸从 800 纳米降低到 130 纳米,再降低到 14 纳米来提高 CPU 速度,现在它在 2020 年接近 5 纳米!所以计算能力也相应增加。第二类创新是 a)支持多核 CPU 架构,或者 b)将 GPU 集成为协处理器,以加速通用科学和工程计算的 CPU。最终目标是一样的:更强的计算能力:而类型 1 创新专注于一种已经定义好的方式,类型 2 创新扩展到替代路径。
两种类型的创新都创造商业价值,然而,它们通常与不同的观点相关联。
- 第一类创新需要一个有很强领域专业知识的人,这样才能推进技术边界;更集中的观点。专注于全合成的大学顶级研究实验室( wiki )可以很好地代表这种创新。
- 第二类创新要求一个人对相关的知识空间有全面的了解,并有将点与点连接起来的心态;更全面的观点。许多传奇的商业故事,如 iPhone 的诞生,都可以用这种创新类型来描述。
现在我们定义了创新的类型,接下来的问题是:如何主动发展创新技能?有没有一个公式,像“A + B =创新”?我不想直接给出我的主观答案,我想先分享一个故事:这是我第一份工作中最喜欢的项目之一,我认为这比干巴巴的声明更有背景。
关于 BuildX 的故事
背景
我在 2013 年 8 月开始了我的数据科学职业生涯,我的第一家公司运营着一个汽车定价和信息网站。2014 年,该公司启动了一项战略计划,其成功取决于获取所有库存车辆的详细配置数据,而这些数据是不可用的。例如,给定一个 VIN 号码“1FATP8FF4L5106855”,根据 VIN 字符串模式,我们知道它是一辆福特野马,2020 GT 敞篷高级版;然而,汽车上安装了许多选项,如“福特安全和智能包”,这些选项无法从 VIN 图案本身提取:尽管这是该公司最需要的详细车辆选项配置。

VIN 的半个车窗贴纸:1FATP8FF4L5106855。来源:【http://vin.maniacs.info/FordSticker.html? title=1FATP8FF4L5106855
产品团队开始通过与第三方数据提供商和制造商(如福特、丰田等)的合作,努力获取此类信息。数据科学团队参与评估数据质量、评估可用性,并就新获取的数据是否充分涵盖了我们的库存提供见解。很明显,数据科学团队起到了支持的作用,这从项目的性质来看是可以理解的。该项目的目标是实现高于某个阈值(例如 80%)的数据覆盖率,以便可以构建其他下游产品。不幸的是,几个月过去了,团队开始意识到数据覆盖率仍然远远低于阈值。
作为团队中的一名数据科学家,我学到了很多关于业务如何运作的知识,甚至扮演了一个支持角色,并且在数据评估和集成方面与多个团队合作是一次很棒的经历。然而,我有一种感觉,数据科学可以提供一些额外的东西。
用虚拟解决方案重新定义问题
我想到的一个想法是:我们花了这么多精力购买数据,有可能在内部生成吗?鉴于当时我在公司的任期有限(不到 1 年),我决定检查一下之前是否有这种想法。这是一次定期的同步会议,产品总监刚刚分享了数据采集的状态,以及修改我们目标的潜在需求。在会议结束时,我非常谨慎地提出了我的问题:“这可能有点天真,但是,有可能在内部生成完整的车辆信息吗?”。答案是:“我们考虑过,但是 VIN 不包含那么多信息;你怎么看?”因为我也还没有一个清晰的想法,所以会上没有太多的讨论;但至少我知道这是一个未触及的想法,我要求一周的时间来探索这个方向。
一周的时间肯定非常紧张,所以我的第一个方法是寻找可以立即提高数据覆盖率的业务逻辑。经过一番挖掘,我找到了一个“解决方案”:如果我们知道某个特定的车辆型号根本没有可用的选项,那么我们可以声明我们知道这个车辆的完整配置。这在某种意义上感觉像是欺骗,然而,从产品的角度来看,知道我们有完整的配置是有帮助的,即使配置什么也没有。
我的论点:虽然它什么都没有,但现在我们知道了这个事实;这很有价值。
接下来的一周,我与团队分享了这一见解,每个人都很高兴看到这一简单探索带来的“免费”覆盖率提升。然而,我们也知道这不是一个通用的解决方案,只有这么多的车辆型号没有可用的选项,我们不能将其扩展到所有的车辆。所以我要求额外的两周时间来寻找一个更具可扩展性的解决方案,并且得到了批准:这个“虚拟解决方案”给我带来了更多的时间:)
证明概念是一个简单但可扩展的解决方案
事实是:除非我们有一些额外的信息,否则没有办法完全根据 VIN 号来识别所有的车辆选项。因此,我深入研究,发现了一些有用的东西:每个 VIN 都与一个固定的制造商建议零售价(MSRP)相关联,同时,每个车型也有一个固定的基础版本 MSRP,因此“VIN MSRP”和“基础 MSRP”之间的差异是“总选项 MSRP”,这将是我们所有库存车辆的额外信息。
现在让我们考虑以下情况:你有一辆汽车,VIN 显示 22K 的建议零售价,车辆型号(例如丰田凯美瑞 le)有 20K 的基本建议零售价,现在所有增加的选项都有 22K-20K=2K 的建议零售价。假设该车辆模型有 4 个可用选项:它们的 MSRP 标签分别为 1.5K、1.0K、0.5K、0.2K。汽车上安装的正确选项是什么?

给定 4 个可用选项的情况,找出答案是非常简单的:我们只需列举所有可能的选项组合,并检查每个组合是否具有相同的总选项 MSRP。如果它是唯一的匹配,我们可以声称该选项组合是正确的车辆配置。
您可能会立即看到这种方法有两个挑战:1 .同一个 MSRP 可能有多个配置匹配,那么如何找到合适的呢?2.选项组合随着可用选项#呈指数增长,这可能是一个大问题。然而,我可以执行以下两条规则来绕过挑战:1 .如果只有一个配置与 MSRP 匹配,则仅声明正确的配置;2.设置超时阈值(例如,每个 VIN 30 秒)以确保计算按时完成。现在,我们有了解决方案!该解决方案非常简单,可扩展至所有车辆库存。虽然我们没有完全解决上述已知的挑战(我们只是绕过它们),但这已经比我们的“虚拟解决方案”前进了一大步。
我们很快测试了这个想法,事实上,覆盖范围有了很大的提高;但是,我们离目标还有差距。这主要是因为许多车型有 30 ~ 60 种选择,极端情况下可达 100 种。在 40 个可用选项的情况下,需要评估 2⁴⁰配置,这超过一万亿个配置!许多 vin 达到超时阈值,并且根本不返回任何选项组合。现在我们知道指数级增长的计算成本是一个限制因素,并且根据定义这是一个 NP-hard 问题,我们应该如何进一步进行?
为可扩展的解决方案开发高级算法
当面临如此严峻的挑战时,我会在圣莫尼卡海滩外面散步,让新鲜空气清理我的思绪。由于我在业余时间上了各种课程,有一门恰好是离散优化,一个算法跳入我的脑海:约束编程。
关于约束编程的高级概念是,您不需要穷尽搜索所有的配置空间。您可以构建约束,以便某些配置永远不会被访问。例如,如果总选项 MSRP 为 1K,则不可能添加 1.5K 选项,因此没有必要评估任何具有 1.5K 选项的配置;另一方面,如果总选项 MSRP 是 10K,一个选项“A”是 5K,所有其他选项 MSPR 加起来是 8K,那么你知道选项“A”肯定在这个车辆上,没有“A”的任何配置都不必考虑。
以下可视化说明了这样一个事实,即约束编程算法通过避免进入违反约束的节点,充当搜索所有配置(表示为二叉树)的智能向导。在这个例子中,配置空间具有 2⁴ = 16 个组合,并且该算法仅需要 5 次移动。

在 Python 的帮助下,我把算法编码成了一个包(一个最小可行的数据产品),把一个现有车辆库存的样本注入到流程中:有效!现在我有充分的信心,我们可以达到覆盖目标!这对团队来说是一个大新闻,每个人都期待着算法的生产:现在,项目从“业务开发驱动”转变为“数据科学驱动”,我们得到了构建数据产品的全面支持。
为了推广我们的成果,我将其命名为“BuildX 项目”
构建一个数据产品有多层复杂性:算法只是其中的一部分。最终,我们交付了它。为了向外部团队推销这个数据产品和我们的成果,我给它起了个名字:“BuildX 项目”。“构建”部分代表了我们正在重建车辆配置的事实,而“X”部分编码了所有的算法复杂性,并使其感觉神秘而强大。人们可以在我们提交的专利中看到关于该架构的更多细节,下面的图表显示了高级系统架构。

我们的合作团队喜欢这个名字!在他们倡导数据产品的力量的帮助下,我们将代码与其他后端系统集成,最终,团队实现了数据覆盖的目标。这个故事有一个快乐的结局。
创新的公式
回顾过去,一切看起来都是如此精心策划:创新就发生在那里!“为什么”的问题,简单的解决方案,然后神奇的海滩漫步导致了“可扩展的解决方案”。然而,在发生这种事情的时候,感觉很没有计划:我问了几个“为什么”的问题,因为我对现有的系统不太了解;我碰巧早几个月上了离散优化课,因为它刚刚在 Coursera 上发布;我开始有规律的沙滩漫步是因为公司组织了一次“散步比赛”(而我没有赢…)。那么这些随机的东西,一旦放在一起,是如何变成“增值”创新的呢?有没有一个创新的秘密公式,不知何故我准确地执行了它?
不幸的是,创新没有神奇的公式,没有确定的公式。从积极的一面来看,我发现了几个有助于促进创新的元素:有了这些元素,你就更有可能给项目带来创新。这些要素是:
- 挑战现状,恭敬地。这通常与“为什么”这个问题相吻合:不管现状的解决方案有多好,在问了几个“为什么”之后,你会发现有些地方可以改进。
- 不断学习。你舒适区之外的任何知识都值得学习:深入某个领域有助于第一类创新,拓宽相关领域有助于第二类创新。
- 把点点滴滴。“点”指任何知识、经验、教训。放松你的思维,让你的大脑把相关的点联系在一起。一旦它们连接起来,奇迹就会发生。
为了结束这个故事,我想再分享一个关于创新的“不确定性”本质的评论:你可能会问很多很棒的“为什么”问题,学习 10+门与你的领域相关的课程,并不断思考如何将“点”与特定项目联系起来。然而,该项目只是让所有组件运行良好,你不能带来革命。这会是一个悲伤的创新故事吗?我不这么认为。尽管成功创新的结果是有回报的,但通往创新的道路才是最重要的。当一个人开始创新,就像在沙滩上散步,你开始环顾四周,突然注意到沙滩上有一个闪亮的物体;你把它捡起来,掸掉灰尘,擦掉污垢,发现它是意想不到的东西。它可能是一颗巨大的珍珠,如果是这样,你真幸运!它也可能是一个漂亮的、形状良好的贝壳,你可以把它装饰在书桌上。偶然发现的时刻会带来更多的快乐,这是创新最令人兴奋的部分;我希望你喜欢。

照片由 Aaron Burden 在 Unsplash 上拍摄
*该文章也可在 LinkedInhttps://www . LinkedIn . com/pulse/how-innovate-data science-pan-Wu上查阅
如何使用 Python 和 Boto3 库为 DynamoDB 插入记录和进行条件删除
一个教程,展示了如何使用 Python 和 Boto3 库以编程方式插入多条记录并按条件删除项目

丹尼尔·冯·阿彭在 Unsplash 上的照片
介绍
出于测试目的,我们的 DynamoDB 表中有许多垃圾或虚假记录是很常见的。它可能是我们正在开发的一个应用程序,甚至只是一个功能。它也可以是我们现有的应用程序生成的一些记录,但实际上,它们没有值。不管它是什么,我们最终都会在数据库中创建许多记录。
我们时常想要清理数据库表,因此只存储有价值和有意义的记录。例如,我们做了一个负载测试来测试应用程序中的用户帐户创建 API。这显然导致了表中的许多记录,这些记录只是“测试”记录。所有这些“测试”记录都具有邮件以testing开头,姓氏以TEST开头的特征。你知道,不管怎样。😆显然,一旦我们完成了负载测试,这些记录就可以从表中删除。
你会学到什么
在本教程中,您将学习如何使用 Python 从 DynamoDB 表中插入项目和有条件地删除项目,无论出于什么原因,您都不想再保留这些项目。我们将使用 Python 的官方 AWS SDK 库,它被称为Boto3。
先决条件
设置虚拟环境
我不打算做详细的演练,但会通过virtualenv快速展示给你如何做。
首先,你需要通过pip3安装virtualenv,如果你还没有安装的话。这很简单,因为:
$ ~/demo > pip3 install virtualenv
然后,创建一个目录来存放项目文件(或者在本例中是 Python 脚本)。
$ ~/demo > mkdir batch-ops-dynamodb
转到目录并在那里创建虚拟环境。
$ ~/demo > cd ./batch-ops-dynamodb$ ~/demo/batch-ops-dynamodb > virtualenv ./venvUsing base prefix '/Library/Frameworks/Python.framework/Versions/3.8'
New python executable in /Users/billyde/demo/batch-ops-dynamodb/venv/bin/python3.8
Also creating executable in /Users/billyde/demo/batch-ops-dynamodb/venv/bin/python
Installing setuptools, pip, wheel...
done.
最后,我们希望激活虚拟环境。快速提醒一下,虚拟环境非常有用,因为它将您的开发与机器的其他部分隔离开来。可以将它想象成一个容器,其中所有的依赖项都在虚拟环境中提供,并且只能从环境中访问。
$ ~/demo/batch-ops-dynamodb > source ./venv/bin/activate$ ~/demo/batch-ops-dynamodb (venv) >
注意(venv)。这表明您处于虚拟环境中。但是,根据终端的设置,您可能看不到这一点。因此,作为一种替代方法,这就是为什么您可以验证您的虚拟环境是否处于活动状态。
$ ~/demo/batch-ops-dynamodb (venv) > which python
/Users/billyde/demo/batch-ops-dynamodb/venv/bin/python$ ~/demo/batch-ops-dynamodb (venv) > which pip
/Users/billyde/demo/batch-ops-dynamodb/venv/bin/pip
您可以看到 Python 和 pip 可执行文件来自我们的虚拟环境。一切都好。🙂
安装依赖项
本教程唯一的依赖项是Boto3库。因此,让我们继续在我们的虚拟环境中安装它。
$ ~/demo/batch-ops-dynamodb (venv) > pip install boto3Collecting boto3
Downloading boto3-1.11.7-py2.py3-none-any.whl (128 kB)
|████████████████████████████████| 128 kB 1.0 MB/s
Collecting botocore<1.15.0,>=1.14.7
Downloading botocore-1.14.7-py2.py3-none-any.whl (5.9 MB)
|████████████████████████████████| 5.9 MB 462 kB/s
Collecting s3transfer<0.4.0,>=0.3.0
Downloading s3transfer-0.3.1-py2.py3-none-any.whl (69 kB)
|████████████████████████████████| 69 kB 2.1 MB/s
Collecting jmespath<1.0.0,>=0.7.1
Using cached jmespath-0.9.4-py2.py3-none-any.whl (24 kB)
Collecting urllib3<1.26,>=1.20
Downloading urllib3-1.25.8-py2.py3-none-any.whl (125 kB)
|████████████████████████████████| 125 kB 5.3 MB/s
Collecting python-dateutil<3.0.0,>=2.1
Using cached python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
Collecting docutils<0.16,>=0.10
Using cached docutils-0.15.2-py3-none-any.whl (547 kB)
Collecting six>=1.5
Downloading six-1.14.0-py2.py3-none-any.whl (10 kB)
Installing collected packages: urllib3, six, python-dateutil, docutils, jmespath, botocore, s3transfer, boto3
Successfully installed boto3-1.11.7 botocore-1.14.7 docutils-0.15.2 jmespath-0.9.4 python-dateutil-2.8.1 s3transfer-0.3.1 six-1.14.0 urllib3-1.25.8
一旦您完成了先决条件,我们就可以开始做有趣的事情了,那就是编写实际的脚本来批量删除我们的垃圾记录。
启动本地 DynamoDB 实例
为了帮助我们了解脚本是如何工作的,我们将在 Docker 容器中启动一个本地 DynamoDB 实例。你可以按照这个教程来实现这个。
本质上,你需要做的是启动 DynamoDB Docker 并创建教程中写的表demo-customer-info。
在表中创建虚拟记录
让我们创建虚拟记录,这样我们可以看到批处理操作是如何工作的。为此,我们将编写一个 Python 脚本,在一个循环中调用 DynamoDB PutItem操作。在batch-ops-dynamo中新建一个 Python 文件,命名为insert_dummy_records.py。
~/demo/batch-ops-dynamodb ❯ touch insert_dummy_records.py
正如前面介绍部分提到的,我们的虚拟记录将具有以下特征:
- 姓氏以
TEST开头 - 电子邮件地址以
testing开头
我们的脚本将包含以下组件:
insert_dummy_record:执行PutItem操作的功能for loop:将调用insert_dummy_record函数 10 次以插入虚拟记录的循环。
我们还利用random.randint方法生成一些随机整数,添加到我们的虚拟记录的属性中,它们是:
customerIdlastNameemailAddress
insert _ dummy _ records.py 将虚拟记录插入到表中
我们的剧本看起来不错!现在,是时候从命令行运行它了,使用来自我们虚拟环境的 Python 可执行文件。
~/demo/batch-ops-dynamodb ❯ python3 insert_dummy_records.pyInserting record number 1 with customerId 769
Inserting record number 2 with customerId 885
Inserting record number 3 with customerId 873
Inserting record number 4 with customerId 827
Inserting record number 5 with customerId 231
Inserting record number 6 with customerId 199
Inserting record number 7 with customerId 272
Inserting record number 8 with customerId 268
Inserting record number 9 with customerId 729
Inserting record number 10 with customerId 289
好的。这个脚本看起来像预期的那样工作。万岁!😄
让我们通过调用本地 DynamoDB demo-customer-info表上的scan操作来检查记录。
~/demo/batch-ops-dynamodb ❯ aws dynamodb scan --endpoint-url [http://localhost:8042](http://localhost:8042) --table-name demo-customer-info{
"Items": [
{
"customerId": {
"S": "199"
},
"lastName": {
"S": "TEST199"
},
"emailAddress": {
"S": "[testing199@dummy.com](mailto:testing199@dummy.com)"
}
},
{
"customerId": {
"S": "769"
},
"lastName": {
"S": "TEST769"
},
"emailAddress": {
"S": "[testing769@dummy.com](mailto:testing769@dummy.com)"
}
},
... truncated
... truncated
... truncated
{
"customerId": {
"S": "827"
},
"lastName": {
"S": "TEST827"
},
"emailAddress": {
"S": "[testing827@dummy.com](mailto:testing827@dummy.com)"
}
}
],
"Count": 10,
"ScannedCount": 10,
"ConsumedCapacity": null
}
完美!我们的表中现在有一些虚拟记录。
将“真实”记录插入表中
我们将快速向表中插入两条“真实”的记录。为此,我们将编写另一个 Python 脚本,它将命令行参数作为输入。我们把这个文件命名为insert_real_record.py。
~/demo/batch-ops-dynamodb ❯ touch insert_real_record.py
该文件的内容如下。
insert _ real _ record.py 将“真实”记录插入到表中
让我们继续向表中插入 2 条记录。
~/demo/batch-ops-dynamodb ❯ python insert_real_record.py 11111 jones [sam.jones@something.com](mailto:sam.jones@something.com)Inserting record with customerId 11111~/demo/batch-ops-dynamodb ❯ python insert_real_record.py 22222 smith [jack.smith@somedomain.com](mailto:jack.smith@somedomain.com)Inserting record with customerId 22222
编写根据条件删除记录的脚本
最后,我们将编写脚本,从表中删除满足某些指定条件的记录。
再次提醒,我们要删除我们插入的虚拟记录。我们需要应用的过滤器是姓氏以TEST开头,电子邮件地址以testing开头。
脚本的工作原理:
- 用给定的过滤表达式在表上执行
scan操作 - 只从所有记录中检索符合我们的过滤表达式的
customerId属性,因为这是我们做DeleteItem操作所需要的。记住,customerId是表的分区键。 - 在
for loop中,对于我们scan操作返回的每个customerId,进行DeleteItem操作。
Delete _ records _ conditionally . py-按过滤器删除记录
继续从命令行运行这个脚本。
~/demo/batch-ops-dynamodb ❯ python delete_records_conditionally.pyGetting customer ids to delete
============
['199', '769', '873', '268', '289', '231', '272', '885', '729', '827']
Deleting customer 199
Deleting customer 769
Deleting customer 873
Deleting customer 268
Deleting customer 289
Deleting customer 231
Deleting customer 272
Deleting customer 885
Deleting customer 729
Deleting customer 827
太好了!该脚本按预期工作。现在,让我们检查表中剩余的记录。
~/demo/batch-ops-dynamodb ❯ aws dynamodb scan --endpoint-url [http://localhost:8042](http://localhost:8042) --table-name demo-customer-info{
"Items": [
{
"customerId": {
"S": "22222"
},
"lastName": {
"S": "smith"
},
"emailAddress": {
"S": "[jack.smith@somedomain.com](mailto:jack.smith@somedomain.com)"
}
},
{
"customerId": {
"S": "11111"
},
"lastName": {
"S": "jones"
},
"emailAddress": {
"S": "[sam.jones@something.com](mailto:sam.jones@something.com)"
}
}
],
"Count": 2,
"ScannedCount": 2,
"ConsumedCapacity": null
}
只剩下 2 条记录,这是我们插入的“真实”记录。我们现在可以确定我们的delete_records_conditionally.py脚本做了它想要做的事情。
很棒的东西。👍
删除脚本的一些细节
让我们来看看我们刚刚编写的delete_records_conditionally.py脚本中的一些内容。
注意,我们有一个deserializer,我们用它来获取customerId。原因是因为,scan操作实际上会返回这样的结果。
# scan operation response{'Items': [{'customerId': {'S': '300'}}, {'customerId': {'S': '794'}}, {'customerId': {'S': '266'}}, {'customerId': {'S': '281'}}, {'customerId': {'S': '223'}}, {'customerId': {'S': '660'}}, {'customerId': {'S': '384'}}, {'customerId': {'S': '673'}}, {'customerId': {'S': '378'}}, {'customerId': {'S': '426'}}], 'Count': 10, 'ScannedCount': 12, 'ResponseMetadata': {'RequestId': 'eb18e221-d825-4f28-b142-ff616d0ca323', 'HTTPStatusCode': 200, 'HTTPHeaders': {'content-type': 'application/x-amz-json-1.0', 'x-amz-crc32': '2155737492', 'x-amzn-requestid': 'eb18e221-d825-4f28-b142-ff616d0ca323', 'content-length': '310', 'server': 'Jetty(8.1.12.v20130726)'}, 'RetryAttempts': 0}}
由于我们只对customerId的值感兴趣,我们需要使用 Boto3 库提供的TypeDeserializer去序列化 DynamoDB 项。
另一个值得一提的组件是Select和ProjectionExpression,它们是scan函数的参数。这两个参数密切相关。我们将Select的值设置为SPECIFIC_ATTRIBUTES,根据 Boto3 官方文档,这将只返回AttributesToGet中列出的属性。AttributesToGet已被标记为遗留参数,AWS 建议我们改用ProjectionExpression。
来自 Boto3 官方文档:
如果使用 ProjectionExpression 参数,则 Select 的值只能是 SPECIFIC_ATTRIBUTES。Select 的任何其他值都将返回错误。
这 2 个参数基本上是在说scan操作应该只返回customerId属性,这是我们需要的。
最后,我们使用 AWS 提供的begins_with()函数。这个函数使用属性名和前缀来检查指定属性的值。
包裹
至此,您已经学会了如何使用 Python 和 Boto3 插入和删除 DynamoDB 记录。您当然可以调整和修改脚本来满足您的需要。例如,本教程中使用的过滤器表达式相对简单,如果需要,您可以添加更复杂的条件。
不管怎样,我希望这篇教程已经让你对如何使用 Python 进行 DynamoDB 操作有了基本的了解。所以,继续发挥你的创造力,利用这个脚本,增强它,做更高级的东西。黑客快乐!🙂
注:这里是 Github 回购。

安东尼奥·加波拉在 Unsplash 上的照片
如何为 Python 轻松安装 Spark
分三步在 Windows 10 上安装 PySpark

费德里科·贝卡里在 Unsplash 上的照片
简介
当我们处理大数据时,我们需要更多的计算能力,这可以通过多台计算机的分布式系统来实现。此外,为了有效地融入大数据生态系统,我们还需要一个集群计算框架,允许我们在大型数据集上快速执行处理任务。
两个最著名的集群计算框架是 Hadoop 和 Spark,它们都是免费开源的。
如果要比较 Apache Spark 和 Hadoop,可以说 Spark 在内存上快 100 倍,在磁盘上快 10 倍。
对于 on-perm 安装,Hadoop 需要更多的磁盘内存,Spark 需要更多的 RAM,这意味着建立一个集群可能非常昂贵。
今天,我们可以通过 AWS 和 Azure 提供的云计算服务来解决这个问题。如果您有兴趣了解更多关于它们的信息,特别是像云数据仓库这样的主题,让我向您推荐我的文章,您可以在这里找到。
相反,在本文中,我将向您展示如何安装名为 Pyspark 的 Spark Python API。在 Windows 10 上安装 Pyspark 需要遵循一些不同的步骤,有时我们会忘记这些步骤。所以,通过这篇文章,我希望给你一个有用的指南,让你毫无问题地安装 Pyspark。
第一部分:检查您的 Java 版本并下载 Apache Spark
我假设你的电脑上至少有 Python 版本。
所以,要运行 Spark,我们首先需要安装的是 Java。建议有 Java 8 或者 Java 1.8。
因此,打开命令提示符,用下面的命令控制 Java 的版本。如果你有老版本,可以在这里下载。
Java -version
出局:

作者图片
现在,我们必须下载 Spark,您可以在这里轻松找到。以下框架显示了您在站点中看到的步骤。
Download Apache Spark1\. Choose a Spark release: 3.0.0(Jun 18 2020)--selected2\. Choose a package type: Pre-built for Apache Hadoop 2.7 --selected3\. Download Spark: [spark-3.0.0-bin-hadoop2.7.tgz](https://www.apache.org/dyn/closer.lua/spark/spark-3.0.0/spark-3.0.0-bin-hadoop2.7.tgz)
上面你可以观察到我如何设置我的 Spark 版本。我选择了最近的 Spark 版本和 Apache Hadoop 2.7 的预构建包。
然后在第三步中,我们可以通过点击链接来下载我们的 Spark 版本,这将打开另一个网页,在该网页中,您必须点击建议的第一个下载版本。
下载完成后,将压缩文件解压到名为 spark 的文件夹中。记住这个文件夹的路径将在下一部分使用。
第二部分:下载 winutils.exe 并设置您的环境
第二步是下载winutils.exe你可以在这里找到。我的情况是选择了 hadoop-3.0.0 的版本,我下载了。你可以创建一个名为 winutils 的文件夹并把它放在那里。
现在,是时候建立我们的环境了。首先要做的是进入 windows 搜索栏,输入“编辑系统环境变量”。
去点击环境变量。

作者图片
当你将在系统变量的组中,创建三个名为 HADOOP_HOME 、 SPARK_HOME 和 JAVA_HOME 的变量。
- 在HADOOP _ HOME→放之前创建的位置 wintulis 文件夹的路径。
- 在SPARK _ HOME→放入你之前创建的 spark 文件夹的位置路径。
- 在 JAVA_HOME 中→放入你的 JAVA 程序的位置路径。
在下图中,你可以看到如何设置你的变量。

作者图片

作者图片
然后在变量路径下面可以看到,我们可以添加以下两条路径:
- %SPARK_HOME%\bin
- %JAVA_HOME%\bin

作者图片
第三部分:在你的蟒蛇身上运行它,飞到朱庇特
现在您可以打开 Anaconda 提示符,将目录更改为 SPARK_HOME 目录,并键入 bin\pyspark。
出局:

作者图片
所以,你准备飞往 Jupyter,用下面的代码尝试 Pyspark。如果没有错误,这意味着您的 Pyspark 已经正确安装。
import findspark
findspark.init()
结论
现在您已经有了 Pyspark,您可以开始通过进行一些数据操作来学习和练习它是如何工作的。如果你在安装上有困难,请随时联系我。
我发出一份期刊简讯。如果你想加入,请点击此链接报名。
除了我的简讯,还可以在我的电报群 数据科学初学者 中取得联系。
如何安装 MySQL 并创建雇员示例数据库
安装数据库以练习 SQL 的分步指南

数据科学家和分析师应该能够用 SQL 编写和执行复杂查询。如果您刚刚开始使用 SQL,或者正在寻找一个沙盒来测试查询,那么本指南就是为您准备的。
有一些很棒的 SQL 资源,比如 HackerRank 、 LeetCode 和 W3Schools ,但是我认为提高熟练程度的最好方法之一是使用您选择的 SQL 编辑器来练习您自己的数据库。
在本指南中,我们将完成以下步骤:
- 在 macOS 上安装 MySQL
- 添加 MySQL shell 路径
- 创建用户帐户
- 使用雇员数据创建示例数据库
- 编写 SQL 查询
什么是 MySQL?
MySQL 是最流行的开源 SQL 数据库管理系统,由 Oracle 公司开发。由
Stack Overflow 进行的 2020 年开发者调查从受欢迎程度方面证实了这一说法,如下所示。

https://insights . stack overflow . com/survey/2020 #技术-数据库
在 macOS 上安装 MySQL
我们将使用位于磁盘映像中的本地包来安装 MySQL 社区服务器 8.0.x。dmg)。
下载。dmg 版本从这里(找 DMG 存档)。这个版本将初始化数据目录并创建 MySQL 授权表。

https://dev.mysql.com/downloads/mysql/
点击Download按钮后,你将被带到一个页面,要求你“登录”或“注册”一个免费账户。点击
No thanks, just start my download可以绕过。

转到下载的文件,right click和Open.

跟着指示走,直到你到达Configuration.
对于Configuration,选择默认的Use Strong Password Encryption。点击这里阅读更多关于 MySQL 密码的信息。

输入root用户的密码。root 帐户是默认的超级用户帐户,拥有所有 MySQL 数据库的所有权限。
MySQL 现已安装。如果你打开System Preferences,你应该在你的面板中看到 MySQL,如下图所示。

macOS '系统偏好设置'
MySQL 偏好设置面板使您能够在 MySQL 安装的引导过程中启动、停止和控制自动启动。

MySQL 偏好设置面板
如果实例是而不是已经在运行,打开它并点击
Start MySQL Server。绿点表示服务器正在运行。
为了节省内存Start MySQL when your computer starts up,我个人没有选中这个框。
记得重启后启动服务器就行了。
在 macOS 中添加 MySQL Shell 路径
macOS 中用户的外壳路径是文件系统中的一组路径,由此用户有权使用某些应用程序、命令和程序,而无需在终端中指定该命令或程序的完整路径。
以下步骤将使我们能够在命令行(终端)的任何工作目录中输入命令mysql。
注意 zsh (Z shell)是 macOS Catalina 的默认 shell。如果你在不同的版本上,你可以试着使用下面的 bash 命令。
- 打开终端(
⌘+Space,输入Terminal) - 一旦你进入终端,输入
cd进入主目录 - 如果你正在使用 zsh ,键入
nano .zshrcT28【如果你正在使用 bash ,键入nano .bash_profile - 复制并粘贴这两个别名:
alias mysql=/usr/local/mysql/bin/mysql
alias mysqladmin=/usr/local/mysql/bin/mysqladmin

请注意,MySQL 前的井号(#)是注释行
5.保存文件control + O,用Enter确认,用control + X退出。
6。Quit ( ⌘+Q)终端并重新打开它
要测试服务器,请输入以下命令(您需要输入安装 MySQL 时创建的密码):
mysqladmin -u root -p version

创建用户帐户(可选)
您可能不想一直使用 root 帐户。您可以创建各种帐户并授予不同级别的权限。以下是步骤:
以 root 用户身份登录:
mysql -u root -p
在下面的命令中,用您选择的用户名和密码替换user和password。我建议您使用与 macOS 系统用户名相同的名称创建一个帐户。
CREATE USER ‘user’@‘localhost’ IDENTIFIED BY ‘root-password’;
以下语句将授予用户帐户对所有数据库的所有权限。用您选择的用户名替换user。使用引号(')。
GRANT ALL ON *.* TO ‘user’@‘localhost’ WITH GRANT OPTION;

这里有一个示例用户(miguel ),使用密码(pass)创建,并被授予完全访问权限(。)
尝试使用新创建的用户登录。首先,键入QUIT结束当前会话,并使用新凭证登录。例如:
mysql -u miguel -p
提示:因为‘Miguel’也是我的系统用户名,我可以简单地输入
mysql -p并省略-u miguel部分。
键入QUIT,但停留在终端并继续下一部分。
创建雇员数据库
雇员样本数据库由帕特里克·克鲁斯和朱塞佩·马霞开发,包含 400 万条记录。它包含虚假的员工数据,如工资、姓名、职称等。以下是模式:

https://dev.mysql.com/doc/employee/en/sakila-structure.html
首先,去 GitHub 上的员工数据库下载回购。
点击Code下载回购协议👉Download ZIP。


用户“miguel”在终端中的逐步过程
在“终端”中,切换到您存储文件的目录。就我而言:
cd Downloads
运行以下命令解压文件:unzip test_db-master.zip
如果不成功,您可以在 Finder 中手动打开文件test_db-master.zip。
将目录切换到解压后的文件夹:
cd test_db-master
现在您已经准备好安装数据库了。键入以下命令(用您自己的用户名替换user)。
mysql -u user -p < employees.sql
要测试安装,运行以下命令(替换user)。
mysql -u ‘user’ -p < test_employees_md5.sql
编写 SQL 查询
下面的笔记本包含几个简单的问题,让你开始。
你也可以在 Jupyter Nbviewer 上查看笔记本:
nbviewer.jupyter.org](https://nbviewer.jupyter.org/gist/corralm/7508d7120f36a13f68774fab13656dd7#Select-all-the-rows-in-the-employees-table)
如果您对在 Jupyter 中运行 SQL 查询感兴趣,请查看我的指南:
[## 如何在 Jupyter 中用 Pandas 运行和分析 SQL 查询
在 Jupyter 笔记本中运行 SQL 并在 Pandas 中进行分析的快速指南。
medium.com](https://medium.com/@corraljrmiguel/how-to-run-and-analyze-sql-queries-with-pandas-in-jupyter-7f02503cf46)
如果您有任何问题或意见,请告诉我。谢谢!
如何在 Windows 上安装 TensorFlow 2 对象检测 API
对最初的基于 Docker 的教程进行了一些修正

在 Unsplash 上由 You X Ventures 拍摄。使用本教程中提供的代码进行对象检测
R 最近,我需要为正在进行的概念验证运行一个对象检测模型。由于我使用的是 TensorFlow 2,对象检测 API 看起来很合适。然而,不幸的是,安装过程比看起来要麻烦得多,而且官方文档是基于 Docker 的,这对一个普通的 pip 包来说似乎是一个不必要的负担。长话短说,我卷起袖子穿过它,一步一步修复,直到它工作。在这里,我向你介绍如何做。
免责声明:我并不是以任何方式反对 Docker。
摘要
- 先决条件
- 在 Windows 上安装 pycocotools
- 介绍对象检测 API
- 测试您的安装
- 结束语
先决条件
我假设您熟悉 Python,正在使用某种虚拟环境,并且熟悉 TensorFlow。我使用 TensorFlow 2.3 和 Python 3.7.6 进行了安装过程。前者可能会在此过程中更新,因此如果您需要特定的版本,请记住这一点。
除了 Python 环境,您还需要一个文本编辑器和一个 Git 客户机。
如果你不是 TensorFlow 用户或数据科学家,只是想让对象检测算法工作,除了 Python 之外的所有依赖项都会被安装,所以你不需要自己安装 TensorFlow。在本文的最后,我提供了一个代码片段来对一个测试图像运行对象检测,以后您可以根据需要修改它。
在 Windows 上安装 pycocotools
TF 的许多对象检测 API 模块依赖于 pycocotools 包,该包无法通过 pip 安装在 Windows 上。如果您已经安装了这个包,您可以安全地跳过这一部分。如果没有,请按照下列步骤操作:
- 克隆官方知识库
- 导航到 PythonAPI 文件夹并打开 setup.py 文件
- 将第 12 行编辑为
extra_compile_args=[]。这里的基本原理是删除特定的铿锵论点,这在 MVCC 不起作用。 - 在 CMD 终端的 PythonAPI 文件夹中,运行:
python setup.py build_ext --inplace
这最后一个命令将在您当前的环境中构建和安装这个包,准备就绪。为了测试安装是否成功,启动 Python 并将其导入为:import pycocotools。
你可能会问,我们是否不应该添加 MVCC 特有的旗帜来取代铿锵的旗帜。我也有同样的疑惑,但是它工作得很好,我没有遇到任何错误。据我所知,最初的 Clang 标志是用来禁用某些警告并强制 C99 遵从性的。
安装对象检测 API
准备好 coco 工具后,我们可以转到实际的对象检测 API。遵循这些步骤(注意有些命令以点结束!):
- 克隆 TensorFlow 模型库。这个 repo 是一组 TF 相关项目的保护伞,Object Detection API 就是其中之一。
- 导航到”。/research/object _ detection/packages/tf2/"并编辑 setup.py 文件。从必需 _ 包列表中,删除 pycocotools 引用(第 20 行)。这一改变将防止安装过程试图从 pip 重新安装 pycocotools ,这将失败并中止整个过程。
- 将这个 setup.py 文件复制到。/research”文件夹,替换已经存在的 setup.py 。
- 打开研究文件夹中的 CMD,用
protoc object_detection/protos/*.proto --python_out=.编译协议缓冲区 - 如果前面的命令有效,应该不会出现任何内容。我知道这不是最直观的东西。之后,运行下面的:
python -m pip install .
如果我解释的一切都正确,并且你严格按照字面意思去做,安装过程应该会很顺利,大量的软件包现在已经安装到你的系统中了。
如果您的系统上没有protocol命令,您需要做的就是下载一个协议缓冲库的预编译版本,并将其添加到您的系统路径(或将其放在 Windows/system32/😈).
奇怪的是,对我来说,在这一切之后,我的 OpenCV 和 MatplotLib 包不再显示数字(cv2 . im show/PLT . show)。我通过使用pip install -U opencv-python opencv-contrib-python matplitlib重新安装两个包修复了这个问题。如果任何其他软件包在安装对象检测 API 后出现故障,尝试像我上面做的那样从 pip 更新它。
测试您的安装
有两种方法可以确定您当前的安装是否正确。第一个是运行库测试套件。在研究文件夹下打开 CMD,运行:
python object_detection/builders/model_builder_tf2_test.py
它应该打印很多东西,并告诉你所有的测试都成功了。
第二种方法是下载一个模型,并尝试用它进行一些推断。这里是用于推理和训练的官方协作笔记本。我不是笔记本的粉丝,所以这里是我的测试脚本,它期望一个test.png文件作为输入,一个 coco 标签图(你可以在这里找到),以及 CenterNet 模型。将所有内容放在一个文件夹中,并将下面的脚本添加到这个文件夹中:
最后,应该会弹出一个包含原始图像和检测覆盖图的图像,还应该会创建一个名为output.png的新文件。
这篇文章的封面图片是使用上面的脚本和来自 Unsplash 的这张图片生成的。如果一切都设置正确,并且您使用此图像作为输入,您应该得到与我相同的结果。
我希望这有助于您使用 TensorFlow 2 对象检测 API,并使您能够使用开箱即用的模型进行推理和训练。有了上面的脚本,应该不难理解如何在您的管道上应用这个 API,并将其更改为使用其他模型。有关实现及其质量/速度权衡的列表,请参考此列表。
如果您对本教程有任何问题,请留下您的评论,我将非常乐意帮助您跟踪问题,并用更新的信息更新本文。
如果你刚接触媒体,我强烈推荐订阅。对于数据和 IT 专业人员来说,中型文章是 StackOverflow 的完美组合,对于新手来说更是如此。注册时请考虑使用我的会员链接。你也可以直接给我买杯咖啡来支持我
感谢您的阅读:)
如何将细分网络模型与您的 iPhone 应用程序集成

Arnel Hasanovic 在 Unsplash 上拍摄的照片
分割图像中的感兴趣区域(ROI)是计算机视觉中的一个关键问题。随着深度学习的兴起,许多网络架构被提出来克服语义分割的挑战。几年前,在智能手机中部署一个经过训练的细分网络模型还远远不现实。然而,由于最近智能手机中的强大硬件加上我们可以使用的强大软件工具,在您的智能手机应用程序中部署一个分段网络只需要几行代码!
本文将带您完成将一个经过训练的细分模型与您的 iPhone 应用程序集成的过程。这个过程包括两个步骤:(1) 将模型转换为。mlmodel 格式和(2) 使用转换后的模型分割 ROI。为了让我们自己熟悉这两个步骤,我们将使用(使用 Keras 框架)训练的 U-Net 模型来分割外部眼睛图像的巩膜区域。
第一步:将模型转换为移动兼容格式
将 keras 模型转换为。mlmodel 格式,我们可以使用coremltools python 库。可以使用以下命令安装它。
pip install coremltools
安装库之后,下面的代码片段允许您执行转换,并将转换后的模型保存在指定的位置。
将. h5 模型文件转换为. ml 模型文件
步骤 2:使用转换后的模型分割 ROI
在获取。mlmodel 文件,将其拖放到 Xcode 导航区域的项目文件夹中。swift 中的Vision 库允许您使用。mlmodel 文件,当您将它与应用程序集成时。
我们首先将库——在本例中是UIKit和Vision——导入我们的代码,如下所示。
import UIKit
import Vision
然后我们用UIImagePickerControllerDelegate定义我们的 **class** ViewController,允许我们从我们的照片库中挑选一张图片。为了简单起见,我们不会在应用程序中添加任何文本字段或标签。
**class** ViewController: UIViewController,
UIImagePickerControllerDelegate,
UINavigationControllerDelegate { }
在这个类中,我们可以开始定义构建我们的应用程序的函数。首先,我们定义UIImageView属性,该属性将显示从照片库中选择的外部眼睛图像和分割结果。
**@IBOutlet** **weak** **var** photoImageView: UIImageView!
然后,我们可以通过下面的命令来定义分割模型。
**let** SegmentationModel = ScleraUNet()
然后我们定义视觉属性request和visionModel。
**var** request: VNCoreMLRequest?
**var** visionModel: VNCoreMLModel?
现在我们写一个设置 SegmentationModel和request的函数。
建立模型
这里你可以注意到VNCoreMLRequest的completionHandler被设置为一个我们还没有定义的叫做visionRequestDidComplete的函数。在visionRequestDidComplete功能中,我们可以包括在request使用分割模型输出分割掩模后应该执行的动作。我们将在本文后面定义visionRequestDidComplete函数。
为了在应用程序加载后设置模型,我们在**class** ViewController中添加了以下代码片段
**override** **func** viewDidLoad() {**super**.viewDidLoad()print("Setting up model...")
setupModel()
print("Model is ready")nameTextField.delegate = **self**}
现在我们可以编写函数,让我们从照片库中选择一个外部眼睛图像。
这样,我们可以通过photoImageView.image访问所选图像。
此外,我们希望有一个交互式按钮,将执行按下分割过程。
**@IBAction** **func** segementImage(**_** sender: UIButton){print("Segmenting... ")**let** input_image = photoImageView.image?.cgImagepredict(with: input_image!)}
按下按钮时,上述功能激活并运行predict功能。我们将在后面定义这个predict函数。
将上述代码片段添加到我们的代码中后,它会是这样的:
现在我们的代码差不多完成了。但是我们必须定义前面留下的visionRequestDidComplete和predict函数。我们将它们定义在**class** ViewController下面的**extension** ViewController中,如下所示。
在visionRequestDidComplete中,我们定义了模型预测分割结果后必须完成的任务。在这种情况下,我们希望将分割结果二值化并显示在我们之前定义的photoView上。
在我们的代码中添加了**extension** ViewController之后,它看起来会如下所示。
为了进一步完善我们的工作,我们可以在 UI 中添加一些标签、按钮和文本字段。在本例中,我们添加了几个标签、一个清除按钮和一个文本字段,该字段接受外部眼睛图像所属的主题名称。这里有一些我们新创建的简单应用程序运行的截图,它可以从给定的外部眼睛图像中分割巩膜区域。

左:应用程序的打开视图,中:从照片库中选择外部眼睛图像后的视图,右:巩膜区域被分割后的视图。(图片由作者提供)
也可以在原始图像上叠加分割蒙版,但不包括在这项工作中。
本文到此结束!希望它能帮助你将一个细分模型恰当地整合到你的 iPhone 应用中。
如何将数据科学整合到您的业务中
最大化你能力的 6 个步骤
在我作为数据科学顾问的工作中,我经常看到公司努力将数据科学有效地集成到他们当前的工作流程中。这不像雇佣新的数据科学家并让他们投入工作那么简单;你需要采取一些具体的步骤来帮助你的组织在这个领域取得成功。
这是将数据科学集成到您的业务中并使其为您服务的 6 个具体步骤。

步骤 1:理解什么是数据科学
在你把全部预算都花在数据科学资源上之前,你应该花些时间了解这个领域。数据科学不是银弹。你可能不会马上收到退货;这可能需要几个月甚至几年,取决于你的目标和你的团队。数据科学是一种逐步提高决策能力的方法。如果你期望太多太快,你可能会对结果失望。
第二步:检查你的数据流畅度
在之前的一篇文章(链接)中,我谈到了组织内部的数据流畅性水平。在你进一步研究数据科学之前,你应该反思你的公司所处的位置。就像一辆没有汽油的超级汽车,没有高质量的数据,数据科学不会走得很快。如果您处于数据流畅的早期阶段,您应该集中资源来改善您的数据策略和数据质量。
第三步:尝试一下数据科学
如果您的数据质量不错,尝试一下数据科学是有意义的。我建议尝试使用内部资源或外部顾问的小项目。这是让你的组织了解这个概念的一个很好的方式,而且你也可以在不雇佣整个团队的情况下获得快速的成功。通过这一过程,您将更好地了解贵公司对数据科学集成的能力和看法。
第四步:雇佣合适的人
此时,您应该能够确定数据科学在当前阶段是否适合您的公司。如果是的话,你应该开始雇佣你的团队。在我看来,数据科学团队的早期雇佣是最重要的。
您的第一个雇员应该能够从事数据科学,但也应该能够为组织建立数据战略。我个人建议雇佣你愿意管理你的数据科学团队的人。如果你先雇佣一群数据科学家,然后再雇佣一个经理,如果他们不能和睦相处,你可能会引起不必要的冲突。
第五步:获得认同
在我看来,得到整个公司的认可是决定数据科学团队是成功还是平庸的关键。您的组织必须发现数据科学是有用的,而作为领导者,您的工作就是让这个团队走向成功。新的数据科学团队很容易被拉到许多不同的方向,在开始时,您的团队应该只专注于明确定义的项目。
步骤 6:创建数据驱动的文化
很多公司实际上不会走到这一步。然而,如果你真的做到了这一步,你将会让你的组织获得前所未有的发展。在这个阶段,您应该将数据科学的元素集成到公司的大部分日常运营中。让数据科学家或分析师接触您业务的大部分领域有助于确定需要改进的领域,并可以消除以后的返工。
如何在 Visual Studio 代码中集成 Python 和 R
我最近在 Coursera 上开始了 IBM 数据科学课程,发现自己正在努力在我的 VSCode 中安装所需版本的 Python 和 R。由于我花了一个令人沮丧的晚上和几个 whiskys 来为我的 Windows 系统找到一个工作解决方案,我决定最好分享它,省得你在网上搜索正确的部分。
你需要什么?
- 微软的 Visual Studio 代码
- Python 语言
- 微软的 Python 扩展
- Don jaya manne 的 Python 扩展包
- R 语言
- Randy Lai 和 Kun Ren 的 R languageserver 包
- 上田祐挥的 VSCode R 扩展
- 弧度作者兰迪·赖
步骤 1:安装 Visual Studio 代码
VSCode 通常是免费的,但更多的选项(如 Azure DevOps Server)可以通过专业版或企业版许可证购买。然而,在我看来,免费版本对于个人使用来说已经足够了。
要安装免费版本的 VSCode,您需要首先从微软官方网站下载您各自平台的执行文件。
下载完成后,启动执行文件并遵循安装指南。安装不需要任何管理权限。然后启动 VSCode,主屏幕将弹出。

VSCode 主屏幕。图片作者。
步骤 2:安装 Python 语言
要在 VSCode 中安装 Python,首先需要下载并安装一个 Python 解释器。您需要哪个解释器取决于您的具体需求,但是,您可以在 Python 的官方下载页面上找到所有可用的解释器。在我写这个故事的时候,版本是 3.9.0。是最新的。
下载完执行文件后,打开它,您将看到以下窗口。

Python 3.9.0 安装程序。图片作者。
如果您对所使用的机器没有任何管理员权限,请确保在单击“立即安装”之前取消选择“为所有用户安装启动器(推荐)”选项。
要检查安装是否成功,请打开命令控制台并执行以下命令:
py -3 --version
输入命令后,应该可以看到以下输出:

显示当前 Python 版本的 Windows 命令控制台。图片作者。
步骤 3:在 VSCode 中包含 Python
打开 VSCode,然后按 Ctrl + Shift + X 打开扩展选项卡。在搜索栏中键入“Python ”,选择 Microsoft 的 Python 扩展并安装。

微软的 Python 扩展包。图片作者。
理论上,您现在已经准备好通过 VSCode 用 Python 编码了。不过我会强烈推荐安装之前 Don Jayamane 的 Python 扩展包。它包括进一步的扩展,通过添加不同的语法高亮选项和基于人工智能的完成项目建议,使您的生活更加轻松。要安装 Don 的扩展包,只需在搜索功能中输入“Python 扩展包”,点击安装即可。

Don Jayamanne 的 Python 扩展包。图片作者。
要启动新的 Python 项目,请按 Ctrl + Shift + P 打开 VSCode 中的命令行,然后键入“Python:Create New Blank Jupyter Notebook”。按回车键,VSCode 将为您打开一个新的 Jupyter 笔记本:

VSCode 中的 Jupyter 笔记本。图片作者。
如果您想在不同的 Python 解释器之间切换,您不需要导入或卸载不同的版本。您可以简单地在 VSCode 中链接不同的 Python 解释器,然后随意在它们之间切换。为此,请按 Ctrl + Shift + P 打开命令行并键入“Python: Select interpreter”。VSCode 将显示当前活动的解释器和其他选项。要添加一个新的解释器,只需将路径复制到相应的执行文件,然后按回车键。

VSCode 中的 Python 解释器选择命令。图片作者。
步骤 4:安装 R 语言
首先,你需要去 R-Project 的官方网站选择一个你附近的 CRAN 服务器位置。一旦你选择了 Windows 版的下载,点击“第一次安装 R”然后“下载 R 4.0.3 for Windows 版”。版本号可能会有所不同,这取决于您阅读本文的时间。

R-Project 4 . 0 . 3 Windows 版的下载页面。图片作者。
拥有管理员权限的每个人都可以执行下载的文件,遵循安装说明并跳到步骤 5。对于没有管理员权限的每个人,您需要执行以下操作。
打开一个文件窗口,转到 c 盘上的用户文件夹。在这里,创建一个文件夹,您可以在其中解压缩安装。我把我的名字命名为“R”。
C:\Users\<user_name>\R
创建文件夹后,正常安装 R,但选择新创建的文件夹作为安装位置,而不是默认位置。安装程序将在您的位置下创建一个名为的新文件夹:
C:/Users/<username>/R/R-<version number>
接下来,在“R”文件夹下创建一个新文件夹,并将其命名为“R-library”:
C:\Users\<username>\R\R-Library
然后导航到 R 执行文件并打开它:
C:\Users\<username>\R\R-<version number>\bin\R.exe
运行 R 终端后,输入以下代码并复制目录。
path.expand("~")
这将告诉你启动时 R 在哪个目录下工作。在我的例子中,它看起来如下:
[1] "C:\\Users\\maurice.buettgenbach\\Documents"
打开各自的目录,创建一个名为“”的新文本文件。RProfile”。你可以通过记事本应用程序做到这一点,但要确保文件没有附加经典的。txt "扩展名。将以下代码粘贴到文件中,并将文件路径与 R-Library 的用户文件夹交换:
.First <- function() {
path_to_libraries <- "C:/Users/<username>/R/R-Library"
.libPaths(c(path_to_libraries, .libPaths()))
}
r 将运行。First()函数,并执行。libPaths()函数告诉 R 安装并访问 R-Library 文件夹中的包。继续之前关闭 R。
步骤 5 :将 R 整合到 VSCode
为了使 R 在 VSCode 中的集成成为可能,我们必须首先安装 Randy Lai 和 Kun Ren 开发的语言服务器协议。R 的 LSP 提供了一个框架,在这个框架下,语言能够与我们选择的编辑器进行通信。
要安装该软件包,请打开 R 并在控制台中输入以下命令:
install.packages(“languageserver”)
接下来,打开 VSCode 并安装上田祐挥的“R”扩展。这个扩展增加了快捷方式,使您能够直接在工作区中运行代码,并更容易地查看数据帧。它现在还包括支持代码语法和高亮显示的功能(类似于旧的 LSP 客户端)。

r 上田祐挥的延期。图片作者。
你现在需要安装的最后一个东西是 Randy Lai 的 Radian。Radian 是 R 程序的另一个控制台,具有多行编辑和语法突出显示功能。因为 Radian 是用 python 编写的,所以您可以通过 Python pip 命令轻松安装它。要安装 Radian,请在 VSCode 中打开一个 Jupyter 笔记本并执行以下命令:
pip install -U radian

在 VSCode 中为-U radian 执行了 pip 安装命令。图片作者。
最后,您需要更改 VSCode 设置,以便在编辑器中启用 R。为此,请按 Ctrl + Shift + P,输入“首选项:打开设置(JSON)”,然后按 Enter 键。这将打开编辑器的 settings.json。将以下代码添加到 JSON 文件中,调整到您的设置的相应路径并保存文件。
"r.bracketedPaste": true,"r.rterm.windows": "<Path_to_radian_.exe","r.lsp.path": "<Path_to_R_.exe>","r.lsp.debug": true,"r.lsp.diagnostics": true,"r.rterm.option": ["--no-save","--no-restore","--r-binary=<Path_to_R_.exe>"],
下面是它在我的 settings.json 中的样子:

我个人 VSCode 的 Settings.json。图片作者。
然后关闭设置文件并打开浏览器。为了测试是否一切都正常工作,创建一个测试文件,并确保它有各自的”。r "结尾。用 VSCode 打开文件,并键入:
print("Hello world", quote = FALSE)
现在,您可以通过按 Ctrl + Shift + S 来运行代码。结果,您应该在终端中收到“Hello world”作为输出,如下图所示。您现在可以在 VSCode 中使用 R 了!

在 VSCode 中执行 R 代码。图片作者。
如何在 Python 中与 API 交互

实践教程
本文介绍了如何用 Python 编程语言处理 API 调用
答 PIs(应用编程接口)对开发、软件和编程社区有着巨大的影响。API 不仅有用,而且很多 API 在进行基本交互时都非常简单。编程语言可以与 API 交互,并执行任务以实现特定的结果。在本文中,我们将使用 Python 来实现这一目的。Python 是我最喜欢的语言之一,它有特别有用的模块来与 API 交互。如果你还没有看过我的一些关于 Python 语言的历史、概述、基础知识和 ide 的文章,我会把它们放在下面。
我将在这里包含我的 GitHub 库的相关代码。
Python 编程语言是一种通用的编程语言,它已经在主流编程语言中占有一席之地
medium.com](https://medium.com/python-in-plain-english/a-brief-history-of-the-python-programming-language-4661fcd48a04) [## Python 基本概述
Python 有许多独特的特性,这些特性帮助它成为现在的样子。这些功能包括:
medium.com](https://medium.com/python-in-plain-english/python-basic-overview-76907771db60) [## Python 初学者完全参考指南
Python 是一种很好的初学者语言,但也适合高级用户。我将深入核心…
medium.com](https://medium.com/python-in-plain-english/python-beginners-reference-guide-3c5349b87b2) [## Python 的最佳 ide 和文本编辑器
我无法告诉你正确的 IDE(集成开发环境)对任何编程项目有多重要。只是…
medium.com](https://medium.com/analytics-vidhya/the-best-ides-and-text-editors-for-python-872ff1176c92)
如果你以前从未使用过 API,你应该学习 HTTP 方法。在这篇文章中,我将只讲述基础知识。我还建议 Postman 在开始使用 HTTP 方法时学习并完成基本任务。Postman 还有其他几个用途。
进行任何种类的 API 调用——REST、SOAP 或普通 HTTP——并轻松检查最大的响应。邮递员也有…
www.postman.com](https://www.postman.com/)
我们将在本文中介绍的主要 HTTP 方法如下:
- GET — HTTP 客户端使用 GET 方法从服务器单向检索数据到客户端。
- POST — HTTP 客户端使用 POST 方法向服务器单向发送数据到服务器。(尽管我们使用 Python 方法来实现这一点)
本文将只介绍在 Python 中使用 HTTP 方法的基础知识。我们也将只讨论 REST APIs。我将在这个项目中使用 JetBrains PyCharm IDE。
[## py charm:JetBrains 为专业开发人员提供的 Python IDE
在 PyCharm 处理日常事务时节省时间。专注于更大的事情,拥抱以键盘为中心的方法…
www.jetbrains.com](https://www.jetbrains.com/pycharm/)
因此,假设我们想每天获取一次第二天的天气,并自动获取包含该内容的电子邮件。
为此,我们将使用 OpenWeatherMap API 和 Google Gmail API:
简单快速和免费的天气 API,你可以访问当前的天气数据,每小时,5 天和 16 天…
openweathermap.org](https://openweathermap.org/api) [## Gmail API |谷歌开发者
这个视频向开发人员展示了编程访问电子邮件的历史,以及为什么要开发一个…
developers.google.com](https://developers.google.com/gmail/api/)
首先,你必须在 OpenWeatherMap 注册一个账户,这意味着根据他们的政策,你必须符合条件。创建帐户后,您将被带到主页面板。导航至 API 键选项卡。这是我们用 Python 编写 GET 请求时需要的关键。然后去他们网站的 API 版块。点击一个调用 API 。
https://api.openweathermap.org/data/2.5/onecall?lat={lat}&lon={lon}&exclude={part}&appid=[{API key}](https://home.openweathermap.org/api_keys)
现在我将requests模块导入 Python。我还需要pandas模块。
import requests
import pandas as pd
然后,我将使用来自 requests 模块的 GET 请求来检索关于天气的数据,我想从这些数据中获取信息。使用 OpenWeatherMap One Call API,您可以构建一个查询字符串。查询字符串是 URL(统一资源定位符)的一部分,它使用键和值来执行大量的过程和功能。?之后的所有内容都是查询字符串。
response = requests.get("https://api.openweathermap.org/data/2.5/onecall?lat=42.937084&lon=-75.6107&exclude=current,minutely,hourly,alerts&appid=redacted&units=imperial").json()
我使用参数exclude=和值current,minutely,hourly,alerts向服务器请求每日数据,以过滤我的结果。在这个例子中,我将使用纽约的坐标,但是您可以使用您选择的任何纬度和经度。
我现在将使用来自pandas模块的json_normalize()方法将我们的数据正确地格式化成 Pandas 数据帧。我还将使用record_path=参数来关注对我所需要的重要的元数据。
responseData = pd.json_normalize(response, record_path="daily")
您可以通过在 API 文档的响应数据部分中查找来找出您需要的元数据。现在,我将通过对数据进行切片来获取我需要的信息。
**# get only tomorrows data
responseData = responseData[1:2]****# convert the precipitation to a percentage
responseData[’pop’][1] *100**
打印结果。我使用 alt 命令来获取度数符号。
ALT 248 | ALT 0176。
print(f"Tomorrow will have a low of: {responseData['temp.min'][1]}°.")
print(f"Tomorrow will have a high of: {responseData['temp.max'][1]}°.")
print(f"Tomorrow will have a {responseData['pop'][1]}% chance of precipitation.")msg_text = f"Tomorrow will have a low of: {responseData[’temp.min’][1]}°, a high of: {responseData[’temp.max’][1]}°, and a {responseData[’pop’][1]}% chance of precipitation."[out]
Tomorrow will have a low of: 56.95°.
Tomorrow will have a high of: 75.43°.
Tomorrow will have a 20.0% chance of precipitation.
因此,我现在有了一种格式的天气数据,我将在每天早上 7:00 使用 Gmail API 向自己发送一次,详细说明第二天的天气。为此,我们需要在您的 google 帐户中执行一些操作。请确保您遵循 Gmail API 快速入门指南中关于验证您的访问权限和下载您的凭据的指南。
[## Python 快速入门| Gmail API | Google 开发者
完成本页剩余部分描述的步骤,创建一个简单的 Python 命令行应用程序,使…
developers.google.com](https://developers.google.com/gmail/api/quickstart/python)
首先,您需要导入适当的包
import pickle
import os
import base64
import googleapiclient.discovery
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import pickle
import os
from google_auth_oauthlib.flow import InstalledAppFlow
接下来,您需要设置权限:
# set permissions
SCOPES = ['https://www.googleapis.com/auth/gmail.send',
'https://www.googleapis.com/auth/gmail.modify']
然后,我将设置凭据:
home_dir = os.path.expanduser('~')
json_path = os.path.join(home_dir, 'Downloads', 'credentials.json')
flow = InstalledAppFlow.from_client_secrets_file(json_path, SCOPES)
creds = flow.run_local_server(port=0)
pickle_path = os.path.join(home_dir, 'gmail.pickle')
with open(pickle_path, 'wb') as token:
pickle.dump(creds, token)
home_dir = os.path.expanduser('~')
pickle_path = os.path.join(home_dir, 'gmail.pickle')
creds = pickle.load(open(pickle_path, 'rb'))
我现在可以构建服务了:
service = googleapiclient.discovery.build('gmail', 'v1', credentials=creds)
最后,您需要发送消息:
message = MIMEMultipart('alternative')
message['Subject'] = "Tomorrow's daily weather alert"
message['From'] = '<youremail@email.com>'
message['To'] = '<youremail@email.com'
messagePlain = msg_text
messageHtml = '<b>Weather Update!</b>'
message.attach(MIMEText(messagePlain, 'plain'))
message.attach(MIMEText(messageHtml, 'html'))
raw = base64.urlsafe_b64encode(message.as_bytes())
raw = raw.decode()
body = {'raw': raw}
message_first = body
message_full = (
service.users().messages().send(
userId="me", body=message_first).execute())
print('Message sent!')
这将打开你的 bowser,要求你登录到你的帐户,然后要求你的应用程序的权限和访问,以发送和修改你的帐户上的消息。如果你不想要这个烦人的消息,那么你会希望在谷歌云开发者平台中给你的应用程序权限。
谷歌是云基础设施和平台服务 Gartner 魔力象限的领导者。谷歌是 Gartner 的领导者…
cloud.google.com](https://cloud.google.com/)
我建议阅读这方面的文档。
该页面为应用程序开发人员提供了 Google Cloud 平台中身份验证的概述(以前称为…
cloud.google.com](https://cloud.google.com/docs/authentication/)
我还想用任务调度程序自动运行脚本。
我首先在任务栏的搜索栏中输入任务计划。这将打开一个可以安排不同节目的应用程序。

任务调度程序
点击动作菜单,从列表中选择创建基本任务… 。

动作菜单
我继续填写关于申请的基本信息。完成后选择下一个的。

创建基本任务窗口
然后选择触发器为每日。选择下一个的。

触发窗口
我把这一天定为我目前撰写这篇文章的第二天。选择下一个的。

每日窗口
保持开启,启动程序并选择下一个。

动作窗口
程序/脚本:应该是要去python.exe文件。添加参数应该是你的 Python 脚本的路径。选择下一个的。

选择 python.exe 和 python 脚本路径
我单击“完成”,查看我的任务是否在任务计划程序库中。

完成窗口

检查您的应用程序是否在任务计划程序库中
该脚本现在应该自动在每天早上 7:00 运行。
带有 HTTP 和 API 的 Python 比这更进一步,但是如果您对这种类型的项目或主题感兴趣,希望这将是一个很好的切入点。如果你有任何问题,评论或更正,请在下面的回复中留下。感谢您阅读这篇文章,希望对您有所帮助。
如何解释和计算“可能性增加 X 倍”的统计数据
吸烟的人患肺癌的可能性是普通人的 15-30 倍。黑人男性和女性死于新冠肺炎相关疾病的可能性是白人的 1.9 倍。
很有可能,你已经在标题或报纸文章中看到过这些“可能性增加 x 倍”的说法。虽然这些数字中有许多是经过充分研究和翔实的,但肯定有来源使用优势比来制造轰动效应和制造恐慌(即这里是你感染冠状病毒的 19 倍以上的地方🙄).今天我给大家简单介绍一下这些统计数据是什么,如何计算,如何解读,并讨论一些弊端。
这些统计数据是什么?
这些统计数据被称为优势似然比,它们通常被用来描述特定人群经历某事的可能性。优势比的一些好处是,它们很容易被广泛的受众解释(即 2x 对大多数人来说意味着大于 0.7 的回归系数),并且可以突出单一变量对两个人群的影响(即吸烟者和非吸烟者的癌症发病率)。
比值比有时会与概率混淆(即10–15%的吸烟者被诊断为肺癌),但它们不是一回事。优势比表示一个事件比另一个事件发生的可能性更大或更小,而概率表示一个事件在所有可能的结果中发生的可能性。
为了展示这种差异,我将使用 YouGov 对 6500 多名受访者的调查来了解美国人相信大多数生活在美国的人相信美国梦的可能性和概率。

杰克从不放手,现在他是杰伊·盖茨比#upwardMobility。图片来自 Pinterest
美国梦是一种信念,即任何美国人都可以通过努力工作和奉献获得成功和向上流动,无论种族、社会阶层或宗教信仰如何。这是美国的基本概念之一,也是我最喜欢的一本书——《了不起的盖茨比》的主题。

图片作者。
回答者认为 A.D.i.O .的概率是可获得的回答总数/所有回答,或(1383 + 1911) / 6588。结果是 51%,这意味着大约有 1/2 的美国人认为是 A.D.i.O
回答者认为 A.D.i.O 与不可获得的概率是可获得的回答总数/不可获得的回答总数,或(1383 + 1911) / (1318 + 1054 + 527)。结果是 1.13,这意味着美国人更倾向于认为 A.D.i.O。
计算比值比的一般公式是事件 A 发生次数/事件 B 发生次数。
如何计算多组的似然比
在我上面的例子中,在我的优势比计算中,我只有一组(所有受访者)。然而,这些比率最好在调查变量对两个不同群体的影响时使用。调查数据还记录了受访者的政治倾向,因此我将调查民主党和共和党的回答分组后,优势比是否有任何变化。

与上面使用的数据集相同,但这次是按政治派别分组的。免责声明:数据集没有按缔约方统计的原始回复数,因此我将使用回复的百分比进行计算。数字加起来不是 100%,因为我去掉了“不知道”的回答。图片作者。
第一步是计算民主党的优势比。利用事件 A 发生次数/事件 B 发生次数的一般公式,我得到 0.38 / 0.57 = 0.66。这可以解释为每 66 名民主党人相信 ADI o,就有 100 人不相信。根据调查结果,民主党人实际上更有可能认为美国梦对于大多数生活在美国的人来说是无法实现的。
然而,这只是等式的一半,现在我们对共和党的回应重复这个过程。用同样的公式,我得到 0.79 / 0.17 = 4.64。这是一个相当大的优势比——每 464 名共和党人相信 ADI o,就有 100 人不相信。
最后一步是相互比较这些几率,因为现在两者都是在同一组内计算的(即所有共和党或民主党的回答)。这可以通过获得共和党优势与民主党优势的比率来完成,该比率为 4.6/0.66 (6.96)。

图片作者。
这意味着共和党人相信美国梦的可能性是民主党人的 7 倍,相信美国梦的可能性是不相信美国梦的 4.6 倍。
如果这项调查的纵向数据可用,那将会很有趣,因此我们将能够调查这种支持美国梦的分裂是最近发生的,还是逐年变得更加两极分化的。
解释优势似然比
比值比为 1 或接近 1 意味着两个事件都不比另一个事件的可能性更大或更小,被调查的变量(即政治派别)与事件(相信美国梦)没有关系。
比值比大于 1 意味着事件 A 比事件 B 更有可能发生,变量很可能与事件相关。但统计显著性仍需检验。
比值比小于 1 意味着事件 A 发生的可能性小于事件 B,变量很可能与事件相关。但统计显著性仍需检验。
似然比的缺点
在解释这些比率时,需要注意的是你不能直接用概率乘以几率。在我们的例子中,共和党人相信 A.D.i.O .的可能性是 6.96 倍,你不能用相信 A.D.i.O .的民主党人的百分比(38%)乘以 6.96 来得到相信 A.D.i.O .的共和党人的百分比(这将导致 264%,这没有意义)。这是因为 6.96 指的是一个事件的几率如何优于另一个事件的几率,而不是一个事件发生在另一个事件之上的概率。这似乎是一件奇怪的事情,但是已经有一些有声望的报纸将优势比误报为概率,然后不得不撤回他们的文章并澄清!
我在本文开头简单提到的另一个缺点是优势比容易引起轰动。特别是当被调查事件的频率很低时,比值比会误导你相信一个罕见事件的可能性比实际情况更普遍。在我下面虚构的例子中,喝日本酸奶获得超能力的几率是不喝酸奶获得超能力的 3 倍。

图片由作者提供,数据(不幸的是)也由作者提供。
听起来不错,对吧?我正要去搜查最近的养乐多工厂。但是等等——即使在最好的情况下,我的机会仍然是 3/10,00,003,或者 0.000029%。我会有更好的机会去科学中心找一只放射性蜘蛛。
另一个缺点是,比值比有时被解释为因果关系(即变量 A 导致事件 A),但事实往往并非如此。优势比仅仅意味着一个变量和一个事件之间有关系,但是可能有许多潜在的变量,一些甚至没有包括在最初的分析中,它们实际上造成了这种影响。
总之,比值比是总结研究结果并与广大受众分享的快速有效的方法。然而,它们也可能被耸人听闻和曲解。如果你看到一个比值比似乎太高或太低,尝试找到原始数据源或类似的研究与实际频率计数。这将让你更好地意识到一个事件在整体上的可能性有多大。这样做的人在数据解释方面的体验要好 95-100 倍😉
p 值:对非统计学家的直观解释
如何找到 P 值并最终拒绝零假设
如果你阅读任何科学论文,例如医学、人工智能、气候、政治等。,或者任何一个民调结果,有一个术语几乎总是会出现——p 值。
但是到底什么是 p 值呢?为什么它会出现在所有这些上下文中?
下表显示了 COVID 和 ICU 入院的症状及其 p 值(新冠肺炎)。

表 1。来自被引用最多的新冠肺炎论文之一— 中国武汉 2019 新型冠状病毒感染肺炎 138 例住院患者的临床特征
在本文中,作者对该表唯一说的是“分类变量的比例使用χ2 检验进行比较。p 值表示 ICU(重症监护病房)和非 ICU 患者之间的差异。”
假设医院里所有的医生都得了冠状病毒病,而你(!)负责决定哪些病人需要进重症监护室。因为 ICU 的床位有限,你不能接纳所有人。您也可以使用这张表格作为参考。
您将如何使用表中的 p 值?根据 p 值,你能预测某人需要入住 ICU 的相关症状吗?在学校,我们了解到小的 p 值(通常小于 0.05)意味着证据是强有力的。但这是为什么呢?
1.什么是 P 值?
P-value 中的“P”表示“概率”——你的样本数据仅仅是因为随机抽样,而不是因为实际差异的可能性有多大。
所以,如果 p 值很小,那很好,因为它告诉你,你的实验结果不仅仅是由于偶然。
本文中武汉医院收治的新冠肺炎患者总数为 N=138。假设我们从纽约、意大利和韩国的医院中抽取了另外三组 138 名患者。
每次我们取样时,重症监护室和非重症监护室的厌食症患者数量会有很大不同吗?
每次我们从不同医院抽取一组病人,都是一次随机 抽样。即使厌食症与 ICU 入院无关,由于随机抽样误差,这两者也可能出现关联。巧合的是,他们看起来像是亲戚。
如果我们要声称差异不仅仅是因为随机 抽样误差 而是因为实际差异,我们需要证明什么?
我们需要证明差异太大,不可能是随机的。我们需要表现出“惊人的不同”。
当我们假设一个统计量为正态分布时,我们可以用均值的标准差来衡量任何一点。同样,我们可以对差异(或归一化差异—检验统计量)假设某种分布。如果我们显示差异在尾部进一步下降,无论是右边还是左边,我们可以说该事件发生的概率很低。

p 值是分布曲线下测试统计值向右或向左的区域。
2.手工计算 p 值
为了计算 p 值,您需要 3 样东西 — 数据、一个零假设和一个检验统计量。
一.数据
很明显。
二。虚假设
无效假设表明两组之间没有关系。****零假设被认为是正确的,直到数据显示足够的证据证明它不是。
**H0** : The anorexia and ICU admission are **independent**.**H1** : The anorexia and ICU admission are **NOT independent**.
美国刑事司法系统使用同样的理念;“无罪推定”。零假设永远不会被证明是真的;你只是没有拒绝它。
三。检验统计量
检验统计是我们用来拒绝零假设的武器。在这种情况下,为了查看这两个变量是否相关,我们将使用卡方检验。
卡方检验统计公式的直觉

卡方检验统计量。“c”:自由度。“O”:一种观察。“E”:一个期望值。
H0 “厌食症和 ICU 没有关系。” 表示无论是否在 ICU,厌食症患者的比例都是一样的。
那么,为了拒绝 H0,我们需要展示什么?
我们需要证明重症监护室和非重症监护室患者中厌食症患者的比例有显著差异。
上面的测试统计就是基于这个思路。如果厌食和 ICU 是独立的,(观察-预期)两者各小。如果你还不清楚,请继续阅读下面的推导。
如何从头开始计算卡方检验统计量
- 根据给定数据绘制表格(又名列联表)

根据表 1,在总共 138 名患者中,36 名患者去了 ICU,102 名患者没有去 ICU。在总共 55 名厌食症患者中,24 人去了 ICU,31 人没有去 ICU。
2。填写表格

3。计算每个单元格的期望值。(这是关键!)

如果你观察细胞[ICU,厌食症],它计算:在总共 36 名 ICU 患者中,36 名* (55/138)患者预计患有厌食症。
我们为什么要这样计算?
因为,如果实际观察值 24 与 36 * (55/138)相差很大,那么厌食症和 ICU 之间一定发生了什么。反过来,如果 36 * (55/138)和 24 相差不是太大,那么 ICU/非 ICU 对厌食症没有太大影响。
如果你计算表 1 中“干咳”的期望值,你不会看到期望值和观察值之间有很大的差别。(试试吧!)
4。正常化吧&总结一下。【直觉】(T3)


应用检验统计公式。卡方检验统计:6.49 +4.3 +2.29+1.52 = 14.6
这个公式没有让你想起什么吗?
方差——观察值和平均值之间的平方差之和。我们用期望值来衡量这个偏差,就像任何标准化一样。它会计算与预期值的偏差。
卡方分布是独立标准正态随机变量的平方和(类似卡方检验统计)。
假设你有一个来自正态分布的随机样本。考虑到中心极限趋势(如果样本超过 30 个,均值趋于正态),这不是一个不切实际的假设。那么,(观察—期望)值也会遵循正态分布,因为 E 是确定性的。
这种正态分布假设在 p 值教学中经常被忽略,但这种假设使得卡方 p 值范式成为可能。
卡方检验统计量:6.49 + 4.3 + 2.29 + 1.52 = 14.6
这是一个单一的数字,它告诉您观察到的计数和预期的计数之间存在多少差异。
5.获得“自由度”。
对于具有 r 行和 c 列的表,卡方检验的自由度计算公式为
**Degrees of Freedom = (# of rows − 1) × (# of columns − 1)**
在我们的数据中,列联表中有 2 行 2 列,因此 df 为 1。
为什么卡方检验的自由度是这样定义的?
首先,自由度是为了使统计量保持不变而可以变化的元素数量。
例如,在公式` a + b + c = 10 '中,您可以将 a 和 b 更改为任何数字,但是一旦设置了 a & b ,就不能更改 c 、,因为总和应该保持为 10。所以,在这种情况下,df 是 2。
卡方检验的 df 是列联表中可以变化的单元格数量。在我们的例子中,列联表是 2 乘 2。如果设置单元格【ICU &厌食】为 24,则确定其余单元格。我们将(row-1)和(column-1)相乘,因为我们需要分类变量的所有可能的组合。
为什么我们需要考虑自由度?
因为自由度影响分布的形状。
如果您查看卡方表,不同的自由度对于相同的 alpha(显著性水平)具有不同的测试统计值。

随着样本规模变大,自由度也变大。所以自由度越大,分布越接近正态分布。

这也意味着,随着自由度变大,尾部的面积变小。它更倾向于平均值(较小的标准差)。而这意味着 0.05 p 值的截止点会更远。因为当你的样本量越小时,不确定性就越多。
6.查卡方表,或者用 python 或者计算器做。
如果查看卡方表,检验统计量越大,p 值越小。

还是计算器:https://stattrek.com/online-calculator/chi-square.aspx

或者,用 Python,也就几行。
from scipy.stats import chi2_contingencytable = [[24, 12], [31, 71]]alpha = 0.05test_statistic, p_value, dof, expected = chi2_contingency(table)if p_value <= alpha:
print('Variables are not independent (reject H0)')
else:
print('Variables are independent (fail to reject H0)')
测试统计越极端,结果偶然发生的可能性就越小。
3.如何解读 P 值
p 值地址只有一个问题:
假设你的零假设为真,你的数据有多大可能?
66.7%的 ICU 患者有厌食症,但 30.4%的非 ICU 患者也有厌食症。其 p 值小于 0.001。p 值 0.001 意味着如果你对 1000 个不同的组进行抽样,你只会看到 1 次相同的统计数据(或更极端的情况),鉴于厌食症和 ICU 确实是独立的。
4.P 值无关紧要。
- p 值经常被误解为零假设为真的概率。但严格来说不是。 P 值不能告诉你零假设是否为真,因为它已经假设零假设为真。(还记得上面的分布曲线吗?曲线的中心意味着 H0=0。)
- 无显著性 p 值不一定排除 ICU 与非 ICU 患者的差异。这只能说明我们手头的数据没有足够的证据表明存在差异。
- p 值也没有说你的结论是正确的。它只是告诉你结果是多么的罕见,仅仅是因为随机的机会,而不是因为其他重要的因素。注意 p 值是关于测试(因此拒绝)零假设的。这只是拼图的一部分。
- p 值不是 1 类错误的概率。显著性水平(α)为。
有时候维基百科没有最好的解释…

需要注意一些事情:
- 在研究中,人们投入了大量的精力来获得 p 值< 0.05 because that’s the threshold which the study result can be declared as “statistically significant”. That is, the result wasn’t a fluke, or by random chance.
- We use the chi-square test only for categorical data. We don’t use it on numerical data. There are many different types of hypothesis tests.
**Different Hypothesis Tests**Comparing means → t, z test
Comparing 2 sample variances → F test
Determining independence → Chi-square test
Determining goodness of fit → Chi-square test
3. Setting alpha (the significance level) is arbitrary. Different people use different significance levels. Therefore, we can arrive at different conclusions from the same data depending on what we choose as our significance level. By convention, α is set to 0.05, or 0.01.
We set our significance level before we see any data. Alpha should not be derived from data nor depend on the underlying hypothesis.
4. Chi-square distribution is a special case of the 伽马分布。具有 n 个自由度的卡方分布等于 a = n / 2 且 b = 0.5(或β = 2)的伽马分布。
如何像数据科学家一样投资
数据科学是一种思维模式和技能组合,可以让你通过投资致富

图片来自 Rick & Morty,已编辑
众所周知,数据科学是一个涉及统计学、数学、计算机科学和商业知识的多学科领域。
成为数据科学家所需的思维和多学科技能是强有力的工具。他们不是博士学位,而是一个优秀数据科学家的资质。它们不仅有利于你的职业生涯,还会对你如何处理生活中的事情产生巨大而积极的影响。
对于任何寻求财务自由的人来说,投资都是一生的任务。无论是投资股票还是投资自己,都有一些原则应该牢记在心。这些原则很重要,但也很容易忘记。为什么?因为“感谢”人性,可以肯定的是,一个人需要一次不成功的投资经历,才能体会到它们的重要性。
有没有不经历失败就能真正掌握这些原则的方法?是的,有了这种心态和多学科的技能,优秀的数据科学家应该知道捷径。希望你会惊讶于这两项技能是如何让你的投资方式受益的。
"整个科学只不过是日常思维的提炼."
——阿尔伯特·爱因斯坦
1.永远不要贪婪→用数学证明

图片来自https://arlenepellicane.com/
赌场是一个非常有利可图的行业,它甚至可以养活整个城市的福利系统,就像在拉斯维加斯。除了游客和临时访客,赌场赚取的最大利润来自赌徒的贪婪。
你很少在赌场看到数据科学家。如果你这样做了,他们要么为赌场工作,要么只是假装与他们的非数据科学家朋友“社交”😲。为什么?因为一个好的数据科学家懂数学。
让我们看一个简化的例子:
- 一个赌徒玩一个游戏,有正好 50%的机会赢和输
- 如果他赢了,他赚 1 美元;如果他输了,他就输了 1 美元
- 赌徒在开始时有 X 美元
- 只有两种方式来完成游戏:1)失去所有的 X 美元,2)总的钱达到他的目标,Y 美元
这个游戏看起来很简单,但是揭示了所有赌博游戏的两个属性。首先,它们看起来都是公平的游戏,这让你觉得如果你的运气一般,你会简单地以平局告终。其次,赌徒很贪婪。
假设,失去所有$X 的概率是 P(X)

一个人有 50%的机会从\(X 到\)X-1,有 50%的机会从\(X 到\)X+1
因此
- P(X) = 50% × P(X - 1) + 50% × P(X + 1)
- 即 2 × P(X) = P(X - 1) + P(X + 1)
- 即 P(X) - P(X - 1) = P(X + 1) - P(X),这满足了典型等差数列的性质
众所周知,对于任何算术级数,

即数列的第 n 项=第一项+第 1 项和第 n 项之间的距离,可以看成是(n - 1) ×任意两项之间的公距。
我们还知道:
- P(0) = 1,当一个人有 0 美元时,失去一切的概率是 100%
- P(Y) = 0,当一个人有 Y 美元时,游戏就结束了,所以输掉一切的概率是 0%
- 因此,d = 1 / Y
该序列现在可以转换为以下形式:

使用上面的公式,
P(X)= P(Y)+(n-1)d = P(Y)+(Y-X)1/Y =(Y-X)/Y
也就是说,如果 X = 1000 美元
- 如果 Y = 1200 美元,P(X) = 1/6
- 如果 Y = 1500 美元,P(X) = 1/3
- 如果 Y = 2000 美元,P(X) = 1/2
- 如果 Y = 5000 美元,P(X) = 4/5
如果你想赚 200 美元,相对容易实现。然而,如果你变得贪婪,想赚 5 倍,有 80%的机会你会失去一切。
“见好就收”—古老的中国智慧
2.小心密码和细价股→用博弈论论证

来自 https://coinmarketcap.com/的比特币图表
你可能听说过 2017 年加密货币的疯狂,当时比特币的价值在一年内增长了 20 倍,随后发生了大崩盘,直到今天。
让我们从一个简单的例子开始,你可能会看到如何在未来动荡的市场中投资:
- 索菲亚邀请诺亚玩一个游戏,给他们每人一枚硬币
- 在每一轮中,他们都展示硬币的一面
- 如果结果是 2 头,诺亚赢得 3 美元
- 如果结果是 2 条尾巴,诺亚赢得 1 美元
- 如果结果是 1 头 1 尾,那么诺亚损失 2 美元
不难想象,抛硬币的结果是 50–50,所以有 25%的次数结果是 2 头,25%是 2 尾,50%是 1 头 1 尾。

投掷 2 枚硬币的概率

不同结果的奖励
因此,诺亚和索菲亚的报酬的期望值是 0 美元:
25%×$ 3+25%×$ 1-50%×$ 2 = 0
是的,这似乎是一个公平的游戏加上诺亚总是想和一个迷人的女士玩游戏,像索菲亚,所以为什么不玩呢?但是,经过几个小时的游戏日期,结果显示,诺亚几乎失去了他钱包里的一切,包括钱包。那是怎么发生的?
诀窍是:索菲亚可以控制概率,而不是每轮随机展示硬币。她用了什么策略?索菲亚是这样做的:
假设 A 代表索菲亚展示头部的事件,B 代表诺亚展示头部的事件。

对诺亚报酬的期望:

绘制这个等式:

绘制诺亚奖励的功能
平面下的区域代表负的 E(Noah),并且有一定范围的 P(A),Sofia 的露头概率,使得 E(Noah)总是负的!这是索菲亚的诡计。下面的代码揭示了范围:
让诺亚赔钱的代码
[0.34 0.35 0.36 ... 0.38 0.39 0.4]
就是这样。如果索菲亚设法迫使概率落在 0.34 和 0.4 之间,她将永远使诺亚赔钱!
这个博弈是博弈论中的问题。这是一个完美的类比,告诉我们如何从一个“公平”的游戏中受骗。在这里,游戏可以被视为一种投资,诺亚代表个人投资者,索菲亚代表机构投资者,也就是大鲸鱼。在小型资本投资中,如加密货币和细价股,大鲸鱼可以轻松地用大量资金操纵市场,即大量抛售或买入。如果个人投资者幸运地跟随“鲸鱼”的运动,他们可以赚钱,但最终个人投资者会亏损,因为他们只是被操纵了。
3.总是比你想象的更快“放弃”→客观思考

图片来自 https://www.aconsciousrethink.com/
在一项投资中,在不同的时间点既赢又输是最常见的事情。当你赢的时候,永远不要贪婪(前面已经证明了)。当你亏损时,明智地止损。
萨姆一直持有价值 1 万美元的股票。最近该公司并没有落入坏人之手,股价突然跌破收购价格,现在它只值 8k 美元。

山姆应该减少损失吗?
如果山姆继续持有或加仓,90%的机会他会损失更多。显然,减少损失是我们应该做的。然而,许多人没有做到这一点,即使他们事先得到了统计数据。这都是因为人的自我,比如“你不卖就不会亏钱”,“永远不会亏钱”。不要武断地看待这些话。

把自我放在一边,也就是客观思维,并不像看起来那么简单,它需要定期的训练和一个人的坚持。这种技能是任何科学家和研究人员的基本要求。
当损失无法挽回时,比如公司是骗局/泡沫,不要希望它会很快好转,承认损失已经成为沉没成本,立即抽身。尽管有时损失可能会被霍德林挽回,但考虑到机会成本,即你等待投资回到之前水平所花费的时间,如果你选择将资金转移到其他地方,你可能已经将仓位翻倍了。
说到投资生存,总是建议对股票进行更多的研究,做一些计算来支持投资决策。另一个简单而聪明的方法是把股票当成是免费送给你的。你会发现,如果 Sam 收到一只免费的 10000 美元的股票,但有一天这只股票跌到 8000 美元,几乎没有机会再涨回来,这个决定就变得容易多了。
4.看穿“预期”→蒙特卡洛模拟

图片来自 https://screenrant.com/的漫威(独眼巨人)和
评估一项投资有无数种好的和坏的方法,上面列出了三种最差的方法。对于个人投资者来说,价值投资、贴现、记分卡、 PB + PE + PEG 都是很好的开始方式。我不会在这篇文章中详细阐述它们,请点击链接,你会发现它们是多么有用。
我想说的是一种有趣的、有时反直觉的方式,许多人包括专业人士都过于依赖这种方式——预期回报。下面显示了什么时候可以,什么时候不可以。
当它工作的时候
假设有一个掷硬币游戏。每一轮,如果是头,玩家赚 1 美元,如果是尾,玩家赚 2 美元。他玩一轮这个游戏应该付多少钱?

预期回报是 1.5 美元,所以只有入场费低于 1.5 美元,这个游戏才值得玩。
当它不起作用时
假设你有$X,有 50%的几率它在下一个单位时间内变成 0.9 × $X,有 50%的几率变成 1.11 × $X。是不是每次都要全进的道理?

这意味着,在下一个单位时间内,你将从你拥有的$X 中获得 0.5%的收益。也就是说,每次投资,你都会获利,所以当然,你应该每次都全押!
然而,在现实中,如果你这样做,你会失去一切。反直觉对吗?下面告诉你为什么。
通过蒙特卡洛模拟,我在 500 个时间单位内创造了 10,000 个投资者,所有人的起点都是 100 美元。

图上的每个点代表投资者在特定时间单位的回报。从中我们可以看出,随着时间的推移,少数投资者取得了非常显著的回报,而大多数投资者却没有这么幸运。
他们有多倒霉?88.56%的投资者的回报率低于他们 100 美元的起点。更不幸的是,10000 个投资者中有 84.76%的人最后都是 0 美元。是的,大多数投资者最终会血本无归。
看起来这项投资非常乐观,如果他(她)们继续玩下去,理论上应该可以获得无限的钱,但市场上几乎没有真正的赢家。
下面的代码再现了模拟:
当预期回报不起作用时演示的代码
如果你不是 100%相信,下面从数学角度解释原因:
我们已经知道预期收益是

一个人的回报极限如何:




因为

多亏了大数定律

因此

嘣!又反直觉了!预期收益为正,但极限为零。这是因为有些 x 最终非常大,但这是非常难以实现的。由于这些很少的大 x,平均回报被拖向正,但事实是大多数 x 几乎为零。
投资时,应该明智地使用工具。预期回报是一个简单而有用的工具,但过度依赖它会让你忽略某些重要信息,这有时可能是致命的。
最后
我想从这篇文章中传达两个信息:
- 数据科学不仅仅是一项日常工作。成为一名优秀的数据科学家所需的思维模式和多学科技能是强大的设备,有利于一个人与生活中一切事物的交互方式。
- 不要变得贪婪,与波动的市场保持距离,减少损失,使用工具时首先要知道自己是什么。这四个投资原则在许多投资者中可能是众所周知的。然而,没有多少人每次都记住它们,因为这些原则是通过语言传授的,而不是通过现实生活中的经验,也就是失败。我希望通过揭示数据和这些教训背后的科学,你不必经历成为投资大师的失败。
参考
[1]中等,朝向数据科学。(2018).数据科学需要研究生学历吗?https://towards data science . com/do-you-need-a-graduate-degree-for-data-science-8e 3d 0 ef 39253
[2]维基百科。算术级数。https://en.wikipedia.org/wiki/Arithmetic_progression
如何发放更明智的贷款
让您的用户满意并遵守联邦法规

由于各种各样的原因,申请贷款可能是一次紧张的经历。在本帖中,我们将使用一个工作实例来理解如何利用数据科学来发放更好的贷款。
近期目标是从头到尾了解如何创造一个金融科技 ( fintech )产品。更大的目标是使贷款申请过程透明。
在介绍这个系统中的角色之前,请记住在头衔的背后,每个人都是人。这意味着并非一切都可以量化,在许多情况下,最终的决定可能是基于人的判断。
债权人
债权人是那些有钱可借的人,必须小心不要把他们的资产浪费在没有出路的努力上。传统上,贷方依赖于 5c 的信用:
- 性格;角色;字母
- 容量
- 资本
- 情况
- 抵押品
申请人
贷款申请人需要证明他们的信誉。所需的信息可能因贷款人而异,浏览申请流程可能会令人困惑。
因此,市场双方都需要理解风险和回报,这一点显而易见。在本帖中,我们将使用 Lending Club 数据来创建 LoanHelp :一个简单的网站,能够帮助债权人和借款人了解贷款是否值得。
详细分析请随时查看 GitHub 回购:https://github.com/NadimKawwa/loan-help
数据采集

杰西卡·刘易斯在 Unsplash 上拍摄的照片
对于这个项目,我们将使用来自美国 P2P 贷款公司的 Lending Club 的数据,这些数据是从 2007 年到 2018 年收集的。这些数据可以在 Kaggle 上免费下载。这些文件包含所有已发放贷款的信息,如当前贷款状态和最新付款信息。
该数据还包含信用评分、金融查询次数、邮政编码和托收等特征。总的来说,我们有大约 890,000 个观察值和 75 个特征。重申一下,我们的目标是预测个人是否会偿还贷款或违约。
在执行任何步骤之前,我们按照发布日期进行排序,并将最后 10%的观察值作为测试集。为了更好的可视化,考虑图 1:

图 1:每年发放的贷款
这种方法要求在勘探阶段看不到测试数据,增加了另一种防止泄漏的安全措施。这是常见的做法,因为我们没有办法确切知道未来是什么。
我们的目标是预测个人是否会偿还贷款或违约
数据探索和特征工程

瑞安·昆塔尔在 Unsplash上的照片
未来泄漏
数据中的一些信息发生在贷款发放后的未来,比如installment:借款人在贷款发起的情况下所欠的月供。这些信息预示着未来,并构成数据泄漏,应该被丢弃。总的来说,在这一步中,我们从分析中丢弃了大约 50 个特征。
遗漏的观察
数据集包含大量缺失的输入,对于数据科学家来说,如果超过一半的输入缺失,就很容易放弃某个要素。但是,建议慢慢来,对每个特性进行尽职调查。在混乱中发现模式是一种乐趣,这是数据科学家的工作。
下面的图 2 显示了缺失观测值在每个特征中所占的百分比分布。我们做出判断,丢弃丢失值超过 50%的所有特征。对于那些少于 10%的缺失,我们填充该特征的模式。

图 2:每列的平均缺失值
分类数据
一些特征是分类数据,例如职位。对于后者和类似的功能,我们设计了自己的功能,试图将作业分配到相关的类别。例如,像护士和医生这样的头衔被标记为健康职业。此外,我们为拥有总裁、首席执行官和区域经理等头衔的'高管创建了一个二元特性。
按地理位置定制功能缩放
对于许多机器学习算法来说,标准规模 r 实例可以提升性能。在深入研究之前,请考虑下图:

通过大都市统计区 (MSA)来衡量观察结果比全国更有经济意义。如果邮政编码的第一位数字代表一个州,那么后两位数字代表该地区的中央邮局。
因此,我们将跟踪统计数据,如按前两位数分组的样本的平均值和标准偏差,我们将称之为“宏观”统计数据。背后的原因是,20,000 美元在德克萨斯州奥斯汀的价值不同于在加利福尼亚州旧金山的价值(作者希望他支付的租金更少)。
用户配置文件
那么谁是 Lending Club 的债务人呢?该公司给每个人分配一个字母子等级(后面会有更多),例如 A1 是最好的等级,G5 是最差的等级。分布似乎向右倾斜,大多数用户的分数为“好”到“好”。

一个有趣的结果是下图比较了已付贷款和违约贷款的年收入。请注意,分布似乎是相同的,而那些倾向于违约的人平均收入略低。

也许这两个情节更有意思。我们看到,较高的利率(int_rate)与较高的违约可能性相关。同时,较低的路基也表明可能违约。我们将这两个地块放在一起展示,因为申请人的子等级越低,风险就越大,利率就越高。因此,这是特征相关性的一个例子。


建模和性能指标

瑞安·昆塔尔在 Unsplash 上的照片
挑选模特
随着数据的清理,我们选择尝试几种监督学习算法,以选出一个赢家,并进一步发展它。
性能指标
鉴于数据集的不平衡性质,仅仅依靠准确性是不够的。诸如接收器操作特性 (ROC)和 f1 分数等指标在不平衡数据集的情况下非常有用。下图 3 显示了不同模型的 ROC 曲线:

图 3:初步 ROC 曲线
请注意,每个分类器都是用默认参数实例化的,因此结果可能会因参数而异。在一项更深入的研究中,人们会将每个模型的最佳之处与其他模型的最佳之处进行比较。为了限制项目的范围,我们决定使用 XGBoost,因为它的整体性能更好。总体而言,XGBoost 能够实现 0.68 的 AUC。
优化结果
与所有机器学习算法一样,交叉验证和网格搜索是最大限度提高性能的有用工具。超参数调整可能是一个计算量很大的过程,因此最好用 google colab 笔记本来完成。然而,模型超参数仅针对少量试验进行了调整。
输出的解释

来源:维基百科
美国联邦贸易委员会(FTC)是美国负责消费者保护和监管商业行为等事务的机构。取决于你住在哪里,大概有一个政府机构有类似的任务。
联邦贸易委员会可能会要求一个机构解释为什么某些贷款申请被拒绝或面临法律后果。因此,模型的可解释性对于法律遵从性是至关重要的。此外,如果任何特征与个人信息有关,如性别或种族:放弃它们。这不仅是不道德的,也是违法的。
从产品的角度来看,网站上的用户可能想知道为什么他们的申请没有通过。会不会是他们的年龄?信用评分?有什么对他们有利的因素吗?沮丧的用户倾向于完全放弃这个平台。不透明的机器学习模型注定会失去业务。可解释性不仅是法则,也是成长的关键。
因此,本节将讨论如何理解起作用的潜在特征,以及它们如何影响模型的决策。
不透明的机器学习模型注定会导致糟糕的决策
我们利用 SHAP 值来获得模型输出的逐例解释。注意,SHAP 特征重要性与特征排列重要性截然不同。事实上,排列是基于模型性能的下降,而 SHAP 是基于特征属性的大小。

图 4: SHAP 汇总图
图 4 是每个特征的 SHAP 值的密度散点图,用于确定每个特征对训练数据集中个体的模型输出的影响程度。
图 4 将输出限制为前 30 个特征,这些特征按所有样本的 SHAP 值大小的总和排序。最大的特点是“路基”(贷款俱乐部指定的等级),最好的等级是 A1,最差的是 G5。直觉上,让评级最高的申请人最有可能还清贷款是合理的。
下一个特性是“term ”,指的是贷款的还款次数,值以月为单位,可以是 36 或 60。第三个特征“dti”是“一个比率,使用借款人每月总债务支付额除以借款人自我报告的月收入来计算总债务,不包括抵押贷款和要求的 LC 贷款“。
我们将注意力转移到房屋所有权上,它可以是拥有、抵押贷款、租金、任何、其他或没有之一。在项目的特征工程部分,我们决定用一个数值来代替这些观察值,这样拥有一个家就有了最高的价值。我们之所以关注这一特性,是因为对于一部分用户来说,拥有房屋可能是即将发生违约的一个指标。这里值得注意的是,功能交互可能在这个评估中发挥作用。
把所有的放在一起

照片由 Precondo CA 在 Unsplash 上拍摄
随着我们的模型得到训练,结果令人满意,我们可以将它包装成一个脚本,用户可以输入关于自己的信息,并接收信用评估。
更大的目标是提供一个个案解释,使贷款申请成为一个透明的过程
我们必须考虑我们可以合理地要求用户做什么。例如,C1 的子等级意味着什么?用户如何知道他们的立场?因此,我们参考 Lending Club 的 SEC 文件,该文件提供了一个子等级与 FICO 平均分数的表格(参见第 49 页)。下面是路基和 FICO 之间的关系图:

图 5
请注意,这个图表并不完全像我们希望的那样稳健。请注意,图中有违反逻辑的扭曲:F1 比 E5 有更好的 FICO 分数。我们预计 FICO 分数和次等级之间几乎完全呈线性正相关。关于如何计算次级评级,还有其他考虑因素,可能隐藏在 SEC 文件的其他部分。然而,在这项研究中,我们认为这些信息已经足够了。
我们还必须考虑到这部分用户的疲劳和我们的应用范围。在 app 开发方面,我们可以要求用户输入 30+条关于自己的信息进行初步评估吗?出于实际考虑,我们将限制关键项目所需的输入,例如:
- FICO 评分
- 位置
- 债务收入比
- 贷款金额
- 岁入
示范
我们利用 python 的 Flask 框架来创建一个简单的网站。然后,我们使用 heroku ,一个支持多种编程语言的云平台服务,在线部署它:
[## 贷款帮助:初步贷款审批帮助
预测贷款违约
loan-help.herokuapp.com](https://loan-help.herokuapp.com/)
下面是如何使用该网站的演示。我们从填写信息开始:

点击 submit 按钮会产生一个决定和关于贷款的信息:

开发 Web 应用程序时的注意事项
在 Heroku 或其他任何地方开发应用程序的最重要的经验是:总是用明确指定的版本来指定 python 依赖关系。
此外,还要考虑预期的流量以及如何减少计算时间。例如,页面一打开就加载 pickled 模型,这样就省去了我们每次做预测时都要加载它的麻烦。另一方面,该网站托管在一个免费的域名上,30 分钟不活动后就会休眠。
最后,考虑我们期望的输入类型和值,并在需要的地方设置硬限制。W3schools 为那些想开始学习的人提供了一个简单的教程。
违约和保险

到目前为止,我们已经能够以债权人和贷款申请人易于理解的方式解释模型的输出。我们可以进一步将我们的发现扩展到评估风险和增加债权人收入的实际方法中。在本节中,我们将简要介绍如何将数据科学应用于贷款保险。
一些债权人可能希望为他们的资产投保以防违约。我们如何计算预期增益?让我们假设一个简单的案例,申请人获得 1000 美元的贷款。
每个月底,债务人都要连本带利地还钱。如果在任何月份有 5%的违约概率,那么债权人的预期利润是:

其中n _ payed是支付月末费用的次数,n _ payable是未支付的次数。如果所有的账单周期都还清了,信贷将收回他们的钱加上利息。如果在任何时候债务人拖欠贷款,任何未来的付款都被视为损失。
这如何在更大范围内应用?保险公司将有可靠的和不那么优秀的债务人。通过将这些投资组合汇集在一起,保险公司可以提供更低的利率,因为违约造成的损失被有价值的债务人全额支付的保费所抵消。数据科学在这里扮演了一个关键角色,因为它会产生每笔贷款的违约概率。
得分和信心
通常,我们希望展示我们的最佳绩效指标,然后就到此为止。但是,部署的模型会持续返回相同的结果吗?我们如何向利益相关者保证最低限度的绩效?
使用 Bradley Efron 和 Robert Tibshirani 的. 632 Bootstrap 方法,我们能够构建置信区间。我们发现 95%的时候,AUC 在 (0.64,0.67) 之间。
缩放产品

照片由 Pepi Stojanovski 在 Unsplash 上拍摄
机器学习模型最终将驻留在专用的网络服务器上,并由使用该服务的债权人和债务人调用。抛开加载网页和访问数据所需的时间,做一个决定需要多少时间?
我们对测试数据进行了这个测试,发现平均来说,预测是在 203 微秒内做出的,标准偏差是 62 微秒。性能可能会得到优化,但是时间是相当合理的。
总结和展望

Fabian Blank 在 Unsplash 上拍摄的照片
利用消费者数据,我们能够帮助市场双方评估贷款结果,做出更明智的决策。输入和结果用简单的英语给出,不需要专业知识。
尽管我们尽了最大努力,我们还是无法实现一个几乎总是正确的模型。这部分是由于问题的模糊性。此外,一些关键特征在数据中不存在,如年龄、教育水平和微观/宏观经济因素。
与任何机器学习模型一样,定期更新我们的训练数据至关重要。随着时间的推移,消费者趋势发生变化,新产品出现,基本事实发生变化,因此我们的指标开始受到冲击。
我们重新训练模型的频率以及使用哪些数据超出了本文的范围,但是在生产部署之前必须考虑。
希望你喜欢阅读这篇文章!
有问题吗?评论?反馈?或者你只是想进一步讨论事情?请随时联系我,我会尽我所能迅速回答你!
参考
虽然一个“C”的平均分在学术等级上可能感觉中庸,但获得五个 C 的学分是…
www.nerdwallet.com](https://www.nerdwallet.com/blog/5-cs-credit/) [## Lending Club 贷款数据
分析 Lending Club 发放的贷款
www.kaggle.com](https://www.kaggle.com/wendykan/lending-club-loan-data) [## 信贷和贷款
关于信贷和贷款的决定涉及很多因素,包括你需要多少钱,你能得到什么条件…
www.consumer.ftc.gov](https://www.consumer.ftc.gov/topics/credit-and-loans) [## 5.10 SHAP (SHapley 附加解释)|可解释的机器学习
本章目前仅在此网络版本中可用。电子书和印刷品将紧随其后。SHAP(沙普利添加剂…
christophm.github.io](https://christophm.github.io/interpretable-ml-book/shap.html) [## 贷款保障保险适合你吗?
贷款保障保险旨在通过在需要时提供经济支持来帮助投保人。是否…
www.investopedia.com](https://www.investopedia.com/articles/pf/08/loan-protection-insurance.asp) [## 保险联营
保险联营是一种做法,其中一组小公司联合起来,以确保更好的保险费率和…
www.inc.com](https://www.inc.com/encyclopedia/insurance-pooling.html) [## 预期值
在概率论中,随机变量的期望值是其概率分布的一个关键方面。的…
en.wikipedia.org](https://en.wikipedia.org/wiki/Expected_value)
交叉验证的改进:. 632+ Bootstrap 方法,Bradley Efron 和 Robert Tibshirani
[## 使用 Lending Club 免费了解您的 FICO 分数
信用评分贷款俱乐部(LC)是一个人对人的贷款网站,连接借款人和贷款人(LC…
www.doctorofcredit.com](https://www.doctorofcredit.com/use-lending-club-find-fico-score-range-free/)
https://www . sec . gov/Archives/Edgar/data/1409970/000089161808000318/f 41480 ors v1 . htm
如何用 PostgreSQL/PostGIS 连接空间数据
初学者指南和教程

马克斯·拉罗彻尔在 Unsplash 上拍摄的照片
连接数据是数据科学领域的一项常见任务。虽然常规的 SQL 表连接是一个很好的特性,但空间连接的真正威力给我留下了深刻的印象。
通过空间连接,您可以基于不同表的几何关系关联它们的信息。在本教程中,我们将看到空间连接的示例以及空间连接后的要素汇总。
如果你是 PostgreSQL/PostGIS 世界的新手,我有一个初学者教程来设置你的环境,并通过一步一步的指导让你快速入门。
[## 使用 PostgreSQL/PostGIS 的空间数据科学
PostgreSQL 和 Python 空间数据入门实用指南。
towardsdatascience.com](/spatial-data-science-with-postgresql-postgis-2f941c8c367a)
探索数据
我们在本教程中使用了巴塞罗那 Airbnb 数据集,统计面积较小。我们的任务是将 Airbnb 公共列表加入到它们所属的各自较小的统计区域中。换句话说,我们希望找出每个 Airbnb 指向的区域。最后,我们将汇总连接的数据,找出每个统计区域有多少 Airbnb 招待所。
在我们进行空间连接之前,让我们先熟悉一下数据集。我们通过查询这些列并将结果限制在前 100 个列表来查看公共列表。
SELECT name, host_name, room_type, price, reviews_per_month, neighbourhood, geom
FROM public.listings
LIMIT 100;
我们在下面显示了前十行的结果。我们有列表的名称、主机名、房间类型、价格、评论、邻居和几何图形(Geom)。几何列有一个小眼睛,允许您可视化空间数据。

Airbnb 列出巴塞罗那
这是 Airbnb 列表的几何查看器的输出。请注意,这仅限于前 100 分。

Airbnb 房源巴塞罗那 PgAdmin 4 几何查看器
现在,让我们看看统计区域数据集。我们简单地将列限制为几何图形和区域代码。
SELECT aeb, geom
FROM public.statistical_areas

巴塞罗那较小的统计区域
下图显示了使用 PgAdmin4 几何查看器可视化的统计区域多边形。

巴塞罗那统计区域 PgAdmin 4 几何查看器
在执行空间连接之前,请确保检查两个数据集的坐标参考系统(CRS)是否匹配。我们可以像这样简单地查询出每个数据集的空间参考系统。
SELECT ST_SRID(geom)
FROM public.statistical_areas
LIMIT 1;
两个数据集都有 WGS84 CRS,因此我们可以继续执行空间连接。
使用 PostGIS 进行空间连接
我们已经看过数据集并检查了数据集的 CRS。现在一切都准备好了。为了连接两个数据集,我们可以使用不同的空间关系,包括ST_Within、ST_Contains、ST_Covers或ST_Crosses。在这个例子中,我们使用ST_Within来找出哪个点在哪个多边形内。
SELECT
houses.name AS guest_name,
houses.room_type as room,
houses.price as Price,
areas.aeb AS statistical_code
FROM listings AS houses
JOIN statistical_areas AS areas
ON ST_Within(houses.geom, areas.geom)
结果是这个包含 Airbnb 列表的表格,其中有一个额外的列指示每个点属于哪个统计区域代码,如下表所示。

空间连接结果
太好了!如果您只想找出每个点的所属位置,那么空间连接可能就是您的最终结果。但是,我们可能需要汇总空间连接结果,以了解数据集的分布情况。
汇总空间连接结果
任何 SQL 聚合函数都可以在这里工作,以从空间连接的数据集中获得洞察力。假设我们想要找出每个统计街区的平均 Airbnb 列表价格。
我们只需要对标价使用平均聚合函数,并按统计区域对数据进行分组。
SELECT
AVG(houses.price) AS AVG_Price,
areas.aeb AS statistical_code
FROM listings AS houses
JOIN statistical_areas AS areas
ON ST_Within(houses.geom, areas.geom)
GROUP BY areas.aeb
结果就是这张表,其中显示了每个统计区域的平均价格。

这是一张显示巴塞罗那统计区域平均价格分布的地图。

巴塞罗那统计区域的 Airbnb 平均标价-使用 QGIS 创建的地图。
结论
在本教程中,我们了解了如何使用真实数据集通过 PostGIS 进行空间连接。我们使用几何关系成功地将 Airbnb 列表连接到它们各自的统计区域。您可以尝试使用ST_Contains来得到相同的结果。您可能还想尝试不同的聚合函数,比如计算每个统计区域中的列表数。
如何在 Golang 中加入弦乐?

马修·皮尔斯在 Unsplash 上的照片
golang 中有多种连接字符串的方式。
让我们从简单的开始。
最初发布于https://schadokar . dev。
使用+运算符🔧
**package main****import (
"fmt"
)****func main() {
str1 := "Hello"
// there is a space before World
str2 := " World!"****fmt.Println(str1 + str2)
}**
输出
**Hello World!**
使用 Sprint,Sprintf,Sprintln 🛠
fmt 包有 Sprint 、 Sprintf 和 Sprintln 函数,可以使用默认或自定义格式格式化字符串。
所有的Sprint函数都是变量函数。
可变函数 可以用任意数量的尾随参数调用。
冲刺
Sprint使用默认格式格式化并返回结果字符串。
Sprint接受空接口。这意味着它可以接受 n 个任意类型的元素。
如果没有传递字符串类型的元素,那么结果字符串将在元素之间添加一个空格。
**package main****import (
"fmt"
)****func main() {
num := 26** **str := "Feb"** **boolean := true** **withStr := fmt.Sprint(num, str, boolean)** **fmt.Println("With string: ", withStr)** **withOutStr := fmt.Sprint(num, boolean)** **fmt.Println("Without string: ", withOutStr)
}**
输出
With string: 26Febtrue
Without string: 26 true
Sprintf
Sprintf根据格式说明符格式化并返回结果字符串。
格式说明符
%v the value in a default format
%s the uninterpreted bytes of the string or slice
检查fmt包中所有可用的格式指定符。
您可以使用
*Sprintf*功能来创建 DB 的*connection string*。
例如我们将创建一个 Postgres 连接 URL 。
连接 URL 格式:postgres://username:password @ hostname/databasename
**package main****import (
"fmt"
)****func main() {** **dbname := "testdb"** **username := "admin"** **password := "test1234"** **hostname := "localhost"** **connectionURL := fmt.Sprintf("postgres://%s:%s@%v/%v", username, password, hostname, dbname)** **fmt.Println(connectionURL)
}**
输出
**postgres://admin:test1234@localhost/testdb**
Sprintln
Sprintln使用默认格式格式化元素或参数。在元素之间添加空格,并在末尾添加一个新行。
**package main****import (
"fmt"
)****func main() {** **str1 := "Hello"
str2 := "Gophers!"** **msg := fmt.Sprintln(str1, str2)** **fmt.Println(msg)
}**
输出
**Hello Gophers!**
使用连接功能🔩
Join函数接受一个字符串数组和一个分隔符来连接它们。
**func Join(elems []string, sep string) string**
该示例包含一组工作日。Join函数将返回由, 分隔的一串工作日。
使用
*Join*你可以将一个字符串数组转换成一个字符串。
**package main****import (
"fmt"
"strings"
)****func main() {
weekdays := []string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}
// there is a space after comma
fmt.Println(strings.Join(weekdays, ", "))
}**
输出
**Monday, Tuesday, Wednesday, Thursday, Friday**
你可以在 上看我最新的 golang 教程我的博客 。
如何在你的人工智能模型中避免偏见
人工智能模型是空的,中立的机器。当用有偏差的数据训练时,他们会产生偏差

如今,人工智能(AI)中的偏见备受争议。从图像分类器给人们的脸贴不正确的标签到雇佣机器人在筛选求职者时歧视女性,当试图自动复制它们时,人工智能似乎继承了人类最糟糕的做法。
风险在于,我们将利用人工智能创造一支种族主义、性别歧视、满嘴脏话的机器人大军,然后这些机器人会回来困扰我们。这是一个伦理困境。如果 AI 天生就有偏见,那么依赖它不是很危险吗?我们最终会塑造我们最糟糕的未来吗?
机器将成为机器
我先澄清一点:AI 只是一台机器。我们可以把它拟人化,但它仍然是一台机器。这个过程就像我们和孩子们在湖边玩石头一样,突然间,一块普通的石头变成了可爱的宠物石。
即使和我们的孩子一起玩,我们通常也不会忘记,一个宠物石,无论多么可爱,也只是一块石头。我们应该对人工智能做同样的事情:无论它的对话或外观多么像人类,我们都不应该忘记它仍然只是一台机器。
例如,前段时间,我做了一个机器人项目:一个教师机器人。这个想法是为关于开源数据科学软件 KNIME Analytics Platform 的文档和特性的查询生成自动的信息答案。在所有的 bot 项目中,一个重要的问题是说话方式。
有许多可能的说话或写作风格。就机器人而言,你可能希望它友好,但不要过分友好——有礼貌,但有时会根据情况表现得很自信。博客文章“描述写作或说话风格的 60 个单词”列出了不同机器人说话风格的 60 种细微差别:从闲聊和对话到抒情和文学,从有趣和雄辩到正式,以及我最喜欢的不连贯。我的机器人应该采用哪种说话方式?
我选择了两种可能的风格:礼貌和自信。彬彬有礼到了诗意的极限。自信到近乎不礼貌。两者都是自由文本生成的问题。
作为这个教师机器人项目的一部分,几个月前我实现了一个简单的深度学习神经网络,它具有一个隐藏层的长短期记忆(LSTM)单元,以生成自由文本。
网络将 M 个字符的序列作为输入,并在输出层预测下一个最可能的字符。因此,给定输入层的字符序列“h-o-u-s ”,网络将预测“e”为下一个最可能的字符。在自由句子语料库的训练下,网络学会一次生成一个字符的单词甚至句子。
我没有从零开始构建深度学习网络,而是(跟随当前的趋势,在互联网上找到现有的例子)在 KNIME Hub 中搜索类似的自由文本生成解决方案。我发现了一个例子,一个类似的网络在现有的真实山脉名称上进行训练,为一系列户外服装新产品生成虚拟的无版权的山脉候选名称。我下载了网络,并根据我的需要对其进行了定制,例如,将多对多转换为多对一架构。
该网络将在一组适当的自由文本上接受训练。在部署期间,将提供 M=100 个初始字符的触发语句,然后网络将继续自己组装它自己的自由文本。

基于 LSTM 的深度学习网络,用于自由文本生成。
人工智能偏差的一个例子
想象一下,一个客户或用户有着不合理但根深蒂固的期望和不可能的要求。我该怎么回答?机器人应该如何回答?第一项任务是训练网络变得自信——非常自信到不礼貌的极限。哪里可以找到一套坚定自信的语言来训练自己的人脉?
我最终在一组说唱歌曲文本上训练了我的基于 LSTM 的深度学习网络。我认为说唱歌曲可能包含这项任务所需的所有足够自信的文本。
我得到的是一个非常污言秽语的网络;以至于每次我向观众展示这个案例研究时,我都要请所有未成年人离开房间。你可能会认为我创造了一个性别歧视、种族歧视、不尊重——也就是公开有偏见——的人工智能系统。似乎我做到了。
下面是网络产生的说唱歌曲之一。前 100 个触发字符是手动插入的;这些是红色的。网络生成的文本是灰色的。当然,触发句对于为文章的其余部分设定合适的基调是很重要的。对于这个特殊的例子,我从英语中最无聊的句子开始:软件许可描述。
有趣的是,在所有可能的单词和短语中,神经网络选择在这首歌中包括“支付费用”、“昂贵”、“银行”和“诚实地”。语气可能不一样,但内容尽量符合触发句。

人工智能生成的说唱歌曲的例子。红色的触发句是软件许可证文档的开始。
关于这个网络的建设、训练和部署的更多细节可以在文章“人工智能生成的说唱歌曲”中找到
这种语言可能不是最优雅和正式的,但它有一个令人愉快的节奏,主要是由于押韵。注意,为了使网络生成押韵文本,过去输入样本序列的长度 M 必须足够。押韵适用于 M=100,但不适用于 M=50 的过去字符。
消除人工智能的偏见
为了重新教育我行为不端的网络,我创建了一个新的训练集,其中包括莎士比亚的三部戏剧:两部悲剧(《李尔王》和《奥赛罗》)和一部喜剧(《无事生非》)。然后,我在这个新的训练集上重新训练了网络。
部署后,该网络现在制作类似莎士比亚的文本,而不是说唱歌曲——在言语整洁和礼貌方面有了明显的改善。不要再说脏话了!不要再说脏话了!
同样,让我们从软件许可文本开始触发自由文本生成,看看莎士比亚将如何根据我们的网络进行。下面是网络生成的莎士比亚文本:红色,手动插入的前 100 个触发字符;灰色的是网络生成的文本。
即使在这种情况下,触发句也为接下来的话奠定了基调:“小偷”、“拯救和诚实”,以及令人难忘的“先生,现在耐心在哪里”都对应于软件许可证的阅读。不过这次说话风格很不一样。
关于这个网络的建设、训练和部署的更多细节可以在“AI 能像莎士比亚一样写作吗?”
请记住,产生类似莎士比亚文本的神经网络与产生说唱歌曲的神经网络是同一个神经网络。一模一样。它只是在一组不同的数据上进行训练:一方面是说唱歌曲,另一方面是莎士比亚的戏剧作品。因此,产生的自由文本是非常不同的——正如在生产中产生的文本的偏差一样。

人工智能生成的莎士比亚文本的例子。红色的触发句是软件许可证文档的开始。
总而言之,我创造了一个满嘴脏话、咄咄逼人、有偏见的人工智能系统,也创造了一个非常优雅、正式、几乎诗意的人工智能系统——至少就说话风格而言。它的美妙之处在于,两者都基于相同的人工智能模型——两个神经网络之间的唯一区别是训练数据。这种偏见实际上是在数据中,而不是在人工智能模型中。
偏入,偏出
事实上,人工智能模型只是一台机器,就像宠物石最终只是一块石头。它是一台根据训练集中的数据调整其参数(学习)的机器。训练集中的性别歧视数据产生了性别歧视的 AI 模型。训练集中的种族主义数据产生了种族主义的 AI 模型。由于数据是由人类创造的,它们也经常有偏差。因此,产生的人工智能系统也会有偏差。如果目标是有一个干净、诚实、无偏见的模型,那么在训练之前,训练数据应该被清理并去除所有偏见。
首次发表于 信息世界。
如何跟上学术文献
学会持续有效地做文献综述

跟上学术文献就像试图从消防栓喝水一样——似乎不可能跟上!(感谢亚历克斯·科宁斯)。来自 dlpng.com、freepik.com的作品。
学术出版正在爆炸式增长。每年有超过 250 万篇论文出版,而出版速度每年攀升 8%的事实对此毫无帮助。有这么多东西要读,很容易让人觉得我们只是在勉强维持生计。
不幸的是,跟上文学是那些事情中的一件——就像走路——并没有真正教给我们。我们被期望自学它。然而,在过去的几年里,我意识到,即使我们有自己查找和阅读论文的风格,也有一些被许多人掌握的、但不为所有人所知的良好实践。只有在我坐在教室里学习如何跟上文学之后,这一点才变得明显起来(吴恩达的讲座)。
在这篇文章中,我将把这些教训与来自我的同事、教授和我自己的经验的其他有价值的见解结合起来。到文章结束时,我们会学到:
- 如何找到与我们相关的论文?
- 如何使用三遍法有效地阅读这些论文?
- 为什么持续的阅读胜过突发的活动?
读什么?一套精心策划的文章。
甚至在我们学会如何高效阅读之前,跟上学术文献的一个方法就是缩小我们的范围,仔细选择我们阅读的内容。除非你是一个像达芬奇一样的博学者,否则你感兴趣的领域很可能很窄,可以用 6-10 个关键词来定义。因为我是一名地球科学家,所以我使用“野火”、“森林死亡率”等关键词。
你可以使用尽可能多的关键词来定义你的范围,但是要尽量保持每个关键词的明确性。比如“深度学习”就是一个很可怕的关键词,因为它不够具体。这将导致数以千计的不相关的文件,在其中找到与你相关的就像大海捞针一样困难。另一方面,“图像分割”是一个很好的关键字,因为它是特定的。最后,不要羞于及时更新你的关键词,以反映你不断变化的兴趣。

使用像“图像分割”这样的特定关键词比使用像“深度学习”这样的宽泛关键词更好,这样可以减少混乱,并使你的阅读列表易于管理。数据来源:科学网。图片作者。
一旦你定义了你的关键词,使用以下资源收集与你相关的文献-
- 在(免费)、 Scopus (付费),或者科学之网(付费)上在线搜索。此选项仅对一次性搜索有效。你不能仅仅依靠这个来让自己跟上文学的发展(稍后解释)。
- 会议记录
- Twitter - 用你的关键词搜索合适的人,关注他们。
- 朋友和同事——利用你的关系网找到合适的论文。如果你找到他们地区的文件,你可以还他们人情。
- 谷歌学术提醒——用你的关键词设置提醒,或者“关注”你感兴趣的教授。
- 目录 -设置接收杂志目录的提醒,你所在地区的文章经常在这些杂志上发表。JournalTOCs 是一个很棒的服务,因为它为大多数期刊合并并发送提醒。对于浏览目录的重要性,人们有不同的看法。然而,我发现克服这种盲目的感觉是很有用的——它让我们得以一窥更广阔的科学世界的发展。
一旦我们使用我们的关键词编辑了一个精选的论文列表,我们就可以使用三遍方法来阅读它们。
如何阅读?三重途径被形象化了。
阅读论文时,我们要确保在略读其余部分的同时,详细阅读所有重要和相关的论文。当然,事先无法知道什么是重要的。因此,从头到尾阅读每篇论文并不是对我们时间的有价值的利用,因为每篇论文的相关性不同——有些可能对它们的背景很重要,有些可能有助于激励我们的特定项目,有些可能有我们想要复制的分析,有些可能有与我们最初的假设相反的结果(因此通读非常重要)。

不要浪费时间从开始到结束依次阅读每篇论文。图片作者。
我发现阅读论文的三步法(S. Keshav 的论文)不仅帮助我识别项目的重要论文,还让我专注于每篇论文中的相关部分。通过这种方式,我可以在每篇论文中进行多次传递,每次传递都有更大的深度
第一轮:亮点。

第一轮:标题、摘要和图片+说明文字。来自 freepik.com的作品。
第一轮包括阅读标题、摘要和图表+说明。这一轮的目的是抓住一篇论文的重点,而不是通过它的细节。标题和摘要有助于我们抓住论文的主要结论。这些数字提供了一目了然的结果。
请记住,我们仍然没有了解到确切的结果,或者这篇论文的背景,这很好。在这个阶段,我们最感兴趣的是论文的“内容”,而不是“为什么”或“如何”。由于第一轮相当短,我在这一轮中涵盖了我从上一节收集的每一篇论文。
在第 1 轮中需要记住的一些思考内容:
- 作者试图完成什么?
- 如何使数字变得更好?(不管论文内容如何,这是一项需要学习的有用技能)
在第一轮结束时,我们可以筛选出那些显然与我们感兴趣的主题无关的论文。然后我们进入第二轮。
第二轮:核心。

第 2 轮:介绍、结果、结论、图表+标题,略读其余部分。来自freepik.com的艺术品。
第二轮包括阅读引言、结果、结论、图表和说明,并略读其余部分。这是我们真正开始理解报纸的地方。导言将帮助我们适应研究的需要,而结果和结论将帮助我们清楚地理解论文的发现。我发现这是我学得最多的一轮。
在第二轮中需要记住的一些提示:
- 有哪些想法或数据可以自己用?
- 你想关注哪些参考资料?
第三轮:细节。

第 3 轮:方法、讨论、参考资料,略读其余内容。来自 freepik.com的艺术品。
第三轮包括阅读方法,讨论,记下一些参考文献,略读其余的。这一轮是为了深入文件。通过详细研究这些方法,我们应该对自己能够复制这种方法相当有信心。因为我们在第三轮深入研究论文,所以这一轮只讨论那些与我们感兴趣的主题直接相关的论文。
由于我们在这一轮结束时已经经历了多轮,这是一个很好的时间来记录最初一组论文中被频繁引用的所有论文。在第三轮中,对讨论部分的额外关注也应该为我们指出具有类似发现的其他相关论文,或者这些结果可能非常重要的地方。
在第三轮中需要记住的一些提示:
- 该方法的关键要素是什么?
- 你想关注哪些参考资料?

三通是什么样子的。图片作者。
通过这种三关方法,我可以每周通读大约 25 篇论文,而不用在那些与我当前兴趣不太相关的论文上花费太多时间。因此,它节省了我大量的时间,而不会影响我对学术文献的需求。但是,只有经常执行,才算成功。
什么时候读书?天天!
如果你从这篇文章中只学到一样东西,那就是这个- 说到阅读,坚持胜过活跃。虽然文献综述在新项目的开始阶段无疑是有用的,但它并不是一项只针对开始阶段的活动。不坚持复习文献,会让我们变得过时。在像深度学习这样的新兴领域,更是如此,4 年前的论文被认为是旧的。

目标是与你的阅读保持一致。图片作者。
与阅读不一致是危险的,原因有二
- 一旦第一轮文献综述完成,我们就不再了解我们领域的最新发展
- 很有可能会错过一些我们最初没有涉及的重要文件
在一次会议上,当有人在我的报告后问我,“当论文 Y 表明它在像你这样的案例中不成立时,你为什么假设 X?”一般来说,这类问题有几个可以接受的答案,但没有一个是以开头的,“我没有读过那篇论文,但是……”。从那以后,我每晚睡觉前都会阅读至少一篇论文,这极大地帮助了我跟上文学的脚步。
一天一份报纸让你远离尴尬。
结论
在这篇文章中,我们学习了如何跟上学术文献。虽然网上搜索是可以的,但使用经常给我们提供论文的工具,如学者提醒或目录提醒,是至关重要的。有了一套精选的论文,我们可以遵循三步走的方法来有效地通读它们——首先抓住重点,然后进入核心,最后理解论文的细节。在每一轮结束时,随意扔掉与你感兴趣的话题无关的论文。最后,通过我自己的尴尬经历,我希望你重视每天阅读的需要,不要把文献综述作为一次性活动。
如何在不需要人工智能的工作中跟上人工智能的最新发展
思考如何平衡学习 SOTA 的需要和工作生活义务的现实。

鸣谢:Unsplash @jon_chng
介绍
本文是由 山姆·鲍曼 对这条推文(下图)的总结。大部分内容取自原始帖子的回复,并与我自己的经历交织在一起。

如果你在数据科学领域工作,你可能会认识以前问过这个问题的人(或者那个人实际上就是你自己)。尤其是如果你在一家非科技公司工作(实际上,即使是科技公司也能务实地解决他们的问题)——你的公司可能不会期望你花太多时间去阅读/研究/学习“艺术之初”( SOTA)的技术来解决你的业务问题。
这真是一个两难的选择。一个有时相当令人沮丧的问题。
这是一个两难的问题,因为成为一名优秀的数据科学家的一部分是推动数据科学所能提供的边界,但在你的工作场所并不鼓励你这样做。
令人沮丧的是,你总是隐隐约约地怀疑你当前生产系统中部署的任何东西都可以很容易地被最新的 SOTA 技术取代,但你却没有获准花一些工作时间阅读一些相关的研究论文,进行实验和 A/B 测试你的假设。
那么,一个数据科学家应该怎么做才能跟上世界的潮流呢?
一方面,成为一名体面的数据科学家的驱动力迫使你跟上最新的 AI/ML 进展,但在硬币的另一面,每天有这么多的论文要读,在这么多的领域发表。在一家对推动人工智能领域的发展不感兴趣的公司工作绝对没有帮助。
战略
从推特的帖子来看,这里有一些我喜欢的策略(也许对你也有用)。
1。错开你的学习


我喜欢上面的是,它让你不再需要总是关注最新的 SOTA 算法,而是迫使你专注于最终目标(即解决商业问题)。是的,你会迟到一会儿(FOMO 是真的)。但是你也可以在其他事情上保持一点点理智(比如帮助孩子做作业或者和你的妻子出去购物)。
我记得几年前伯特论文发表的时候,每隔几周你就会看到一个新的伯特变种出现,并声称 SOTA 分数。我不认为测试所有不同的嵌入是对您时间的有效利用——而且它们可能不会增加您的知识深度水平(因为当每个人都渴望证明一些东西时,在快速上升期间事情会很快变得陈旧)。
因此,在采用一种技术之前,有一个间隔年(或 6 个月)让尘埃落定,对我来说听起来是个不错的策略。更不用说在这一年的时间内,已经有大量的研讨会、教程、文章、视频、示例代码以及您需要快速了解的算法要点,以及如何有效地部署它(在您非常熟悉的框架中)。
2.听播客

在我看来,播客是消费最新 SOTA 最简单的方式。一天的通勤时间(Covid 19 之前)大约花费我 3 小时的时间(来回),一集播客通常在 30 分钟到 1 小时之间,取决于提供商。这意味着在一周内,它会总结出 15 个小时的高质量内容,如果我觉得这个话题有趣,我可以随时回去看。
我最喜欢的如下:
- TWIML(涵盖整个人工智能领域、垂直业务和 ML Ops)
- NLP 亮点(Allen NLP 人员采访其他 NLP 专家)
- Lex Friedman 的人工智能
3.加入一个虚拟的纸质阅读小组
如果说新冠肺炎有什么好消息的话,那就是它已经成为许多公司虚拟知识共享的催化剂。我最近关注的一些问题是:
- Stitchfix 制作的 Algo Hours (录像可在 Youtube 上获得)
- 深度学习沙龙通过权重和偏见(Youtube 上有录音)。
- HuggingFace 已经在各种技术会议和他们的 Youtube 频道上分享了许多内容,但还没有开始分享内部讨论。然而,他们确实会在 Github 上分享他们正在阅读的内容。

- Kaggle 阅文组。它很过时了(最后一次更新是在 2019 年 12 月,所以可能没那么老……),但是涵盖了很多 NLP 研究论文。准备人:Kaggle 的 Rachael Tatman。
5.由 dair.ai 的 elvis 主持的论文阅读&讨论 dair . ai,这是一个相当新的发现,我还没有时间深入研究他们的材料。不过,过去录音的标题看起来确实很有趣。
然而,回到现实,我从来没有刻意去观看或参加每一场直播的知识分享会(通常在中午 12 点左右+)。我通常会做的(Covid19 之前)是查找记录,将其保存在我的手机上(这对 Youtube 来说很容易),并在通勤期间观看它们。
当然,现在我大部分时间都在家里工作,每当我休息或什么的时候,我总是可以直接在 Youtube 上观看它们。大多数时候,我通常会专注于与我可以立即使用的东西相关的东西(回到上面的第一点)或者正在某个地方的商业环境中应用的东西(而不仅仅是最新的 SOTA)。
4.社区/社交媒体
前面提到的项目指出了你可以自己学习的事情。但是请注意,在大多数情况下,没有一个反馈环告诉你到目前为止你所学到的是否正确。
这就是与社区保持联系的好处。我能想到的一些好处是:
- 检查和平衡你的理解。
- 众筹解决问题的最快方法。一般来说,人们都很慷慨,只要你不被认为是在虐待他们。
- 能够加入各种主题的学习小组(从初级到高级)。TWIML ( 本周在机器学习)和 MLT ( 机器学习东京 ) Slack group 上的那些甚至为各个地理区域举办会议来迎合观众)。对于 fastai 库的用户来说, fast.ai 社区尤其活跃在他们的话语页面上。
- 通过 Twitter/Slack 等平台直接接触行业先锋和开拓者。关于这个平台,我最喜欢的是该领域专家的推文(以及他们的回应,比如激发这篇文章的那条)。能够通读来自书籍作者、讲师、研究人员和人工智能圈名人录的关于 ML 最佳实践、数据伦理、NLP 技术和其他主题的来回讨论总是令人耳目一新。
5.做

最终,一个人需要积极地工作在代码上,并构建一些东西来真正欣赏已经获得的知识。研究源代码,从事自己的项目,参加 Kaggle 竞赛,甚至写下你所学到的东西——将极大地帮助巩固你的理解,并将它保存更长的时间(即刻意练习)。
结论
与 AI/ML/NLP 的最新发展和艺术状态保持同步可能是一项艰巨的任务——如果你的日常工作不需要你处于 AI 研究的前沿,就更是如此。
在这篇文章中,我们介绍了一些如何跟上 ML/NLP 最新发展的技巧。总结一下,不容易。但更重要的是,也许你真的不需要停留在进步的前沿。
随着这些天 NLP 领域的进展越来越快——想要跟踪每周出现的每一件事情可能都不是一件好事。一个更好、更简单的方法是错开投入的比例,这样既能让同类中的佼佼者脱颖而出;同时也从炒作的循环中过滤掉虚假的声明。
其余的建议围绕着在业余时间消耗知识,利用网络进行信息过滤,以及分配一些时间进行有意识的练习。
如何跟上 ML 的最新研究和趋势
对 ML 的大肆宣传导致该领域的研究和兴趣急剧增加。在这篇文章中,我分享了我追踪最新研究和趋势的方法。
ML 中的出版物数量呈指数级增长。下面的图表来自 2020 年的 Jeffrey Dean,图表显示,自 2009 年以来,我们已经增长了 30 倍。现在,跟上该领域的发展趋势和研究进展变得更加困难。你是如何跟上时代的?

接下来,我们将首先看看其他人是如何跟踪这个领域的,然后我将分享我在过去几年在轻松地工作期间收集的技巧和诀窍。
其他研究人员是如何跟上最新研究的?
2019 年,我们对 CVPR、ICML、ICCV、NeurIPS 等会议接受的出版物作者进行了调查。来自学术界和行业研究实验室的 50 名研究人员参加了调查。

根据我们的调查,我们在 2019 年 3 月进行了调查
Arxiv 托管出版物的重印版,并对公众开放。这与 ML 研究人员对公开分享和传播他们的工作的强烈兴趣相结合,使其成为查找论文的首选地点之一。
会议可能是与该领域其他感兴趣的人进行身体交流的最佳场所。此外,他们列出了所有被接受的出版物,并向公众开放。我给你加了 CVPR 2019 、 ICML 2019 、 NeurIPS 2019 、 ICLR 2020 的链接。你也可以在网上找到会议发言的录音。我在这里列出了一些: CVPR 有自己的 YouTube 频道,对于 ICML,你可以在 YouTube 上简单地搜索“ICML 2019”来找到相关的演示文稿,对于 NeurIPS 也是如此。
谷歌学术可能是最广泛的关于 ML 出版物的数据库。它允许我们在引文中搜索(如下面我的一个提示和技巧所示)以及按出版日期过滤。例如,这将很容易过滤掉 2020 年后出现的所有引用 BERT 的公开论文。
人们不能忘记在同一领域工作的同事的重要性。我定期与来自世界各地的朋友交流,讨论我们最近感兴趣的论文。找到志趣相投的人的一个方法是参加当地的聚会小组。
我发现有趣的是 GitHub 越来越重要。我已经看到越来越多的存储库显示了“牛逼论文”的列表,例如牛逼-深度视觉、牛逼-深度学习论文。我不期望这些来源总是最新的,但是在一个地方有一个更有影响力的论文的“摘要”可能是方便的。
我觉得非常有用的提示和技巧
我将总结一些帮助我提高效率的要点。我使用的主要渠道是 Twitter、Reddit 和谷歌学者引文搜索。
创建一个 Twitter 账户,关注其他研究人员 尽管 Twitter 在我们 2019 年的调查中只获得了几票,但我觉得它对我保持最新状态有很大帮助。大多数与我的领域相关的 ML 研究人员都在推特上发布他们最新的研究论文。只要跟踪他们,每周查看几次我的 twitter 账户,我就能跟踪他们的工作。此外,他们经常转发他们喜欢的领域的其他新论文。因此,只要关注几十名研究人员,你就已经可以在 twitter 上看到很多有趣的新论文了。如果你是一名研究人员,还没有 Twitter 账户,那就创建一个,让其他同事随时了解你的工作进展。
使用 Reddit,不仅可以找到新的论文,还可以对它们进行讨论 我喜欢 Reddit 的一点是,在对他人的工作给出反馈时,人们会更加直接和诚实。我想强调一下机器学习子编辑。这个 subreddit 有将近 100 万用户。你不仅会发现许多新的有趣的出版物,还会在评论区看到其他人的评论和想法。使用 Reddit 时还有另一个好处:你经常会发现与你的领域没有直接关系的论文。作为计算机视觉领域的人,你也会发现关于 NLP 或语音识别的论文。就个人而言,我非常欣赏这一点,因为它让我能够看到跨数据类型和行业的研究模式。此外,它给了我一个自我监督学习的一般进展概述。2018 年, BERT 使用自我监督的预训练在 NLP 中展示了巨大的成功。2019 年取得了跨界突破,并被证明对计算机视觉具有不可估量的价值。
使用谷歌学者的“引文搜索”功能 对我来说,谷歌学术是找到与我当前研究相关的其他相关论文的最重要工具之一。假设我们想要在 Google scholar 上引用 SimCLR 的文章中搜索特定文本。只需切换“在引用文章中搜索”复选框,您将在引用 SimCLR 的文章中进行搜索。Arxiv 有一个在引文中搜索的类似功能,但是我个人偏好谷歌学术搜索。

切换复选框,在引用谷歌学术的文章中进行搜索
在一次会议上检查论文是否被接受 我经常看到自己落入这个陷阱。Arxiv 已经成为 ML 论文的热点之一。然而,提交给 Arxiv 是非常容易的,有时甚至太容易了。没有同行评审程序,例如,你可以在著名的会议上进行。你只需要已经注册的人的“认可”。这有其利弊。一方面,实验,其结果将不足以为其他会议可以出现在 Arxiv。不太成功的实验不像成功的实验那样享有相同的曝光度,但它们可以为我提供一些有价值的知识,这个简单的平台使它们可以公开。另一方面,在 Arxiv 上也可能出现错误的实验、错误的数字和结果。为了保持对这一缺点的警惕,快速检查您在 Arxiv 上找到的论文是否也被该领域的任何会议接受总是好的。
查看论文评论 对于一些论文,你会在 OpenReview 上找到反馈。举个例子,我在这里为你链接了 Karras et al .Progressive GAN 的反馈,2018 ,。并非所有的反馈都对你有用,因为你不是该出版物的作者。但它仍然可以帮助你更详细地理解某些部分,并了解其他工作与它的区别。
你如何跟踪你所在领域的相关研究和趋势?请在评论中分享你的建议和窍门。
Igor 联合创始人
lightly.ai
如何启动你的第一个数据博客?

弗兰基·查马基通过 Unsplash 拍摄
除了“之外,这可能是我最常被问到的问题了。你是如何找到数据科学/数据分析方面的工作的?“我将写另一篇关于我求职历程的博客,所以这篇博客将关注如何在没有工作的情况下获得行业曝光率。
我之前在 DIPD @加州大学洛杉矶分校 — 就这个话题做过一次演讲,这个学生组织致力于增加产品和数据领域的多样性和包容性,是我共同创立的。然而,我的目标是扩展这个主题,让更多的人了解它。
我希望这篇文章能激发越来越多的数据爱好者开始他们自己的博客。
对我们许多人来说,这可能是一个艰难的时期,但这也是增强和提升你在数据科学和分析方面的技能的黄金时间。如果你的工作在这个时候受到了影响, 把不幸的当作一个休息、反思和启动你的个人项目——时间不允许时奢侈的事情。
“当一扇门关闭时,另一扇门会打开”——亚历山大·格雷厄姆·贝尔
艰难并不能决定你是谁,是你的态度和毅力决定了你的价值。让我们开始吧!
从哪里开始?

卡尔·海尔达尔通过 Unsplash 拍摄的照片
从小规模开始,逐步扩大
在我们开始任何项目之前, 先缩小你的兴趣范围 。这是你的个人项目,所以你有完全的自主权。找到让你兴奋的事情,让你有动力投入时间!
一路上会有很多挑战,可能会阻止或转移你完成项目,让你坚持下去的应该是与你的兴趣密切相关的分析主题。它不一定是世界之外的东西。问问自己什么对你来说是重要的,为什么我们要在乎它。
当我刚开始时,我知道我全心全意地关心心理健康和获得更多正念的方法。所以我更深入地分析了排名前六的冥想指导应用,以了解哪一个最适合我的偏好。
获得灵感

与 Raj 通过 Unsplash 公路旅行的照片
读,读,读!
以我的微妙的夫妻特质分析为例。通过 Spotify API 在音乐品味分析领域已经做了一些工作,但还没有人真正深入研究电影。所以我抓住这个机会,发现了我们夫妇对音乐和电影的狂热爱好的交集。
寻找合适的工具箱

Giang Nguyen 通过媒体 MinfulR 拍摄的照片
现在,到了这一步,您需要确定要收集哪些数据,并为这项工作找到合适的工具。 这部分一直与我作为数据分析师的行业经验有着内在的共鸣 。这确实是最具挑战性和最耗时的部分。
对于这一阶段的分析,我最好的建议是问很多实际问题,并提出一些你需要通过数据来回答或证明的假设。我们还必须注意项目的可行性,否则,你可以更灵活地调整你的方法,使之更可行。
注意,可以使用自己最得心应手的编程语言:)我相信 Python 或者 R 都有自己的优势和很棒的支持数据包。
我过去项目中的一个例子可以阐明这个策略。我对与抑制新冠肺炎相关的非药物因素很好奇,所以我列出了所有我能想到的变量,如天气、个人防护用品、重症监护室床位、隔离等。然后我开始对开源数据集进行大规模研究。
“所有的模型都是错误的,但有些是有用的”——乔治·博克斯
由于我没有公共卫生方面的背景,为这种类型的疫情数据建立预测模型是一个巨大的挑战。我首先从一些我熟悉的模型开始,如随机森林或贝叶斯岭回归。然而,我发现疫情通常遵循逻辑曲线的趋势,即病例在一段时间内呈指数增长,直到达到拐点并趋于平稳。这里指的是流行病学中的房室模型。我花了将近两周的时间来学习这个模型并将其应用到我的分析中,但结果非常令人着迷。我最终写了一篇关于此事的博客。
该过程
如果你在数据科学/分析领域工作,这对你来说并不陌生— “数据科学家 80%的时间都用于准备(简单地查找、清理和组织数据),只有 20%的时间用于构建模型和执行分析。”

照片由冲动创意
清理数据的过程可能很繁琐,但是当你做对了,你的分析就会更有价值,更有意义。以下是我在分析工作流程中采用的典型流程:
1)收集数据
2)清理数据
更多…
3)基于项目的技术
- (NLP) 情感分析、POS、话题建模、BERT 等。
- (预测)分类/回归模型
- (推荐系统)协同过滤等。
更多……
4)写下见解和建议
将这些点连接起来
这是分析中最重要的部分。我们如何将分析见解与现实环境联系起来,并提出可行的建议?不管你的项目的重点是什么,是关于机器学习、深度学习还是分析, w 你的分析/模型试图解决什么问题?

照片由 Quickmeme 拍摄
想象一下,我们建立一个高度复杂的模型来预测有多少媒体读者会为你的博客鼓掌。好吧,这有什么重要的?**
将其与潜在影响联系起来!如果你的帖子从 claps 获得更多的支持,它可能会在媒体平台上更频繁地被策划和展示。如果更多的付费媒体读者找到你的博客,你可能会通过媒体合作伙伴计划赚更多的钱。这才是影响!
然而,这并不总是利润驱动的影响,它可能是社会,健康,甚至环境影响。这只是如何将技术概念与现实世界的实现联系起来的一个例子。
障碍
你可能会在旅途中的某些地方碰壁。我最好的一条建议是主动 寻求帮助 !
除了向朋友、同事或导师寻求建议之外,我经常发现在在线问答平台上搜索或发布问题很有帮助,如 Stack Overflow 、 StackExchange 、 Github 、 Quora 、 Medium 等等!在寻求解决方案时,要有耐心和创造力。如果在线解决方案还没有解决您的问题,请尝试考虑另一种方法来针对您的数据或代码版本的特征定制解决方案。
写作的艺术是重写。
当我第一次向 Medium 发布我的第一个数据博客时,我发现自己重新访问了我的帖子,并在这里和那里修改了一些句子或措辞。如果你在发布后发现一些错别字或语法错误,不要气馁,你可以随时回去编辑!
因为这是我们的个人项目,所以你没有义务一定要完成它。因此,优先顺序和纪律在整个过程中起着至关重要的作用。为你的项目设定一个明确的目标,并制定一个实现目标的时间表。同时,不要把自己分散得太开,因为这可能会让你失去兴趣。
了解您的时间表和容量!我经常在休息或周末的时候,用 2 到 4 周的时间来完成我的个人项目。为了组织你的冲刺,跟踪你的进度,你可以参考一些敏捷框架,可以通过协作软件找到,比如特雷罗或者阿萨纳。只要你取得进步,哪怕是最小的进步,总有一天你会成功。所以坚持下去,不要放弃!
结束语
第一步总是最难的 。如果你觉得项目还没准备好,给自己一点时间微调,分享一下!
一开始没有什么是完美的。但是通过将它交付给观众,你会知道在以后的项目中应该改进什么——我从产品管理的角度全心全意地采纳了这个原则。
我过去并不擅长清晰地表达我的想法(我仍在努力改进),但通过将自己推出舒适区,我已经走得更远了。我希望这将在某种程度上激励你开始你的第一个数据博客。相信你自己,勇敢一点,如果你一路上需要帮助,请联系我或你网络中的任何人!
"信念是迈出第一步,即使你看不到整个楼梯."—马丁·路德·金

格伦·麦卡勒姆通过 Unsplash 拍摄的照片
点击这里查看我的数据博客
免责声明:本分析的目标是提供一些关于新冠肺炎传输的数据信息
towardsdatascience.com](/covid-19-what-do-we-know-about-non-pharmaceutical-interventions-ba5c9f4150bb) [## 微妙的夫妻特质:通过 Spotify 和网飞了解你爱的人
是的,像其他亚洲夫妇一样,我们分享每个订阅账户,包括 Spotify 和网飞·😄
towardsdatascience.com](/a-subtle-analysis-on-couples-music-and-movie-tastes-via-spotify-netflix-df40ce274383) [## MindfulR —应用商店评论挖掘
你有没有被淹没在思绪中?你希望变得更加专注和专注吗?
towardsdatascience.com](/mindfulr-how-app-store-review-mining-can-boost-growth-improve-product-and-increase-monetization-4d50e20e9834)
快乐的数据博客!🎉*
是的,你可以:如何开始你的数据科学家生涯
回答初级数据科学家和准数据科学家关于 ds 职业生涯第一步的常见问题

照片由来自 Pixabay 的 StartupStockPhotos 拍摄
如果你错过了,有一个疫情在那里,它迫使我们所有人关闭所有公共活动。随着时间的推移,我们都开始理解封闭、社交距离和缺少聚会的影响。我们意识到的一件事是,这里的“我们”我指的是我工作的 Taboola 的 Algo 团队,它对那些刚刚开始职业生涯或即将改变职业生涯的人有着重要影响。
我们曾经主持和参加过许多数据科学会议,并注意到许多初级数据科学家和准数据科学家利用这些聚会来寻求和接受关于他们职业道路的指导和非官方咨询。而现在,当所有这些都取消后,他们就没有人可以联系了。因此,我们提出了一个新的倡议,我们将其命名为 Algo Boost(Algo Boost . me),允许每个人与我们安排 30 分钟的一对一变焦会议,并获得他们所寻求的指导。
我们所在的以色列的数据科学界对此的需求之大让我们震惊。我们所有的志愿者在活动开始后的 6 个小时内就被预订满了。

我个人已经花了几个小时回答问题,并尽可能地提供指导,我发现有些问题和焦虑是大多数人都有的——老实说,我在开始职业生涯时也有过。因此,我认为把它们都写下来是一个好主意,包括我个人的想法,因为我相信更多的人会发现它们在这些时候很有用,在全球的其他地方也是如此。我还是想强调一下——这些都是我个人对事情的看法,仅仅是我自己的建议。
数据科学家的实际含义变化很大。在阅读数据科学职位描述时,您可能已经注意到,每个公司对数据科学的解释都不尽相同。在一些地方,这意味着你将从事深度学习模型的工作,在其他地方,这个角色主要涉及 SQL 和 Excel。确保你明白你所看到的具体角色是什么。如果你对数据科学的定义是研究机器学习和深度学习模型,那么—
你的第一份工作不会是数据科学家,这没关系。如果有什么事情我希望在我刚刚开始职业生涯时有人告诉我,那就是这个。数据科学家知道如何对问题建模,如何分析数据和结果,并且能够实现执行它的代码,显然还能调整它。如果这听起来像是很多技能,那是因为它是。这也是为什么它不是第一份工作。当你获得了作为分析师或软件开发人员的经验后,你就成为了一名数据科学家,然后作为你第一份数据科学家工作的一部分,填补了另一个角色的空缺。因此,如果你正在寻找你的第一份工作,从成为分析师或软件开发员(最好是大数据相关的)开始——无论哪个最适合你。我们大多数人都是这样开始的。例如,我在 Appsflyer 作为一名数据工程师开始了我的职业生涯,这无疑是我职业生涯中可能发生的最好的事情之一,也是我直到今天都感到自豪的事情之一。所以,万一不够清楚,请允许我强调一下—
编程是工作的一部分,很重要的一部分。实现机器学习模型意味着你需要对它们进行编码。并测试它们。并部署它们。以及修复 bug、升级——我们甚至还没有触及输入数据处理和功能设计。编码是数据科学家一天中的大部分时间所做的事情,不一定要编码一个最先进的模型。不是每个人都喜欢编码,这很好,因为虽然我可能在陈述显而易见的事情,但我想把这一点说清楚—
不做数据科学家也没关系。如今,数据科学似乎笼罩着一层巨大的光环。这是最热门的趋势,人们有时会觉得成为数据科学家是最好的职业道路。这绝对是错误的。对你来说,最好的职业道路是最适合你的,因为这是你茁壮成长的地方。对于任何问我如何成为数据科学家的人,我的第一个问题是:向我描述一下五年后你的工作日。如果你对分析、计算数据和使用统计数据来揭示有趣的见解感兴趣,但编码是你宁愿避免的事情——那么去做一名分析师。如果你想与人交谈,提出想法,并根据数据做出决定,那么你应该成为一名产品经理。这不是“让自己失望”或“退而求其次”——这些是有意义的、要求高的、极具挑战性的角色,具有很大的影响力,如果这是你真正想做的——去做吧。标题只是标题。但如果你真的在追求数据科学,这里有一些我个人的建议:
关注与行业相关的模型。机器学习和深度学习下有大量不同的模型类型和领域,但只有其中一些真正用于当今的行业。这些主要是图像识别、自然语言处理(NLP)和推荐系统。因此,虽然强化学习可能是你见过的最酷的事情(我非常同意你的观点),但这不是我建议你在启动职业生涯时关注的事情。去卡格尔,接我提到的类型的挑战,并尝试自己解决它们——。我的意思是,使用外部库来为你做困难的技术工作是我们在行业中实际做事情的方式,但是至少尝试自己实现一次简单的版本。例如,使用 NLTK 进行 NLP 词干分析是很棒的,但是试着看看你是否能自己实现它的一个基本版本。吴恩达在 Coursera 上的机器学习课程甚至有一个练习,让你从头开始实现反向传播。这些东西真的会让你明白事情是如何运作的,而且肯定会反映在你的工作面试中。如果你不确定你知道该如何应对这些挑战—
阅读,并确保你理解。数据科学家最重要的技能之一是自己寻找解决方案的能力。我们面临的许多挑战,我们第一次面对。对于这份工作来说,知道相关的来源并能够阅读学术论文&技术博客是必须的。练习这个,如果论文中有你不完全理解的地方,去寻找答案。一旦你找到了答案,
写 blogposts,带代码。这个技巧是我个人的最爱之一,因为这是我开始寻找我作为数据科学家的第一份工作时经常做的事情之一,直到今天仍然如此。我写博客的读者总是相同的——我,六个月后,在我忘记了博客里写的一切之后。所以每当我写博客时,我都会确保从最基本的开始解释我所做的一切,提供例子,并确保不留下任何漏洞或公开的问题。我发现这是确保我真正理解我认为我理解的东西的最好方法,遵循爱因斯坦的名言:如果你不能简单地解释它,你就理解得不够好。添加代码作为例子只会让它变得更好,因为它迫使你将理论转化为实践。
你真的需要更高的学位吗?这个问题的答案因你所在的国家而异。我可以告诉你,在以色列这里,答案将是:可能是,这是有原因的。顾名思义,数据科学家就是科学家,也就是说,我们进行研究。这意味着,掌握一个月前你还不知道的领域,了解最新的学术论文并设计&进行实验是数据科学的核心。这些正是人们在追求完成学术论文时所做的事情,这就是为什么拥有一篇论文是一个主要优势。也就是说,有些数据科学家只拥有学士学位。老实说,我在 Taboola 的第一个经理只有理学学士学位,但仍被认为是团队中最聪明的人之一。
你需要机器学习的学位吗?简而言之就是没有。更长的答案将是:不,但你必须更加努力地工作来弥补差距。说实话,你甚至不需要计算机科学学位,但这是有代价的。我从未学习过计算机科学——我的学术背景是物理学,但我现在在这里。但我意识到我的数据科学知识和经验中存在漏洞,并努力工作来填补这些漏洞。如果你也不是来自学术数据科学背景,你必须迎头赶上——学会编码,学会处理数据,学会建模,学会分析,并真正理解你在做什么和为什么做。没有正式背景的代价意味着你的第一份数据科学工作可能比其他工作更长,需要更多的努力,但这是完全可能的。想知道应该采取什么步骤来获得数据科学家的第一份工作吗?嗯,从头读起:)。祝你好运!

由 starline / Freepik 设计
如何用 4 个简单的步骤为深度学习标记音频
使用 Audacity 标记音频文件并在 Python 中加载结果的快速分步指南

韦斯·希克斯在 Unsplash 上拍摄的照片。
为了训练深度学习模型,准备和管理数据集通常是非常重要的一步。在这个故事中,我展示了如何使用 Audacity 一款“免费、开源、跨平台的音频软件”来标记你的数据。
目录
- 声谱图表示
- 创建标签
- 导出标签
- 在 Python 上加载数据
1.声谱图表示
在安装 Audacity 并导入一个音频文件后,第一步是更改为声谱图表示,如下图所示。

大胆地看声谱图。作者打印屏幕。
然后,您可以在同一菜单中调整谱图设置,并通过右键单击显示比例来调整显示比例。在下面的例子中,我选择“Mel”选项来缩放。你可以在 Dalya Gartzman 的这个故事中读到更多关于 Mel 光谱图的含义。

将比例更改为 Mel。图片由作者提供。
2.创建标签
要创建标签,首先进入编辑>标签>在选择处添加标签并检查键盘快捷键(Windows 中的 Ctrl+B ),这样你就不需要每次都回到菜单。

寻找添加标签的选项。图片由作者提供。
现在您已经知道了键盘快捷键,在谱图中选择一个要标记的区域(单击并拖动),然后使用快捷键“在选择处添加标签”。将出现一个标签轨道,您可以输入标签的名称。您可以重复此过程,根据需要添加任意数量的标签!

创建标签。图片由作者提供。
注意:在您添加标签时播放片段会有所帮助。您可以使用“空格键”来播放和暂停。
3.导出标签
要导出标签,请转到文件>导出>导出标签。

导出标签。图片由作者提供。
结果是一个文本文件,每个标签指示开始和结束时间、标签名称以及最小和最大频率。频率值为-1 表示低于显示的最小值或高于显示的最大值。

导出标签的示例。图片由作者提供。
4.在 Python 上加载数据
对所有音频文件重复上述步骤后,您就可以在 Python 中加载数据了!我准备了以下代码来读取和显示带有相应标签的声谱图。该代码也可以作为 Kaggle 内核获得。
结果是下图所示的 Mel 谱图,红色边框对应于“标签数据框”(上面的代码)中的标签。

Mel 谱图和标签。图片由作者提供。
结束语
希望你觉得这个故事有用!请考虑在这个链接 加入我的私人邮件列表,这样你就不会错过我接下来的任何一个故事了!你可以在下面的两个故事中了解更多关于我的数据科学之旅!
[## 我的 3 年历程:从零 Python 到深度学习竞赛高手
自从 2017 年开始学习 Python 以来,我一直遵循的道路是成为一名独自参加 Kaggle 比赛的大师…
towardsdatascience.com](/my-3-year-journey-from-zero-python-to-deep-learning-competition-master-6605c188eec7) [## 我在 Kaggle 上的两年旅程:我如何成为竞赛大师
描述我的旅程和策略,我遵循成为一个竞赛大师与个人金牌
towardsdatascience.com](/my-2-year-journey-on-kaggle-how-i-became-a-competition-master-ef0f0955c35d)
感谢阅读!祝您愉快!
如何逐步标记用于对象检测的图像
标记图像的逐步详细指南

照片作者: Pixabay
图像标记是目标检测的第一步,也是最重要的一步。标注确实是一个非常耗时的过程,但是你在标注图像上投入的精力越多,你的模型就越精确。在这个故事中,我将详细讨论标签的完整方法。最后,通过这篇文章,您将为您的对象检测模型准备好您的标记数据。
这里你需要一个开源的工具来标注你的数据。要下载该工具,请按照以下步骤操作。
下载贴标工具
- 如果您的机器上安装了 Git,请在设备的 open 命令提示符下键入
git clone [https://github.com/pranjalAI/labelImg.git](https://github.com/pranjalAI/labelImg.git)
- 如果你没有安装 Git,那么去 https://github.com/pranjalAI/labelImg.git下载压缩目录。
- 如果你是通过链接直接下载的,那么解压你的压缩文件。zip 文件。
安装依赖项
- 您需要使用命令提示符进入“labelImg”文件夹。

- 之后需要安装一个名为“pyqt5”的库。在命令提示符下键入以下命令。

安装 pyqt5
定义自定义类
- 你需要去“labelImg\data”文件夹;在那里你会发现 predefined_classes.txt 在这里,你可以定义你的自定义类。
激活“标签”工具
在命令提示符下,键入以下命令。

启动标签工具

- 键入上面的命令后,您会看到一个交互式窗口,这是一个开源工具。

“标签”工具
你将在这里花费相当多的时间,因为这将帮助你得到标记的图像,并使它们为物体检测做好准备。
如何使用这个工具
- 点击“打开目录”并选择保存您需要标记的图像的文件夹。
- 然后点击“更改保存目录”这里,你需要选择目录来保存你的标签文件。该目录应该不同于图像目录。
- 现在你可以使用“创建矩形盒”在图像上绘制盒子。
- 点击保存按钮。它将生成一个包含盒子坐标的文件。

标签过程
- 您可以在一个图像中绘制多个框。它会要求分配一个类;选择您在上述步骤中定义的类别。
最后,您现在将拥有一个文件夹,该文件夹将使用与您的图像相同的名称来标记图像数据。您的数据现在可以进行对象检测了。尽管如此,如果你觉得你有更少的图像计数,那么请按照我的指南生成对象检测数据。这里,我展示了不同图像和标签增强技术。如果你想了解更多关于对象检测的后续步骤,那么请阅读我的另一篇文章,Python 中的自定义对象检测。在这里,我已经讨论了如何训练您的模型并将其部署到本地主机。

约翰·施诺布里奇在 Unsplash 上的照片
一些收尾建议
标注数据可能是一个非常耗时的过程,但是如果您想要在您的模型中实现良好的准确性,那么您必须在此步骤中给出合理的时间量。试着从不同的资源中收集尽可能多的图像。图像种类越多,你的模型就越好。
在你走之前……
如果你喜欢这篇文章,并且想继续关注关于 Python &数据科学的更多精彩文章——请点击这里https://pranjalai.medium.com/membership考虑成为一名中级会员。
请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。
还有,可以随时订阅我的免费简讯: Pranjal 的简讯 。
如何开始你的数据科学生涯
你有兴趣进入数据科学领域吗?我们不怪你。数据科学是一个不断变化和发展的令人兴奋的领域,这给数据科学家的工作带来了无限的潜力。这里有六个方法可以让你开始你的数据科学生涯!

格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片
1.熟悉 Python 和 SQL
学习 Python 和 SQL 将在您投身数据科学职业生涯时对您大有裨益。对于 python,有一个完整的数据科学包和工具的生态系统,你应该学习。为了帮助你,安装 Anaconda 发行版并查看这个伟大的资源让你开始pythonprogramming.net。对于您使用 SQL 的第一步,我们建议您查看伟大的w3schools.com。
2.参加在线课程
学位是开创新事业的必备条件的日子已经一去不复返了。如今,你可以通过在线课程独立学习,并获得在数据科学领域取得成功所需的技能和知识。去看看伟大的吴恩达。了解计算机科学、统计学和数学的基本概念——你就可以开始了。您可以参考的一些推荐课程和资源包括:
3.在 Kaggle 比赛
建立投资组合对于有抱负的数据科学家来说至关重要,就像对于艺术家来说一样。有了 Kaggle,你可以做到这一点。 Kaggle 是世界上最大的数据科学社区,它提供的工具和资源可以帮助您快速启动您的数据科学事业。Kaggle 还举办比赛,世界各地的数据科学家可以竞争,以产生预测和描述数据的最佳模型。想比赛吗?这里有一个提示:不要放弃比赛,直到你进入前 10%的提交名单,并且你的名字出现在排行榜上。这将迫使你推动自己,结果,你将熟悉该领域的最佳实践和最现代的工具和框架。
4.熟悉完整的开发者世界和工具包
数据科学家将大部分时间花在编写代码上。但是数据科学家不仅仅是编码员,他们还是技术专家。为了写出好的代码并产生更大的影响,熟悉技术世界和做事的最佳方法对你有好处。
5.听播客,读科技博客
播客和技术博客提供了一种极好的方式来了解数据科学领域发生的一切。播客也提供了一个很好的方式来听取该领域一些最伟大的思想关于行业中最紧迫的问题以及他们目前正在做什么和在想什么。你甚至可能会遇到一个故事,这个故事来自一个解决了和你正在处理的问题相似的问题的人,它会给你一些新的想法和见解。这就是我们刚开始建立特色商店时发生的事情,你可以在这里了解。
想知道从哪里开始?伟大的数据科学博客的数量可能会多得惊人。我们建议从这些开始:
在撰写本文时,这些数据科学播客仍然活跃,并且仍在制作中。从档案深处开始,一路向上:
6.与人交谈
加入论坛和其他在线团体,在那里数据科学家可以相互交流。您会发现大多数数据科学家都面临着相同类型的问题。与他人交谈,了解他们是如何解决他们所面临的各种问题的,这将有助于你学习和前进。
结论
我们生活在一个激动人心的时代,比以往任何时候都有更多的机会获得专业信息,这些信息可以帮助我们促进我们的职业发展。这也适用于寻求在数据科学领域开创职业生涯的人。通过在网上轻松访问课程、小组、竞赛和信息,以及实践和奉献,您可以获得作为数据科学家开始成功职业生涯所需的技能。
如何学习数据科学的编码
意见
提示 1:停止参加在线课程

当我第一次想学编程的时候,我在 YouTube 上看了 4 个小时的教程。
课程结束后,我想:“太棒了”。"我现在知道如何编码了!”
我很兴奋!我想了解更多。
所以我又上了一门教程。
然后…..我又拿了一个。
还有一个。
听着耳熟吗?
这种情况持续了一段时间,直到我最终放弃学习如何编码。
我太习惯结构化的课程了,而且似乎没有明确定义的教学大纲可以让我在编码方面从“零到英雄”。
嗯,至少我试过了。现在我知道这不适合我,”我心想。
一年后,在与一些程序员交谈并阅读了一些资料后,我意识到自己陷入了一个叫做的教程陷阱。
什么是教程陷阱?
教程陷阱真的很容易掉进去了。
你想学习编码。有人承诺,如果你学习他们的课程,你将成为一名程序员。
你选这门课。
你用新的框架和语言一次又一次地这样做。
这是一个非常棘手的情况,尤其是因为你实际上感觉你在每个教程中都学到了一些东西。
不幸的是,你无法学以致用。你不能用自己的代码来解决问题,更不用说从头开始创建一个完整的项目了。
如果这是你,那么是时候跳出教程陷阱了。
突破教程陷阱

如果你读这篇文章是因为你想成为一名程序员,你来错地方了。
每个人学习编码的道路是不同的。我会简单地根据对我有效的方法给你指出正确的方向。
要跳出教程陷阱,首先需要停止上教程。
如果你上过一两门在线课程,你就会知道基本的语法和操作符。
- 变量
- 功能
- 控制流
- 环
- 数组
一旦你熟悉了基础知识和它们是如何工作的,继续前进!
所有的在线课程都会教你同样的东西,多学一门只会浪费你的时间。
了解这些之后,继续前进,开始做一些小的编码挑战。

Jukan Tateisi 在 Unsplash 上的照片
我个人最喜欢的是一个名为 HackerRank 的网站。他们面临不同难度的挑战。
一旦你掌握了编程的基本知识,这是一个很好的入门方式。它会帮助你熟悉这门语言。
这些挑战一开始可能会有点吓人,因为这是您第一次在没有编码的情况下解决问题。
如果你中途遇到困难,看看另一个人的代码也会帮助你开始思考。(不要只是复制粘贴他们的代码,试着去了解他们是如何解决的。)
当你看别人的代码时,你会注意到他们都是不同的。看待一个问题的方式总是不止一种,你可以采取许多不同的方法。
这将真正改变你作为程序员的思维方式,提高你的编码能力。
项目,项目,项目

Jo Szczepanska 在 Unsplash 上拍摄的照片
一旦你对自己无需遵循教程就能编写代码的能力有了一些信心,你就可以从项目开始了!
开始之前,心中要有一个最终产品
当我第一次进入数据分析领域时,我在任何地方都读到同样的建议。
做项目!
然而,我不知道该做什么项目。每次我开始做一件事,它都没有结果,我永远也不会完成它。
这是因为我头脑中没有一个坚实的目标。
当创建一个项目时,头脑中始终要有一个坚实的最终目标。此外,确保这是一个你有兴趣做的项目。否则你将永远无法完成它。
这里有一个例子:
你想分析音乐行业的发展趋势。
最终目标:利用艺术家姓名和流派等数据,发现音乐趋势随时间变化的模式。
为此,您首先需要收集数据。
这可以在网络刮刀或 API 的帮助下完成。这将需要相当多的编码,这本身就是一个很好的中级编码项目。
然后,您需要清理数据。这是一项简单的任务,但由于数据可能会非常混乱,因此可能会非常耗时。
执行数据分析任务不需要很高的编程技能。需要做的大多是数据操作,不需要太多逻辑就能做到。
最后,您可以执行实际的分析。为了做到这一点,你需要知道如何使用可视化库,这很容易掌握。Matplotlib 和 Seaborn 是两个流行的 Python 可视化库。
就是这样!
这只是你学习数据科学编码应该采取的步骤的一个粗略的想法。
我知道数据科学是一个吸引各种不同背景的人的领域。如果你来自非技术背景,编码部分可能一开始看起来真的很吓人。
每个人似乎都在编写这些非常复杂、大而无意义的代码。
然而,你需要记住每个人都有起点。
即使是最好的程序员也是从“Hello World”开始的,你只需要有耐心。
给自己一些时间去学习,拥抱学习曲线。就像学习游泳、开车或骑自行车一样,学习编码不是一夜之间就能完成的。这需要大量的练习和盯着电脑屏幕才能实现。
我希望这篇文章是有帮助的,感谢阅读!
犯错误仅仅意味着你学得更快
如何学习数据科学,开始你的神奇之旅
数据科学学习指南

JESHOOTS.COM在 Unsplash 上拍照
随着科技行业的快速变化和机器人创新的到来,数据科学是开始学习的最佳领域之一。如果你对数据和如何使用数据充满热情,这篇文章将帮助你了解如何学习数据科学专业,以将你的兴趣转化为高薪职业。
数据科学新手的学位或证书
你可能会认为是时候获得一个技术学位或证书作为你的第一步了。实际上,你不需要这个。为什么?你的知识和你能做什么将是你面试的主要因素,而不是教育。
是的,拥有一个技术学位或证书当然是好的,但这不会仅仅因为你有文凭就帮你找到工作。所以把证书/学位当做一个可选项。拥有它是好事,但绝对不是你开始数据科学家之路的第一件事。
另一方面,如果你决定把你的时间奉献给一条深度学习的道路,而选择的大学或课程帮助你获得了你实际上会用到的知识,那就完全是另一回事了。
所以我的总体建议是开始一条理论或实践的学习之路。如果你有大量的时间和金钱,去学习课程,甚至获得学位。记住,公司不会非常详细地询问你的学历文件。你的回答会很笼统:“是的,我有学位/证书”或者“不,我没有学位/证书”。
还有,2020 年是远程做任何事情的一年。我相信你可以在网上获得一切,而不是去现场学习。在我们这个时代更安全,更有效。
你需要学习的技能
你学习道路的基础是 Python、SQL、机器学习和统计学。这些知识是高级的,所以让我们分别复习一下。
计算机编程语言
这将是你学习的第一门编程语言。这是非常令人兴奋的!为什么?因为 Python 是通用编程语言。它支持很多框架和库。学习起来既简单又快。此外,用 Python 而不是 Java 编写将节省大量时间。
如果您想了解更多为什么我给予 Python 如此高的优先级,我有一篇关于 Medium 的单独文章,提供了所有细节:
[## 作为数据科学家,你需要学习 Python 的 7 大理由
Python 给数据科学家带来的好处
towardsdatascience.com](/top-10-reasons-why-you-need-to-learn-python-as-a-data-scientist-e3d26539ec00)
你需要同时学习和练习。试着用包含在文件夹中的项目来构建你的学习路径。这意味着一旦你掌握了足够的理论知识,就要尽可能多地包含实践步骤。这样,你很快就可以用纯 Python 写东西了。这包括基本语法、功能、控制流、循环、模块和类。
结构化查询语言
要使用数据库,您需要学习 SQL。这项技能允许您提取数据并与之交互。有不同的 SQL 类型,但是作为一个新手,你需要学习基本的分析 SQL。
可以用 W3School 借鉴一下。它有一个你需要的基本理论。同样,最好尽可能频繁地学习理论和实践。记住,任何科技行业都需要大量的实践经验。如果你停止练习,你会很快失去知识。
与 SQL 相关的问题是数据科学家在面试中的热门话题。这就是为什么它是学习 SQL 和自信快速回答面试问题的另一个原因。
统计数字
你当然应该学统计学。概率的主要关注点是分布、统计意义、假设检验和回归。
你可以把你的统计学习分成几个步骤:
- 核心统计概念
- 试验设计
- 回归建模
- 数据转换
2.贝氏思维
3.机器学习
检查 UCI 机器学习知识库。您可以将他们的数据用于您的个人项目。也可以部署一个模型。构建您的项目并将其存储在 Github 上。这是学习和建立个人投资组合的最佳方式。

机器学习
我假设数据科学家最流行的方法来自机器学习。它不同于其他计算机决策,因为它包括预测。计算机能够使用算法用自己的数据预测结果。
如果将来要构建和部署产品,ML 肯定是一开始就要学的东西。在所有的数据科学家职能中,有一个软件工程师,需要 ML 知识。
如您所见,数据科学家不仅是构建模型的人,也是运行和支持模型的人。意思是她/他类似于软件工程师。
一些有用的链接
这里有一个列表可以帮助你:
可汗学院 —学习技术资料
Codeacedmy Python 课程 —这是一门学习 Python 的好课程
统计学习简介 —从这里学习统计。
数据灵丹妙药:数据科学新闻和资源
重要说明
当你学习数据科学时,为开源项目做贡献。您可以找到许多需要社区帮助的 Python 库。这是一个很好的方法:
- 练习你的技能;
- 从其他人那里获得即时反馈和帮助;
- 参与真实的项目;
- 开源项目可以组织一次黑客马拉松,你可以参加;
- 你向别人学习;
- 你的作品集有一个真实的项目。
结论
数据科学家是一个非常创新和高薪的专业。如果你想学得快,我分享了一些有用的步骤,会让你在学习之旅中获得成功。我希望我已经激励你成为一名数据科学家,你将使用我的提示开始你的学习之旅,成为一名数据科学家。
如何在短短 1 年内把数据科学从初学者学到大师(我的亲身经历)
从初学者到大师,我学习数据科学的清单的完整汇编只需要一年的时间旅行故事。享受学习!

索尼娅·兰福德在 Unsplash 上拍摄的照片
终于,这篇文章是我们一直在等待的。在这篇完整的文章中,我们将讨论一个完整的大一新生如何在广阔的机器学习和数据科学领域开始他们的旅程,从学习核心概念和编写基本代码一直到破解面试,并随着时间的推移获得经验。互联网和书本上有如此多的内容,但是读什么和不读什么呢?完全糊涂了!让我们倒退一下,回到过去,从头开始一切。
如果你是一个初学者,并且想带着极大的热情学习数据科学,那么相信我,这篇文章肯定会帮助你制定学习机器学习和数据科学的计划。
在此之前,只是一个小提示,本文将很短(😅不那么短),简单而精确,讨论了如果我再次回到过去,并准备成为一名数据科学家,用一个很酷的时间旅行讲故事,我会遵循的确切方法!
如我所说,让我们回到一年后,开始我们的旅程。

来源:瑞克和莫蒂的时间旅行
感谢里克和莫蒂在 2019 年把我们送回来!现在我们已经有了完整的一年,让我们来规划我们完整的路线图。所以基本上,首先让我们创建一个清单,列出我们在直接探索和学习之前可能想到的事情。我的简单描述清单如下:
- 学习一门编程语言(R 或者 Python)。
- 熟悉应用数学(LA,Stats,Prob)。
- 开始读 ML/AI 上的博客,听播客。
- 阅读一些令人惊奇的书来建立基础。
- 学习机器学习和深度学习。
- 尝试这些技能,做一些实践。
- 利用竞争数据科学构建一些端到端项目。
- 申请和破解面试。
现在,在我们知道最好和最有用的资源并让自己始终保持学习的动力之前,这个清单是没有用的。
这两件事如果能完美地付诸实施,我真的可以在一年内成为一名优秀的 ds!
学习编程语言
要成为一名数据科学家,你不需要成为一名专业的编码员,或者是 CodeChef 或 TopCoder 上的五星,你只需要知道如何用你喜欢的语言编写一个优化的代码。来自不同背景的人,尤其是没有编码经验的人,通过学习聪明地编码,在短短一年内被证明是优秀的数据科学家。

谷歌趋势 R(红色)vs Python(蓝色)
选择一种语言: Python 和 R programming 自 2014 年以来一直是机器学习和数据科学领域最受支持的语言之一,因为它们易于使用,并且广泛支持一个详尽的库列表,只需几行代码就可以做任何事情。上面的谷歌趋势图显示了这些语言在谷歌搜索引擎上的受欢迎程度。你可以尝试两种语言,看看哪一种更适合你,哪一种对你以后的工作更有帮助。
有些人甚至会两者都学,但就目前而言,我会根据自己的需求选择 Python。根据我的经验学习 Python 的几个资源有 YouTube:send ex或者 科里斯查费 。除此之外,我更愿意在【data camp】上一个月的包,尝试一下我的 python 实践课或者免费的,【LearnPyhon.org】的也会有同样的帮助。****
熟悉应用数学
任何人都可以只用 3-4 行代码就让机器学习模型工作,但你有没有想过幕后发生了什么?机器学习算法的核心承载着背后运行的数学,并让它为我们工作。对库的支持减轻了我们的工作,但我们需要清楚它是如何工作的,以及我们如何构建自己的模型。
要做到这一点,我们需要非常清楚线性代数等核心数学,向我解释每一个算法的几何直觉,以及我如何在理解代数和向量系统的情况下制作自己的模型。主题包括矩阵代数和向量系统,可用于主成分分析(PCA)、支持向量机(SVMs)和许多其他数学模型。
其次,统计学和概率对于理解数据中的模式和从中发现洞见非常重要。机器学习所需的统计和概率理论是对各种分布的理解,如高斯分布、二项式分布、基于条件概率的概率规则贝叶斯定理、佩里托定律等。
微积分在理解数学模型中也起着非常重要的作用,一些必要的主题包括微分和积分,拉普拉斯,雅可比,偏导数,方向梯度,拉格朗日分布等。
最后,算法和优化问题是我们的机器学习算法的计算效率和可扩展性所需的另一个非常重要的数学分支。使用最佳算法理解,可以很好地理解如何编写最佳模型构建或数据规范化。
一些好的资源可能是 ISLR 的或者是用于机器学习专业化的 数学 或者是可汗学院的 线性代数概率&统计多变量微积分**和 优化**********
阅读博客、文章和听播客
每天都有大量经验丰富的人发布惊人的博客。我可以选择每天读几本。现在,我需要计划我一天可以消化多少博客/文章而不中断流程,并了解数据科学领域正在发生的事情,或者熟悉一些科技人工智能新闻,或者可以是任何事情。一些真正优秀的定期发布一些惊人内容的出版商有朝向数据科学 、 数据驱动投资人 、Analytics Vidya,或者 KD 掘金 等。
听几个很棒的播客可以极大地提高我理解惊人项目背后的科学的技能,或者研究人员对机器学习和人工智能领域的干扰有多深。播客基本上帮助我们建立可实现的数据素养,与每个人交流我们的数据故事。一个可以经常收听的播客列表是这里的,其中我个人更喜欢雨果-鲍尼的 DataFramed 或基里尔·叶列缅科的**SuperDataScience Podcast 或有时是data hack Radio****on sound cloud on day bases。**********
阅读机器学习书籍
"对于那些寻求超越平凡的人来说,阅读是必不可少的。"—吉米·罗恩
读书是我今年应该做的最重要的事情之一,以提高我的学习。我应该说,如果你是一个爱书的人,那么书是提高你学习的最好来源之一。我可以选择阅读免费的电子书或购买纸质书,任何东西都可以。有很多书可以购买并开始阅读,但我建议阅读的一些好书是:
- 用于数据分析的 Python,
- 统计学习简介,
- 使用 Scikit-Learn、Keras 和 TensorFlow 进行机器实践学习,
- 模式识别和机器学习由 Christopher M .和 Bishop,
- 深度学习Ian good fellow,
- 其他一些奥莱利的书也很棒,等等。
学习机器学习和深度学习
在线 MOOC 课程可能是一个非常好的资源,可以在更短的时间内学习 ML 和 DL,并保持旅程的互动性。我更愿意参加以下学习 ML 和 DL 的课程。
- 机器学习由斯坦福大学、
- 应用数据科学与 Python 专业化密歇根大学,
- 深度学习专业化由 deeplearning.ai、
- 应用人工智能课程Srikanth Varma,
- Udemy 的基里尔·叶列缅科教授的数据科学和 ML 课程,
- 对于 CNN 和计算机视觉 CS231n 由斯坦福大学、
- 还有斯坦福大学的 for NLP CS224n 都是很美的课程等等。
除了这些,全球的一些标准大学也为 ML 和数据科学提供令人惊叹的在线或离线课程。如果你想了解更多,你可以在他们的官方网站上查看,或者阅读相关文章了解更多。
技能健身房和动手实践
告诉我,我会忘记。教我,我会记住。让我参与进来,我会学到东西。—本杰明·富兰克林
更重要的是,如果一个人只是不停地学习而不参与事物,那么他就不能把知识长久地保存在持久的记忆中。动手实践是学习的一个非常重要的过程。毫无疑问,我更愿意要么在我的本地机器上为我学到的每个概念编写代码,并将其推送到 T2 的某个云上,要么使用一些好的在线平台在他们的云上做同样的事情,比如 T6、T7、DataCamp、T11、T13、Dataquest、T14、T15。这将帮助我不仅使我的概念变得强大,而且随着时间的推移提高我的编码技能,我可以随时通过查看代码来修改。
构建端到端项目并参与竞争
在项目中应用我过去所学的知识对于了解 ML 项目在真实行业中是如何构建的非常重要。你会得到一份你可以做的项目的详尽清单,DataFlair、Simplilearn 或互联网上的任何随机文章都可以帮助你开始做基础项目。其次,为 GitHub 或任何 VCS 上的公共项目制作一个记录良好的代码库肯定会帮助我建立一个好的投资组合。
参加比赛最终还会帮助我变得擅长编码,并将我的技能应用于现实世界的问题,并了解我在全球排行榜上的位置,这可以帮助我纠正错误,建立更好的自我。我会参加任何关于分析 Vidya驱动数据 或 黑客地球等的比赛。他们主持惊人的全球研究和行业水平的竞赛。但是要确保你不会过度劳累😂!********
你可以阅读下面这篇文章来了解更多关于我在 Kaggle 上来自未来的旅程(😅别忘了我们现在是在过去)。
****** [## 我是如何在短短 1 个月内成为 Kaggle 3X 专家,并在 3 个月内成为大师的!
让我们来谈谈我在加入平台仅一个月内成为 Kaggle 专家的故事,以及我是如何设法…
towardsdatascience.com](/how-i-became-kaggle-3x-expert-in-just-1-month-b63b37b53865)******
破解采访
现在,我应该完全准备好了一切,并开始申请数据科学职位,应该努力提高我的沟通技能、数据叙事和其他软技能。我应该能够充分理解我过去所做的工作和我做过的项目,并且能够用比别人更好的方式来解释它们。
你的知识不会让你找到一份好工作,除非你有一个很好的投资组合,这说明了很多关于你的事情,如果你有兴趣了解更多关于为自己建立一个好的投资组合的信息,请阅读这篇文章!
****** [## 如何建立一个能让你找到工作的数据科学投资组合?
学会制作一个关于你的强有力的作品集!
towardsdatascience.com](/how-to-build-a-data-science-portfolio-that-can-get-you-a-job-9f8d113739b3)
如果我现在遵循所有的事情,在一年之内,我将能够突破 ML 和数据科学技术,并将能够获得一份好工作,我的朋友也一样,他通过这篇文章与我一起走过了完整的旅程😉!
让我们在一次很酷的时间旅行后及时回到 2020 年,并充分利用我们由于柯维德疫情不确定性而拥有的时间来学习并擅长机器学习和数据科学。******
给你额外的小费!
恭喜🎉如果到目前为止你还在读这篇文章,那么你真的是一个对成为数据科学家有毅力和决心的人,并且很快就会成为一名数据科学家!
如果你是一个初学者,并正在寻找一些东西开始,我希望你会有一个清晰的图片来选择和规划自己的自定义清单。
想了解更多关于统计学、机器学习和数据科学的知识吗?
你可以在这里阅读我的其他类似博客:
释放你内心的超能力!
medium.com](https://medium.com/datadriveninvestor/how-to-become-super-powerful-and-successful-cdf65722a765) [## 如何评价 Python 中机器学习模型性能?
一个实用的方法来计算模型的性能和在 Python 中的实现,涵盖了所有数学…
towardsdatascience.com](/how-to-evaluate-machine-learning-model-performance-in-python-135b4ae27f7e) [## “正态分布”的功效
理解钟形曲线背后的科学!
towardsdatascience.com](/the-powers-of-normal-distribution-4cbb06e4a955)
谢谢你,祝你新的旅程好运!
其他资源和参考
- https://medium . com/forward-artificial-intelligence/top-university-to-purchase-a-masters-in-the-us-ai-d4a 461229 fbb
- https://towards data science . com/python-vs-r-for-data-science-6a 83e 4541000
- https://towards data science . com/the-mathematics-of-machine-learning-894 f 046 c 568
- https://towards data science . com/top-competitive-data-science-platforms-than-ka ggle-2995 e9 dad 93 c
- https://towards data science . com/8-ml-ai-projects-to-make-your-portfolio-stand-out-BF C5 be 94 e 063******
2020 年如何学习数据科学
我自学了数据科学,你也可以。

照片由 Aaron Burden 在 Unsplash
自从我在上发布了一篇获得数据科学工作的帖子后,许多读者在 LinkedIn 上向我寻求建议。
大多数人问我同样的问题——“像我这样的完全初学者如何学习数据科学?”
学习数据科学可能看起来极其令人生畏,当你开始时感到不知所措是正常的。
外面有很多 MOOC,承诺教你关于这个主题所需要知道的一切。
你每天看不同的博文信誓旦旦的说这是适合你的正确道路,告诉你如何在不到一个月的时间里成为一名数据科学家。
不知何故,这些事情对你都没用。
为什么不呢?
因为每个人都不一样。没有一条路可以让我们都到达同一个目的地。

创建自己的数据科学学习路径,而不是遵循其他人声称对他们有效的方法。
在本文中,我将介绍成为数据科学家所需了解的一切。我还会给你提供一份你可以学习的资源清单。
利用这些资源,你可以开拓出一条最适合你的学习之路!
你需要知道的是
编程;编排

詹姆斯·哈里森在 Unsplash 上拍摄的照片
学习数据科学需要一些编程技能。从两种语言中选择一种——R 或 Python,然后开始。
对于一个完全的初学者来说,学习如何编码似乎是一项艰巨的任务,但实际上并没有那么难。
当我学习我的第一门编程语言时,我向我的朋友(他有大约十年的编程经验)寻求编码建议。
他告诉我,所有经验丰富的程序员都有一项伟大的技能:
长时间盯着电脑的能力。

这是你开始学习编码时需要养成的习惯。从编写小段代码开始,自己修复错误。
然后开始创建自己的小项目。在这个过程中,你会学到比仅仅学习在线课程更多的东西。
在线课程对刚起步的人来说很棒,可以让你走上正确的道路,但不会让你成为程序员。
如果你是一个完全的初学者——没有编程经验或统计背景,我建议从 Python 开始。
这是因为 Python 是一种高度通用的语言,它的语法比其他语言更容易掌握。
一旦你有了坚实的 Python 基础,学习你的第二和第三编程语言将会容易得多。
资源
第一步:在线课程— 2020 年完整 Python 训练营:从零到 Python 中的英雄 n
如果你是一个完全没有任何编程经验的初学者,我建议你参加这个课程。
这是一门介绍性课程,将带您了解 Python 编程的基础。本课程在 Jupyter 笔记本上讲授,这很好,因为这是一个您将在数据科学中使用的编码环境。
我没有上过这门课,因为在学习数据科学之前,我已经有了一些编程经验。
然而,我确实上了同一个老师(何塞·波尔蒂利亚)教的另一门课,而且非常喜欢这门课。他的教学风格令人难以置信,他有一种用简单易懂的方式分解复杂概念的诀窍。
第二步:黑客排名
在熟悉了语言的基础之后,你需要练习。
HackerRank 是一个非常棒的网站,而且完全免费!
在各种不同的语言中,存在着从简单到困难的编码挑战。
前几个挑战非常简单,是对你已经学过的所有概念的回顾——循环、数组、条件语句等等。
之后,挑战会变得稍微困难一些,需要一些逻辑来解决。然而,它们并没有那么难,并且是提高您的编码技能的好方法。
每当我想学习一门新语言时,我每天都会花大约 4-5 个小时来解决黑客问题。这有助于我更快地熟悉这门语言。几周后,我准备开始做项目了!
第三步:项目
现在,你准备好做项目了!
这篇文章提供了一些难度不同的非常棒的项目想法。
从一些最简单的开始,然后一步一步来。
等你做完这些,恭喜你!你知道如何用 Python 编码。
接下来,我建议学习统计学。
统计数字

由 Carlos Muza 在 Unsplash 上拍摄的照片
就其核心而言,数据科学基本上就是统计学。统计概念用于从数据中获得洞察力并做出决策。因此,要成为一名数据科学家,你需要有扎实的统计学背景。
资源
第一步:课程— 可汗学院
汗学院有一门很棒的统计学和概率课程,作为一个绝对的初学者,你可以选修。
然而,我在观看讲座时注意到的一点是,它们只触及某些重要主题的表面。因此,我用步骤 2 中的资源补充了我的学习。
第二步:玛丽安大学——社会科学应用统计学
这个网站是学习统计学的一个很好的资源。没有视频讲座可以借鉴,但是每个话题都有很棒的例子详细讲解。
你可以做大量的练习题,它会带你了解从假设检验到线性回归的概念。
学习材料并做所有的练习题,你会比从任何在线课程中学到的更好地掌握所有这些主题。
第三步:概率
学完基本的统计概念,就要学概率。概率知识对于数据科学家来说是必不可少的,因为它塑造了你的决策过程。
麻省理工学院开放课件的概率介绍是一个很好的起点!
数据分析

塞萨尔·阿布纳·马丁内斯·阿吉拉尔在 Unsplash 上的照片
有了统计学和编程的知识,你现在就可以学习数据分析了!
在这里,您将学会使用之前所学的知识从数据中获得洞察力,并提取有用的信息。
资源
第一步:课程— 数据分析基础
这是一门很棒的在线课程,教你如何应用统计学和编程从数据中获得洞察力。
事实上,如果你想学会快速分析大量数据,跳过前面两步,这个课程是适合你的。
它是用 R 语言讲授的,学习这门课程不需要任何编程背景。
第二步:项目
再说一遍,我的建议是做项目。
找一个你感兴趣的话题,找一个数据集,开始你的分析吧!
我已经写了一整篇关于创建数据分析项目的文章,你可以从中寻找灵感。
机器学习

安迪·凯利在 Unsplash 上的照片
终于可以开始学习机器学习了。
机器学习是你如何教计算机学习和做决定,而不用显式地给它们编程。
数据科学是一个更广泛的术语,它将带您了解整个数据处理方法。机器学习属于数据科学,本身就是一个很大的领域。
如果你想学习用数据做更多的事情,并提出模型来进行预测,那么你也应该学习机器学习。
资源
有太多的工具可以用来研究机器学习。然而,大多数在线课程只给你初级到中级的知识。它们只是不够深。
鉴于此,我将推荐一些额外的学习资源和书籍,您可以用它们来跟进这些课程。
第一步:基础知识— 吴恩达的机器学习课程
斯坦福大学传奇的机器学习课程对初学者来说非常适合。它教你机器学习算法是如何工作的,而不需要太多的数学知识,这使得它对于没有数学背景的学习者来说是可以理解的。
然而,这门课程的一个缺点是实践是在 Matlab 中教授的。如果你想要一个 Python 的替代品,我建议你选择这个课程。
第二步:数学
首先,学习数据科学的线性代数。如果你是一个完全的初学者,我建议可汗学院的线性代数课。麻省理工学院开放课程也提供更深入的线性代数课程。
接下来学习多元微积分。这个是可汗学院学习路径的链接,这个是麻省理工学院开放式课程的链接。
书籍
几本书将补充你的学习过程:
第四步:高级机器学习专业化 — Coursera
这是用 Python 教授的七门机器学习专业课。先决条件包括机器学习算法的知识、数学背景和 Python。
这门课程将带你经历从深度学习到教你如何赢得顶尖棋手的棋牌比赛的一切。
还有…就是这样!
我希望本指南有助于启动您的数据科学之旅。
记住,你不必按照我列出的顺序来学习这些东西。
我用自下而上的方法学习数据科学。我没有先学习统计学和理论,而是开始看 Kaggle 教程,用 Python 实现机器学习算法。
然后,我对底层算法及其工作原理感到好奇,这是我开始学习其背后的数学和理论的时候。
我上面列出的资源和我在学习过程中使用的大部分是一样的,但是我使用的顺序不同。
你可以用任何你想要的方式开始你的学习过程,只要做最适合你的。
只要坚持不懈,你就会成功。祝你好运!
如何在线学习数据科学:你需要知道的一切
Python、SQL、机器学习、作品集以及其他在线资源

来源: Adobe 股票
这是利用在线资源进入数据科学的完整路线图/课程。
无论你是想免费学习还是更高效地学习**,本指南将带你一步步走上正确的道路。我们将讨论技能、在线课程、书籍以及其他资源。
你会发现:
- 数据科学的基础 (Python、SQL、机器学习/统计)以及如何学习它们。
- 为什么以及如何建立数据科学组合。
- 深入数据科学世界的其他技巧/资源。
立即开始您的数据科学之旅!
我们是谁,为什么要遵循这个路线图?
Justin 和 Lianne 都在数据科学领域工作了 5 年多。我们曾在各种行业工作过,如营销、欺诈、反洗钱和大数据技术。Justin 拥有计算机工程学士学位和统计学硕士学位(后来的);而 Lianne 拥有统计学学士和硕士学位。
数据科学是计算机科学和统计学的混合。我们俩都是从一边开始失踪的。因此,我们理解学习其他领域以进入数据科学的挑战。凭借我们的工作经验,我们也了解行业的需求。
我们写下这个路线图(和数据博客中的)是为了帮助更多的人进入这个有趣而有前途的领域。
这些建议都是基于我们多年的经验加上数小时的研究。
希望你能找到有用的东西。
第 0 步:感受数据科学
为什么是数据科学?我应该进入这个领域吗?
花点时间想象一下:
- 你可以基于数据分析探索世界,发现模式/真相。
- 你可以通过使用先进技术、机器学习算法来影响世界。
- 你有一份你热爱的**高薪工作。
如果所有这些听起来像你想要的,那么数据科学就是为你准备的!
查看这些 YouTube 视频,更好地了解数据科学:
请记住,数据科学对许多不同的行业都很有用,例如:
- 机器人学
- 营销
- 金融
- 卫生保健
它可以用于许多不同的应用,例如:
- 分析学
- 预言;预测;预告
- 分类
- 建议
- 自然语言处理
还有各种数据科学职业道路。您可以是报告分析师、数据分析师或数据科学家。它们都需要不同的优势/技能。
毕竟,拥有一套新技能不会有坏处。
一旦你下定决心,让我们开始艰苦的(但有趣的)工作。**
步骤 1:学习数据科学的基础知识
数据科学是不同领域的混合体,包括计算机科学、统计学、信息科学、数学。所以你需要同时具备编程/编码技能和理论知识。
我们需要知道哪些数据科学的基础知识?
最终,我们所有的努力都是为了在数据科学领域开创事业。你可能想知道雇主想要什么:
哪些数据科学语言/工具?
有哪些顶级技能?
对学历的最低要求是什么?
这就是为什么我们根据实际上是的招聘信息总结了上述问题的答案。查看帖子2020 年数据科学家的热门技能有哪些寻找答案。
为了让开始变得简单,我们将重点关注以下技术技能:
- 计算机编程语言
- 结构化查询语言
- 机器学习(包括基础统计)
提示:还有其他工具/技能比如生产系统,软技能。但是你会一路发现它们。他们也依赖于工业。没有必要一开始就把一切都压得喘不过气来。
披露:以下所有推荐课程、书籍都是由我们独立挑选和测试。一些课程和书籍有平台或亚马逊的附属链接,这意味着如果你通过它们购买,你不会多花一分钱,但我们会得到一小笔佣金。这有助于我们保持光明。谢谢!
数据科学在线课程
我们应该从许多不同的课程中挑选哪些课程?
下面我们总结一下最流行的平台的特点。
我们会针对 Python / SQL / 机器学习的每个话题提供更多详细推荐。请继续阅读,找出答案。**

- 迎合没什么经验的人
- 注重基础,易于掌握
- 使用 Python/SQL/R 交互环境
- 数据科学项目组

- 可以免费旁听特定时间的部分课程
- 付费证书
- 主要由麻省理工学院、哈佛大学等学院/大学的教授授课

- 可以免费旁听部分课程
- 付费证书
- 大多由来自各种顶级学院/大学的教授授课

- 拥有最大的课程选择,任何人都可以成为平台上的讲师
- 良好的审查系统

- 由谷歌、AWS、IBM 等顶级科技公司打造并获得认可
- 更深入:纳米学位需要 4-5 个月才能完成(每周 5-10 小时)
- 有现实生活中的项目被审查
- 提供技术指导支持
- 提供个人职业服务
Python
Python 是最需要的数据科学语言,而且可以免费使用。它是一种功能强大的语言,可以帮助您完成大多数数据科学任务,甚至更多!
r 是另一种流行的数据科学语言。然而,如果你仍然在 R 或 Python 之间挣扎,请阅读2020 年数据科学家的热门技能是什么。
根据我们的经验,我们编制了一份对数据科学至关重要的清单:
- 数字类型
- 布尔类型
- 列表
- 设置
- 字典
- 功能
- 日期
- 文件
- 字处理
- 条件句—如果/否则
- 环
- 软件包—安装、导入等
这听起来像很多概念。
更新:刚入数据现推出 免费 Python 速成班:突入数据学!
该课程对初学者友好,涵盖了开始数据科学所需的基础知识。点击下面的链接注册/了解更多信息!
*** [## 为数据科学学习 Python:免费在线课程-数据入门
从你注册后的第二天开始,我们将每隔一天向你发送 6 封电子邮件/课程。大多数课程将…
www.justintodata.com](https://www.justintodata.com/learn-python-free-online-course-data-science/)
但是不要担心,我们复习了会有帮助的在线课程。以下所有课程包含了我们刚刚提到的大部分概念,你可以很容易地在课程期间/之后填补空白。
查看以下评论:
- 内容质量/覆盖面基于上述基本知识列表和我们的判断。
- 承受能力是以金钱为基础的。$符号越多,课程越贵。
- 推荐的课程包括我们认为最好的课程,涵盖了 Python 的基础。我们逐一审查了每个平台上的不同选项。
注意:介质不允许表格。为了更好的观看体验,请查看原帖如何在线学习数据科学:你需要知道的一切。
内容质量 / 覆盖率:4/5
负担能力:$
推荐课程:
课程以模块形式提供,
所以需要以下所有:
–Python 简介
–中级 Python
–编写高效的 Python 代码
–在 Python 中处理日期和时间
内容质量 / 覆盖率:4/5
负担能力:审核一段时间获得免费获得或获得
证书获得 $
推荐课程: 数据科学 Python 基础
内容质量 / 覆盖率:3.5/5
负担能力:审核为免费 或
领取证书为 $$
推荐课程: Python 为大家特殊化
内容质量 / 覆盖率:4.5/5
承受能力:$$$
推荐课程: 完整 Python Bootcamp:在 Python 3 中从零到英雄
内容质量 / 覆盖率:5/5
负担能力:$$$$
推荐课程: 用 Python 进行数据科学编程
提示 :
以上大部分课程都没有涵盖安装程序,这可能会让人感到困惑。查看我们的帖子,获得逐步指导:如何安装/设置 Python,并立即准备数据科学。学习编码的同时练习是必不可少的。我们不可能一下子掌握 Python 中的每一个包/函数。先把基础学起来,边练边学别人就行了!
在进入机器学习之前,也有必要熟悉两个必须知道的包:
- NumPy : 一个允许高效数值运算的低级包。所有其他 Python 机器学习包都使用它。
你可以在他们的网站上看一下教程,这也是一个很好的参考值得保留。 - 熊猫(Pandas):一个建立在 NumPy 基础上的包,用于数据清理、管理和探索。
这很容易掌握,但可能会令人困惑,因为做事的方式各不相同。从阅读这份材料开始。你也可以尝试搜索一些在线课程来获得更深入的信息。下面我们也会推荐几本书。
SQL
SQL 是经典的,并且仍然是从数据库中提取数据的主要语言。大多数公司的数据库中都有数据,这使得 SQL 成为数据科学的一项基本技能。
根据我们的经验,我们编制了一份对数据科学至关重要的清单:
- 挑选
- 过滤器
- 加入
- 聚集
- 分组依据
- 子查询
- 公式
- 创建表格
- 索引/键
- 窗口功能
- 数据库表图表
查看以下评论:
- 内容 质量/覆盖面基于以上列举的必备知识和我们的判断。
- 承受能力是以金钱为基础的。$符号越多,课程越贵。
- 推荐课程包括我们认为最好的课程,涵盖了 SQL 的基础知识。
我们逐一查看了每个平台上的不同选项。
注意:介质不允许表格。为了更好的观看体验,请查看原帖如何在线学习数据科学:你需要知道的一切。
内容质量 / 覆盖率:5/5
负担能力:$
推荐课程:
课程以模块的形式提供,
因此需要以下全部:
–SQL 简介
–SQL 中的联接数据
–中级 SQL
–SQL 中的探索性数据分析
–PostgreSQL 汇总统计和窗口函数–
–SQL 中的关系数据库简介
内容质量 / 覆盖率:4/5
负担能力:审核一段时间获得免费 或
获得 $ 证书
推荐课程: 数据科学 SQL
内容质量 / 覆盖率:4/5
负担能力:审核为或
赚取证书为 $$
推荐课程: 数据科学 SQL
内容质量 / 覆盖率:4/5
承受能力:$$$
推荐课程: 完整 SQL Bootcamp
内容质量 / 覆盖率:3.5/5
负担能力:免费
推荐课程: 用于数据分析的 SQL
机器学习/统计学
机器学习是人们谈论最多的数据科学。我们把它留在最后,因为它需要编程技巧来应用它的算法。机器学习的课程通常也包括统计学的基本概念。
查看以下评论:
- 内容 质量/覆盖面基于我们的判断。
机器学习有不同的课题。我们需要在学完基础知识之后,在具体领域进行更深入的挖掘。 - ****承受能力是以金钱为基础的。$符号越多,课程越贵。
- 推荐课程**包括我们认为涵盖了机器学习基础的最佳课程。
我们逐一查看了每个平台上的不同选项。**
****注意:介质不允许表格。为了更好的观看体验,请查看原帖如何在线学习数据科学:你需要知道的一切。
内容质量 / 覆盖率:4/5
负担能力:$
推荐课程:
课程以模块形式提供,
因此需要以下所有内容:
–使用 Python 中基于树的模型进行机器学习
–使用 Python 中的时间序列分析
–使用 Python 中的线性分类器
–使用 Python 中的聚类分析
–使用 XGBoost
–使用 Keras 进行深度学习简介
内容质量 / 覆盖率:3/5
负担能力:审核一段时间获得或
获得证书获得 $**
推荐课程: 用 Python 分析数据
内容质量 / 覆盖率:4/5
负担能力:审核为或
获得证书为 $$******
推荐课程:
都是理论多应用少:
—应用数据科学配 Python 专精 或
—机器学习配吴恩达(非 Python)
内容质量 / 覆盖率:3.5/5
承受能力:$$$
推荐课程: 用 Python 进行机器学习、数据科学和深度学习
内容质量 / 覆盖率:5/5
承受能力:$$$$
推荐课程:
两个学位都非常全面实用:
数据分析师纳米学位
数据科学家纳米学位
数据科学免费在线教程
也有一些免费的在线书面教程。它们是很好的参考资料,因为它是基于文本的,易于搜索。但是它们通常没有结构,不像课程/书籍那样容易理解。
计算机编程语言
我们为没有编程经验的人推荐在线课程。但是,如果你对 Python 之外的编程很有经验,你可以自学。
查看我们的帖子,了解设置环境的逐步说明:如何安装/设置 Python,并立即准备数据科学。
并且看一看 W3School Python 教程或者 Python Doc。
结构化查询语言
和 Python 一样,还有 W3School SQL 教程 。看一看了解基础。
PostgreSQL 和 MySQL 都是免费的开源数据库。它们在真实的生产环境中也很常见。您可以尝试安装它们,并使用示例数据库进行练习:
学习更高级的窗口函数也很重要。查看以下流行服务器的说明:
机器学习/统计
我们找不到任何涵盖所有必要材料的免费在线教程。所以我们推荐线上课程或者书籍。
如果你预算紧张,试试上面的免费在线课程。
数据科学书籍
阅读是一种传统的学习方式。
我们推荐阅读基础书籍或者只关注概念的书籍。更深入的编程内容有时会过时。
这些书可能涵盖多种技能,所以我们把它们放在一起,而不是分成 Python/SQL/机器学习部分。
从零开始的数据科学是我们找到的开始数据科学的最佳书籍。

阅读这本书需要一些基本的先决条件。它涵盖了广泛的主题,例如:
- 数据科学,机器学习导论
- Python 和 SQL 基础知识
- 线性代数、统计和概率基础
- 数据处理
- 从简单的线性回归到更先进的神经网络的模型
提示:这本书没有深入涉及主题。但这是一个很好的开始。一旦你了解了数据科学的各个方面,你就会找到一条更清晰的道路。
Python 机器学习简介:数据科学家指南如果你想专注于数据科学的机器学习方面,这是一个很好的开始。

这本书包括:
- 机器学习简介
- Python 基础
- 机器学习算法、模型
此外,看看这些初学者友好的书籍:
如果你已经知道了一些基础知识,可以试试下面的书来提高技能:
- 用于数据分析的 Python:与 Pandas、NumPy 和 IPython 的数据角力
- Python 数据科学手册:处理数据的基本工具
- 使用 Scikit-Learn、Keras 和 TensorFlow 进行机器实践学习:构建智能系统的概念、工具和技术
提示:不可能一下子掌握这些课程和书本上的所有概念。很容易感到迷茫和沮丧,但不要放弃和练习。
这就是下一步非常关键的原因。经过几个周期的学习和练习,你会成功的!
摘要
学习数据科学的基础知识仍然有很多选择!有时候选择太多并不理想。
你拥有的选项越多,你就越有可能选择无选项。**
所以,简单来说:
- 想学免费,选择 Coursera 或者 edX ,审核无认证,结合在线免费教程。
别忘了我们的免费 Python 速成班:闯入数据科学! - 如果你想在有预算的情况下高效地学习,请选择数据营或 T21 书籍。
- 如果你想系统而有效地学习,这将节省你大量的时间和精力,选择。
步骤 2:构建数据科学组合
构建数据科学组合非常重要,主要有两个原因:
- 不弄脏自己的手,不去实践,就没有真正的收获。所以在学习了必要的知识之后,把它们应用到现实生活中是很好的。
- 这是向你的潜在雇主展示你既有热情又有能力做的事情的最好方式。
遵循以下一般程序:
找到一个有趣的问题/话题
这个初始过程至关重要,因为人们更关心数据科学能做什么,而不是理论和算法。他们希望数据科学项目变得有趣、有用。我们使用的任何数据科学工具/模型都应该围绕我们试图解决的问题。
请记住,数据科学可以应用于许多不同的领域,因此:
- 如果你有梦想中的行业,关注相关问题可以帮助你找到梦想中的工作。
- 如果没有,试着从日常生活中一些你感兴趣的问题开始。
给出一些想法,
- 我们喜欢看体育比赛,所以我们发现利用数据科学赚点外快很酷。
**** [## 如何提高体育博彩赔率 Python 中的一步一步指南-只是进入数据
体育博彩可能不仅仅是利用你的直觉。查看我用来赚 20,000 美元的数据科学策略…
www.justintodata.com](https://www.justintodata.com/improve-sports-betting-odds-guide-in-python/)
- 我们有兴趣了解更多关于我们最喜欢的健身 YouTube 频道,所以我们深入研究它的数据。
[## 如何用机器学习技术获得更多的 YouTube 浏览量——仅仅是数据
在这篇文章中,我们用 Python 对 YouTube 数据应用了机器学习算法。我们将包括端到端流程…
www.justintodata.com](https://www.justintodata.com/get-more-youtube-views-with-machine-learning/)
- 我们想更多地了解冠状病毒,这种疾病极大地影响了我们的生活。所以我们也研究了它的数据。
这是利用在线资源进入数据科学的完整路线图/课程。你是否想学习…
www.justintodata.com](https://www.justintodata.com/coronavirus-death-rate-with-hyperparameter-tuning/)
你肯定能找到一个数据科学能帮上忙的有趣话题!
查找与主题相关的公开数据集和文章
有了问题的想法后,我们可以开始寻找数据集进行分析。
一些数据可以通过公共数据源轻松访问,例如:
- 卡格尔
- 我们的数据世界
- 政府网站如美国开放数据源、加拿大统计局
- 用于数据集搜索的谷歌工具
有些可能需要你收集数据。但是不要担心,Python 可以帮你实现。
例如,为了获得 Indeed 工作发布数据,我们用 Python 从 Indeed 网站抓取数据。看看如何在 Python 中使用 NLP:一个实用的分步示例。
提示:许多文章建议参加 Kaggle 竞赛,但我们发现许多数据集或解决方案并不现实。
将知识应用于数据集
一旦我们有了数据集,就该深入研究了。我们需要:
- 探索数据
- 清理数据
[## Python 中的数据清理:终极指南(2020)——只进入数据
我们用 Python 创建了这个新的完整的分步指南。你将学习如何寻找和清理的技巧:丢失…
www.justintodata.com](https://www.justintodata.com/data-cleaning-python-ultimate-guide/)
- 研究解决问题的好办法
- 将算法/模型应用于数据
如果你更喜欢从一些指导开始,搜索有清晰的分步说明和实践的文章。例如,你可以查看我们的博客上的文章,在那里我们解释了完整的过程并提供了 Python 代码。
提示:你可以尝试实现不同的模型来探索同一个数据集。这是展示你技能的好方法。
写信炫耀工作
最终,我们需要让世界了解我们的工作:
- 在 GitHub 上发布你的代码。查看 Hello World GitHub 指南了解基础知识。
别忘了创建一个自述文件和评论。你的代码甚至可能对同一主题的其他人有所帮助。 - 写文章总结工作。
- 并在平台上发布文章,如:
–LinkedIn
–Medium
–Twitter
–脸书团体
–或个人网站
我们爱 Medium,因为你甚至可以根据浏览量获得一些报酬。媒体上最大的数据科学出版物是面向数据科学的。 - 或者将文章推销给其他出版物,如 KDnuggets 、 Dataquest 。
提示:项目的结果有时候不一定要完美。但是一定要解释你是如何处理这个问题的。
第 3 步:与数据科学世界接轨
现在我们有一个作品集来展示我们的技能。联系数据科学的真实世界非常重要。
如前所述,你可以加入不同的社交网络:
你也可以通过参加 Meetup 和 Eventbrite 的活动来尝试结识真实的人。
Stack Overflow 也是一个技术社区,在帮助他人的同时获得你的问题的答案。
最后的话
进入数据科学职业道路并不容易。但这是一个有益的和有影响力的!
所以请不要放弃,继续努力。
祝你好运!
如果你有任何问题,请留下评论。我们会尽力回答他们。
在你离开之前,别忘了 报名参加刚刚进入数据快讯 !或者在推特、脸书上与我们联系。
所以您不会错过我们的任何新数据科学文章!
【https://www.justintodata.com】原载于 2020 年 4 月 1 日。
* [## 如何在 Python 中使用 NLP:一个实用的分步示例——只进入数据
这是利用在线资源进入数据科学的完整路线图/课程。你是否想学习…
www.justintodata.com](https://www.justintodata.com/use-nlp-in-python-practical-step-by-step-example/) [## 如何在 5 个步骤中可视化决策树——仅在数据中
这是利用在线资源进入数据科学的完整路线图/课程。你是否想学习…
www.justintodata.com](https://www.justintodata.com/visualize-a-decision-tree-in-python/) [## 如何安装/设置 Python 并为数据科学做准备——直接进入数据
我们将带您逐步完成设置 Python 环境的过程。您将学习:如何安装 Python…
www.justintodata.com](https://www.justintodata.com/install-python-and-prep-for-data-science/)********
当生活不给你喘息的机会,如何学习数据科学
我努力为数据科学贡献时间。但是发现新的策略使我能够提高学习速度,完成更多的事情
每一次挣扎都有出路
带着进入数据科学领域的目标,你决定想要获得什么样的技能。现在你只需要有时间坐下来获得这些技能。最终,你会成为一个有竞争力的候选人,得到你想要的工作。
但是生活不会让你坐下来。它要求你继续努力,做好自己的本职工作,同时还希望你能在简历中获得 2 年以上的工作经验。你感到停滞不前和沮丧。你知道你需要学习并完成一些项目,但发现坚持你的承诺是如此困难。那么应该放弃吗?

史蒂夫·哈拉马在 Unsplash 上拍摄的照片
两个月前我经历了同样的事情。作为一个有 5 门课和一份工作的数学系学生,我发现很难找到时间学习数据科学。在我快要放弃的时候,我告诉自己要继续走下去。这不是努力工作的问题;这是关于更聪明地工作。我只是需要改变我的学习策略。
不是多努力的问题。这是关于运作系统。
Snapchat 首席执行官埃文·斯皮格尔
现在,我设法完成了许多有趣的数据科学项目,每周至少发表 2 篇文章,在 NLP 研究中有新的发现,同时保持我的 4.0 GPA。当我不断问自己如何能更有效地工作时,我找到了方法。由于新方法对我有用,我想与您分享这些方法,希望您也能采用一些方法,在短时间内获得这些技能,让您的数据科学之旅更加愉快。
先完成一件事,然后再继续另一件事
我过去做的事
连续几周每天花一个小时在一个项目上。当我完成的时候,我觉得我什么都没完成。
我的新方法
设定一个我想完成的小目标,并在短时间内完成它。比方说,当我从学校回来时,我会告诉自己:我想在 2 小时内完成我的学校作业,并在 2 小时内完成我的 NLP 项目。明天我将在到校前写一篇 2 小时的短文。
知道我可以在很短的时间内完成这些事情让我很兴奋,并处于流中。我可以集中注意力几个小时而不分心。看到我的工作完成让我感到有动力,有动力继续下去。
创造一个孤立的环境
我过去做的事
为我想完成的不同项目和我想阅读的新文章打开几个浏览器。知道还有许多事情需要完成,我感到心烦意乱。
我的新方法
一旦我完成了一件事,我就关闭所有与前一项工作相关的文件或浏览器,继续下一项工作。如果工作还没有完成,我想以后再回到网站,我就用一个标签把多个浏览器压缩成一个。清楚地看到我的浏览器可以防止我的注意力分散,集中在工作上。
稍后当我想回到我的工作时,我只需打开一个选项卡,就可以快速访问我自己的工作。

我一直在采用的另一个小秘密是:把我的手机设置成飞行模式,关闭我的 MacBook 上的任何通知。我会在我选择的时间回复消息。任何消息都可以等待。
管理勘探和开发之间的关系
我过去做的事
我知道在数据科学领域,学习新知识和更新新技术和技巧是非常重要的。所以我每天会花很多时间去探索不同的工具,阅读很多文章,却不去应用它们。我感到筋疲力尽,无能为力,因为我意识到有太多的东西我需要学习,但我还没有学到任何一个
我的新方法
每当我在 Medium 或其他网站上看到有趣的文章时,如果我当时正在做什么,我会浏览一些有价值的文章,将它们保存到 Instapaper ,并将其归入特定的类别(数据科学、编程、数学、数据 viz 等),以便我以后可以轻松访问它们。当我有少量空闲时间时(比如在公交车上,在线路上,或者在午餐时间),我会拿出我保存在 app 中的文章来阅读。一旦我读完,我要么删除它们,要么保存它们,如果我以后想访问或尝试代码的话。

通过创建我自己的阅读空间和习惯,我能够在完成工作的同时用新知识更新自己。
分享我所学到的
我过去做的事
每天默默的做着工作。当我该在简历上展示我的工作时,我没有什么可展示的,因为我在完成工作后从未分享或发表过。
我的新方法
把一个大项目分成几个小项目。在 Github 上推送我的小成就,或者在 Medium 上分享我的短代码。然后我会在 LinkedIn,Twitter,或者我的网站上分享我的项目和文章。我从不忽视我的任何项目和小成就。

如果你因为觉得自己的作品不够好而犹豫要不要分享,那你永远都不够好。一旦你分享并收到他人的积极(或消极)反馈,你会更有动力去提高你的技能来分享更好的内容。
将“我需要做”转换为“我想做”
我过去做的事
“我可以跳过今天的项目吗?不,我不应该找借口,因为我已经向自己承诺,无论如何,每天都要花一个小时在数据科学上。这种想法给了我一种义务感,这个项目就像家庭作业或工作一样。我并不期待着手这个项目。
我的新方法
告诉自己,如果我愿意,我可以跳过我的项目,跳过写文章,跳过我的研究。没有人强迫我做这件事。这个想法出人意料地改变了我对工作的看法。我有选择我想做什么的自由,我仍然选择做我的项目。说明我真的很喜欢这个项目!这会很有趣的。我立刻感到精力和热情有所提升,开始着手这个项目。
结论
不管你认为你能还是不能,你都是对的
亨利福特
要成为一名数据科学家,我还需要掌握许多技能。但是当我看到我的新方法实验帮助我有效地获得新技能并完成更多工作时,我知道如果我不放弃并有勇气改变那些不起作用的方法,我最终会实现我的愿景。
感谢您阅读我的文章。我很乐意听听你对这些策略的看法,以及哪些策略对你有效。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 T2 Twitter 上与我联系。
星这个回购如果你想检查我写的所有文章的代码。在 Medium 上关注我,了解我的最新数据科学文章,例如:
你创建了一个待办事项清单来提高效率,但最终却把时间浪费在了不重要的任务上。如果你能创造…
towardsdatascience.com](/maximize-your-productivity-with-python-6110004b45f7) [## 高效 Python 代码的计时
如何比较列表、集合和其他方法的性能
towardsdatascience.com](/timing-the-performance-to-choose-the-right-python-object-for-your-data-science-project-670db6f11b8e) [## 字典作为 If-Else 的替代
使用字典创建一个更清晰的 If-Else 函数代码
towardsdatascience.com](/dictionary-as-an-alternative-to-if-else-76fe57a1e4af) [## 什么是卓越的图形以及如何创建它
作为一名数据科学家,了解如何制作重要的图表至关重要
towardsdatascience.com](/what-graphical-excellence-is-and-how-to-create-it-db02043e0b37)
不编码如何学习数据科学
谈论是否有可能,以及从哪里开始…

数据科学是计算机科学中要求最高、最受欢迎的领域之一。人们可能会认为,一般来说,数据科学家需要了解 Python 和编程才能获得成功。虽然这在一定程度上可能是真的,但在这篇文章中,我们讨论了没有编程数据科学是否可能,以及如果你不是程序员,如何开始学习。TL;DR:有低代码经验学习数据科学是有可能的。微软和 Udacity 刚刚宣布了一项合作,将帮助你做到这一点!
自从数据科学家成为如此受欢迎的职业以来,我确信许多人开始考虑学习数据科学,并且他们中的许多人都感到气馁,因为他们认为一个人需要成为一名优秀的程序员。大部分人认为了解机器学习是从 Python 开始的。但是,我必须向你保证,事实并非如此!在学习 Python 之前,有一些数据科学的基本原理需要你先学习,完全不需要任何编码就可以开始解决很多现实世界的问题!
数据科学最重要的事情是开始从数据、特性、准确性测量等方面考虑问题。是通过编写 Python 程序还是通过其他工具来训练模型并不重要。
让我们考虑一个例子:假设你想了解哪些照片更适合社交媒体。例如,在博客帖子中插入小猫的照片以吸引注意力是否有意义,或者观众已经厌倦了那些俗气的照片?一张照片在社交媒体上获得大量赞需要什么?
让我们看看如何从数据科学的角度来解决这个问题。
像数据科学家一样思考
数据科学依赖于数据。所以我们需要做的第一件事是收集数据集。在我们的案例中,我们有一个客观的指标来衡量观众对某些内容的喜欢程度,这就是喜欢的数量。
获取数据集
有多种因素会影响赞的数量:图片本身、相应的文本或者发布的日期和时间。让我们只关注图片,并从 Instagram 中获取一个图片样本,以及相应的赞数。因此,我们的初始数据集将由一张照片(URL)和它收到的一些赞组成。

一旦我们有了数据,我们需要弄清楚我们将解决哪个问题。机器学习可以处理许多典型问题,其中最重要的是:
- 分类问题,当我们需要把我们的对象分成两个或更多的类时。分类问题的一个例子是过滤垃圾邮件,因为我们需要将每封邮件分类为垃圾邮件或非垃圾邮件。
- 在一个回归问题中,我们需要预测一个数字。预测一家商店每天售出的冰淇淋数量就是一个很好的例子。
- 聚类问题可以帮助我们找到相似类型的对象,并根据某种相似性原则将它们分组在一起。
- 异常检测允许我们发现不同于“正常”的数据
在我们的例子中,我们有一个回归问题,因为我们希望建立一个模型来预测我们的照片将获得的赞数。
提取特征
传统的机器学习模型使用表格数据,其中每个数据点由表格中的一行表示,该表格由特征(模型的输入值)和标签(我们试图预测的值)组成。虽然更高级的神经网络模型可以直接处理图像,但它们需要更多的数据来训练,所以我们在这里不讨论它们。
为了训练模型,我们首先需要执行特征化,即从图片中提取数字或分类特征。我们可以使用认知服务计算机视觉 API 来做到这一点。认知服务可以将一张图片作为输入,然后返回计算机可以在这张图片中“看到”的一切:关于人、物体、主色的信息,以及图片上出现的任何文本。例如,我们可以提取以下特征:
- 主要图像类别:食物、肖像、建筑、风景等。
- 照片上的人脸数量及其年龄(平均年龄,如果有多张人脸)
- 背景和前景颜色
- 哈希标签。在表格中表示散列标签的方式被称为一键编码——每个标签将由一列表示,如果标签对应于图片,则包含 1,否则包含 0。

我们可能还想添加日期作为一个功能。添加日期可能很棘手,因为模型最适合数字,而日期不仅仅是一个数字。因此,我们可能希望用从开始日期算起的天数来表示一个日期,并添加“星期几”作为另一个特性,因为帖子的受欢迎程度可能在很大程度上取决于这一天。我们可能还想添加“周末”二进制特性来尝试和检测周末活动的变化。
在数据集的最初设计中,以及在收集哪些数据的整个问题上,投入了大量的思考。这个过程往往比实际的模型训练更重要,不需要编码就可以完成。
有时候数据准备的过程可以用 Excel 来完成,在数据集上调用认知服务可以用 Power Apps ( 本文档描述如何)或者微软 Flow 来实现。
在这个例子中,我已经为你准备好了数据集。此处以 CSV-table 的形式提供。

现在有了数据,就可以开始模特训练了!而即使是这看似最难的一步,不用编码也能实现!
Azure 机器学习
我将向您展示如何使用微软的主要机器学习服务Azure Machine Learning在不编码的情况下训练模型。这项服务既面向需要处理海量数据和计算工作量的专业数据科学家,也面向刚刚迈出机器学习第一步的初学者。对于初学者来说有两个特别有用的技术: AutoML 和 Designer 。使用 AutoML 从头到尾不编码的过程在文档中有的描述,但是我们在这里也要概述一下。
要开始使用 Azure ML,您需要创建一个工作区。你可以开始跟随我的教程,或者官方文档。工作空间将与机器学习任务相关的所有东西组合在一起:数据、计算资源、实验结果和训练模型。
定义数据集
首先,我们需要创建一个数据集。由于我们将使用来自互联网的数据集,我们只需要指定 CSV 文件的 URL。

选择一个选项从 Web 文件创建数据集,指定表格数据集类型,并选择一个选项使用第一行作为标题。您应该会看到这样的数据预览屏幕:

创建数据集后,可以在数据集部分找到它,您可以查看数据并以各种方式探索它们:

训练自动模型
有了数据集,你就可以在上面训练不同的机器学习模型。但是,如果您不是数据科学家,您可能不知道使用哪个模型。此外,可能会发生数据集中的某些列需要从训练中排除的情况,例如, URL 字段,它不包含对预测有用的信息,因为每个 URL 在数据集中只出现一次。
自动 ML 是一种尝试训练不同机器学习算法直到找到最佳算法的技术。它还执行一些巧妙的特性分析来排除无意义的列,并在需要时做一些额外的特征化。如果问题是可解的——它通常可以找到一个相当好的模型。当然,这是以花费更多的计算能力去尝试许多可能的模型为代价的,但计算能力绝对比好的机器学习专业人员更容易找到。
要使用自动 ML,您只需要几个简单的步骤:
- 点击 ML 门户中的自动 ML ,选择要使用的数据集。
- 选择了一个实验名和目标列。在我们的例子中,我们需要预测喜欢的数量,所以目标列应该是
likes。

- 你需要一些计算机来训练这个模型。您需要创建一个新的计算,并指定一个集群。通常最好将最小节点数设置为 0,这样当您不执行任何训练时,集群会自动关闭。至于虚拟机类型,对于简单的任务,比如我们正在做的最便宜的选择,
Standard_D1应该足够了。

- 在下一页中,您选择一个任务类型:分类、回归(我们的案例)或时间序列预测。如果你知道你在做什么,你也可以改变一些配置设置或特征设置。
- 点击完成。
之后,实验就要开始了。训练不同的模型可能需要一段时间,这取决于您在集群中指定的最大节点值和虚拟机的类型。在我的例子中,对于 1 个节点的D1,花了大约 3 个小时才找到最佳模型。
您可以在门户网站的实验部分找到该实验:

最初,实验将只包含一次运行,但是您需要点击 Include child runs 来显示训练不同 ML 模型的所有不同子实验。您可能还需要调整图表的参数,以便更好地了解所达到的精确度。
现在让我们取消选择 Include child runs ,并选择主实验。打开详细信息页面后,单击模型以查看 AutoML 尝试训练的所有算法的列表,以及它们相应达到的精度(在我们的示例中,因为我们正在训练回归模型,所以我们使用 spearman 相关性来反映模型的“质量”):

了解模型
经过训练的模型现在允许我们预测我们计划发布的任何照片的点赞数。然而,我们更想要的结果是一组关于获得更好的用户对照片反应的建议。换句话说,我们想了解哪些特性会影响结果,以及如何影响。
模型可解释性通过观察不同的特性如何影响最终结果,我们可以更好地理解模型。
当使用 AutoML 训练一个模型时,默认情况下 Azure ML 也会在最佳模型上运行可解释性实验——这就是为什么你会在顶级模型旁边看到视图解释链接。点击它被带到模型解释屏幕,在那里你可以探索不同的功能发挥的效果。

首先,您可以探索工程特性(默认情况下选择此视图)或原始特性的重要性。我们可以通过更改下拉菜单切换到原始特征视图,选择解释指向原始模型。
在下图中,您可以看到特性的重要性。最重要的特征是发布日期(当),其次是人标签,然后是面数、前景色和主类别。这允许我们对我们的问题域做出一些结论:
- 获得更多喜欢最重要的因素是时间。这可能是因为随着时间的推移,越来越多的人喜欢旧帖子,因为随着时间的推移,越来越多的人发现了它们
- 肖像贴子(有一张大照片)越来越受欢迎
- 照片的整体色彩起着相当重要的作用
- 照片的类型也很重要,但没有我们想象的那么重要。我们需要进一步调查哪种类型的照片更受关注
因此,在创建了一个机器学习模型之后,由于可解释性,我们能够看到哪些因素促成了一张照片的流行。我们也可以直接使用该模型,给它一张照片作为输入(事先通过认知服务),它将预测估计的喜欢数量,这样我们就可以测试潜在的候选人并进行比较。
如何开始学习
对于想开始学习数据科学但没有深厚编程功底的人,微软和 Udacity 刚刚宣布了针对微软 Azure 的 机器学习奖学金计划。您可以在2020 年7 月 30 日之前 申请 。更多细节请见微软博客和 Udacity 博客。
微软和 Udacity 今天宣布的计划将由两部分组成。前 10000 名申请者将被提供第一门基础课程Azure 上的机器学习入门,并有低代码体验。这个课程会持续 2 个月,它会教你如何做出像这样的数据驱动的结论,以及如何在几乎不用编码的情况下训练和使用机器学习模型。它将包括以下重要主题:
- 解决问题的数据科学过程
- 不同类型的数据(表格数据、文本等。)和准备数据
- 监督与非监督学习
- 特征工程
- 深度学习与机器学习(即何时应该、何时不应该使用神经网络)
- 分类、回归、聚类等最重要的算法。
- 负责任的人工智能和人工智能的公平性
最佳表现者(根据结果和社区参与程度选出)将获得奖学金,并报名参加微软 Azure 的机器学习纳米学位项目。
如果你以前没有认真尝试过数据科学,我绝对鼓励你报名参加这个课程,体验一下数据科学,并告诉你的非开发人员朋友这个课程。开始这一旅程从未如此简单!
原载于 2020 年 6 月 17 日 https://soshnikov.com**。
数据科学家如何更快地学习
学会学习的有效策略

哈雷戴维森在 Unsplash 上的照片
我的故事标题是“你在试图成为数据科学家时受挫的原因”,我收到了许多回复,询问我们如何成为更好的学习者的技巧。作为这些回答的结果,我开始深入思考“更好的学习者”意味着什么?
将最优秀的人与众不同的隐藏技能
towardsdatascience.com](/the-reason-youre-frustrated-when-trying-to-become-a-data-scientist-2d2b8b402811)
关于这一点,我把更好的学习者定义为以更快的速度保留更多知识或技能的人。这个比率因人而异,但是学习的过程非常相似,你可以通过下面的链接了解更多。
了解学习的 3 个阶段,以及我们如何将其有效地应用于数据科学学习
towardsdatascience.com](/3-stages-of-learning-data-science-9a04e96ba415)
序幕
“能力越大,责任越大”这句耳熟能详的话并没有完全抓住我们内心产生极端力量的事实。然而,当我们把这句话反过来说,当我们承担起责任时,就能找到力量。对你所要求的负很大的责任?我们关注什么,事情的意义,我们的错误,我们的责任。我们现在的结果是我们过去决定的体现,为了确保我们在未来实现我们想要的结果,我们应该对现在负责。
“责任越大,力量越大”——吉姆·奎克
解构缩写词
如果你想成为一个更好的学习者,要快速思考。

F——忘记
A -活性
s 州
t 型教学
婴儿是超级学习者!我很幸运有一个 1 岁的侄女可以观察,所以没有必要做思想实验。我看到她从被到处带着,到爬行,到站立,到静态舞蹈,到走路,到动态舞蹈,到爬楼梯,到开门,现在说出三个词——“恶心”、“恶心”和“啊哦”。因此,我的许多例子可能与我对我侄女的观察有关。尽管如此,这不会阻止我们做一个简单形式的迁移学习来将这些例子应用到数据科学中。
忘记

图片来源:【http://www.quickmeme.com/meme/3thj73
为了成为更好的学习者,我们应该忘记三件事,对于我们社区中的已婚人士来说……不,你的妻子不在其中。排名不分先后:
1 - 我们所知道的
当我们年轻时,我们完全是海绵。地球是我们的科学实验室。让我们想象一下,如果我的侄女在她出生的那一刻就已经知道如何走路,那将是一场灾难。她的骨头会立刻让她失望,因为她根本没有这个能力。
然而,这就是我们所做的!当我们觉得我们已经知道了一些事情时,当我们回顾它时,更容易掩盖这些信息。为了成为更好学习者,我们必须忘记我们已经知道的东西。
如果我花时间去掌握线性回归和逻辑回归,我理解深层神经网络的内部工作方式会有多快?
“你的头脑就像一个降落伞;它只有在打开时才有效”
2 - 什么不急
我敢说你可以在我侄女看 CBeebies 节目的时候和她说话。你会被贪婪地忽视。所以当翻滚先生在的时候,我不会在这里捣乱,坏主意。
我知道这个世界上很少有人相信他们可以一心多用,你知道吗,他们可能可以。不幸的是,我是这个部门中不那么幸运的大部分人中的一员。但是,如果你在这群人中注意,这不是我们的缺陷,这是我们的力量。当我们在想很多事情的时候,我们的大脑几乎无处不在,在不同的任务之间转移注意力。或者,当我们专注于一项任务而忘记所有其他任务时,我们就进入了一个极其微妙的地方,叫做当下。
如果你还记得前奏的话,我们在这个地方所做的事情将决定我们未来取得的成果。
“当我们忘记不紧急的事情时,我们通过进入现在为自己提供了一个在未来取得更好结果的机会。”Kurtis Pykes)
3 - 限制
我侄女刚走两步就摔倒了,我一分钟都没想到她会认为走路不适合她,因为她站直了,又试了一次。
以下是我从初学者数据科学家那里听到的一些限制性观点——如果您听到了一些有趣的观点,请随意添加您自己的观点:
- “我没有博士学位”
- “我没有数据科学学位”
- “编程是为聪明人准备的”
这些陈述可能是事实,但是这些原因并不是阻止你成为数据科学家的原因,而是你的信念。
“如果你为自己的局限而战,你就能保留它们”——吉姆·奎克
活跃的

彼得·康伦在 Unsplash 上的照片
我不会称自己为学者。事实上,由于我的选择,我上大学晚了 4 年,尽管 12 个月里每周上两天课,我还是迫不及待地想让它结束——这是可以理解的,因为我当时正在学会计。
我不确定其他国家,然而,我完全反对我们在英国被教育的学习方式——或者可能只是我的学校,我不知道。对我来说,好的学习是安静地消耗信息的印象一直是荒谬的,也许对其他人有用,但对我来说,这是不正确的。
“学习不是一项观赏性运动”——吉姆·奎克
我们人类是创造者,这是我们最深刻的知识所在。进一步说,当我们积极参与创造的过程时,我们绝对可以学到我们想要的任何东西。你问,怎样才能在学习中变得更积极?
- 做笔记
- 提问
- 履行
你越积极,你学得越多
状态

个人经历以及约翰·霍普金斯医学院进行的广泛心理学研究证实,情绪高涨时发生的事情比不太激动的事情更令人难忘。该研究称,“情绪唤醒时释放的一种激素通过增加神经重新布线形成新的记忆回路的位置的化学敏感性,刺激神经细胞记住事件。”
在这里阅读更多关于这个的内容 …
信息×情感=长期记忆
对许多人来说,这是一个“啊哈”的时刻。是的,你忘记了学校教你的一切,因为你在课堂上很可能处于一种无聊的状态。通过改变我们所处的状态,我们可以成为更好的学习者。
怎样才能提高自己的状态?
- 学习时,要像完全精力充沛时那样定位自己。
- 想一想你将从学习中获得的好处——比如更高的薪水,在 kaggle 上更有竞争力等等。
- 保持好奇、着迷和快乐。
- 有好的姿势
- 横膈膜呼吸
"出售你的聪明,购买困惑."–贾拉鲁丁·鲁米,13 世纪苏菲神秘主义者
教

“如果你想把你的学习曲线缩短一半,那就带着把它教给别人的意图去学习。”—未知
教书确实能给你一些疯狂的刺激。我记得有人第一次就我的一篇文章找到我,问我一个关于他们正在做的项目的问题……我们不想误导人们,所以我们自然会给予更多额外的关注,我们会做更好的笔记,我们会做任何我们认为必要的事情来提供可靠的信息。此外,当你在教学中被某个现象绊倒时,这可以作为你需要更深入学习以获得更好理解的反馈。
"当我教一样东西时,我会学两遍."—吉姆·奎克
我经常对人们说,他们应该把他们正在学习的东西写在博客上,或者想办法把他们正在做的事情公之于众,这样其他人也可以学习。额外的关心和反馈对你的成长至关重要,对我来说也是如此。
包裹
成为更好的学习者是一种技能,就像任何技能一样,它需要时间才能完全诞生。尽管如此,不断的刻意练习将提高你的学习能力,反过来增加你实现成为数据科学家目标的可能性。
注:这个故事是高度启发吉姆 Kwik 的教导。他有一个非常有用的播客叫做“Kwik Brain ”,我建议你看看这里的。
如果您认为我遗漏了什么,或者您想向我指出什么,或者如果您仍然不确定什么,您的反馈是有价值的。发个回应!
然而,如果你想和我联系,我在 LinkedIn 上是最活跃的,我也很乐意和你联系。
[## Kurtis Pykes -人工智能博客-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
我最近增加了我的 PyTrix 系列,在那里我展示了可以用 Python 做的对数据科学家有用的很酷的事情。我已经更新了我的时间表,现在每周都会做这个系列。你可以在下面的链接中看到前两个 PyTrix 故事:
PyTrix#1:加速我们的 Python 代码
towardsdatascience.com](/vectorization-in-python-46486819d3a) [## 使用 Numpy 数组:索引
访问 Numpy 数组中的元素
towardsdatascience.com](/working-with-numpy-arrays-indexing-e4c08595ed57)
如何从学术项目中学习
专业建议:不要在大学提交低质量的项目
作者注: 这篇文章是关于你如何通过在大学从事优质项目来学习核心概念的。虽然很多讨论的观点是经验性的,但我认为它们对大多数 CSE 本科生都适用。

演员表:作者
公司希望看到你所做的工作,而不是你在课程中所做的。这些是我所在学校的一位“分班老师”说的话。这是他微妙的方式让我们知道,为分数而做的项目对雇主来说并不重要。我不知道是否到处都是如此。
但是,我认识的人证实了上述说法。他们觉得招聘人员不太关心学术项目。事实上,他们想看看这些候选人还做了什么。等等,先不要把雇主描绘成恶棍。
大量的学术项目是由学生完成的,因为他们必须这样做。没有激情或欲望去学习这些努力。这导致工作缺乏质量。对任何人来说都是无聊、无趣且没有价值的工作。
如果我们,学生自己低估了我们的工作,为什么招聘人员不应该呢?此外,招聘人员对我们项目的看法肯定是次要的。最重要的任务是从这些项目中获取知识。
竞争不是在候选人的项目之间,而是在那些项目中的想法和实现之间。这是关于你学了多少和应用了多少。
大量的学术项目是由学生完成的,因为他们必须这样做。
基于项目的学习的基础提倡实践方法的重要性。这些课程旨在为学生提供一个通过暴露来学习的范例。然而,就像人类的传统一样,这种方法经常被我们误用。
什么是基于项目的学习(PBL)?
PBL 将知行合一。学生学习核心课程的知识和要素,但也应用他们所知道的来解决真实的问题并产生重要的结果。PBL 的学生利用数字工具生产高质量的协作产品。PBL 重新将教育的重点放在学生身上,而不是课程——这一转变是全球要求的,它奖励无形资产,如动力、激情、创造力、同理心和弹性。这些不能脱离教科书来教,而必须通过经验来激活。 —托马斯·马卡姆( 来源 )
上述定义可以说是对 PBL 核心内容的最好概括。为了简洁起见,让我们把 PBL 压缩成一个基本短语— 边做边学。
参与项目可以让学生:
- 理解现实世界中的问题
- 将理论概念应用于实践
- 与同事讨论建议解决方案的功效
- 组织想法,并通过实施来实现它们
- 提高沟通技巧
不幸的是,今天课堂上的 PBL 通常不遵循这些原则。这不是方法上的错误。反而是学术项目一般理解上的短板。我们容易误解学术项目的全部目的。
等等,我真的误解了大学项目的目的吗?
嗯,你正在读这篇文章,因为你确实在读。事实上,几乎每个人都这样。无论你是坐在教室的前排还是后排,都没有关系。这也和你的成绩无关。
已经说过我们都误解了项目的含义,现在是时候用一些事实来支持我的论点了。所以,我希望你仔细阅读下面的问题,并在心里回答它们(是/否)。
- 你是否曾经因为项目将被评估的部分而过度烦恼?
- 你有没有在一个项目上拖延到截止日期前的最后一周?
- 你曾经提交过别人的项目作为你自己的项目,而没有对原始项目进行重大升级吗?
- 你曾经提交过一个包含代码的项目而没有检查代码效率,没有必要的文档或者没有考虑你的分析的可重复性吗?
- 你曾经提交过一个项目,要求你写一份报告,从互联网上复制超过 30-40%的报告?
- 你有没有因为确信没有人会检查代码,而从互联网上随机获取结果,并作为自己的结果传递出去?
- 你有没有在完成报告后从网上随便找来一些引文,只是为了填满“参考文献”部分?
- 你有没有因为相信“演示比内容更重要”而花更多的时间在演示上,而不是项目本身?
如果这 8 个问题中至少有 2 个你的答案是“是”, 欢迎加入那些误解学术项目目的的人的俱乐部。 我已经和你一起 3 分了。
学术项目的目的
我们所看到的期末成绩的 40-70 %,实际上远不止这些。项目帮助我们实现的不仅仅是分数。正是我们从这些项目中获得的大量知识帮助我们为未来的职业生涯奠定了基础。
- 学术项目为我们提供了一个将理论知识应用于实践的平台。
- 项目有助于更多地关注“问题”并找出“更有效”的方法来解决它。
- 项目促进创新思维。它们有助于用更非传统但有效的替代方案取代对现有解决方案的所有狭隘、传统的理解。
- 通过项目,我们学到了很多关于学术领域合作的知识。协作工作很重要,因为它允许对某一特定主题有不同的意见,并最终导致没有个人偏见的产出。
- 最重要的是,项目在很大程度上帮助个人寻找自力更生的能力。
项目的每个部分都有助于我们对以前不太了解的某个方面有更多的了解。
一个学术项目远不止占 40-70%的分数。
从项目中学习的常见障碍
在这一部分,我列出了一些我们在大学做学术项目时最常犯的错误。这个列表并不详尽,所以请在评论区添加更多内容!
选择一个非常普通的话题
选择一个每个人都在工作或写作的主题太容易了。它浪费了在独特或有价值的问题陈述上工作的大好机会。不太受欢迎的项目会让你的观众更感兴趣。因此,要想脱颖而出,你必须在不太常见的想法上下功夫。
选择一个雄心勃勃的主题
一个看起来像是下一个伟大发明的想法通常是你头脑中的一个诡计,除非你有一个合适的计划来实现它。本科生通常很难区分理性想法和独角兽。因此,使用现实的尺度来衡量项目选择是很重要的。
跟随炒作,而不是问题
我无意冒犯,但似乎几乎每个人都在解决一个问题,因为他们希望 使用 数据科学。数据科学是一个伟大的领域。但是如果我们被炒作所驱使,我们就会对问题视而不见。我们在技术或我们使用的工具上停留的时间越长,我们的解决方案就越有限。
从互联网上挑选代码
从互联网上复制代码并作为你自己的提交可能有它自己的一套伦理问题。但是,学生们经常绕过这些,因为我们大多数人认为,“这不是犯罪。所以,何必在意呢?”。这种想法的愚蠢超出了本文的范围。通过盲目地复制代码,我们通常得到的只是一个临时的修复和许多错过的增强技能的机会。
最后一分钟匆忙完成
在提交前一天开始任何学术项目都不是一种有效的学习方式。你可能会完成它并得到一个分数,但它从来都不是你最好的作品。你在学习代码上的分数几乎为零。
对文档皱眉头
记录学术项目是任何项目中最容易被忽视的方面。这就是为什么很难向他人很好地解释我们的项目,即使我们已经做了一些真正好的工作。记录所有采取的步骤,包括那些失败的步骤,总是很重要的。
不善于团队合作
没有完美的团队成员。只有团队成员互补不足,作为一个队列一起有效学习。不幸的是,这是最难理解的想法之一。我们成为糟糕的团队成员有几个原因:
- 我们觉得我们的队友不够了解,往往看不起他们。
- 当我们看到一个不工作的团队时,我们不能停下脚步。因为,归根结底,他们是你的朋友或同事。你选择拥有比坏血更坏的最终产品。
- 你觉得没人能跟上你,你工作得太快了。你工作负担过重,最后弄得一团糟。
当然,在这里指责游戏不是正确的做法。更聪明的选择是选择你的团队,让它让你工作并为你试图解决的问题服务。
主课——如何从项目中“学习”?
前一节强调了学习的障碍,而这一节讨论了解决方案。我花了 4 年时间在一个学科上进行本科学习,在这个学科中,你的知识深度是由你的项目质量来衡量的。
以下几点总结了这些似乎对我有用的技巧。希望这些对你的事业有所帮助。
不要太担心这些项目带来的分数或负担
把分数看作是你所做事情的额外收获。将项目纳入课程的真正想法是为学生提供一个自学技能的机会,这些技能在一个学期的范围内是学不到的。
选择合适的团队
如果选择你的队友是在你的控制之下,建立一个可以一起工作的团队。选择最亲密的熟人加入我们的团队是我们都会犯的错误。一个团队最好不要建立在谁和谁是朋友的基础上,而是建立在谁能和谁一起做出有效贡献的基础上。
关注问题
当我们有了目标,我们会学到更多。在项目中,我们的目标是我们希望解决的问题。所以,一心一意专注于此是可以创造奇迹的。
提前计划
不要等到最后一刻才开始你的项目。积极主动,当你被告知这件事的时候,就制定一个计划去做。虽然有几种方法可以成功地进行规划,但我不确定哪种方法适合你。所以,我会让你来决定!
为您的项目设置结构
一个有组织的项目结构将有助于理解你所做的工作。这将证明对你和你的项目读者都有好处。如果你正在从事数据科学项目,一个可以帮助你的模板是 Cookiecutter 数据科学。
维护实验室笔记本
一个粗略的本子,在上面潦草地写下你所有的实验、结果、问题和与项目的互动,这将有助于你在准备最终报告时知道该写些什么。
在别人之前打破你的解决方案
每个解决方案都有缺陷。每一个。所以,永远要知道你工作中的陷阱和你所做的假设。通过这种方式,你向你的评估者或雇主或评论家表明你知道你的项目。
保持开放的态度
虚心接受反馈。每个论点都有多个方面。所以,把批评当作一种新的提高方式。
与同事一起回顾你的进步
讨论你的工作,如果不是太机密的话。外部视角将有助于改进你的工作。
让谷歌成为你的搜索源,但不要过度依赖
不要依赖互联网来获取最简单的代码片段。互联网一定不是让你增值的东西,你应该是让你有价值的东西。
诚实地报告你的结果
如果你的项目遇到了瓶颈或者失败了,不要隐瞒。报告你的问题并诊断你所面临的问题。如果人们知道你失败的地方,他们就有更好的机会帮助你。
抄袭代码并不完全错误
只要你给别人的代码添加了属性,那么他们的代码并没有错。总是鼓励使用别人写的东西来构建和改进你的项目。然而,如果你打算拿起整个程序,然后把它们当成你自己的,那就太愚蠢了。
不要小看其他项目
没有“更好”的项目。每个项目都是独立的。它可能是你用 iris 数据集进行的简单数据分析,也可能是一个全新的深度学习框架,但两者都需要同等的尊重。不是每个人都有相同的资源和能力,所以尊重他人的工作。
结论
在当代世界,学历是衡量人们很多方面的最重要的标准。然而,具有讽刺意味的是,作为获得这些学位旅程一部分的学术项目被严重低估了。
嗯,我们中的一些人可能在某些项目上非常努力,但老实说,没有人会在意,除非我们的努力转化为他们的价值。因此,唯一阻碍我们学习和创造惊人项目的是我们自己的想法。我们需要改进这一点。
一个计划周密、结构良好的项目可以帮助你学习新概念,这比在上面做一门课程要容易得多。此外,一个写得好的项目向你的读者展示你的关心。在一个越来越自私的世界里,能够关心他人的舒适肯定会让你超越很多竞争对手。
2020 年如何免费学习地理空间数据科学
免费的在线课程,学习最先进的地理空间数据科学。

地理空间数据科学是一个蓬勃发展的领域。然而,学习地理空间数据科学对于新手和中级用户来说都是一项艰巨的任务。与主流数据科学资源相比,该专业领域的学习资源和途径更少为人所知,也更少被共享。我知道在 Courser、EDX 等主要 MOOC 提供商那里寻找地理空间数据科学资源是多么痛苦和令人失望…
地理数据科学是专门研究数据科学的空间组成部分的学科。它带来了数据科学领域中特定于地理数据的理论、概念和应用。
在本文中,我分享了最新的免费课程,可以帮助您实现地理空间数据科学领域的学习目标。你会发现一个宝贵的资源宝石启动你的职业生涯在地理空间数据科学。
这个列表中包含的资源主要在 Python 生态系统中。在这个列表中,我们还包括初级和高级资源。
1.Geo Python(赫尔辛基大学-2019 年最新版本)

这门课程是您开始地理空间数据 Python 编程之旅的好地方。您将学习 python 编程基础,重点关注地理空间应用。本课程涵盖 Python 中的基本数据类型、数据处理和可视化。包括讲座视频、Jupyter 笔记本、GitHub 练习在内的所有资料都是开源的,可以免费获取。
我最喜欢这门课程的一点是,它不仅对初学者来说是用户友好的,而且还教会你数据科学世界中使用的最先进的技术和工具,包括 Jupyter 笔记本电脑。如果您是 Python 或地理空间世界的新手,我强烈建议从这里开始。
材料可在课程主页获得
2。地理数据科学(利物浦大学—2019 年最新发布)

地理数据科学(ENVS363/563)是一门结构良好的课程,在地理空间数据科学领域有很多实际应用。这门课程有两个主要部分:讲课和实验。本课程涵盖的主要主题包括数据科学基础和地理空间数据的机器学习应用。
虽然没有视频讲座,但讲座的幻灯片是免费提供的。附带 Jupyter 笔记本的实验室也是开源的,并提供了许多关于地理空间数据科学不同方面的详细工作。
课程首页。
3.GIS 流程自动化(赫尔辛基大学-2019 年最新版本)

本课程是列表中第一门课程的后续课程, Geo python 及其所有资源均可在线免费获取。自动化 GIS 流程提供了关于如何使用 Python 编程语言执行一些常见 GIS 任务的教程。它还提供托管 Jupyter 笔记本(Binder),您可以在浏览器中进行交互,而无需设置编程环境。这是一门中级课程,需要掌握 Python 语言知识。
课程资料:课程主页。
4.空间数据科学(芝加哥大学-2017 年)

空间数据科学中心
这是一门高级课程,详细解释了许多空间统计概念的理论基础。本课程涵盖的主题包括探索性空间数据分析(ESDA)、空间回归和地理空间数据的无监督聚类。
本课程的实验室使用 Geoda 软件,但是在 Pysal — Python 空间分析库—功能的帮助下,用 Python 实现大多数实验练习是可行的,并且是一个很好的实践项目,可以增强您的理解。
讲座视频: Youtube
5.空间数据科学和应用(Coursera)

空间数据科学旗帜。
此列表中的最后一门课程通过空间大数据世界中的各种示例和应用,突出了地理空间数据科学的高级应用。虽然本课程没有任何编程任务,但它很好地介绍了空间数据科学的实际应用,包括所使用的工具和开源解决方案中的分步过程。
课程链接: Coursera 。
结论
该列表重点介绍了最佳和最新的地理空间数据科学课程。在另一篇文章中,我将分享关于地理空间数据科学的最新书籍。让我知道,如果你有任何其他额外的课程在这个领域,我没有包括在这个列表中。
已经会 Python 了怎么学 Julia
跳到好的方面

鲍里斯·斯莫克罗维奇在 Unsplash 上的照片
朱莉娅是新来的吗?
Julia 是一种较新的获奖编程语言,学起来像 Python 一样简单,但执行起来像 c 一样快,不信?确实是真的。(点击此处进行多语言速度对比。)
Julia 提供的不仅仅是语法和速度。为了解释他们开发这种语言的原因,朱莉娅的创造者说:
“我们想要 C 的速度和 Ruby 的活力。我们想要一种同形异义的语言,既有像 Lisp 那样的真正的宏,又有像 Matlab 那样明显、熟悉的数学符号。我们想要像 Python 一样可用于一般编程,像 R 一样易于统计,像 Perl 一样自然用于字符串处理,像 Matlab 一样强大用于线性代数,像 shell 一样善于将程序粘合在一起。这种东西学习起来非常简单,却能让最严肃的黑客感到高兴。[1]"
陪审团还没有决定,但感觉他们已经做出了决定。当 Julia 1.0 发布时,一种有潜力实现大部分(如果不是全部)目标的语言的框架就诞生了。
同时,Julia 要达到主流编程语言的成熟还有很长的路要走。Julia 的软件包需要改进,它的文档和学习资源也需要改进。幸运的是,一个活跃的(甚至是热心的)开发者社区正在解决这些问题。
尽管这种语言正在发展,但有很多理由学习 Julia ,尤其是如果你对机器学习、数据科学或科学计算感兴趣的话。
懂 Python 想学 Julia?

照片由 Arif Riyanto 在 Unsplash 上拍摄
Python 用户通常能够很快学会 Julia 语法。语法类似于 Python,有许多 Python 用户熟悉的约定。
然而,用 Julia 编程与用 Python 编程有着根本的不同。很有可能,Python 用户编写的第一个 Julia 代码在外观和行为上都很像 Python。虽然这种方法没有什么大问题,但看起来像 Python 的 Julia 可能会效率低下,并且会错过该语言的重要方面。
Julia 在不同的范例下运行——通用函数、巧妙的调度和深思熟虑的类型(仅举几个例子),这些想法中有许多根本没有出现在 Python 中。因此,本文的目标是教授三个简单而重要的 Julia 概念:类型层次、多分派和用户定义类型。选择这些概念是为了帮助加速 Pythonic Julia 程序,说明 Julia 与 Python 的不同之处,并向 Python 用户介绍新的编程思想。
因此,因为我侧重于概念,所以我不会在这里介绍安装 Julia 和学习基本语法。对于安装和语法,我推荐以下资源:
- Changhyun Kwon 的《Julia 运筹学编程》的第一章包含了一个优秀的安装和设置指南。
- 由 J. Fernandez-Villaverde 编写的安装和语法综合指南。
- 通过例子向 Julia 学习语法。
- 从德里克·巴纳斯的视频中学习语法。
三个重要的朱莉娅概念
1。类型层次
Julia 的许多速度、多功能性和可组合性优势部分归功于打字系统。在 Python 中,类型可能是事后才想到的,所以通过类型思考可能会显得乏味。然而,Julia 保持简单,并以速度提升奖励仔细思考。
具体/原始类型
Julia 使用两种不同的类型:具体类型和抽象类型。每一个都有不同的用途。具体类型包括典型的String、Bool、Int64等。并用于标准计算。类型Float64是一个具体类型,意味着Float64可以被实例化并用于计算。
抽象类型
类型Union{}、AbstractFloat、Real和Any都是抽象类型。抽象类型不能实例化。相反,抽象类型是将相似类型的数据组合在一起的容器。它们通常用于向编译器表明可以在抽象类型的任何子类型上调用函数。
""" This function accepts Float16, Float32, Float64
because they are all subtypes of AbstractFloat
"""
function g(a::AbstractFloat)
return floor(Int, a)
end
类型Any和Union{}是特殊的。Union{}被预定义为所有类型的子类型。它是类型层次结构的底部。类似地,每个类型都是Any的子类型,使其成为类型层次结构的顶层。
为什么使用抽象类型?
抽象类型很有用,因为定义为作用于抽象类型的函数能够作用于抽象类型的所有子类型。
举个例子,假设一个开发人员需要一个类似数组的数据结构。在 Julia 中,他们可以定义自己的应用程序特定结构,并确保它满足AbstractArray类型的要求。然后,Julia 生态系统中定义为对AbstractArray数据进行操作的所有函数将在开发人员的类似数组的数据结构上工作。由于这个特性,Julia 的许多包可以顺利地一起工作,即使它们不是一起设计的。
与 Python 包形成对比。几乎每一个使用数组的包都是为使用numpy数组而设计的。这就造成了对numpy的巨大依赖。如果一个程序员想创建自己的数组并在上面调用numpy函数,这可能会引发错误。很少有 Python 库能处理自定义对象。相比之下,Julia 中的抽象类型给了开发人员更多的灵活性,并有助于使包更具可组合性。
操作员
二元运算符::用于断言变量是某种类型。更具体地说,运算符可以将变量初始化为特定类型,表明函数参数必须是特定类型,或者断言预定义变量是特定类型。下面演示了其中的每一种用法。
# Initialize a Float64
x::Float64 = 100# Argument z must be an Int64
**function** f(z::Int64)
**return** z^2
**end**# Assert x is a Float64
x::Float64 # (Does nothing)# Assert that x is an Int64
x::Int64 # (Raises error)
值得一提的是,我们可以在没有类型断言的情况下声明变量或定义函数,例如x = 100。(在这种情况下,变量x将是一个Int64。)
子类型运算符<:确定一个类型是否是另一个类型的子类型。如果我们想比较两个变量x和y的类型,如果变量x的类型是变量y’s类型的子类型,那么计算表达式typeof(x) <: typeof(y)将返回true。作为另一个例子,考虑以下表达式:
Union{} <: Float64 <: AbstractFloat <: Real <: Any
这评估为true,表示我们已经在类型层次结构中对类型进行了正确排序。(<:操作符可以比较这些对象,因为它们是类型而不是变量。)
更多关于类型的阅读:
- 关于类型的文档
- 一个很棒的关于类型的教程来自《艰难地学习茱莉亚》
- Julia 的创造者之一,(Stephan Karpinski) 讲解栈溢出上的类型系统。
2.多重调度
这个概念可能是了解朱莉娅最重要的概念。从开发的角度来看,Julia 提供的许多优势都源于多重调度。
多重分派是指函数根据其参数的类型表现不同。它类似于函数重载,但不完全相同。
当程序员将类型注释添加到函数定义中时,会发生多重分派。考虑下面的例子:
我们需要一个函数f来平方它的输入,然后计算它的值 mod 4。在 Julia 中,有 3 种等价的方式来定义f:
# Verbose definition
**function** f(x)
**return** x^2 % 4
**end**# Mathematical notation
f(x) = x^2 % 4 # Like a Python lambda
f = x -> x^2 % 4
假设我们总是需要f输出一个整数,但是它的输入x可以是一个String、Float64或者Int64,直到运行时我们才会知道x的类型。在 Python 中,这是通过以下方式解决的:
**def** f_py(x):
**if** type(x) == string:
x = float(x)
**if** type(x) == float:
x = ceil(x)
**return** x**2 % 4
在 Julia 中,我们可以编写一个类似上面 Python 函数的函数:
**function** f_py(x)
**if** isa(x, String)
x = parse(Float64, x)
**end**
**if** isa(x, Float64)
x = ceil(Int64,x)
**end**
x^2 % 4
**end**
然而,我们最好这样写:
f(x::Int64) = x^2 % 4
f(x::Float64) = f(ceil(Int64, x))
f(x::String) = f(parse(Float64, x))
这个定义集合与 Python 函数f_py做同样的事情。但是f对x的作用取决于x的类型。三个定义中的每一个都指定了f将对特定类型做什么。
- 如果
f被传递了一个Int64,它将把它的平方和 mod 减四。 - 如果向
f传递了一个Float64,它将计算高于 float 的整数上限,并对该整数调用f。这将调用 1 中描述的整数版本的f。 - 如果
f被传递了一个String,它将把它转换成一个Float64,然后在 float 上调用f,这将调用f的 float 版本,如 2 中所述。正如我们已经看到的,Float64版本转换为Int64,并调用f的Int64版本。
当这些函数在一个有 300 万个混合类型元素的数组上广播时,被调度的函数在 0.039 秒内完成。Python 版的f_py比f慢 50 倍。此外,调度函数f的速度是 pythonic Julia 的两倍。
一方面,Julia 基本上比 Python 快,但是我们也看到多分派比 pythonic Julia 快。这是因为在 Julia 中,f的正确版本是在运行时通过查找表确定的,这避免了多次if语句求值。
正如您所看到的,多重分派速度很快,可以有效地解决各种编程挑战,使其成为 Julia 语言最有用的工具之一。
更上多分派
- Julia 如何使用多重调度击败 Python 。来自 DJ Passey 的多个调度的更多例子。
- 多次派遣的不合理效力。斯蒂芬·卡尔平斯基的演讲。
- 关于 Erik Schnetter 的博客文章泛型编程的一些想法。
3.复合类型(结构)
这可能令人震惊,但事实证明,Julia 不是面向对象的。没有类,也没有具有成员函数的对象。然而,通过利用多重分派和类型系统,Julia 获得了面向对象编程语言的优点和额外的灵活性。
Julia 不使用对象,而是使用用户定义的复合类型结构。结构没有内部函数。它们只是命名类型的集合。在下面的例子中,我们定义了一个 NBA 球员结构:
**struct** NBAPlayer
name::String
height::Int
points::Float64
rebounds::Float64
assists::Float64
**end**
类型NBAPlayer有一个默认的构造函数:
doncic = NBAPlayer("Luka Doncic", 79, 24.4, 8.5, 7.1)
每个字段都可以用熟悉的点符号访问:doncic.name、doncic.height、doncic.points、doncic.rebounds和doncic.assists。
您可以定义额外的构造函数,只要它们接受不同于默认的类型组合。这是多重调度在起作用:
# Constructor with no arguments**function** NBAPlayer()
# Make an empty player
**return** NBAPlayer("", 0.0, 0.0, 0.0)
**end**
有了定义的结构,我们可以给 Julia 库中的函数新的定义:
**function** Base.show(io::IO, player::NBAPlayer)
print(io, player.name)
print(io, ": ")
print(io, (player.points, player.rebounds, player.assists))
**end**
这定义了结构NBAPlayer在打印时的显示方式。这类似于在 Python 中为一个类定义一个__repr__()函数。然而,与我们在 Python 中定义内部函数不同,在 Julia 中,我们为外部函数如何作用于结构提供了新的定义。
Python 允许开发者用魔法方法来决定某些操作符应该如何作用于一个类。程序员可以为+, -, +=和其他人应该如何作用于一个类编写他们自己的定义。但是,这从根本上受限于具有魔法方法的操作符列表。在 Julia 中,任何函数都可以被赋予任意类型或结构组合的定义。
结论
尽管 Julia 很容易上手,但掌握起来却很棘手。学习这些概念使开发人员走上了掌握 Julia 的道路。通过实践和尝试这些想法,您可以开发出编写高质量 Julia 程序所必需的技能。
参考
[1] J. Bezanson,S. Karpinski V. Shah,A. Edelman,为什么我们创造了 Julia (2012),JuliaLang.org
亲自看
medium.com](https://medium.com/swlh/how-julia-uses-multiple-dispatch-to-beat-python-8fab888bb4d8) [## 朱莉娅语言的风景照
体验朱莉娅,而不必做任何困难的事情
towardsdatascience.com](/a-scenic-look-at-the-julia-language-e8ba53dea5bd) [## 深度学习并驾齐驱:Julia v.s. Python
你能说出哪一种是未来的语言吗?
towardsdatascience.com](/deep-learning-side-by-side-julia-v-s-python-5ac0645587f6)
如何在学习机器学习的同时提高健康水平
这里有一个新规则:如果你的模型在移动,你也在移动。

一个穿着灰色连帽衫的胡子拉碴的男人坐在电脑前,看着亏损曲线下降。照片来自:当我的机器学习模型在 YouTube 上训练时,进行全身锻炼。
现在是时候问自己两个问题了。
- 什么不会改变?
- 会有什么变化?
一段时间后一切都变了
那是最好的故事开始的地方。或者至少它们包含了一个弧线,这个弧线带着一个角色经历了一系列的事件,之后一切都不一样了。
我们假设这个角色是你(还有我,因为我也在想这些事情)。
当一切恢复正常时,你会觉得有什么不同?
首先,我们必须明白,正常并没有一个统一的定义。你有你的故事,我有我的。你知道吗?
成为故事主角的美妙之处在于你可以创造它。你可以写下什么改变了,什么没有改变。
也许你已经意识到你所做的活动有一半是不必要的。或者你拥有的一半垃圾不能给你带来快乐。
学习机器学习(或任何东西)的公式
上个月底我发表了一个视频叫 不要学机器学习 。潜在消息的点击标题。
切忌当驴。
一个人如何避免成为驴子?
当问题出现时,通过识别并采取相应的行动。
驴子问题来自一个故事,一只驴子被困在一桶水和一堆食物之间。它不能决定它是饿还是渴,所以它看了一眼水,然后看了看食物,然后又看了看水,食物,水,食物,水。
最终,由于无法做出任何决定,驴子饿死了。
也许你以前遇到过这个问题。卡在两件(或更多)事情之间,全神贯注于考虑每一件事情,结果什么都没发生。
现在。
有很多方法来看待这个问题。或许,拖延决定会有所帮助。
你等待的时间越长,你就变得越聪明,你就能做出更好的决定。
或者拖延本身是一个信号,没有可行的选择,你应该选择没有。你知道俗话说,如果你不能决定,答案是否定的。
让我们把这个和学习机器学习联系起来。
我被问到的最一致的问题是,“我如何学习机器学习?”。
通常它会伴随着。
“我没有数学经验,还能学吗?”
“我没有统计学或者神经科学的背景,怎么办?”
对此,我的第一反应是“如果每个人在开始做某件事之前都需要背景知识,那么没有人会开始做任何事。”
我不会这样说,当然,我的回答更有礼貌,但在这篇文章中我可以更直接。
这里的驴问题很明显。有人有兴趣学习一个新的话题,但是考虑到摆在他们面前的无限的途径,他就退缩了。
修复?
如果你面前的现有路径都不起作用,你必须自己创造一条。
这里有一个万无一失的方法。
- 使用在线课程和材料(你足够聪明,可以找到这些)来建立知识基础。追求技能,而不是证书。
- 通过创建自己的项目,将你的知识基础转化为具体的知识(无法教授的知识)。
问题。
哪些资源最好?
很多都是入门绰绰有余。看评论。尝试一个,看看它是否能激发你的好奇心,让你继续下去。
如果外面有更好的东西呢?
驴的问题。避免。你会通过尝试一些事情来弄明白这一点,看看它是否适合你,如果不适合就继续前进。记住,你做的比你想的更聪明。
我学过一些入门课程,我应该做什么项目?
你自己的。
如何?
设计一些可能行不通的东西。
制作一个玩具来打动你的顾客、你的粉丝和你自己。不要担心做出什么东西来给竞争对手或你的同行留下深刻印象。
我的努力白费了怎么办?
99%的努力都浪费了。但是如果你从来没有奉献过,你就永远没有机会去成就那 1%不属于你的人。
注意我们所经历的是如何应用于学习几乎任何东西的。
最重要的一点是,在任何给定的时刻(不可能预测),你不是关注什么是正确的,而是关注趋势。
你正在培养学习的习惯(以课程为基础)和创造的习惯(建立自己的项目)。
过一会儿,你会发现一个暗示另一个。很快,你的创造会推动你的学习,而你的学习也会推动你的创造。
你用来学习的工具和资源会随着时间而改变,但是如何培养学习的习惯,培养实验的习惯不会改变。
在学习机器学习的同时改善健康
我承诺这里会包括健康。
健康不会改变。
失去健康,你还有什么?
如果你在学习机器学习,我要给你一个新的规则。
每次你的模型在动,你的身体也在动。
想象一下,你正在训练一个神经网络,或者对一个随机森林进行网格搜索。模特搬家。身体在动。
也许你去散步,做些俯卧撑,或者伸展一下久坐后紧绷的臀部。之后,你回来检查结果。好消息是,尽管你的损失功能一点也没有减少(你忘了加上optimizer.step()),你的身体感觉很好。
为什么?
缺乏运动导致身体堵塞。当你的身体堵塞时,你的思想也堵塞了。你不想那样。
同样,这可以追溯到学习一个新的话题。
对于任何给定的主题(尤其是机器学习),入门的资源都可能是巨大的。因此很有可能出现驴的问题。
和健康一样,有很多关于饮食、运动的教条,但是没有一个像趋势一样重要。
让我说清楚。
运动的习惯比运动的种类更重要。
学习的习惯和使用你所学的知识去创造比你用来学习的资源更多。
如果你想改善你的健康,你的知识,你分解问题和建立解决方案的能力,最好的方法是以小行动的形式,日积月累。
创建自己的反馈回路
好吧。
你可能会想,“丹尼尔,我被一头驴的问题卡住了,我能做什么?”。
除了我们已经讨论过的,这里有一些你可以采取的步骤。
对事物进行分级
你的健康,你的学习,你的创意,你的人际关系,其他对你很重要的事情。从 1 到 5,它们是如何叠加的?应该首先解决最低的问题。读完这篇文章后,把它们写下来。
30 天
获得评定后,设计 1-3 个步骤,在接下来的 30 天内,你可以采取这些步骤来评定最低的等级。这里少即是多。从尽可能小的行动开始。可能是每天花 10 分钟散步或阅读。或者去掉你收藏的 15 个标签,坚持选择最能激发你好奇心的那一个。
后续
任何互动中被忽略的一点是跟进。不要小看它。在 30 天结束时,重做评级并问自己:
- 我移除了什么?(记住,如果你正在读这篇文章,你的生活可能会通过减法而不是加法得到改善)。
- 我学到了什么?
- 我创造了什么?
- 我是怎么移动的?
- 什么保持不变?
- 未来 30 天有什么变化?
这个活动不需要超过一个小时。但是你正在做的是创造你自己的反馈回路。完全自我驱动。
因为。
如你所知,没有人比你更关心你。无论是学习新的东西还是照顾你的健康,都取决于你。
需要灵感?
我拍了一个我遵循新规则的视频:模特动,身体动。过来跟着走。
这篇文章最初是作为 2020 年 4 月期的吃、动、学、做播出的,这是我大约每月发送一次的时事通讯,面向饥饿、活跃、好奇的创作者。你可能是其中之一。更多类似这样的作品,一定要报名。
2020 年如何学习机器学习和数据科学
从线性回归到神经网络开始的最佳课程
想学习机器学习或数据科学但不确定从哪里开始?我当时就在那里——我还记得那些漫漫长夜,我在互联网的信息海洋中搜索,寻找最能利用我时间的课程。经过一番艰苦的挖掘,我发现了一些关于学习机器学习的优秀资源,我用这些资源进行了面试,并在数据领域获得了一个角色。在这篇文章中,我将分享我最喜欢的机器学习课程,这样你就可以直接投入到学习机器学习中,而不用像我一样花上几个晚上研究相同的主题。

马库斯·温克勒在 Unsplash 上的照片
今天,机器学习经常被吹捧为解决许多世界问题的银弹——它给了我们有效的网络搜索、无人驾驶汽车、实时语音识别,甚至极大地揭开了人类基因组的神秘面纱。它在我们日常生活中的普遍存在反映了它在大规模改善人类生活方面的效用和潜力,这也是机器学习的吸引力所在。
对于对学习它不感兴趣的局外人来说,它只不过是一个笼罩在神秘阴云中的时髦词。对于希望从事机器学习的新人来说,机器学习可能看起来像一个深奥的概念,具有很高的进入门槛。然而,机器学习不必神秘或难以理解。带着开始追求机器学习知识的真诚愿望和一点耐心,你现在正处于开始解决它的最佳位置。
但是什么是机器学习呢?
我喜欢把机器学习看作是教会机器自己学习的科学。更严格地说,机器学习之父亚瑟·塞缪尔在 1959 年将其优雅地定义为
这个研究领域赋予计算机无需明确编程就能学习的能力[1]
这与我们定义的传统编程截然不同。在传统编程中,我们给计算机一段程序和一个输入。反过来,我们期望一个输出。例如,如果我们给一个计算器程序提供 1+1 的输入,我们都知道输出是什么。

作者插图
然而,通过机器学习,我们给计算机一些输入和输出。随着时间的推移,机器会更好地学习输入和输出之间的关系。当我们给出一个新的输入时,它能告诉我们预测的输出。
例如,埃隆计划买一辆二手特斯拉。他在 Craigslist 上研究特斯拉汽车的价格,发现一辆接近新车的特斯拉起价约为 4 万美元。他还意识到,随着车龄的增长,特斯拉的价格会下降约 1000 美元。然后,他预测 5 年车龄的汽车——你已经猜到了——是 35,000 美元。

作者插图
换句话说,埃隆只是发明了回归——机器学习中的一个重要概念!在机器学习中,程序识别输入和输出之间的模式,并预测输出。

这辆特斯拉的价格是多少?尼克·科尔曼在 Unsplash 上拍摄的照片
人工智能和深度学习呢?
这些是与机器学习密切相关的术语。他们彼此之间到底是什么关系?这在图表中得到最好的体现—

人工智能、机器学习和深度学习的关系。作者插图
正如你从这张维恩图中看到的,深度学习是机器学习的一个子集,其中的算法模拟了我们大脑传输信息的方式——从神经元到神经元。深度学习通常被视为更复杂的机器学习形式。因此,学习者应该在深入学习之前掌握机器学习的基础知识。
另一方面,机器学习是人工智能(AI)的子集。通俗地说,AI 被定义为机器以各种形式展示的认知智能的模仿,包括但不限于推理、规划和学习。[2]
这些与数据科学有什么关系?
数据科学是一个跨学科的领域,它使用从数学、计算机科学和领域知识中提取的技术和理论。[3]为了说明什么是数据科学,我喜欢使用下面的维恩图。

机器学习与数据科学的关系。作者插图
如您所见,数据科学是不同领域知识的结合,包括数学、计算机科学和领域专业知识。机器学习是数学与计算机科学相遇的地方——计算能力与应用于大型数据集的优雅数学方程的融合。因此,机器学习是数据科学的重要组成部分。
好吧,我现在明白了。我如何学习它?
有太多的机器学习课程来学习机器学习。这涵盖了从机器学习入门到研究生水平的课程,从物理课程到在线课程的所有领域。
在数据科学领域的新手中很受欢迎的一些介绍性机器学习课程包括:
- Udacity 的机器学习入门课
- Datacamp 的/ Dataquest 使用 Python 的机器学习基础
- 哥伦比亚大学在 EdX 上的机器学习
- Udemy 上的机器学习 A-Z
- 哈佛大学的免费机器学习课程
- …
名单还在继续!
就我个人而言,我尝试了列表中的一些机器学习课程,但对其中一些课程提供的深度和严谨性不太满意。
如果你正在寻找一门严格的机器学习课程,将有助于你成为一名数据科学家,你来对地方了。今天,我将分享我个人最喜欢的机器学习入门课程,我从中受益匪浅——这就是 Coursera 上吴恩达(斯坦福大学)的机器学习。我也将分享我的建议,关于什么是需要的知识,在课堂上期待什么,以及如何在课堂上发挥你的最佳水平。
吴恩达在 Coursera 上的机器学习
机器学习中的课程一直被吹捧为初学者最好的机器学习课程。该课程在 370 万名注册者的 15 万个评分中得到 4.9 分,这暗示了它的可信度。
你可以免费听课(审计版)。作为学习者,你可以随时免费注册。然而,如果你是免费注册的,你将没有资格获得证明你已经完成课程的证书。您将无法提交和接收大多数编程练习和测验的反馈。
你可以在 Coursera 上注册 7 天的免费试用,也可以在 7 天结束前的任何时候返回课程。
证书费用为 49 美元。就我个人而言,我发现证书是一个很好的方式来证明我有必要的动力来完成这个课程。有需要的学习者也可以获得经济资助,所以请随时联系 Coursera。这里是如何—

作者插图
这门课的讲师吴恩达几乎不需要介绍。他是斯坦福大学的兼职教授,Coursera 和 Google Brain 的联合创始人,百度的前副总裁,不用说,他是机器学习领域极具影响力的人物。

吴恩达。史蒂夫·杰维特森通过维基共享资源拍摄的图片
为什么我很高兴上了这门课
一年多前,我想从事数据科学,但不知道从哪里开始,我疯狂地在谷歌上搜索'如何学习数据科学'。我很快被铺天盖地的资源和庞大的学习内容——数学、概率、统计、机器学习——淹没了,争先恐后地选择了似乎最受欢迎的课程,那就是吴恩达的机器学习。
我现在可以说,我很高兴我上了这门课。
我仍然记得已经完成了这门机器学习课程,并想去数据科学实习碰碰运气——至少可以说,我绝对吓坏了,但我参加了这门课的事实让我平静了一些。那些最早的数据科学面试告诉我,大多数机器学习从业者都熟悉,或者至少认识这门课程。当我参加这些面试时,当我提到我完成了课程时,招聘经理点头表示同意,这让我很受鼓舞。

我完成了这门课,这为招聘经理提出后续问题提供了一个跳板,比如“你从这门课中学到了什么”、“这门课最具挑战性的部分是什么”和“你如何在我们公司应用这门课的内容?”
事后看来,完成课程的行为可能被视为学习动机的标志和机器学习基础知识的展示——这两者都是招聘经理在数据科学职位上寻求的基本素质。
诚然,当我的简历只有这门课程时,我并没有获得数据科学实习。然而,它给了我信心,让我可以开始说该领域专家的语言。有了它,我能够与数据科学专家交流并向他们学习。
这门课是给谁上的
这门课是为希望在数据分析、数据科学、机器学习或人工智能领域从事技术工作的严肃学生开设的。它也面向没有机器学习背景的初学者或寻求机器学习概念复习的人。虽然没有明确提到,但这门课的数学严谨性将强烈吸引那些渴望深入了解机器学习的学习者,同时让那些对机器学习的细节不感兴趣的学习者却步。
因此,时间承诺不是微不足道的。完成本课程总共需要大约 60 个小时。假设你每天能投入 2 个小时,这个课程需要一个月。根据你对数学和编程的熟练程度,时间可能会有所不同。
这门课不是给谁上的
记住这一点,这门课不是为寻求对机器学习及其如何解决问题的一般定性理解的非技术学习者开设的,你可能更适合参加同样由吴恩达指导的 AI for everyone 。这门课的目标是希望理解人工智能领域和术语的非技术专业人士。这堂课也短得多,只需要 6 个小时的时间。
还有,如果你没有学习数学和编程的想法,这门课可能不是最容易的课。你可能会发现很难保持你的动力和兴趣。
好吧,数学听起来很难。没有数学可以做机器学习吗?

数学对马丁·路德·金很重要。由杰斯温·托马斯在 Unsplash 上拍摄的照片
不完全是。在不理解数学的情况下进行机器学习会带来严重的缺点。首先,你盲目实现机器学习的技能很容易被自动化的机器学习 AutoML 取代,就像那些由谷歌云实现的。其次,数据科学家的价值在于,在考虑运行时和存储复杂性以及算法对数据集的适用性之后,仔细选择一种性能最佳的适当算法。
想象你是一辆汽车的主人。当然,当汽车行驶时,你能平稳地驾驶汽车。然而,如果有一天你需要从头开始制造一辆汽车,或者如果你需要对一辆有故障的汽车进行故障排除,你将需要了解保持汽车在道路上行驶的齿轮和车轮。如果你不了解汽车的内部运作,这些都是不可能的。现在,汽车是一种数据科学算法——如果你不知道它在内部是如何工作的,你就无法建立一种机器学习算法。
作为数据科学家、分析师和工程师,我们的角色不仅是使用机器学习模型,还要构建、维护和部署它。要做到这一点,你需要知道数学。
好吧,我确实想学,但是我没有扎实的数学或者编码背景…
别担心!Coursera 上的课程没有实际的先决条件——你完全可以在没有我下面提到的任何课程的情况下开始上课。然而,我建议你先修一些课程,这将增加你在这门课上成功的机会。
推荐编码背景
在参加了 Datacamp 和 Dataquest 的 python 和 R 课程后,我对 MATLAB 和 python 有了非常基本的了解,开始了这个课程。本课程很早就对 MATLAB 进行了简要而温和的介绍,因此如果您没有必要的编码经验,也不必担心。这有助于学习者快速掌握所需的编码熟练程度。
如果你熟悉其他编程语言,但不熟悉 MATLAB,我建议你直接进入课程,不要太担心语言。但是,如果您仍然想花一些时间学习 MATLAB,我推荐以下由提供的优秀资源
- 麻省理工学院开放课件(免费)或
- Coursera 上的范德比尔特大学(付费)。

伊利亚·巴甫洛夫在 Unsplash 上拍摄的照片
推荐数学编码背景
本课程假设了高中水平微积分和线性代数的一些知识。你对数学越精通,就越容易轻松通过这门课程,反之亦然。
吴恩达的课确实提供了一些线性代数的复习,所以如果你对线性代数生疏了,也不必担心。
也就是说,我仍然建议你在开始上课之前问自己以下问题
- 我是否自信地知道微分法则?如果没有,可以去看看汗学院的微分学课程。
- 我知道什么是矩阵以及如何对矩阵进行运算(转置、算术、点积)吗?如果没有,查看一下可汗学院的线性代数播放列表。
下图是课堂上遇到的一些数学问题。你对这样的符号感到舒服吗?如果没有,使用上面的链接给自己一个快速复习可能是个好主意。


期待什么
要学习机器学习,通常需要知道
- 可以用机器学习解决的不同类型的问题。
- 解决不同问题的不同类型的算法。
- 每种算法在不同数据集上的优缺点。
- 支撑每个算法的数学和假设。
- 机器学习的权衡(偏差-方差权衡)
- 机器学习的最佳实践。
- 机器学习算法的应用。
为了涵盖这些概念,吴恩达的课程被分成由算法组织的章节。每个类都是有逻辑的:它首先向读者提供算法的简要介绍和它在现实世界中应用的突出例子,从而为读者做好准备。然后,它通过令人信服的图形解释建立读者对算法的直觉。这种直觉减少了理解算法数学的摩擦,这在课程中广泛涉及,但并不过分。
讲座结束后,你可以用小测验来测试你的理解程度。为了内化你的学习,你也将有机会使用基本原理在 Matlab 中从头实现算法。

你将在这堂课上学到的东西
该课程提供了对机器学习前景的广泛鸟瞰视角。这是本课程涵盖的概念的思维导图。

优秀的书籍伴侣
虽然吴恩达的课程没有官方教科书,但我发现当我有疑问时,查阅教科书很有帮助。为此,我推荐教材统计学习入门,这本书也可以在网上免费获得。这本书提供了清晰的解释和插图,以增强你对机器学习算法的数学直觉。一个警告是它使用 R 作为主要的教学语言。
取得进步的技巧和诀窍
- 提问
长时间停留在同一个地方真的很容易。Coursera 为像您这样的学习者提供了一个提问的论坛。如果你确实需要帮助,请随时联系我,我会尽我所能帮助你。
- 慢慢来
本课程涵盖的概念绝不简单。这门课进展缓慢是很自然的,所以一定要慢慢来。
- 小休
当您对某个代码块尝试了足够长的时间,却没有得到想要的输出时,也许是时候后退一步,休息一下了。
- 沿途做笔记。
我发现在纸上做笔记和编码非常有帮助,因为我可以通过绘制图表来可视化概念。我还发现,在我的电脑上实现代码之前,先把代码写在纸上很有启发性,因为这有助于我形成自己的想法。

我发现一路上做笔记非常有帮助。图片作者。
如果你相信,我强烈建议你今天就开始,今天就试一试。
这门课结束后去哪里
恭喜你!现在你已经完成了课程,你渴望更多的知识,你已经有了什么是机器学习及其数学基础的良好基础,你准备好了更多。以下是我对你可以追求什么的一些建议。
- 重温其他数据科学技能 (SQL、python 和 R)
- 创建有趣的项目来展示你的新技能。
- 参加统计学和概率的课程。
- 从 Coursera 上的 deeplearning.ai 上深度学习的课。
- 拿本课的进阶版 CS229 机器学习。这需要(本科生/研究生)对线性代数、统计和概率有深入的了解。
如果你有兴趣成为一名数据科学家…
这是一个关于如何在 2020 年学习数据科学的四部分系列。下面可以参考一下。
- 第 1 部分—使用 SQL、Python 和 R 进行数据处理
- 第 2 部分—数学、概率和统计(即将推出)
- 第 3 部分—计算机科学基础(即将推出)
- 第 4 部分—机器学习(你来了!)
- 第 5 部分—您的个人数据科学顶点项目(即将推出)
结论
作为一个对机器学习一无所知的学习者,在我上了这门课之后,我感到了难以置信的希望。它为我学习其他机器学习和数据科学概念提供了很好的基础。如果你坚持下去,我相信你很快就能完成这门课程,并有同样的感觉。
祝你的学习之旅一切顺利!如有任何建议或问题,请随时通过 LinkedIn 联系我。
www.linkedin.com](https://www.linkedin.com/in/travistang)
结论
[1] 米切尔,汤姆 (1997)。机器学习 。纽约:麦格劳·希尔。ISBN0–07–042807–7。OCLC36417892。
【2】罗素,斯图亚特 j .;彼得·诺维格(2009 年)。 人工智能:一种现代方法 (第三版。).新泽西州上马鞍河:普伦蒂斯霍尔。国际标准书号 978–0–13–604259–4。
[3]达尔,V. (2013 年)。《数据科学与预测》。ACM 的通讯。56(12):64–73。doi:10.1145/2500499。S2CID6107147。于 2014 年 11 月 9 日从原件存档。检索于 2015 年 9 月 2 日。
如何用支持向量机学习非线性数据集
支持向量机简介及其在非线性数据集上的应用
动机
支持向量机
什么是支持向量机?支持向量机是监督学习模型,分析数据进行分类。单独类别的样本点由一个尽可能宽的间隙分开。

作者图片
如上图所示,间隙是用黑色圆圈的两点定义的黄色区域。边框绘制在黄色区域的中间。当新的样本点进来时,它们将被预测为属于它们落入的那一侧的类别。
但是我们的数据并不总是线性的
如果数据像上面一样是线性可分的,那么我们用线性分类器来分离这两个类就没有问题了。但是如果我们的数据是像这样的非线性可分的呢:

作者图片
正如我们所看到的,即使来自不同类的数据点是可分的,我们也不能像上面那样简单地画一条直线

作者图片
那么,我们如何使用支持向量机来拟合非线性数据集呢?本文将带您了解如何做到这一点。读完本文后,您应该能够理解内核、gamma 和 C 的作用,以及如何操纵它们来适应您的数据集。
SVM 的实验
创建数据集和绘图功能
从创建非线性数据集开始。
您应该会看到类似这样的内容。

作者图片
我们还需要一个名为plot_decision_region的绘图函数,就像这个一样。由于本文的目标是理解 SVM,如果您想使用数据集并遵循本文,请随意复制并粘贴下面的代码。
线性 SVM 的尝试
在扭曲我们的算法之前,让我们先试试标准的线性 SVM
C是与错误分类相关的成本。C的值越高,正确分离数据集的算法就越严格。我们使用kernel='linear'进行线性分类。

作者图片
正如我们所看到的,即使我们将成本设置得非常高,这条线也没有很好地分离红色和蓝色点。一些蓝点和红点在错误的一边。
径向基函数核
到目前为止,我们已经使用了线性分类器的形式

我们可以看到,g(x)是一个线性函数。当 g(x) >0 时,预测为 1。当 g(x) <1 时,预测为-1。但是由于我们不能像上面那样使用线性函数来处理非线性数据,我们需要将线性函数转换成另一个函数。

你不需要理解我们是怎么得到像上面这样的函数 g(x)的。请注意:
- ||x-x_i||是距离公式。我们根据两点之间的径向距离来区分这两点。
- 西格玛是一个调节参数。西格玛越大,分类器对距离差异越不敏感。
- 范围从 0 到 1 的函数。
- 距离越大,函数越接近零。这意味着两点更有可能是不同的。
- 距离越小,函数越接近零。这意味着两点更有可能相似。
这个分类器似乎是我们非线性数据的一个很好的候选。让我们检查一下
gamma是 1/sigma。记住 sigma 是一个调节函数。因此,伽马值越小,西格玛值越大,并且分类器对各个点之间的距离越不敏感。****

作者图片
让我们试着把伽玛放大,看看会发生什么

作者图片
厉害!似乎将伽马值放大 100 倍可以提高我们的分类器对训练集的准确性。我们把这个伽玛乘以 10 怎么样?

作者图片
看起来分类器努力使训练集的准确度更接近于零。那么这是否意味着如果我们将 gamma 增加到 10000,它会更加精确呢?不完全是。如果伽马太大,分类器最终对差异不敏感

作者图片
让我们改为增加 C。还记得 C 是做什么的吗?c 是与整个数据集的错误分类相关联的成本。换句话说,增加 C 将增加对整个数据集的灵敏度,而不仅仅是单个数据点。
让我们用一个下拉栏来快速观察 C 值增加的差异

作者图片
厉害!我们已经找到了参数,所以我们的 SVM 分类器成功地分离了两组点。
下一步是什么
我希望这篇文章能让你直观地了解什么是 SVM 分类器,以及如何使用它来学习非线性数据集。当然,如果您的数据是高维的,您不能总是基于上述可视化来判断您的分类器的性能。一个好的做法是根据训练集训练数据集,并在测试集上使用混淆矩阵或 f1 分数等指标。
你可以玩玩这本笔记本中提供的代码,以建立对 SVM 更好的直觉。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 T2 Twitter 上与我联系。
星这个回购如果你想检查我写的所有文章的代码。在 Medium 上关注我,了解我的最新数据科学文章,例如:
使用 Python Widget,您可以用 3 行代码升级可视化
towardsdatascience.com](/how-to-create-a-drop-down-menu-and-a-slide-bar-for-your-favorite-visualization-tool-3a50b7c9ea01) [## 如何有效地微调你的机器学习模型
发现为您的 ML 模型寻找最佳参数非常耗时?用这三招
towardsdatascience.com](/how-to-fine-tune-your-machine-learning-models-with-ease-8ca62d1217b1) [## 自然语言处理中的卷积神经网络
什么是卷积神经网络,如何利用它进行情感分析?
towardsdatascience.com](/convolutional-neural-network-in-natural-language-processing-96d67f91275c) [## 如何用 Github 组织你的数据科学文章
被新信息淹没?现在,您可以轻松地跟踪文章并为其创建自定义注释
towardsdatascience.com](/how-to-organize-your-data-science-articles-with-github-b5b9427dad37) [## PyTorch 是什么?
想想 Numpy,但是有强大的 GPU 加速
towardsdatascience.com](/what-is-pytorch-a84e4559f0e3)
如何像爱因斯坦学物理一样学习编程

爱因斯坦是个天才,是有史以来最伟大的科学家之一。1905 年,他发表了四篇奠定现代物理学基础的科学文章,改变了对空间、时间、质量和能量的看法。在以这四篇文章出名后,他继续在 1921 年获得了诺贝尔奖,因为他解释了被称为光电效应的现象。
我们都可以从爱因斯坦的生活中学习,尤其是他的工作和学习方式。即使我们不一定都是爱因斯坦级别的天才,仍然有一些模式可以在多个研究领域中被模仿,尤其是在软件开发中。成功留下了线索,揭示了我们如何向任何人学习。
像 Michael Jordan 或 Arnold Schwarzenegger 这样的人不是软件开发人员,但是他们有意的实践和态度代表了一些可复制的模式,这些模式既可以由软件开发人员实现,也可以由其他职业的人实现。
在他们所做的事情上是精英中的精英的人通常因他们不同寻常的习惯而与众不同,比如专注于正确的事情,以及在没有人观看的时候痴迷地练习他们的手艺。他们不仅比同龄人和同龄人群体外的其他人工作得更出色,而且他们工作效率更高,并将学习视为一种生活方式。
正如世界上最著名的表演教练托尼·罗宾斯所说,“我认为如果你渴望学习,渴望成长,渴望掌握一切。如果你不满足于低于你的能力或成就,那么你就能超越任何人。”
学习如何学习

据报道,爱因斯坦曾说过:“精神错乱就是一遍又一遍地做同一件事,却期待不同的结果。”如果你想获得不同的结果,你需要做与别人不同的事情。当你像其他人一样学习时,你会得到和他们一样的结果。你需要愿意深入一门学科,以不同的方式学习,才能成为爱因斯坦那样的人。
几十年前,一名物理系学生在一次考试中取得了满分,但在一个关于如何使用气压计测量建筑物高度的问题上,教授给他的分数很低。
学生写道:“去楼顶。放下气压计,数秒钟,直到它砸在下面的人行道上。然后用重力加速度的公式来确定建筑物的高度。”
预期的答案是参考气压计,使用气压作为测量高度的工具。当学生争辩说他已经用一种有点不寻常的方法得出了一个正确的答案时,教授和学生做了一个交易:如果学生能用另一种方法正确地回答同一个问题,教授会给他满分。
这名学生立即想出了另一个回答。他说他会用气压计敲大楼房东的门。房东一开门就会问:“这楼多高?”
教授要求学生想出另一种方法来回答这个问题,所以学生建议在气压计上绑一根长绳,从楼顶测量这根绳子的长度。或者像钟摆一样摆动绳子,通过它产生的运动来推断高度。
教授认为所有这些从不同角度的答案都是正确的,并给了学生满分。
根据斯科特·扬的书《多学点,少学点》,这个年轻的学生就是尼尔斯·玻尔,他因为发现了原子内部电子的本质而获得了 1922 年的诺贝尔物理学奖。但是他并不是仅仅通过参加他的物理讲座就学会了所有这些方法。
你必须对某件事充满热情,才能深入学习,理解这个话题,并对同一个问题给出这么多答案。此外,你也必须学习不同于大多数其他人的。
大多数学生为考试而学习,因为他们想取得好成绩。他们不会学到比期末考试更多的东西,更不用说在期末考试后花更多的时间学习与主题相关的东西了。
类似地,很多软件开发人员倾向于使用谷歌来解决问题,这样他们就可以尽快修复错误。他们主要关心的是在经理面前表现得富有成效。他们没有花时间在更深层次上理解解决方案,或者找出解决问题的最有效方法。他们很满意这个任务在吉拉完成了。
当然,可能会有这样的情况,当你处于压力之下,你必须快速修复一个关键的 bug,因为最后期限很快就要到了。尽管如此,你不应该让这几个案例分散你继续学习的注意力。

现在我们知道了学习对一个人的成功有多么重要,让我们看看如何通过更好地学习来成为更好的软件开发人员。
1.学习计算机科学的基础知识
根据沃尔特·伊萨克森写的阿尔伯特·爱因斯坦传记,在爱因斯坦 15 岁之前,他已经掌握了微积分,因为他认为数学是理解自然的一种方式。这些基本概念后来被证明在他的物理学领域的工作中是有用的。
大多数人倾向于避免学习基本面,因为他们可能在短期内看不到自己工作的成果。告诉别人你已经准备好在 Play Store 下载你的应用程序,比告诉他们你仍然专注于基础更令人满意。
和那些人不一样。学习计算机科学的基础——更具体地说,数据结构和算法——并真正学好它们。你必须能够在不使用教科书的情况下,自己实现一些最常用的算法和数据结构。
当您最终在深层次上理解它们时,您将获得以直观的方式解决软件开发中现实世界问题的能力,这可能是一种更快、更有效的方法。
正如艾萨克森提到的,爱因斯坦认为“直觉只不过是早期智力经验的结果。”在软件开发中,先前的智力经验需要坚实的基础。
正如 Linux 内核开发人员 Linus Torvalds 所说:
“事实上,我会说,一个糟糕的程序员和一个优秀的程序员之间的区别在于他认为他的代码更重要还是他的数据结构更重要。糟糕的程序员担心代码。优秀的程序员会担心数据结构和它们之间的关系。”
微软、谷歌或亚马逊等大型科技公司通过围绕基本概念的艰难技术面试来招募新的软件开发人员。
换句话说,不管你使用什么类型的编程语言,你的代码只是表达算法和数据结构的方式。
2.通过解决问题来学习,而不只是被动地看教程

爱因斯坦在大学经常逃课。艾萨克森引用他的话说,“我经常逃学,在家里怀着神圣的热情研究理论物理大师。”他没有兴趣,也没有被迫去听他的讲座。他发现了更吸引人、更有成就感的事情——他利用时间专注于解决难题,痴迷于自己摆弄想法和方程。
有很多书和教程可以教你编程。但是它们通常只给你一个关于新概念的肤浅介绍,而更深层次的理解和学习是在使用这些概念解决现实世界的问题时完成的。
不要错误地认为,通过被动地观察某人快速开发 web 应用程序,你已经学到了一些东西。当你还没有真正学会的时候,不要假装你懂了。正如爱因斯坦所写,“任何读书过多而用脑过少的人都会养成懒惰的思维习惯。”
相反,你应该积极参与解决问题,以便学习新的概念。你可能会从 LeetCode、Codility、HackerRank、CodeChef、CodeForces 等在线评委那里发现可以测试你对基本面理解的技术问题。
您还可以通过修复 bug 或使用更高效的实现优化现有功能,为 GitHub 中的开源项目做出贡献。参与他人的项目可以帮助你从他们的实现和方法中学习,并激发你提出新的解决方案。
这种工作积极地让你的大脑参与进来,因为你找到了现有解决方案的新方法,结果帮助你长期学习和保留信息。
如果你已经有了一份全职工作,或者即使你是一个独立的承包商,你也应该根据你目前的经验水平不断地寻找具有挑战性的任务。不要害怕要求你的项目经理把它们分配给你。不要回避这些机会,要充满热情,感受到通过学习做一些你以前不知道的事情而获得报酬的特权。正如爱因斯坦所说,“智力的增长应该始于出生,止于死亡。”
而且,不要犹豫,开始一个副业。您不必等到五年后才构建自己的应用程序。您可以开始开发一个小的应用程序,并计划在了解更多信息后进一步扩展它。
在 GitHub 上发布您的源代码,并通过电子邮件或编程社区联系其他程序员,尝试向他们寻求反馈。
3.通过编写测试来提高你的理解
爱因斯坦的叔叔雅各布早年挑战侄子证明毕达哥拉斯定理。经过一番努力,我成功地在三角形相似的基础上‘证明’了这个定理,爱因斯坦回忆道。**
爱因斯坦花了很多心血通过做证明来建立他的理解。结果,他不仅能够全面地学习东西,而且也有足够的信心自己尝试其他东西。
证明定理类似于在编程中编写测试:你需要通过提出测试用例来证明网站的一个特性确实在工作,然后期望执行特定的功能或者源代码产生输出。考试是学习新事物的另一种方法,因为它比被动地观看教程花费更多的时间和精力。
一些新开发人员害怕进入测试领域,但是它代表了理解一个软件的执行流程和功能的最有效的方法之一。对于项目新手和希望了解项目结构和工作方式的人来说,这尤其有用。
如果你想了解一个特定的开源框架是如何工作的,你可以通过编写测试来提高你对它的理解。这样,你不仅能更好地理解框架,而且你的测试也能对项目有所贡献。
如果您正在处理一个大型项目,并且有些事情您不清楚,您可以将执行流程分解成几个组件,并为每个组件编写测试。
编写测试不仅有助于您的理解,还能让您发现潜在的 bug,从而为整个项目做出贡献。
4.全神贯注

凯文·Ku 在 Unsplash 上的照片
我们生活在一个有太多干扰的时代。从早上醒来的那一刻起,我们就拿起了手机。查看短信。阅读电子邮件。平均来说,一个人每天要打 76 个电话。
显然,爱因斯坦没有手机,但他有自己的分心事物类型,并有处理它们的方法,我们可以从中学习。他的儿子报告说,即使是最大的婴儿哭声似乎也不会打扰父亲,他补充说,“他可以继续工作,完全不受噪音的影响。
他高度集中注意力和长时间不间断工作的能力帮助他实现了历史性的突破。“我能够在两三个小时内完成一整天的工作。一天中剩下的时间,我会想出自己的想法,”爱因斯坦在谈到他在伯尔尼专利局的工作时说道,这份工作让他有时间专注于更具挑战性的工作。
软件开发人员可以向爱因斯坦学习,练习排除干扰。不要假装在无数次“只是检查”脸书的信息后,你能够专注于相同的强度水平!
畅销书《泰坦的工具》的作者 Tim Ferriss 写道“单一任务是一种超能力”他补充说,“在数字经济中,注意力分散就是一种货币,如果你能一次专注于一件事三到五个小时,并排除所有的注意力分散,你就有了很大的优势,你能做深入的工作,并把无关的点连接起来。”
试着与你的经理达成妥协,留出一天中的特定时间进行交流,将其他时间投入到有价值且认知要求高的工作中,比如学习新概念或新技术以及编写代码。
当我们能够远离那些干扰,运用好的时间管理技巧,我们就增加了更深入学习的机会,结果,我们变得更有效率。
5.保持好奇心,热爱学习

软件开发是我们这个时代最受欢迎的职业之一。不断有新的工作机会,吸引了来自各行各业的年轻人和已经就业的人。他们知道作为一名软件开发人员,你可以得到一份非常好的薪水,因此,他们怀着远大的抱负开始了他们的职业生涯。
然而,即使你得到了一份软件开发的工作,只有你热爱学习和编程,你才能变得伟大。这是少数几个你必须不断学习新东西的职业之一。
你需要了解的不仅仅是现有的概念。你必须适应新技术和编程语言的不断发明。你必须适应市场的变化,学习目前被认为有价值的新事物。
你必须坚持不懈地学习很多东西。为了让你的大脑不断参与学习,你必须保持好奇和谦逊。
通常,程序员在他们现有知识的基础上获得就业,并开始认为他们不再需要学习新的东西。然而,只有当你充满好奇心并热爱学习的时候,你才能成为一名优秀的软件开发人员,因为学习的需求永远不会停止。
1915 年 11 月,爱因斯坦只写了两页就给 11 岁的儿子汉斯·阿尔伯特写了一封信,他被 T4 称为“我一生中最美丽的作品之一”。他表扬了儿子的学习努力,说:“这是学习最多的方法……当你如此享受地做某事,以至于你没有注意到时间的流逝。”
“好奇心有其存在的理由,”爱因斯坦解释道。“当一个人思考永恒、生命和现实的奇妙结构的奥秘时,他不禁感到敬畏。”
对框架是如何工作和构造的感到好奇。当你彻底了解某样东西时,你会对它的机制和功能有一个清晰的了解。不要简单地接受 Rails 是快速开发 web 应用程序的伟大框架——了解 Rails 如何幕后工作。此外,考虑对其做出贡献和改进的可能性,因为它是开源的。
也要小心,不要被金钱所困扰。当然,我们都需要钱来支付账单,为自己和/或家人购买食物,但是如果你想在软件开发方面出类拔萃,你需要培养学习和开发的热情。你需要热爱编程,并且感激你有机会用你写的代码对数百万人的生活产生积极的影响。
爱因斯坦相信“爱是比责任感更好的老师。”作为软件开发人员,我们从中可以学到的不仅仅是为高薪而工作的重要性,而是因为我们热爱学习和我们的工作,并且有一种内在的好奇心和动力,让我们在下班后或周末老板不在的时候保持忙碌。
永远记住:编程是一生的学习

除了他的学习方法,爱因斯坦是物理学中最有影响力的人物之一。他的工作帮助了许多学科,从核能生产到 GPS 卫星同步到计算机,再到许多日常消费品。
他的天才和成就可能超出了我们大多数人的能力范围,但他的职业道德、谦逊、好奇和坚韧值得任何人效仿。
如果你想成功,你可以通过复制其他成功人士的行为来节省自己的时间。尽管爱因斯坦没有写过一行 Java 或 Python 代码,但他的一生揭示了一些鼓舞人心的模式,我们都可以从中学习,并应用于软件开发领域。
爱因斯坦可以作为一种鼓励,专注于学习基本面,通过解决问题和编写不同项目的测试来学习,集中注意力,最重要的是,热爱学习。如果我们想在事业上取得成功,我们需要对学习充满热情,并认识到它是我们生活中至关重要的一部分。
跟我上 推特
如何以正确的方式学习编程
语法不应该是第一步!

凯利·西克玛在 Unsplash 上的照片
对程序员、开发人员和数据科学家的高需求吸引了许多人加入 IT 领域。但是,最常见的情况是,新员工试图通过快速学习过程来更快地找到工作。
匆忙的学习过程并不总是一件好事;事实上,有时,人们可能会跳过该领域的一些重要方面,试图缩短他们的学习时间,或者因为他们觉得这些方面令人生畏。
“我看到新程序员犯的最大错误是专注于学习语法,而不是学习如何解决问题。”— 诉安东·斯普拉
无论你的目标职业是软件开发人员、web 开发人员还是数据科学家,所有基于 IT 的职业都有一个共同点,那就是编程知识。
在这篇文章中,我将带你经历 5 个步骤——我相信——学习编程的正确方法。在我们开始之前,我想澄清一下,我不会谈论如何用特定的语言编程。相反,我将谈论发展直觉和解决编程问题的思维过程。
作为一名程序员不仅仅是坐在电脑前快速点击一串按键。当一个程序员接到一个编程问题时,坐着完成并编写代码可能是最后一步。
先学会逻辑解决问题
第一步是——我知道这很“老套”——用笔和纸逻辑地解决问题。每当我教一个完全的初学者编程时,我首先解释解决编程问题背后的逻辑,并在我们真正进入编码之前用笔和纸解决许多问题。
要发展您的编程直觉,您需要练习:
- 学会认真看问题。阅读一个问题,找出你需要做什么的细节,你的输入是什么,你的预期输出应该是什么。
- 解决问题不要先想到代码。我把这一步放在第一位,因为如果你已经知道如何编码,你将倾向于直接进入这一步。停下来。先用常用词解决问题。
- 在不同的输入示例上测试您的解决方案。一旦你想出了一个解决方案,尝试不同的案例场景,看看你的解决方案是否经得起所有的考验。
- 每天练习解题。每天解决新的问题将帮助你发展一种编程直觉,并练习你解决问题的技巧。日常编码问题是一个很好的资源。
这一步非常关键,但许多人似乎完全跳过了这一步。学会正确的思维过程,学会如何解决编程问题,有助于减少你未来解决问题的时间。它还将帮助您更快、更有效地学习多种编程语言。一本很棒的关于解决问题过程的书是 像程序员一样思考。
学习算法和数据结构
许多初学者和一些有经验的程序员避免学习数据结构和算法,因为他们认为这很复杂,在现实生活中没有用。
虽然在没有扎实的算法和数据结构知识的情况下,你可以——可以说——在职业生涯中走得更远,但是很好地掌握这些概念将会巩固你的知识基础,让你成为一名更好的程序员。
算法不是计算机独有的概念。算法是一组步骤,遵循这些步骤可以解决特定的问题。如果你真的想过,我们每天都在开发和使用算法!当我早上醒来时,我总是煮一些咖啡。我得到咖啡豆,研磨它们,用新鲜的水装满我的咖啡机,然后煮我的咖啡。
我只是按照一套特定的步骤来解决一个特定的问题:我的咖啡因上瘾!。当你学习如何逻辑地解决问题并发展直觉时,你基本上是在学习如何开发和应用算法。
另一方面,数据结构是你的输入和输出将如何呈现。回到我的咖啡算法,咖啡的初始状态会影响我如何准备它。例如,如果我有整粒的咖啡豆,在我煮咖啡之前,我需要先烘焙和研磨它们。然而,如果咖啡豆已经磨碎了,我可以直接开始酿造。想想整粒咖啡豆和磨碎的咖啡豆是我的咖啡可能的数据结构。因此,不同形式的数据(或咖啡)需要不同类型的处理。
有很多资源可以用来建立算法和数据结构的基础知识。我最喜欢的两个是冒名顶替手册和这个 Coursera 课程。
阅读复杂性理论。
复杂性理论是每个以写代码为生的人都应该非常熟悉的重要方面之一——不管代码做什么。
复杂性理论描述了算法相对于输入大小的表现以及它是如何实现的。通俗地说,就是描述你的算法有多好。尽管计算机能够完成令人印象深刻的任务,但也有其局限性。如果你开发了一个复杂到目前的计算机无法运行的算法,它可能没有好处。
当你在处理现实生活中的应用程序,试图解决许多问题时,你总是需要记住你的答案的复杂性。例如,如果我给你一本书,让你打开第 5 页,你可以简单地浏览第 1~5 页。因为 5 离开始很近,所以通过之前的 p[ages 并没有花太多时间。但是假设我想让你打开 489 页。这可能需要你多花一点时间去做。
这就是复杂性理论所描述的。虽然问题是一样的,但可以提出不同的解决方案,不是所有的方案都有同样的效果。选择最佳解决方案是每个开发人员都需要掌握的技能,其基础是复杂性理论。
《冒名顶替者手册》有一章是关于复杂性理论的,很容易理解。如果你想要更深入的信息,麻省理工学院和斯坦福也提供免费的课件来学习复杂性理论。
从伪代码开始
等等!现在还不是学习特定编程语言的时候,但是你已经快到了。
你解决了很多问题,发展了你的直觉,知道了基本的算法和使用的数据结构。你想开始写代码,构建很酷的项目。
但是,
在你这么做之前,我的建议是先用伪代码实现你的算法和解决问题的技巧。正如我们刚刚讨论的,算法是用来解决特定问题的一组步骤。伪代码被定义为“任何算法步骤的简单语言描述”这意味着伪代码被用来描述算法的步骤,作为一种介于普通英语和编程语言之间的形式。
伪代码通常用于人类阅读,而不是机器阅读。这是一种向他人而不是向计算机解释你的思维过程的方式。
我这么说吧。如果你的算法对其他程序员来说没有意义,它甚至是非常复杂或者不准确的。
[加州理工州立大学](http://California Polytechnic State University)写了一本关于伪代码标准的很好的指南。此外,这篇 DEV 文章解释了如何编写伪代码以及何时使用它。
将您的知识应用于特定的语法
最后,您已经准备好开始编码了。
一旦你建立了解决问题、算法和复杂性理论的坚实基础,你就可以坐下来开始选择一门编程语言开始学习了。根据维基百科,有超过 700 种编程语言。并不是所有的都是众所周知的或今天使用的。
此时,您可能会问自己应该从哪种编程语言开始?
好消息是,所有的编程语言基本上都是一样的。这意味着如果你有良好的编程直觉,你可以把它应用到任何编程语言中。你只需要学习它的语法。
我希望你们把不同的编程语言想象成表达同一件事情的不同方式。例如,如果我想说我家附近有一个漂亮的花园,我大概可以说:
- 我家附近有一个美丽的花园。
- 我非常喜欢我家附近的花园。
- 我喜欢我家附近花园的美丽。
- 我家附近有一个花园。很漂亮。
所有编程语言都有相同的词汇、变量、循环、数据类型、条件语句、函数、类等。他们只是有稍微不同的书写方式。
所以,无论你从哪种编程语言开始,只要你的基础扎实,你都可以很快学会另一种语法。话虽如此,基于你的目标职业,有些编程语言可能比其他语言更好学。
最后的想法
不管你的目标职业道路如何,如果你想建立一个 IT 职业生涯,你将需要学习并擅长编程。尽管有许多途径可以学习如何编程,但在我看来,正确的途径是:
- 培养良好的编程直觉(致力于解决问题的技能)。
- 学习算法和数据结构。
- 至少学习复杂性理论的基础。
- 首先使用伪代码实现您的解决方案。
- 学习任何编程语言的语法。
如果你遵循了前 4 个步骤,那么你在第 5 步中选择的语言就没多大关系了。把前 4 个步骤看作是你知识的支柱;支柱越强,你的学习就越高。
R 编程语言:简介
约翰·霍普斯金 DS 专业化系列
什么是 R,R 与 Python,以及学习 R 的最好方法

由 Unsplash 上 Greg Rakozy 拍摄的照片
[Full series](https://towardsdatascience.com/tagged/ds-toolbox)[**Part 1**](/the-data-scientists-toolbox-part-1-c214adcc859f) - What is Data Science, Big data and the Data Science process[**Part 2**](/how-to-learn-r-for-data-science-3a7c8326f969) - The origin of R, why use R, R vs Python and resources to learn[**Part 3**](/a-crash-course-on-version-control-and-git-github-5d04e7933070) - Version Control, Git & GitHub and best practices for sharing code.[**Part 4**](/the-six-types-of-data-analysis-75517ba7ea61) - The 6 types of Data Analysis[**Part 5**](/designing-experiments-in-data-science-23360d2ddf84) - The ability to design experiments to answer your Ds questions[**Part 6**](/what-is-a-p-value-2cd0b1898e6f) - P-value & P-hacking[**Part 7**](/big-data-its-benefits-challenges-and-future-6fddd69ab927) - Big Data, it's benefits, challenges, and future
本系列基于约翰·霍普斯金大学在 Coursera 上提供的 数据科学专业 。本系列中的文章是基于课程的笔记,以及出于我自己学习目的的额外研究和主题。第一门课, 数据科学家工具箱 ,笔记会分成 7 个部分。关于这个系列的注释还可以在这里找到。
介绍
如果您是 R 编程语言的新手,或者您想了解更多,那么这篇文章是为您准备的,受 Coursera 上的 DS 工具箱课程的启发,我将简要说明 R 在数据科学中的使用,包括关于它的重要性以及它与 Python 相比如何的细节。在文章的最后,我还会分享一些学习 r 的资源。希望你喜欢阅读这篇文章!
R 编程语言的起源
许多编程语言的创造都是受手头某个特定问题的启发,一般来说,是为了让编程更直观。对 R 来说,它是为统计学家建立一种更容易理解的语言。当时有一种高度复杂的语言叫做 SAS,是为统计学家设计的,但是语法和功能太难使用了。两位杰出的开发人员看到了这个机会,并创造了 R,这是 SAS 的一个免费、开源的替代品,更容易编写和简化。
R 是什么?
快速浏览一下维基百科就能明白这一点
统计学家和数据挖掘者广泛使用 R 语言来开发统计软件和数据分析
定义是不言自明的,R 是一种面向统计分析的简单语言——就像 Flutter 用于构建移动应用程序,React 用于漂亮的网站——一般来说,R 提供了一种简单的方法来获取数据,并将其转化为有用的统计数据、令人敬畏的图表和用于预测和推断的统计学习模型。
今天,R 已经不是学术环境中统计学家的语言了,它有无数的扩展来服务于不同领域的不同目的。例如,它可以用于工程、营销、金融、保险等等。
为什么用 R?
本课程主要给出了 4 个原因,分别是:
1.流行
r 是统计分析的典型语言,随着其功能的不断增加和更新,以及数据科学的蓬勃发展,它已经成为数据科学家的顶级语言。
2.免费和开源
像大多数语言一样,它是开源的,可以免费使用。像 IBM SPSS 这样的统计软件是要花钱的,所以让所有人都可以使用 R 是件好事。
3.广泛的功能
r 真的很万能。除了统计和绘图,它的广泛功能包括制作网站、分析语言等等。有了正确的包,你几乎可以用 R 做任何你想做的事情。
4.巨大的社区
像 Python 一样,它是开源的,有大量扩展功能的包。这样做的一个好处是,当你在 R 中遇到问题时,你可以去论坛寻求帮助。
R 怎么用?
安装 R
你可以在 CRAN 下载 R,它代表 C 综合RACN网络
RStudio
R 的官方 IDE 是 RStudio ,它让 R 编程变得超级简单有趣。
TidyVerse
鉴于数据科学的繁荣, Tidyverse 应运而生。这是一个供数据科学使用的 R 包集合,它扩展了基础的功能。如果你已经有编程背景,并且正在学习数据科学的 R,那么使用 TidyVerse 是理想的。但是,如果没有编程基础,您应该先学习 base R,然后再学习 TidyVerse。
R vs Python
r 和 Python 是数据科学中的两大巨头,出现在许多热烈的讨论中。我将简单介绍一下要点,并在后面的参考资料中链接更详细的比较。
R 是为统计学家打造的,所以 R 将在统计分析和建模方面占据上风,特别是 TidyVerse 包——用 ggplot2 进行数据操作和绘图,以及用 R notebook 和 RStudio 中的 Markdown 生成报告。然而,它确实有一个陡峭的学习曲线
Python 是一种更通用的语言,是万能的。它在生产和其他方面,如软件开发,建立网站,机器学习和深度学习(PyTorch)方面具有优势。
由于这两种语言各有利弊,大多数人通常会出于不同的目的使用这两种语言,这取决于他们的专业和用例。
那么,应该学哪个呢?
有许多不同的意见,你应该学习。但是我认为最重要的事情是首先掌握编程的基础,因为所有的编程语言都是在编程和计算机科学的基本概念下工作的。
即使在那之后,你决定先学习哪种语言并不那么重要,R 和 Python 都被广泛采用和使用,你将使用哪种语言取决于你的专业和你做的项目。因此,开始学习是个好主意,这样你就不会浪费时间去研究、思考和实际掌握技能来保障你的未来。
缩小范围的一种方法是确定你在数据科学领域的首选角色,通过研究你的理想工作,你应该能够了解你选择的公司首选什么语言。假设你想成为一名数据分析师,你应该专注于拥有尖端软件包的 R。但是如果你更喜欢构建模型和生产代码,你应该关注 Python。
我如何学习 R?
约翰·霍普斯金大学提供的数据科学专业是一个很好的起点,因为它为你提供了你需要了解的关于数据科学基础知识的一切,并让你从零到 R 中的英雄。除了这门课程,你还可以从数据科学的书R开始。
为了更好地理解机器学习和统计,你也可以阅读《统计学习简介》这本书,这本书教你用 R 语言构建各种统计学习模型,但前提是你必须在数据科学专业化方面取得相当大的进展。
除此之外,你还应该经常利用互联网上的大量资源——比如 YouTube 教程、文章等。—并且总是尝试真正巩固和实用化你所学的东西,记笔记(手写笔记以便更好地保留),并在学习会话后用代码复制你所学的内容。
对我来说,在线学习最重要的一课是,你的目标不应该是证书或炫耀你在简历上获得的新技能,而是学习的技能和学习如何学习,这在这个快节奏的世界中非常重要,因为数据科学的最新工具和技术可能会在未来几年发生变化。
这篇学习 R 的指南并不是最好的当然,这只是我个人学习 R 的计划,我希望你会发现这也是学习用 R 写代码的技巧的好方法!我希望你学习愉快。
摘要

照片由 Jonatan Pie 在 Unsplash 上拍摄
总之,对于统计分析和建模来说,R 是一种很棒的语言,至今仍被许多人使用。决定学习并坚持学习可能是你一生中最好的决定之一。我目前正在学习 R,我认为这是一门很好的语言,我迫不及待地想做好模型和漂亮的图形。
学习数据科学有时会非常困难,你会觉得自己不够好(冒名顶替综合症)。保持你的动机和决心的一种方法是记住你为什么首先学习它,对我个人来说——在这个数据科学和人工智能时代确保你的未来,并在这个过程中获得惊人的技能。
你还必须明白,学习它是一个终生的旅程和过程,它不是一个四年制的本科学位就能获得的。一张纸上的分数并不代表你的心态和哲学,也不能证明你的技能和能力(在现实世界中)。这个领域总是在变化,更重要的是要适应并专注于学习如何学习,而不是教科书上的定义和方法。
正如 苏格拉底 所说:
"教育是点燃火焰,而不是填满容器."
以及 爱因斯坦 :
"智力的发展应该从出生开始,只有在死亡时才停止."
因此,如果你一直在考虑成为一名数据科学家,学习 R 是一个很好的起点。祝你一切顺利。
感谢您的阅读,我希望这篇文章是有教育意义的,让您对 R 编程语言有所了解。
R 的资源
awesome R 包和工具的精选列表。灵感来自令人敬畏的机器学习。下载量排名前 50 的 CRAN
github.com](https://github.com/qinwf/awesome-R/blob/master/README.md) [## 通过 5 个步骤正确学习 R——在 Dataquest 学习数据科学
r 是一种越来越流行的编程语言,尤其是在数据分析和数据科学领域。但是…
www.dataquest.io](https://www.dataquest.io/blog/learn-r-for-data-science/)
r 代表数据科学
这本书将教你如何用 R 做数据科学:你将学习如何把你的数据放入 R,把它放入最…
r4ds.had.co.nz](https://r4ds.had.co.nz)
Python vs R
来源:数据营团队
[## Python vs. R for Data Science:有什么区别?
如果你是数据科学的新手,或者你的组织是新手,你需要选择一种语言来分析你的数据和一个…
www.datacamp.com](https://www.datacamp.com/community/blog/when-to-use-python-or-r)
来源:数据驱动科学
关于:数据驱动科学(DDS)为在人工智能(AI)领域建立职业生涯的人提供培训。跟随…
medium.com](https://medium.com/@datadrivenscience/python-vs-r-for-data-science-and-the-winner-is-3ebb1a968197)
如果您对学习数据科学感兴趣,请查看“超学习”数据科学系列!
这是一个简短的指南,基于《超学习》一书,应用于数据科学
medium.com](https://medium.com/better-programming/how-to-ultralearn-data-science-part-1-92e143b7257b)
查看这些关于数据科学资源的文章。
[## 2020 年你应该订阅的 25 大数据科学 YouTube 频道
以下是你应该关注的学习编程、机器学习和人工智能、数学和数据的最佳 YouTubers
towardsdatascience.com](/top-20-youtube-channels-for-data-science-in-2020-2ef4fb0d3d5) [## 互联网上 20 大免费数据科学、ML 和 AI MOOCs
以下是关于数据科学、机器学习、深度学习和人工智能的最佳在线课程列表
towardsdatascience.com](/top-20-free-data-science-ml-and-ai-moocs-on-the-internet-4036bd0aac12) [## 了解数据科学的十大热门 GitHub 存储库。
以下是 GitHub 上一些关于数据科学的最佳资源。
towardsdatascience.com](/top-10-popular-github-repositories-to-learn-about-data-science-4acc7b99c44) [## 2020 年将加入的 20 大数据科学不和谐服务器
以下是 Discord 上用于数据科学的最佳服务器列表
towardsdatascience.com](/top-20-data-science-discord-servers-to-join-in-2020-567b45738e9d) [## 2020 年在 Twitter 上关注的顶级数据科学家
这里有一个你应该关注的杰出数据科学家的列表。
towardsdatascience.com](/33-data-scientists-to-follow-on-twitter-77f70c59339f)
联系人
如果你想了解我的最新文章,请通过媒体关注我。
也关注我的其他社交资料!
请关注我的下一篇文章,记得注意安全!*
如何学习数据科学的 R,快!
快速、免费地深入了解 R。

布拉登·科拉姆在 Unsplash 拍摄的照片
学习 R 会花很多时间。虽然一夜之间成为专家是不可能的,但是你可以做很多事情来加快学习过程。根据我自己的经验,我整理了一些建议来帮助你提高 R 语言能力。
我应该马上注意到每个人的经历是不同的。有些人用不同的方法学习 R,仍然取得成功。也就是说,我从下面的建议中获得了很多价值,我认识的许多其他人也是如此。
1.先学习编程的基础知识
作为一种由统计学家而不是程序员构建的语言,R 看起来与许多其他语言有点不同。也就是说,它仍然共享大多数编程语言的基本组件。像分配变量、评估条件和调用函数这样的操作都很常见。因此,最好至少了解一些基本知识:
- 常见的数据类型(字符串、整数、布尔值等)
- 条件(if/else)语句
- “For”和“while”循环
- 功能
当我开始学习 R 时,我发现了解这些东西大大加快了我的进度。很有可能你也会通过使用 R 来学习新的编程概念——我已经学过了。但是至少熟悉一些基础知识会为你以后节省很多时间。
2.从一个好的来源学习正确的框架
除非你作为一个学位级别的学生在 R 学习一门付费课程,否则你会希望用另一个指南来组织你的学习,比如一本书或一门课程。虽然投资这些资源是值得的,但你也可以免费找到好的指南。
这基本上就是我所做的——事实上,我从未为一个独立的 R 资源付费。
就书籍而言,Hadley Wickham 和 Garrett Grolemund 的【R for Data Science】是必不可少的参考。它是免费的,涵盖了 R 的所有关键方面,并且在介绍 tidyverse 的同时也介绍了它。tidyverse 是一个旨在使 R 更易访问和阅读的包的集合,并且正在迅速流行起来。这些包使我的代码变得更好,我强烈建议马上学习它们。
一旦你已经理解了数据科学的大部分 R,那么 【高级 R】也是深入研究 R 编程的一个很好的下一步。
如果你想用一门课程来补充你的阅读,在 YouTube 上可以快速搜索到一些免费的课程。或者,如果你不介意付费的话,大多数主要的课程网站都有 R 语言的教学系列。我再次推荐使用 tidyverse 软件包的视频或课程。坚持一个 R 框架(最简单的一个)可以消除同时学习不同方法带来的困惑。这也将有助于更快的学习。
3.将你的技能应用到有趣的项目中
一旦你有足够的知识来处理一些基本的任务或项目,就开始制作东西吧!
应用你的技能是学习编程语言最重要的部分。没有实践经验,你的新知识不会被理解。所以,享受其中的乐趣吧——选择一些能让你的生活更轻松的有趣的项目,并着手去做。
诀窍是始终如一地处理项目和应用问题。这让你习惯于项目管理,并鼓励你完成自我驱动的任务。它还会提示你填补知识中的空白,否则你可能不会注意到。我经常带着新技能开始项目。但是通常,新的需求会出现,我最终会学到一些我从未想过要学的东西。
我最近写了一些在我作为 R 用户的旅程中发现有用的项目。如果你正在寻找灵感,这些应该足以让你前进。
帮助您改进编码和分析的原创想法
towardsdatascience.com](/10-awesome-programming-projects-for-data-scientists-d2bf64f72ee4)
我再怎么强调基于项目的学习的重要性也不为过。课程证书可能证明你有普通的 R 知识,但是一个项目证明你能做出有意义的东西。
一个好的项目可以激发他人的情感反应和真正的灵感。它们允许设计中的创造性,甚至可以扩展到有利可图的应用或服务中。一直以来,他们都保持着你的兴趣,激励你去学习更多。
世界上没有一个课程证书能与之相比。
4.参与 R 社区
r 用户很幸运被一个紧密团结的社区所包围。无论你的熟练程度如何,充分利用这一事实向你周围的人学习是值得的。有几种方法可以做到这一点。
- 许多有影响力的研发人员出现在的 Twitter 上,关注他们很有用。我经常在无意中看到来自汤姆·莫克、朱莉娅·西尔格和其他许多人的推文,从而获得一些金玉良言。参与#TidyTuesday 也很有用。
- 中等也是学习的好地方。在我短暂的时间里,我已经从像基思·麦纽提这样的作家那里获得了很多价值。读者有时也会给热门文章留下一些提示和补充,作为评论,所以这些也值得留意。
- 如果你在一个方便的地方,你也许可以参加当地的 聚会和会议并向有经验的演讲者学习。这仍然在我的遗愿清单上,但我听说它们通常是值得的。
- 如果你和 R 用户一起工作,和他们聊天!作为一名学术研究人员,我的许多同事使用并教授 r。与他们讨论 r 给了我许多新的见解,并让我有动力学习更多。
当你有社区意识时,以任何你认为合适的方式与更高级的 R 用户互动是值得的。就我而言,与高级研究人员和学术人员的交谈有助于发展我的技能。虽然你不需要全面的指导来快速学习 R,但有时候它真的很有帮助。
最起码,不要完全孤立地学习 R。与其他人互动,分享你的学习经验,观察你的进步速度。
5.保持新鲜有趣
在任何一个学生的旅程中,总有一些地方会让人不堪重负。学习曲线在你面前上升,你很难找到向上爬的动力。如果你和我一样,你可能会被困难的新话题吓倒,或者时不时地失去兴趣。
保持你的练习愉快对减轻这些感觉是至关重要的。当然,有时候问题会让你沮丧,或者你的动力自然会很低。但是,如果你一直磨到停下来,做点什么只是为了好玩。
我经常发现写好的代码是非常令人满意的,即使它只是做一些简单的事情。同样,新项目不一定总是严肃和可扩展的——它们可以是轻松有趣的。你会惊讶于你能从娱乐性编码中学到什么,以及持续的实践如何能带来快节奏的进步。
最后的想法
希望记住以上几点能加速你掌握 R。虽然我给出的是学习 R 的小技巧,但我不会假装自己什么都懂。目前,我正在做一些事情来保持 r 的进步。
- 从事各种新颖的项目
- 寻找更有效的方法来完成我已经熟悉的分析和任务
- 在工作和业余时间使用新的包和方法
- 阅读高级概念来填补我在概念理解上的空白
- 通过个人互动和媒体文章分享我的进步
我还有很多东西要学,但是随着新的包和版本的不断发布,每个人都在学习。所以带着好奇心去寻求新的理解,享受学习的过程。
你会得到巨大进步的奖励。**
想阅读我所有关于编程、数据科学等方面的文章吗?在这个链接注册一个媒体会员,就可以完全访问我所有的作品和媒体上的所有其他故事。这也直接帮助了我,因为我从你的会员费中得到一小部分,而不需要你额外付费。
每当我通过订阅这里发帖,你也可以将我所有的新文章直接发送到你的收件箱。感谢阅读!
如何用 Kaggle 免费学习数据科学和机器学习的基础知识
与 Kaggle.com 一起学习数据科学和机器学习的初学者指南

图片由 Unsplash 上的 Alexandru Acea 拍摄
Kaggle 是一个由数据科学家和机器学习用户组成的在线社区。该网站侧重于共享和分析数据集;并提供带有现金奖励的数据分析和机器学习竞赛。然而,Kaggle 最被忽视的一个方面是为初学者提供的学习这门学科基础的特殊短期课程。Kaggle 课程是免费的,在教授核心基础知识和不向用户灌输可以及时获取的先进概念和信息之间取得了良好的平衡。在这篇短文中,我想向你展示如何通过 Kaggle 课程免费开始学习数据科学和机器学习。
签约雇用
首先,你需要注册使用该网站。Kaggle 归谷歌所有,因此如果你已经使用了 YouTube 或 Gmail 等谷歌服务,那么你可以使用该帐户注册一个 Kaggle 帐户。如果你没有谷歌服务帐户,你可以使用任何你喜欢的电子邮件帐户注册。

作者 Rugare Maruzani 截图
课程
注册并登录 Kaggle 后,导航至网页左侧的课程部分。作为初学者,您会希望从 Python 课程开始。我已经完成了那门课程,所以你不会在下图中看到它。Python 是机器学习和数据科学的首选语言,尤其是对于初学者。我认为你可以在没有编程经验的情况下直接进入这个课程,但是 Kaggle 建议你在开始这个课程之前熟悉一些绝对的基础知识。当每节课结束时,请点击每节课末尾“轮到你”部分的链接,练习刚刚学到的内容,这一点很重要。

作者 Rugare Maruzani 截图
完成 Python 课程后,我会推荐参加熊猫课程。Pandas 是关键的 Python 库之一,本课程将教你如何使用 Pandas,并向你介绍 Python 中的库是如何工作的。接下来,我会做数据可视化模块,然后介绍机器学习和中间机器学习
研究别人的笔记本
Kaggle 的一大优点是社区可以通过笔记本分享他们的数据科学和机器学习工作。作为一个完全的初学者,这些笔记本可能会令人生畏,难以理解,然而,你读得越多,你就会理解得越多,你会注意到更多的模式。我建议在你感兴趣的领域寻找笔记本并研究它们。你会发现笔记本电脑分析健康,体育,人口和疾病的数据以及许多其他主题。您还可以将笔记本复制到您自己的配置文件中,允许您修改和破坏代码,这是一种非常棒的学习技巧。

通过点击“笔记本”选项卡(蓝色箭头)来搜索笔记本,并且可以通过点击“复制和编辑”按钮(红色箭头)来复制笔记本和修补。作者 Rugare Maruzani 截图
结论
在参加了一些 Kaggle 课程后,我想你会对数据科学是否是你真正感兴趣并想进一步追求的领域有一个很好的想法。如果是这样,你会注意到其他课程来发展你作为数据科学家和机器学习实践者的技能。完成一门课程后别忘了收藏你获得的证书,分享到 LinkedIn 上!
如何利用卫星收集的遥感数据在 Grasshopper 中轻松建立一个站点模型
建筑学和数据科学
帖子 4:使用 QGIS 和 Grasshopper 插件——Heron 和 Elk
了解场地和地形是任何建筑项目的关键第一步。网站建模可能会变得非常令人生畏,昂贵,或者只是繁琐,经常不得不使用各种软件,只是掌握一个网站的一般意识。我发现最有效的方法是使用 QGIS 和 Rhino Grasshopper 来覆盖我的大部分分析,如等高线映射、风流、太阳辐射、太阳路径和阴影、自然地形等等。我还想在一个软件中参数化地控制这些不同的分析。感谢 Grasshopper 的精彩社区,他们创建了插件来支持它。

数字高程模型的层次离散化。数据来源:美国地质勘探局地球探测器,图片阿迪蒂亚·维诺德-布钦格
第二步是收集地形数据。卫星使数据收集变得非常简单,因为数据是免费提供的。建筑项目不仅仅是在其场地边界内定义的。语境很重要。也许它坐落在山谷或山上,靠近一条容易被洪水淹没的河流,或者在一个邻近的建筑阻挡阳光的城市里。就地形而言,您通常需要更大的区域来执行适当的分析并了解周围的环境。

遥感过程。阿迪亚·维诺德-布钦格。来自 Flaticon 的图标归于 Icongeek26 、 Freepik 、桉树、 Xnimrodx 、苏朗
对于这个更大的区域,我会使用卫星收集的数据。遥感越来越准确地接近真实情况。因此,来自卫星扫描的数据可以成为地球上几乎任何地方的非常可靠的数据源。
工作
使用公开可用的数据集对网站建模
目标
我的目标是在 20 米和 25 米的网格上以点的形式获得标高。我想利用这一点在总体规划中战略性地定位建筑,这样每个部门/建筑之间至少相距 20 米或 25 米。我还想控制建筑物的高度,同时保持每个建筑物的视野。因此,在稍后的阶段,我将使用进化求解器设置多目标优化,将建筑的高度、标高和视图作为约束条件。
计划

Aditya Vinod-Buchinger 场地建模路线图
1.收集高程数据作为 DEM(数字高程模型)
使用 Elk、OpenStreetMap 和 QGIS
步骤 1:下载从遥感(卫星扫描)获得的信息,这些信息可以从美国地质调查局免费获得,作为该地区的陆地卫星图像。卫星扫描正变得越来越准确,取决于网站的位置,并可能持有有价值的信息。它们可以很好地显示周围的地形,并可以在稍后阶段与通过勘测获得的更准确的数据相关联。
USGS 地球资源管理器 >选择地区>下载 DEM
或者,您可能会拥有一个 DEM(。tiff)测量员的测量图。
第二步:使用 Elk 插件、& OpenStreetMap 数据,在 Grasshopper 中采集道路网络、建筑层、水体等 GIS 图层。

创建道路网的定义 Aditya Vinod-Buchinger
我还在 grasshopper 中找到了使用 Heron 插件的替代方法。Heron 是一个很棒的插件,它可以直接将 GIS 数据导入 Grasshopper,而无需通过方法 1。网上有很多这方面的教程。这些定义也可在示例中的Heron @ food 4 Rino上找到。
我选择了麋鹿。
2.从 DEM 中处理和提取高程值
数字高程有多种与 GIS 兼容的格式,例如。为了提取高程,我在中下载了 DEM 栅格。tiff 格式。使用开源地理信息软件 QGIS GRASS 3.2(特别是 GRASS 的最新版本只能执行重采样步骤),对图像进行处理、重采样并转换为保存 Z 值的点。
带 GRASS 的 QGIS >处理工具箱>重采样为 25 米格网>计算 Z 值>将图层另存为点
下一步是将它导入 Grasshopper。
3.蚱蜢的分析
此阶段的输入是从 QGIS 获得的具有 x、y 和 z 值的点云。输出将是基于高程的参数控制的离散组。
作为一个规则,总是参数化你不一定确定的项目,或者希望保持一定的灵活性。
例如,面积为 10 平方米但长度和宽度不确定的房间的大小。然后,您将使长度和宽度成为滑块控制的区域的函数。
我希望能够根据高程控制点的分组,以便参数化地离散高程。参数化级别可以控制选择点的标准。

作为点和曲线添加到参数的输入 Aditya Vinod-Buchinger

如何利用卫星收集的遥感数据,在 Grasshopper 中轻松地建立一个站点模型

设置 z 值范围的开始和结束参数 Aditya Vinod-Buchinger
4.输出
有了这个我有了;
- 将级别组织为可控参数特征。
- 参数化的分组级别,以 5 米为增量
- 根据我的项目纲要的要求,确定了整个场地的低海拔和高海拔区域,以规划放牧和农田
- 设置运行进化求解器的阶段,以便在稍后阶段生成选项
下一步
包 2:集中和分区
你好,谢谢你看我的帖子!随时拍摄任何问题,你可能有评论。此外,如果您需要任何帮助,请通过 LinkedIn 与我联系。
我是一名来自伦敦的建筑师(COA)和技术爱好者。我对构建环境感兴趣,并广泛围绕设计、性能和见解利用数据科学进行架构。我不时从事各种主题的工作,如生成设计、空间分析、能源和环境研究。我是一家生物技术创新公司的项目经理(AEC ),在北非开发一个大规模的可持续项目。
如何在数据科学项目中利用 Visual Studio 代码
直到发现一种新的有效方法,我们才意识到我们是多么低效

从维基百科检索的图片
动机
在从事数据科学项目时,您可能需要在 Github 或 Terminal 等不同工具之间来回切换。额外的几秒钟可以积累成大量的时间浪费。想象一下把所有东西都放在一个地方是多么的快捷和方便。如果你掌握了键盘快捷键,你的工作流程会更快。
切换到 Visual Studio 代码使我能够通过减少耗时的活动来加快工作流程。Visual Studio Code是微软为 Windows、Linux、macOS 制作的免费源代码编辑器。我喜欢 VS 代码的两大优点是键盘快捷键和有用的扩展,比如嵌入式 git。
VS 代码可以为您现有的工作流添加很多东西。在这篇文章中,我将回顾几个我最喜欢的帮助我平衡工作流程的方法。
快捷键
当我们有鼠标时,为什么要使用键盘快捷键?因为知道如何使用键盘快捷键可以节省你大量的时间。
但是你可能对学习键盘快捷键犹豫不决,因为它需要你去记忆。这是对我有效的策略:在便笺条上写下几个键盘快捷键。然后把它们贴在你周围的工作区。每次不记得键盘快捷键的时候就看看便利贴。渐渐地,键盘快捷键会像便利贴粘在你的桌子上一样粘在你的脑海里。

由 Kelly Sikkema 在 Unsplash 上拍摄的照片
知道了这一招,你应该不会害怕学习任何有用的键盘快捷键。让我们探索一些可以添加到工具箱中的快捷方式。
一次改变所有相似的单词
你是否曾经想改变一个变量名,但是发现修改每个变量名很费时间?要一次修复所有相似的单词,只需点击单词并使用Ctrl+Shift+l。****

将光标移动到行尾和行首
假设您忘记在几行的开头或结尾添加一个单词或字符。您可以手动进入每一行来修复您的错误,但是这很耗时。这是你需要键盘快捷键的时候。你需要做的就是选择你想要改变的行,然后使用 Alt + Shift + I 转到行尾。使用向左箭头转到该行的开头。

或者按住 Alt 的同时上下移动鼠标线条也应该可以。

代码折叠
您的代码变得非常大,您希望通过隐藏您没有处理的代码来保持专注?这很容易做到,移动到该行,然后使用 Ctrl + Shift + [ 。要展开,使用 Ctrl + Shift + ]

开放终端
如果我们想打开一个终端来快速运行你的代码呢?没问题。Ctrl + ` 应该能行。

分画面银幕
希望能够同时查看两个文件进行比较?这时候我们就可以使用 Ctrl + \。

前往该功能
假设你想知道一个函数的定义或者回顾这个函数。您可以通过按住 Alt 键并单击该函数来快速找到该函数,而不是搜索几个文件夹和许多行代码来找到一个函数。

版本控制
我真正喜欢 VS 代码的另一个优点是嵌入式 Git** 。Git 是控制项目版本的有效工具。如果能在文本编辑器中嵌入 Git 就更好了。如果我们碰巧在我的代码中犯了任何错误,我们可能希望与上一个版本进行比较并轻松地修复。**
要启用 git 版本控制,请添加扩展 GitLens。你可以在左边找到扩展栏,然后搜索 GitLens。然后单击安装。

用以前的版本检查行更改
只需点击右键,然后选择用先前版本打开行变更。我们应该能够检查更改!

查看上次提交的更改
如果您想将当前提交的某些文件与上一次提交的文件进行比较,该怎么办?你所需要做的就是打开你想要比较的文件。单击左侧导航栏中的 GitLens 图标,然后选择要比较的提交。

会出现一个分屏,颜色显示两个文件之间的不同,就像这样。

查看日期和作者
假设你正在和其他人合作一个项目,你想知道谁在什么时候做了什么改变。单击您关心的代码行,就可以很容易地看到这一点

如您所见,当我点击每一行时,都会显示作者、日期以及提交消息。
结论
我希望这篇文章很好地概述了 VSCode 如何在处理数据科学项目时帮助加速您的工作流。刚开始习惯一个新工具可能会感觉不舒服,但是找到改进我重复活动的方法可以在将来增加你的时间。
每花一分钟,就赚了一小时——本杰明·富兰克林
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 T2 Twitter 上与我联系。
星这个回购如果你想检查我写的所有文章的代码。在 Medium 上关注我,了解我的最新数据科学文章,例如:
被新信息淹没?现在,您可以轻松地跟踪文章并为其创建自定义注释
towardsdatascience.com](/how-to-organize-your-data-science-articles-with-github-b5b9427dad37) [## 如何创建可重用的命令行
你能把你的多个有用的命令行打包成一个文件以便快速执行吗?
towardsdatascience.com](/how-to-create-reusable-command-line-f9a2bb356bc9) [## 使用这两个工具在您的机器学习项目中实现可重复性
你能打包你的机器学习模型,并根据你的需要挑选一个最好的吗?
towardsdatascience.com](/achieve-reproducibility-in-machine-learning-with-these-two-tools-7bb20609cbb8) [## 如何有效地微调你的机器学习模型
发现为您的 ML 模型寻找最佳参数非常耗时?用这三招
towardsdatascience.com](/how-to-fine-tune-your-machine-learning-models-with-ease-8ca62d1217b1) [## 如何通过将自己置于合适的环境中来加速您的数据科学职业生涯
我感到增长数据科学技能停滞不前,直到我有了一个飞跃
towardsdatascience.com](/how-to-accelerate-your-data-science-career-by-putting-yourself-in-the-right-environment-8316f42a476c) [## cy thon——Python 函数的加速工具
当调整你的算法得到小的改进时,你可能想用 Cython 获得额外的速度,一个…
towardsdatascience.com](/cython-a-speed-up-tool-for-your-python-function-9bab64364bfd)**
如何限制人为的愚蠢

Carlos Alfonso 在 Unsplash 上拍摄的照片
人类学习图书馆概述
什么是人为的愚蠢?
人工愚蠢是一个新术语,被用作人工智能的反义词。然而,它有两个相反的含义:
- 机器学习算法在从数据中学习时会犯愚蠢的错误。
- 人工智能被变得愚蠢,会犯错,看起来更像人类。
写第二种意义可能很吸引人,也很值得鼓掌,但我想向你介绍人工愚蠢的第一种意义,以及文森特·d·瓦姆的迷人的人类学习图书馆。
人为愚蠢的一个有趣例子:
这几年有很多人工傻第一个意思的例子。其中最有趣的一个是由 Ciaran Maguire 发现并在 Twitter 上介绍的。一家保险公司的算法根据人们出生的日期计算不同的费用。正如你在下面的推文中看到的,当出生日期改变了一天,价格变化很大。算法是怎么得出这个计算结果的?测试算法准确性的程序员呢?他们怎么会错过这样一个离奇的结果?
我的假设是,数据集中有严重的异常值,这极大地影响了模型的权重。尽管如此,这个错误可能还有其他原因。
人工智能中的人情味
当我在制作机器学习模型时,我总是想知道有效的数据清洗、预处理、探索性数据分析和特征工程如何将最简单的模型转化为强大的预测器。选择合适的模型是至关重要的,但为模型提供正确的数据是必不可少的。因此,即使建立了最好的卷积神经网络,“垃圾进,垃圾出”的原则仍然有效。
如果人类的触摸可以使一个相当简单的模型高度精确,为什么人类不在训练过程中做出贡献?为什么人类智能不在建模中助推人工智能?人可以在培训前和培训中帮助计算机吗?如果我们可以在建模的时候画出特征、分类器、离群值呢?
人类学习图书馆
2020 年 10 月 8 日,Vincent D. Warmerdam 编写并介绍了人类学习库,这使得创建基于规则的系统更加容易。该库有两个数据集:泰坦尼克号(是的,再来一次!)和企鹅。
通过绘画学习和组合:
主要思想是更熟悉数据(扩展 EDA),通过手工绘制为模型做贡献。
可以将多个绘图及其权重放在一起,以制作一个人工和计算机聚合(组合)的模型。当人类为模型的学习做出贡献时,她/他可以对模型有更多的了解,并防止机器犯愚蠢的错误。
制作基线模型:
至少你可以用这个系统做一个基线模型,来检验你的“比最深更深”的神经网络是否比这个最简单的模型表现得更好。
创建更多可解释的模型:
两个两个地使用特征图的权重可以增加模型的可解释性。您可以显示工程图中特征之间的关系。
无预测区域:
这是我最喜欢的想法!
我们不必对每个点都做预测。如果聚类不够清晰,我们应该能够说:“在这个区域没有预测。”这样就可以约束人为的愚蠢。
结论:
我发现这个库很有趣,想在这篇文章里分享一下。你可以像我一样使用 GitHub 回购。
最后一句:
虽然计算机在学习重复性任务方面似乎更聪明,但人类的创造力和解决问题的能力使它们更胜一筹。
进一步阅读
- 我的媒介文章关于可解释的人工智能(XAI)
- 一篇关于三种人为愚蠢的文章。这篇文章中有一种巧妙的人为愚蠢,值得一读。
- 一篇关于人类和计算机的智能和愚蠢的惊人的福布斯文章。
- 亚马逊、微软和苹果最著名的人工智能失败。
- 维基百科链接基于规则的系统与基于算法的系统
感谢阅读。
如果你想取得联系,你可以给我发电子邮件到 eymatas@gmail.com 的 s ,或者你可以在 https://www.linkedin.com/in/seyma-tas/的找到我
如何找到用于安全研究的黑暗网络黑客论坛
黑暗网络安全研究的滚雪球抽样

资料来源:Pexels
警告:访问黑暗网络可能是危险的!请自担风险继续,并采取必要的安全预防措施,如禁用脚本和使用 VPN 服务。
介绍
对大多数用户来说,谷歌是探索互联网的门户。但是,deep web 包含不能被 Google 索引的页面。在这个空间中,隐藏着黑暗网络——匿名网站,通常被称为隐藏服务,从事从毒品到黑客到人口贩运的犯罪活动。
在黑暗网络上进行安全研究可能很困难。黑暗网络上的网站 URL 不遵循惯例,通常是由字母和数字组成的随机字符串,后跟。洋葱子域。这些网站需要 TOR 浏览器解析,无法通过 Chrome 或 Safari 等传统浏览器访问。
此外,传统的搜索引擎如谷歌并不存在于暗网上。取而代之的是,网站 URL 要么被人对人(在线或面对面)交换,要么被收集到一个简单的 Html 目录中。这使得在黑暗网络上很难找到黑客论坛——特别是严肃的个人聚集的论坛。
一些论坛可以在上面列出的黑暗网络目录中找到。这些都可以在暗网甚至表面网上找到(我们都知道的网,这篇文章也是在上面托管的)。但是,因为这些论坛很容易找到,所以它们经常吸引社区中的业余爱好者。为了定位更多安全研究的相关论坛,可以使用滚雪球抽样法对暗网进行爬取。
滚雪球抽样
滚雪球抽样是一种方法,可用于定位暗网上的隐藏服务,用于安全研究,包括数据收集和 CTI 流。雪球抽样是一个网络爬虫架构,它获取一个根 URL 并抓取该网站到其他网站的输出链接。然后,对于每个收集的链接,在设定的深度内继续该过程。这个爬虫将返回一个它收集到的黑暗网站的 URL 的大列表。
这种方法非常类似于早期搜索引擎网络爬虫的工作方式。谷歌的创始人谢尔盖·布林和劳伦斯·佩奇在 1998 年的论文“大规模超文本网络搜索引擎的剖析”中可以找到一个重要的例子。
当应用于黑暗网络的论坛时,滚雪球抽样效果很好。用户通常会在论坛帖子和评论中链接到其他论坛,这是前面提到的人与人之间交换 URL 的一个例子。通过从一个在目录上找到的黑客论坛(或者你已经知道的一个)开始,可以快速找到更严肃的和安全相关的论坛。
环境设置
为了开发黑暗网络爬虫,你需要设置你的环境。阅读我写的关于如何刮掉黑暗之网的文章可能会有助于更好地理解这个过程。这也将有助于从你所发现的黑暗网络论坛中搜集数据。本文假设您使用的是 OSX 操作系统。但是,如果你使用的是 Linex 或者 Windows,很多方面应该还是适用的。
TOR 浏览器
TOR 浏览器是一种使用 TOR 网络的浏览器,允许我们使用. onion 子域解析网站。TOR 浏览器可以在这里下载。
虚拟专用网络
在爬行黑暗网络时运行 VPN 可以为您提供额外的安全性。虚拟专用网络(VPN)不是必需的,但强烈建议使用。
计算机编程语言
对于本文,我假设您已经在自己的机器上安装了 python,并使用了自己选择的 IDE。如果没有,网上可以找到很多教程。
熊猫
Pandas 是一个数据操作 Python 包。Pandas 将用于存储和导出刮到 csv 文件的数据。通过在终端中键入以下命令,可以使用 pip 安装 Pandas:
pip install pandas
硒
Selenium 是一个浏览器自动化 Python 包。Selenium 将用于抓取网站和提取数据。Selenium 可以通过在终端中键入以下命令来使用 pip 进行安装:
pip install selenium
壁虎
为了让 selenium 自动化浏览器,它需要一个驱动程序。因为 TOR 浏览器在 Firefox 上运行,我们将使用 Mozilla 的 Geckodriver。你可以在这里下载驱动。下载后,解压驱动程序,并将其移动到您的~/中。本地/bin 文件夹。
Firefox 二进制文件
TOR 浏览器的 Firefox 二进制文件的位置也是需要的。要找到它,右键单击应用程序文件夹中的 TOR 浏览器,然后单击显示内容。然后导航到 Firefox 二进制文件并复制完整路径。将此路径保存在某个地方以备后用。
履行
这个实现将让你开始创建一个深度为 1 的雪球抽样黑暗网络爬虫。因为论坛的网站结构互不相同,所以很难在深度 1 之外实现爬虫的自动化。
首先,从 selenium 导入 web 驱动程序和 FirefoxBinary。也进口熊猫作为 pd 和 re。
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
import pandas as pd
import re
创建一个变量“binary ”,并将其设置为您之前保存的 Firefox 二进制文件的路径。
binary = FirefoxBinary(*path to your firefox binary*)
设置 web 驱动程序使用 Firefox 并传递二进制变量。
driver = webdriver.Firefox(firefox_binary = binary)
创建一个变量“starting_node”并将其设置为起始论坛的 URL。
starting_node = *your url*
创建空列表“found_nodes”。
found_nodes = []
您现在需要自动抓取论坛帖子、评论或两者的文本。这一过程因论坛而异。我推荐阅读我的文章“如何清理黑暗网络”来获得一些指导,Selenium 文档可以在这里找到。
编译一个正则表达式,用于识别字符串中的洋葱链接。
p = re.compile('\S+onion')
对于每个字符串(帖子文本或评论文本),搜索 onion URLs 并将它们添加到列表“found_nodes”中。
for post in posts:
nodes = p.findall(post)
found_nodes.append(nodes)
列表“found_nodes”将包含从起始节点找到的洋葱链接。然后,可以对每个找到的链接重复该算法,或者在深度 1 处停止。
讨论
滚雪球抽样是发现黑暗网络黑客论坛和其他隐藏服务的好方法。此外,通过这种方法找到的服务通常比在目录中找到的服务更有助于安全研究,因为黑客社区的重要成员通常不会聚集在广告宣传良好的站点上。
然而,在这个实现中有一些需要改进的地方。按照这种滚雪球抽样的实现,需要手动访问每个找到的节点并检查其内容。这不仅是一个耗时的过程,而且访问未知的洋葱链接也很危险。通过帖子上下文自动确定网站内容将极大地改善这个爬虫。
我想重申,刮暗网可能是危险的。确保你采取了必要的安全措施。请继续研究黑暗网络上的安全浏览。我对发生的任何伤害不负任何责任。
如何看起来像一个 10 倍的开发者

图多尔·巴休在 Unsplash 上的照片
装饰你的 Mac 终端,在你周围的开发者海洋中显得很酷
我喜欢使用 shell 命令。它们速度很快,并且提供了大量的灵活性来做特别的事情。但是我最喜欢它们的一点——哦,它们看起来太酷了。
或者说我是这样认为的,直到有一天我周围的每个人都在使用 shell 命令。我讨厌这样的发展。凉爽消失了,用黑屏工作变得一天比一天无聊。我必须满足自己与生俱来的出类拔萃的需求。在发布下一个代码时,我需要这个灵感来源。
这不是我工作的咖啡馆?唉,我周围的人开始知道我在做的都是些非常普通的东西。
所以,我再次问自己——我如何在工作时看起来很酷?这个问题困扰着每一个开发者,自从开发者的存在以来。就像我是开发人员一样,我想到了同样的老答案— 定制。
我向自己承诺,我将拥有最好的终端,我将根据它定制 s * * t。然后人们会知道我有多酷,我会成为所有值得谈论的话题的焦点。但是,唉——有一样东西是定制的,它不是终端自带的,而我就像周围的每个开发者一样懒惰。我需要一些快速从下面最时髦的终端移动。

但是,就像所有与 shell 相关的事情一样——有些事情很难做不是一个 bug,而是一个特性。几十年来,正是 shell 的这一特性让我们开发人员看起来很酷,所以我需要尊重这一点。这使得开发人员更容易达到最高目标——看起来很酷。在开发者看来,没有任何额外的东西意味着你可以用你自己的方式定制你需要的东西。
所以,在这篇文章的最后,这是一个关于我如何让我的终端看起来很棒的演练,我会让终端看起来像下面这样,它显示了 git 的状态,并且有一个非常棒的主题。

怎么会?
我想这篇帖子不会像我的每一篇帖子一样广为流传,所以我想我可以告诉你看起来很酷而对我自己的酷没有任何伤害的伟大秘密。露齿一笑,低声耳语。这其实很简单。我只是运行了一些命令。
但是,让我们先退一步,然后再去理解发生了什么。您的 Mac 附带有自己版本的终端应用程序。我不会用那个。虽然这个应用很棒,但我已经习惯了使用 iTerm2,因为它提供了所有的定制选项和主题。
要安装这个主题并拥有 iTerm2 终端,首先需要在 MAC 上安装 iTerm2。您可以在 iTerm2 下载页面上的处完成此操作。一旦您安装了 iTerm2,我们将通过一系列步骤让 terminal 再次变得强大。
您需要在我们新的 iTerm2 终端中完成所有这些步骤。我首先创建一个目录来完成我们所有的工作,并在命令行上安装oh-my-zsh。什么是oh-my-zsh?你可以认为zsh shell 类似于bash shell,oh-my-zsh是一个维护你的.zshrc文件的框架,它非常类似于.bashrc文件。
mkdir iterm_theming
cd iterm_theming
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
这将为您安装 oh-my-zsh 及其默认主题,重启后您的终端应该如下所示:

这似乎是一个进步,但并没有太大的进步。现在换个主题吧。谈到主题,我们有多种选择。你可以在 oh-my-zsh 的主题页面获得一个完整的选项列表。
我将使用 powerlevel10k 主题,因为它本身提供了许多配置选项,但是你基本上可以使用任何主题。首先,我们需要运行:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
然后用任意编辑器编辑~/.zshrc文件中的ZSH_THEME=”powerlevel10k/powerlevel10k"。我用了纳米。
一旦您重新启动 iTerm2 会话,您将会看到:

作者图片:Powershell 配置屏幕 1
一旦你按下y,你会看到下面的窗口,要求你重启 iTerm2

作者图片:Powershell 配置屏幕 2
一旦你再次重启 iTerm2,你将会看到一个向导,在这里你可以选择你的偏好来配置你的提示符的颜色和样式。

来源:Github 上的 Powerlevel10k 回购
我多次经历这个步骤,以得到我想要的正确风格。如果您不喜欢您设置的样式,您可以使用p10k configure命令重新启动小部件。
最后一眼
这是我最终得到的造型。这是我在博客上工作时的工作流程。

作者图像:使用终端
正如你所注意到的,它通过使用颜色和符号以一种相当直观的方式向我们展示了提示符本身的大量信息。
例如,提示中的黄色表明 git repo 与主数据库不同步。数字!5显示了已更改但尚未提交的文件数量。数字?3显示了我们应该使用git add命令添加的未跟踪文件的数量。而这一切都不需要使用git status命令。只要看到绿色提示符中的⇡1,就可以看到我们的分支比主分支领先 1 个提交。在右侧,我们可以看到花费了一些时间的命令的执行时间。你可以在主题页面上找到所有符号的描述。
我还在提示中保留了完整的路径,以便在需要时可以获取。尽管有一个小问题。你可以看到路径被缩短到下面的~/w/mlwhiz而不是~/web/mlwhiz。这不再是一个 bug,而是一个节省空间的特性。诀窍是在提示符下复制粘贴并按 tab 键。你将再次获得完整的路径。

作者图像:使用 2 号航站楼
添加更多功能
这还不是全部。除了得到一个漂亮且功能强大的终端,你还可以通过 oh-my-zsh 得到许多插件。上面我们刚刚使用了git插件。但是你可以从一长串插件列表中为自己选择一个,你只需要通过将插件名称添加到.zshrc文件中的plugins列表来安装它。
例如,您可以通过将plugins=(git)改为plugins=(git vscode tmux)并重启终端,在您的终端中添加插件 vscode (提供大量 vscode 别名)和 tmux (提供大量 tmux 别名)。
你还在等什么?让您的终端再次变得伟大。
继续学习
如果您想更好地使用 shell,也请阅读我以前的一些关于使用 shell 命令的文章。
数据科学家的 10 分钟外壳/终端技能
towardsdatascience.com](/impress-onlookers-with-your-newly-acquired-shell-skills-a02effb420c2)
如果你想了解更多关于命令行的知识,我想你会的,Coursera 上有UNIX work bench课程,你可以试试。
谢谢你的阅读。将来我也会写更多初学者友好的帖子。关注我在或者订阅我的 博客 了解他们。
此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。
如何在 Python 中遍历自己的对象
Iterables,迭代和迭代您的自定义 Python 对象

图片由Tine ivani通过 Unsplash 提供
目标
本教程旨在帮助你理解什么是迭代和迭代器,以及它们之间的关系。其次,理解 Python for 循环是如何工作的,最终将有助于设计一个可以迭代的用户定义的自定义对象。
可重复的
iterable 是一个能够逐个返回其成员的对象。简单地说,iterable 是可以使用 Python 中的 for 循环进行循环的任何东西。序列是一种非常常见的可迭代类型。内置序列类型的示例包括列表、字符串和元组。
迭代器
迭代器是表示数据流的对象。您可以通过实现 iterable 的 iter 内置函数来创建迭代器对象。
迭代器可用于手动循环遍历 iterable 中的项目。迭代器反复传递给内置的 next 函数,返回流中的连续项。当 iterator 中的条目被使用时,它就消失了,最终,当没有更多的数据可供检索时,就会引发一个 StopIteration 异常。
了解 Python for 循环
发展关于可迭代和迭代器的知识的核心是理解 Python for 循环是如何工作的。为了更好地说明这一点,让我们定义一个可以接受任何 iterable 的函数,并在不使用 for 循环的情况下遍历。
我们的功能需要能够实现以下目标:
从 iterable 创建迭代器
从迭代器中重复检索下一项
执行任何预期的操作
当没有更多要检索的项时,引发 StopIteration 异常。
在 Python for 循环中,iterable 被转换成迭代器。
我们的自定义函数首先将任何 iterable 转换为迭代器。在 while 循环中,我们从迭代器中获取下一项,并对该项执行任何操作。在这种情况下,我选择编写一个函数来将迭代器中的数字提升 2 的幂,但是可以采取任何操作,例如,我们甚至可以选择简单地打印出容器或集合中的数字。
Python 中所有形式的迭代都是以这种方式工作的。
关键定义
为了更好地区分 iterable 和 iterator,进一步细化它们的定义并注意它们的区别会很有帮助。迭代器不能被索引/切片(因为它们可以无限长)。此外,与可重复项不同,它们没有长度。在下面的例子中,试图获取迭代器对象的长度,my_iter_list 引发了一个类型错误异常。
iterable 是可以循环的东西。
>迭代器是代表数据流的对象。它对一个 iterable 进行迭代。
在为本文进行研究时,迭代器的一个简洁明了的定义来自于 StackOverflow ,如下所示:
iterator是一个更一般的概念:任何对象的类都有一个next方法(Python 3 中的__next__)和一个__iter__方法(T4)
迭代器允许用户使用和创建惰性迭代器。懒惰的迭代程序不做任何工作,直到我们向它们请求下一个项目。这个特性可以帮助我们处理内存中容纳不下的无限长的可重复项。这被称为惰性评估,可以帮助节省内存和 CPU 时间。
迭代器协议
如上所述,迭代器对象需要支持以下两种方法,这两种方法组合在一起构成了 Python 迭代器协议:
邓德/魔术 iter 法:
- 迭代器。iter()
返回迭代器对象本身。这是允许容器(也称为集合)和迭代器与for和in语句一起使用所必需的。
邓德/魔种下法:
- 迭代器。next()
从容器中返回下一个项目。如果没有更多的项,则引发 StopIteration 异常。
创建自己的可迭代类型
我们可能想要创建一个自定义迭代器。为此,我们需要一个定义了 init 、 next 和 iter 方法的类。
自定义团队
首先,让我们定义一个名为 CustomIterTeams 的自定义类。这个类没有内置的 iterable 行为,但是我们可以在类中实现代码,使我们的自定义用户定义对象的行为像 iterable 一样。
有两种方法可以让自定义的用户定义对象表现得像 iterable。第一种方法涉及定义两个 dunder 或 magic 方法,即 iter()和 next()。dunder iter 方法只需要返回对象本身。这是因为,当我们编写 for 循环时,这将是我们打算迭代的对象。这个 iter 方法返回一个迭代器。
在幕后,Python 的 for 循环使用迭代器。
我们的自定义对象现在是一个迭代器,可以使用 dunder next 方法返回流中的连续项。这两种方法共同支持迭代器协议。
在 _ _ init _ _ 构造函数中,我们将对象中的索引设置为值-1。当调用下一个方法时,例如在 for 循环的第一次迭代中,索引的值增加 1。然后,我们检查索引值是否大于用户在第一次创建对象时决定添加的球队列表的长度。如果索引小于团队的长度,我们只需从团队列表中返回具有范围内索引的团队。
一旦索引等于或大于团队列表的长度,我们再次将索引重置回-1(正如它最初在 init 构造函数中设置的那样),并引发一个 StopIteration 异常。
用户现在能够迭代创建的团队。CustomIterTeams 对象 prem_teams 现在是一个迭代器,我们可以遍历它。

一旦索引达到列表的长度,在引发 StopIteration 异常之前,会特意将索引重置为其原始值。实现此功能是为了让用户在同一个会话中执行对象的多次迭代,如下面的 python 提示所示。

我们现在还可以通过简单地实现 dunder reserved 方法来颠倒团队的顺序。

定义自定义可迭代类型的简单方法
没有必要为了使用户定义的对象可迭代而定义一个 dunder next 方法。相反,我们只需要让 dunder iter 方法返回一个生成器,这个生成器在我们的团队中循环。每个生成器都是一个迭代器。生成器有一个内置的 next 方法,因此不需要在自定义 python 类中实现 next 方法。

这段代码片段的 github 要点可以在这里找到,如下所示:
总结:
通过包含 iter 和 next 方法,或者简单地在 iter 方法中返回一个生成器,可以在自定义的类中实现迭代。这取决于程序员,但是 iter 和 next 方法的实现稍微长一点,可以添加更精细定义的行为。
如何用 Python 制作冠状病毒世界地图
由 Pyecharts 库支持
新冠肺炎正在全世界传播。可视化数据的最佳方式之一是将数据映射到世界地图。幸运的是,很容易制作一个像下面这样的交互式地图。

这是一个动态图表,每当鼠标悬停在地图上时,数字就会显示出来。要创建这个图表,您只需要几行 Python 代码。
在编写这几行代码之前,您需要安装名为 Pyechart 的可视化包。这是一个 Python echarts 绘图库。它提供了 30 多种图表。最新版本是 1.7.1,发布于 2020 年 3 月 12 日。你可以 pip 安装它。
pip install pyecharts==1.7.1
软件包安装完成后,我们就可以开始构建地图了。
第一步:导入库
#import libraries
from pyecharts.charts import Map,Geo
from pyecharts import options as opts
from pyecharts.globals import ThemeType
第二步:导入数据
新冠肺炎的数据可以从我们的数据世界网站下载。
该网站提供 CSV、CLSX 和 JSON 格式的完整新冠肺炎数据集。
#import data
dataset=pd.read_csv(‘owid-covid-data.csv’)
我只会得到 2020 年 7 月 3 日的数据,然后将数据映射到世界地图上。
#change date from object data type to datetime data type
dataset[‘date’]=pd.to_datetime(dataset[‘date’])
df = dataset.sort_values(by=['date'], ascending=False) #sort data by date
map_df=df[df['date']=='2020-07-03']
map_df.reset_index(drop=True, inplace=True)
map_df

第三步:创建数据可视化所需的两个数据序列
country=list(map_df[‘location’])totalcases=list(map_df[‘total_cases’])
第四步:生成地图
有了 7 行,就会得到冠状病毒世界地图。
list1 = [[country[i],totalcases[i]] for i in range(len(country))] #prepare data for visualization
map_1 = Map(init_opts=opts.InitOpts(width=”1000px”, height=”460px”)) #create the map and set the size of the map
map_1.add(“Total Confirmed Cases”, list1, maptype=’world’) #add world map
map_1.set_global_opts( #set global configurations
visualmap_opts=opts.VisualMapOpts(max_=1100000, is_piecewise=False),
legend_opts=opts.LegendOpts(is_show=False), #show legend or not
)
map_1.render_notebook() #show the map in the notebook directly

这张地图看起来有点乱。我们需要自定义美化地图。
4.1 从地图上删除国家名称
list1 = [[country[i],totalcases[i]] for i in range(len(country))]
map_1 = Map(init_opts=opts.InitOpts(width=”1000px”, height=”460px”))
map_1.add(“Total Confirmed Cases”,
list1, maptype=’world’)
map_1.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) #remove country names
map_1.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=1100000,is_piecewise=False),
legend_opts=opts.LegendOpts(is_show=False))
map_1.render_notebook()

4.2 从地图上移除圆点
list1 = [[country[i],totalcases[i]] for i in range(len(country))]
map_1 = Map(init_opts=opts.InitOpts(width=”1000px”, height=”460px”))
map_1.add(“Total Confirmed Cases”,
list1,
maptype=’world’,
is_map_symbol_show=False)
map_1.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
map_1.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=1100000,is_piecewise=False),
legend_opts=opts.LegendOpts(is_show=False))
map_1.render_notebook()

4.3 将图例从滑动条更改为颜色箱
list1 = [[country[i],totalcases[i]] for i in range(len(country))]
map_1 = Map(init_opts=opts.InitOpts(width=”1000px”, height=”460px”))
map_1.add(“Total Confirmed Cases”,
list1,
maptype=’world’,
is_map_symbol_show=False)
map_1.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
map_1.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=1100000,is_piecewise=True,pieces=[
{“min”: 500000},
{“min”: 200000, “max”: 499999},
{“min”: 100000, “max”: 199999},
{“min”: 50000, “max”: 99999},
{“min”: 10000, “max”: 49999},
{“max”: 9999},]),
legend_opts=opts.LegendOpts(is_show=False))
map_1.render_notebook()

4.4 给地图添加标题和副标题
list1 = [[country[i],totalcases[i]] for i in range(len(country))]
map_1 = Map(init_opts=opts.InitOpts(width=”1000px”, height=”460px”))
map_1.add(‘Total Confirmed Cases’,
list1,
maptype=’world’,
is_map_symbol_show=False)
map_1.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
map_1.set_global_opts(
visualmap_opts=opts.VisualMapOpts(max_=1100000,is_piecewise=True,pieces=[
{“min”: 500000},
{“min”: 200000, “max”: 499999},
{“min”: 100000, “max”: 199999},
{“min”: 50000, “max”: 99999},
{“min”: 10000, “max”: 49999},
{“max”: 9999},]),
title_opts=opts.TitleOpts(
title='Covid-19 Worldwide Total Cases',
subtitle=’Till July 05th,2020',
pos_left=’center’,
padding=0,
item_gap=2,# gap between title and subtitle
title_textstyle_opts= opts.TextStyleOpts(color=’darkblue’,
font_weight=’bold’,
font_family=’Courier New’,
font_size=30),
subtitle_textstyle_opts= opts.TextStyleOpts(color=’grey’,
font_weight=’bold’,
font_family=’Courier New’,
font_size=13)),
legend_opts=opts.LegendOpts(is_show=False))
map_1.render_notebook()

通过向主题参数传递不同的值,可以很容易地更改地图的整体外观。
list1 = [[country[i],totalcases[i]] for i in range(len(country))]
map_1 = Map(init_opts=opts.InitOpts(width=”1000px”, height=”460px”**,theme=ThemeType.ROMANTIC**))
map_1.add(‘Total Confirmed Cases’,
list1,
maptype=’world’,
is_map_symbol_show=False)
map_1.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
map_1.set_global_opts(
visualmap_opts=opts.VisualMapOpts(max_=1100000,is_piecewise=True,pieces=[
{“min”: 500000},
{“min”: 200000, “max”: 499999},
{“min”: 100000, “max”: 199999},
{“min”: 50000, “max”: 99999},
{“min”: 10000, “max”: 49999},
{“max”: 9999},]),
title_opts=opts.TitleOpts(
title=”Covid-19 Worldwide Total Cases”,
subtitle=’Till July 03rd,2020',
pos_left=’center’,
padding=0,
item_gap=2,
title_textstyle_opts= opts.TextStyleOpts(color=’darkblue’,
font_weight=’bold’,
font_family=’Courier New’,
font_size=30),
subtitle_textstyle_opts= opts.TextStyleOpts(color=’grey’,
font_weight=’bold’,
font_family=’Courier New’,
font_size=13)),
legend_opts=opts.LegendOpts(is_show=False))
map_1.render_notebook()

有许多选项和参数可供您探索和尝试,以进一步美化您的地图。
享受 Python 中的数据可视化!
如何制作一个 GPT2 Twitter 机器人
它只有大约 100 行代码,但是 tweets 是无限的。

作者对推特机器人的演绎
介绍
我喜欢生成模型。向一台机器展示一堆数据,并让它画一幅画或写一个与原始材料相同的小故事,这是一件神奇的事情。如果我们不能正确地与他人分享,这些愚蠢的小模型有什么用?这毕竟是信息时代。在本帖中,我们将:
- 从头开始创建一个 Twitter 机器人
- 训练一个最先进的语言模型来为我们生成文本
- 使用 Twitter API 来制作您的机器人 tweet!
当你完成教程后,你将能够创建一个像这样的机器人 one 来发布生成的谚语。这个项目的所有代码都可以在这个资源库中找到。开始吧:)。
设置
本教程将使用 Python3。我们将使用gp T2-简单库来训练我们的模型。它依赖于 tensorflow.contrib,后者在 tensorflow 2.0 中已被删除,因此您需要使用早期版本:/。很抱歉。为了简单起见,我把 docker 容器和 Makefile 放在一起,以便在库中运行。您可以通过构建 docker 容器来加载一个工作环境进行游戏:
make build
然后跑步
make run
如果 Jupyter 更适合你,你也可以做
make run-jupyter
请注意,端口设置为 8989,而不是通常的 8888。
设置 Twitter
用 Twitter 建立一个机器人只需要你申请一个开发者账户,并把凭证和你想运行的任何代码链接起来。下一节将详细介绍如何设置开发人员帐户。这有点无聊,所以如果你已经有了,就跳到下一部分。
首先登录 Twitter,然后前往他们的开发者网站。您应该会看到类似下图的内容。

Twitter 开发者页面
单击右上角的应用按钮。这将带你到一个新的页面,你需要点击“申请一个开发者帐户。”

这将把你带到一个页面,询问你将如何使用开发者账户。我们正在制作一个机器人,所以选择那个,但是如果你感觉辣并且想要做其他事情,也标记那些。

然后填写下一页的所有信息,并添加一个电话号码。

最后一页涉及两个需要回答的问题。下面我概述了我对每个获得批准的问题的回答。如果你打算像我一样使用这个机器人,只是为了有时发推文,请随意复制它们。您可以将其他内容标记为与此 bot 无关。
请用英语描述您计划如何使用 Twitter 数据和/或 API。回复越详细,就越容易审核和批准。
“我计划建造一个小机器人,它将使用 GPT2、马尔可夫链或 RNN 的某种变体,每天就给定的主题发布简单的推文。目的是通过 Twitter 平台分享这些模型生成的有趣文本。”
你的应用会使用推文、转发、赞、关注或直接消息功能吗?
该应用程序将使用 tweepy Python 库每天更新机器人的 twitter 状态。Python 脚本将从我电脑上的 cron 作业中运行,并将只使用 Tweet 功能。”
你需要等待他们批准你的申请。在这一点上,我们很高兴填写另一个表格描述我们的应用程序!通过单击您的姓名,然后单击应用程序下拉字段,导航至应用程序页面。

单击创建应用程序

填写另一张表格…

一旦所有这些都填好并提交,你就可以开始了。您将在应用页面中看到您的新应用。当你点击细节,你可以得到你的 API 密匙。您只能查看您的访问令牌一次,因此请务必记下它们。我把我的保存在一个 JSON 文件中。这使得我可以很容易地以编程方式访问这些令牌。
{"consumer_key": aaaa
"consumer_secret": "bbbb"
"access_key": "cccc"
"access_secret": "dddd"}
就是这样!我们终于准备好写一些代码了!
获取一些数据
我要让我的推特机器人写一些有趣的谚语。你可以在这里找到我用来训练我的模型的数据。对于你的,看看你是否能找到一个数据集,其中的主要思想是简短的,并且有相当多的数据。一些想法可能是坎耶·韦斯特的推文,现任和前任总统的推文,甚至是魔法卡片。
我们将使用的 GPT2 简单模型作用于一个文本文件,所以我们需要做的就是将我们感兴趣的任何文本源编译成一个文本文件。我在培训 GPT2 时喜欢做的一件事是在不同的部分之间添加分隔符,这些分隔符不会出现在文本中。例如,您可以将《箴言》中的所有内容放入一个文件中,或者您可以用“\n==========\n”分隔每个谚语。然后,模型可以了解谚语的开始和结束位置,您可以更容易地解析输出。我已经按照我喜欢的方式设置了谚语文本的格式,其中有一个“\ n = = = = = = = = = = \ n”来分隔每个谚语的结尾,所有多余的字符都已被删除。
建造大脑
创建世界级的文本生成模型从未如此简单。当我制作第一个生成模型时,我必须编写大量代码来构建模型、训练模型、从模型中提取合理的预测等等。现在,我们可以在 GPT2 上进行一点迁移学习,并获得比几年前想象的更好的结果。
Max Woolf 创建了一个惊人的库,使得微调 GPT2 变得超级容易。我们将采用他所有的优秀成果,并使用该界面进行培训。以下 30 行代码是微调同类最佳生成模型所需的全部内容。gpt2_simple finetune 函数接受几个值得解释的参数。
微调 GPT2 模型的代码
- 会话该会话只是当前的 Tensorflow 会话
- 数据集这是加载并用于训练的文本文件的路径,稍后将详细介绍。
- 型号名称要使用的 GPT2 型号名称可以是 117M、124M 或 355M。124M 在我的 1080Ti GPU 上很好用。
- 步数模型要走的步数。这个数字应该足够大,至少可以遍历整个数据集一次,但也不能大到让你无法适应。当在相对较小的数据集上微调 GPT2 时,我喜欢做一到两个时期。然后我进行测试,以确保它生成的内容不是直接来自训练集。
我们可以通过使用wc实用程序查看文本中的总字数来计算步骤数:
wc Data/proverbs_clean.txt
生产
1816 15984 93056 Data/proverbs_clean.txt
我们可以看到这个文件有 1,816 行,15,984 个单词和 93,056 个字符。步骤中传递给模型的默认字数由 sample_length 参数设置,默认为 1023。所以 15984 / 1023 = 15.6。所以每 16 步我们都要检查一次所有的数据。这意味着我们应该训练我们的模型走 33 到 66 步。以避免过度拟合。
要生成给定模型的新文本,我们可以使用 gpt2_simple.generate 函数,如下所示:
sess = gpt2.start_tf_sess()
gpt2.load_gpt2(sess, checkpoint_dir=checkpoint_dir)
text = gpt2.generate(
sess,
checkpoint_dir=checkpoint_dir,
length=length,
temperature=temperature,
destination_path=destination_path,
prefix=prefix,
return_as_list=True
)
让我们再次分解这些论点。
- sess 是我们想要使用的 tensorflow 会话
- checkpoint_dir 是从我们的微调到保存的检查点的路径
- 温度是大于 0 的值,我喜欢在 0.8 到 2 之间玩。温度越低,你的输出就越稳定和可预测;温度越高,它们就越狂野、有趣,甚至可能是荒谬的。
- destination_path 是保存文本的路径。如果你只是想内联返回它,让这个 None
- 前缀是个好玩的。它可以是用于播种模型的文本字符串。因此,如果你以“你不应该”开始,那么模型将写下接下来的单词,就好像它以“你不应该”开始一样。
- return_as_list 将使函数返回文本,而不只是打印出来。
运行这段代码,我们可以生成一些谚语!
for he that taketh away his beret also with food, and as a disorderly child, so hath a man a very strange prayer
==========
for though it seem good to us to be taken, yet a man that hath it in his heart never cometh out of it
==========
he that hath his substance with him seeketh out knowledge and hath neither toy with his heart
==========
for a stranger cometh when i talk with him, and delivereth him, so that i may give to him even as the blood I drink, and a spare change my food
建造机器人
我们有数据,一个根据我们的数据训练的模型,和一个 Twitter 开发者账户,剩下的就是把它们连接起来。我们的机器人需要做三件事。
- 使用 Twitter API 进行身份验证
- 产生一句谚语
- 把这句谚语发到推特上。
幸运的是 Tweepy 让第一和第三部分变得非常简单,我们已经完成了第二部分!
证明
首先,我们需要将我们的凭证放入 Python。正如我前面提到的,我把我的保存在一个小的 JSON 文件中,所以用 Python 加载它非常容易。
# Parse the credentials for the twitter bot
with open("twitter.json", "r") as json_file:
twitter_creds = json.load(json_file)
# Set the credentials based on the credentials file
CONSUMER_KEY = twitter_creds['consumer_key']
CONSUMER_SECRET = twitter_creds['consumer_secret']
ACCESS_KEY = twitter_creds['access_key']
ACCESS_SECRET = twitter_creds['access_secret']
有了所有这些凭证,我们可以使用 Tweepy 通过 Twitter API 进行身份验证。
# Authenticate with the Twitter API
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
文本生成
现在,我们可以使用之前编写的代码生成新的文本。我将所有这些打包成一个名为 generate_text 的小函数。生成文本后,我们要确保不要抓取任何超过 280 个字符的文本,因为这是 Twitter 的 tweet 限制。
# Generate some text
generated_text = generate_text(checkpoint_dir, length, temperature, None, prefix)
# Parse out all "sentences" by splitting on "\n———————\n"
split_text = generated_text.split("\n———————\n")
# Filter out all examples which are longer than 140 characters
valid_text = [x for x in split_text if len(x) <= 140]
推特!
微博现在只有两行了!随机选择一个谚语,然后使用 Tweepy 更新机器人状态!
tweet = np.random.choice(valid_text, 1)
api.update_status(tweet[0])
就在那里!
包扎
我们有代码来生成圣经谚语风格的推文,也有技术来处理任何文本语料库!我通常只是在我的服务器上安排一个 cron 作业,每天运行一到两次。我已经在库中包含了一个 Makefile,使得用一个命令就能让机器人发布 tweet 变得容易。只需运行:
make CHECKPOINT_DIR="deepproverbs" TWITTER_CREDS="twitter.json" tweet
我把我们今天写的所有代码都打包成了一些漂亮的点击函数,所以应该很容易从命令行运行。
如何建立黑仔数据科学投资组合?
与聊天机器人集成

达米尔·斯班尼克在 Unsplash 上拍摄的照片
我会跟你直说。如果你现在试图找一份工作,这绝对是一种折磨,因为数据科学家是 21 世纪最性感的工作,因为竞争非常激烈,每天都在增长。
事实是,除非你站出来,吹嘘自己,否则你不会成功。嘿,如果你不为自己做,别人也不会做。
这是我在找工作的时候告诉自己的,仅仅通过简历申请和分享 LinkedIn 和 GitHub 个人资料不会有任何进展。
每个人都忙于自己的生活,你需要让它变得特别,需要时间。然后我认为有一个杀手级的投资组合网站来展示我的项目、技能和兴趣并不是一个坏主意。
但是我该怎么做呢?
正如 Julia Nikulski 在她的文章中提到的,作为数据科学家,我们并不经常使用 HTML、CSS、JavaScript 或 Flask。对于一个典型的数据科学家来说,编码和创建一个网站显然非常耗时,而且质量没有保证。
在谷歌上快速搜索后,我找到了数百个教程,可以帮助你在 30 分钟内建立和部署一个像样的单页文件夹。但是他们不是真正的杀手标准质量,我也需要为域名和托管服务支付少量的钱,我不准备这样做。
我保证自己不会投入大量的时间和精力来创建一个网站,因为它只是一个助手,但我希望有一个吸引注意力的杀手级网站,因为我对 NLP 特别感兴趣,我肯定希望在其中集成一个聊天机器人,因为它可以向用户表明我对 NLP 表现出额外的兴趣。准确地说,我个人的要求是
没有 HTML / Java 脚本代码
零价格和免维护
惊艳 UX 吸引眼球
笔记本电脑、平板电脑和移动设备布局的单一设计
聊天机器人集成
Linkedin 和 Github 导航
如果你认为我的要求不切实际,甚至贪婪。但我向你保证这是可能的。你可以在这里看到我的作品集。如果你只使用一个信号源,那肯定是不行的,你需要使用 3 个信号源。
- Webflow
- 陆地机器人
- 坎瓦
ebflow 创建网站,Landbot 创建聊天机器人,Canva 创建徽标。所有这些资源都提供免费增值服务。我确保坚持自由放养。
选择 Webflow 的原因是因为你只需点击一个按钮就可以部署你的网站,域名中有你的名字,还有免费的托管服务。要导航到 Chatbot、GitHub、Linkedin 页面,您可以使用带有超链接的按钮。全部免费。下一节将详细介绍 Lanbot 和 Canva。

作者图片来自作者网站
3 步指南:
你可以通过三个简单的步骤获得这样一个令人敬畏的投资组合网站。
第一步:标识
为你的网站创建一个标志。
虽然这不是强制性的,但我强烈建议你制作自己的 logo,因为它会立刻让用户感觉他/她进入了你的世界。

作者的徽标图像
您可以使用canva.com从可用的免费徽标模板中快速制作您的徽标。如果你已经有了一个设计方案,你可以在 5 分钟内完成,并下载成图片。
您将在稍后创建网站时在 Webflow 中使用它。
步骤 2:聊天机器人
拥有一个个人聊天机器人可以提升你的作品集,让它变得互动和有趣。如果你像我一样对 NLP 领域感兴趣,我认为这是一个必须的广告。
你有两个选择。第一,你可以用 python 自己制作一个简单的聊天机器人,可以谈论你的教育,个人项目,分享你的联系方式等。第二,你可以使用像 Lanbot 这样的免费平台,在不到 15 分钟的时间里创建一个有趣的基本聊天机器人。
如果你想选择第一个选项并寻求帮助,你可以关注徐哲睿的文章
[## 如何在不到一小时的时间内用 Python 和深度学习创建聊天机器人
显然不要指望会是 Siri 或者 Alexa…
towardsdatascience.com](/how-to-create-a-chatbot-with-python-deep-learning-in-less-than-an-hour-56a063bdfc44)
对于第二种选择(我用过),有很多平台,比如 Dialogflow 、 Collect.chat 、 Chatfuel 、 Morph.ai 、 Landbot.io 等
选择 Landbot.io 的原因是,据我所知,这是唯一一个平台,它不仅提供了用于集成的 JavaScript 代码片段,还提供了一个超链接,我可以在按钮下使用它进行导航。
一旦你进入了,在 Landbot 中创建一个聊天机器人是很容易的。它更像是 if-else 循环。如果你需要更多的信息,你可以看看兰德机器人的学院页面。

图片来自作者的 Landbot 创建页面
Landbot 跟踪用户,并提供关于谁在何时、何地以及如何使用的分析。

来自作者的 Landbot 分析页面的作者图片
如果你在数据科学领域,你知道跟踪数据和信息有多有用。
你可以在这里看到我完全开发的聊天机器人。
io 是一个创建对话界面来代替表单的工具。不需要编码!
landbot.io](https://landbot.io/u/H-351396-6XX1VDBMWWRQM117/index.html)
第三步:网站
在 Webflow 中,如果你想从头开始建立一个网站,你可以通过拖放内置工具来建立一个网站,或者更好的选择是,你可以选择和克隆数百个已经用 Webflow 建立的网站。
[## 响应式 web 设计工具、CMS 和托管平台| Webflow
我们的大学、博客和展示平台为您提供成功所需的教育、见解和灵感…
webflow.com](https://webflow.com/?r=0)
您可以在 showcase 选项卡中看到模板。你所要做的就是选择一个适合你风格和品味的网站,并确保你点击 clonable 只看到允许克隆的网站。
专业提示:Webflow 中几乎所有的网站都非常漂亮,我觉得很难从中选出最好的。如果你写下你想容易过滤掉的特征,这会对你有所帮助。
确保在项目设置中选择合适的域名。我用了有我名字的' tejesh-ai ',然后在图标部分上传你设计的 logo 。
我创建的作品集是从吉米制作的网站[克隆而来的。我对克隆版本做了一些修改,插入了我的徽标,还创建了按钮让用户导航到我的聊天机器人和 Github。****](https://webflow.com/website/Jimmy-Makes-Things-Design-Development-Collective)

作者的 Webflow 设计页面中作者的主屏幕图像
我使用集合在工作页面中列出了一些我选择的项目,并在每个项目的底部设计了一个 GitHub 页面导航按钮。

作者的 Webflow 设计页面中作者的工作屏幕图像
在所有的改变之后,只要确定在不同的布局上看起来如何,特别是在移动中。如果你想改变元素的位置,完成后点击顶部的发布按钮。
就是这样,你现在可以在你的简历、Linkedin、Twitter 中复制并添加链接,并与全世界分享。
最后的话
我知道在这个竞争激烈的数据科学领域脱颖而出并不容易,但做一些小事,比如在你的个人资料中添加一个投资组合,肯定会给你带来优势。如果有人在看到你的作品集后开始和你交谈,不要惊讶。
如果你决定制作一个作品集,请不要满足于平庸的 UX 设计,当你有机会轻松制作一个杀手作品集的时候。
我想给你的一个建议是让你的投资组合保持活力。不管怎样,你添加的项目和作品是人们最关注的。所以请不断更新你的作品👋。
让我知道你是否尝试过这个,如果你面临任何封锁,在这个帖子里留下评论,我会尽力帮助你。
参考
如何制作一个专业外观的闪亮应用程序,而不被吓倒
使用 mtcars 的分步示例
介绍
这篇文章的目标读者是有 R(最好是 tidyverse)经验的人,他们想学习如何开始制作闪亮的应用程序。对于那些以前没有听说过 Shiny 的人来说,这是一个包,它允许你使用 R 创建 web 应用程序,而不需要知道任何 HTML、CSS 或 Javascript。也就是说,如果你真的想深入应用程序开发,学习 HTML、CSS 和 Javascript 将提高你做更强大的事情的能力,并对应用程序开发过程有更多的控制。然而,由于可以使用如此多的工具,这可能会让人不知所措。因此,这篇文章旨在为开始制作一个专业外观的闪亮应用程序提供一些基线代码和闪亮的概念。我希望,通过遵循本文中的步骤,您将能够立即开发出一个干净的高质量的应用程序。每一步,如果你好奇,你可以谷歌一下,我认为这是最好的学习方法之一。
直接进入一个更专业的应用程序,而不是从样板闪亮的例子开始,背后的动机是因为理论和中间的弯路往往会延长做的道路,这可能会挫伤你的积极性。我的哲学是,一旦你开始做某件事,你将能够 1)为你已经做的先进的事情感到骄傲,2)以后补充细节。我不会对 Shiny 理论或 Shiny 的一些更复杂的底层组件进行太多的详细描述,但 Hadley Wickham 正在进行的在线教科书是一个很好的资源。因此,对于这篇文章,请耐心听我说,我没有全面解释的任何术语或概念都需要您花费一些精力来查找。
设置
当您第一次安装shiny包并重启 RStudio 工作空间时,您会看到一个选项来初始化闪亮的 web 应用程序,如下所示:

这将带你到一个提示,让你选择初始化应用程序在一个单一的文件(应用程序。r)或两个文件(ui。r 和服务器。r)。我将在这里提到,任何闪亮应用的主干都由两个组件组成:定义应用如何出现的 UI (用户界面)和定义应用如何工作的服务器。对于这个例子,我们实际上有三个文件(ui。r,服务器。r,和 app。r,最后一个是我们加载所有包的地方,sourceUI 和服务器脚本,并运行应用程序。这种三脚本框架通常用于更复杂的闪亮应用程序,尽管我今天将带你们浏览的示例应用程序相当简单,但开始培养良好的习惯还是有好处的。所以你们可以做的是继续做三个新的 R 脚本文件,并把它们命名为“ui”。r”,“服务器。r”和“app。r”。
app。稀有
让我们从简单的开始。将以下代码复制并粘贴到您的应用程序中。r 文件。
我们目前要关注的主要库是shiny和shinydashboard。我们使用shinydashboard是因为它是一个简洁的包,提供了一个清晰的接口来呈现数据和图表。
闪亮的应用程序
因此,在我们继续讨论 UI 和服务器之前,让我们先来讨论一下我们正在构建的应用程序实际上会是什么样的!我们将使用mtcars数据集并构建一个简单的线性回归 OLS 模型来预测mpg或每加仑英里数。app 界面将允许用户更改各种输入,输出将是一个预测的mpg。当然,预测的 mpg 本身是没有意义的,因为模型会被过度拟合(我们在构建模型的同一个数据集上进行预测),但这不是我们本次练习的关注点。
UI。稀有
仪表板有三个部分:标题、侧栏和主体。最简单的示例会生成以下内容:
ui <- dashboardPage(
dashboardHeader(),
dashboardSidebar(),
dashboardBody()
)
server <- function(input, output) { }
shinyApp(ui, server)

因此,对于这个应用程序,我在考虑将输入放在侧边栏(黑色部分),输出放在主体(浅蓝色部分)。对于更复杂的应用程序,指定单独的标题、侧边栏和主体对象是一个好习惯。我们将从标题开始,因为它最简单。
header <- dashboardHeader(title = “Demo Predictor”)
接下来,让我们开始用我们希望用户能够选择的输入填充侧栏界面;这些将是 mtcars 数据集中的预测变量。为了简单起见,我们将分类变量设为 a selectInput,它将为用户提供一个下拉菜单选项,而连续变量设为 a numericInput,它将允许用户输入一个数字。这些输入基本上有三个关键参数(还有更多,但我会让您自己去探索):输入 ID(稍后我们将在将服务器连接到 UI 时使用)、标签(显示在应用程序中的文本)和值。注意,输入 ID 必须是一个简单的字符串,只包含字母、数字和下划线(不允许空格、破折号、句点或其他特殊字符!)且必须唯一。如需更多类型的输入,请查看本章节。
这是它目前的样子:

点击预测!要下拉的菜单项
这里有一些评论。所以我使用sidebarMenu布局中的菜单项来存储我想要的下拉菜单,点击即可显示/隐藏。我使用的参数如下(当然还有更多):
menuItem(text = "Predict!", tabName = "model", icon = icon("bar-chart-o"),...)
其中文本是显示的内容以及菜单项将激活的选项卡的名称。现在不要太担心 tabName,如果我们想对菜单项如何与仪表板的其他部分交互有更多的控制,或者如果我们想用 HTML/CSS/Javascript 进一步定制它,它主要是存在的。请注意,您在代码中列出各项的顺序就是这些项出现的顺序。另外两个组件是“预测!”和“清除”按钮。

目前,如果你按下它们,什么都不会发生,因为我们还没有为这两个按钮指定一个服务器功能,但最终“预测!”将输出一个预测的 mpg 和“清除”重置所有输入。请注意,它们周围有一些代码看起来一点也不像 R 代码。那是因为那是 CSS(层叠样式表),是一种定制网站元素外观的语言。我写的代码基本上是将两个按钮并排放在同一行,但是同样,不要太担心细节。
最后,让我们填写正文。
在这里,我介绍一个verbatimTextOutput(),它将打印预测的 mpg。它通常与renderText()成对出现,我将在稍后的服务器代码中讨论。闪亮 UI 设计中的另一个重要概念是fluidRow()。流体行的宽度为 12,因此您可以将内容组织在宽度总计为 12 的列或框中。最后一个概念是标记,但这更高级一些,因为标记允许您更好地控制 HTML/CSS/Javascript 元素。在这里,只需要知道tags$style允许我改变 CSS 元素来定制字体大小和家族之类的东西。
现在,我们有了所有的 UI 组件,所以我们像这样把所有的东西放在一起。
ui <- dashboardPage(header,
sidebar,
body,
useShinyjs()
)
服务器。稀有
您必须记住的是,对于您做出的任何具有输入 ID 的 UI 决策,您都应该将一个服务器函数与它配对(这是一个通用的经验法则)。所以你会记得我们有所有的 mtcar 变量输入,即“预测!”按钮和“清除”按钮。服务器功能非常简单。我们希望在线性回归模型中使用所有变量输入。我们还将编写一些单独的代码来重置这些值。
这就是输入 ID 变得重要的地方。它必须是唯一的,因为在服务器中,您使用input$someID引用输入。我将分解三个功能:
observeEvent()eventReactive()output$pred <- renderText(pred())
然而,要理解这些,我不得不谈谈反应性。反应是 Shiny 的一个核心组成部分,不可否认,最初你可能很难理解这一点。本质上,反应性的要点是任何时候用户改变输入,我们不希望所有的代码都重新运行;我们希望控制何时重新运行代码的某些部分。这一点很重要,因为想象一下,如果你每次在网站上进行点击或滚动等操作时,网站每次都要重新加载,那将是有史以来最令人沮丧的网站!对于反应性的更深入的描述,请务必查看 Hadley Wickham 的第章中的内容。
observeEvent()基本上告诉应用程序做一个动作,在这种情况下,在某个动作时将值重置回默认值,在我们的情况下,就是单击我们称为“清除”的actionButton()(ID 为“reset”)。我使用eventReactive()来指定当用户点击“预测”时我想要运行的代码按钮,这是一些相当简单的 dplyr 和基本预测函数。我甚至可以通过在外部执行争论来提高效率,这样它就不必每次都重新运行,但是现在,由于它是一个小数据集,代码仍然运行得非常快。当我将一个eventReactive()语句保存为 R 对象时,为了再次调用它,我必须把它当作一个函数来处理(这是 Shiny 的反应式编程方式)。这就是为什么pred变成了pred()。最后一件事是呈现我们用renderText做的输出,我们必须用正确的 ID 将它分配给输出,所以回想一下在我们的 UI 脚本中,我们指定了verbatimTextOutput(pred)。
这是我们运行该应用程序时的样子shinyApp(ui, server)。

结论
Shiny 是现有 R 用户进入网站和应用程序开发的一种非常简单和用户友好的方式。一个闪亮的应用程序可以成为传达你的见解的强大工具,并允许用户自己探索概念和见解。使用类似shinydashboard的东西真的很有帮助,因为不管我们是否意识到,一个应用程序的设计方式真的很重要。我们的体验越无缝、越直观,通常就有越多的隐藏的东西让这一切发生。对于那些对此感兴趣的人,我鼓励使用这个应用程序作为跳板,并尝试融入新的功能。试图学习所有的 HTML、CSS 和 Javascript 太难了,绝对不推荐,所以下面是我推荐的一些资源,供你参考:
- 高级闪亮提示
- 如何让你闪亮的仪表盘跑得更快
- Shinyjs
- 哈德利·韦翰闪亮的衣服
尽情享受吧!
如何制作一个简单的聊天机器人
不到 10 分钟
因为教程通常更容易实时跟踪。
你可能听说过围绕人工智能的炒作。也许你是一个商业领袖或者一个有抱负的学生。不管怎样,你可能已经看到标题声称“人工智能正在崛起”,处于发展的顶峰,准备在工作中包容人类。好吧,我让你自己判断这个决定。在这篇关于构建应用聊天机器人的温和介绍中,我向你展示了任何明智的个人都可以创造的基本能力,这些能力只有通过谷歌上的 Dialogflow 和 Actions 提供的工具才能实现。
那么,到底什么是什么是 Dialogflow 呢?简单的答案是:帮助人们以更简化的方式与技术互动。例如,假设我问我的机器,“今天我附近有哪些咖啡店营业?”对于更传统或硬编码的系统,如果问题不是以这种方式提出的,那么系统就不能理解你在说什么。至少在英语中,用不同的词来传达相同的“意思”有几种方式…
- “星巴克开门了吗?”
- “今天我可以去哪些咖啡店?”
- “什么咖啡馆接移动订单?”
我们喜欢 Dialogflow,因为它可以处理这些不同的最终用户体验。为了打破这种对人类话语差异的基本理解,我将(非常)简要回顾 Dialogflow 背后的一些基本原则,这将使本教程的其余部分更容易理解,并且应该为您提供一个未来聊天机器人交互的有用框架。
现在在 Dialogflow 中,我们也有称为代理的实体。这些虚拟代理处理与最终用户的对话。这些人经过训练,像呼叫中心代理一样,处理预期的对话。
代理学会识别被称为意图的东西,作为人类,我们自然理解为与你的动机有关的东西,或者问某事的原因。也许你听了某人的漫谈,你可能会在内心深处想“说重点!”好吧,你最终能够跟上谈话,因为你在谈话中不断评估某人意图的可能性。同样,意图被用来帮助你的虚拟代理获取一个短语,并理解用户或说话者想要从对话中得到什么,然后通知代理的最终响应。
因此,以咖啡馆为例,意图可以描述为“寻找咖啡馆意图”在您甚至可以点星巴克之前,代理需要知道在哪里可以找到咖啡馆,所以我们在第一次传递中会询问您的邮政编码。有了这个意图,我们的代理就知道要监听什么样的参数,需要提取什么样的数据,以及代理应该给你的最终用户什么样的回答或响应。一些示例响应可能是:
- "当然,星巴克就在离你 0.1 英里的地方."
- "离你两公里以内的菲尔茨咖啡已经关门了."
最后,在每个意图中,我们可以定义实体、来识别我们应该从用户话语中提取的关键数据。从概念上讲,这些就像是代理应该在对话中寻找的对象,比如“日期”或“位置”也许实体类型甚至更加定制化,例如“咖啡”实体匹配不同类型的咖啡(美式咖啡、摩卡咖啡、冰拿铁咖啡),可以通过我们的咖啡代理商购买。
在我们进入这个过程之前,要考虑的最后一个组件是对话流上下文。正如上下文在正常对话中的重要性一样,对话流代理需要理解上下文,以便与意图相匹配。例如,如果你在人行道上随意走到某人面前,说,“好吧,我们点一杯摩卡!”,那么你很可能会受到困惑的目光,而这个谦逊的陌生人可能会说一些类似于“嗯,你是谁?”
然而,如果你先问同一个陌生人“嘿,我附近有什么咖啡店开门吗?”,然后你设置一个“咖啡馆购物环境”因此,如果你接着问“我可以点一杯摩卡吗?”的话,这位先前感到困惑的陌生人可能会做出更正常的反应
使用谷歌助手构建聊天机器人的最后一个“基础”是一个动作。顾名思义,一个动作可以是发起与助手互动的第一个切入点。这就像当我们以“嗨,星巴克博士!”为了激活我们的星巴克聊天机器人。然而,更广义地定义,一个动作通过一些服务、应用或逻辑来实现或执行一些用户定义的意图。
如果你还有任何问题,请随时直接联系我或查看 YouTube 视频。与此同时,让我们把手弄脏吧!

你的首页截图。
2.从这里,你点击“新项目”以确定一个暂定的“项目名称”我们将对其进行自定义,您可以点击“对话”按钮记住,我是 2020 年 6 月 30 日做这个的,所以有可能界面又变了。但是对于那些及时看到这个的人来说,我希望这有助于激起你的兴趣。现在,向下滚动到底部,确保在 Dialogflow 中定义一个动作。

“单击此处使用 Dialogflow 构建您的操作”将位于自定义菜单的底部。
3.接下来,点击“决定如何调用您的操作”。然后,您将看到设置和显示名称。这是我们用来触发我们的代理并激活他或她的名字。我们要打电话给我们的代理商,星巴克的代理商 S。一个好听的中性名字。一定要保存好。
4.然后,您将能够指定操作。点击开始。这将打开一系列窗口,最终将带您进入 Dialogflow,在这一步的加载过程中,您可能需要授权您的 Gmail 登录 Dialogflow。

“动作”按钮在左边,在“调用”下面在 Create Action 下,点击“Build”,应该会把你带到 Dialogflow,如果之前的指示被准确遵循的话。
5.从这里,您应该会被带到 Dialogflow 中的“intents”页面。现在我们可以开始构建星芭儿特工的意图了。为相应的对话流选择一个名称,并在继续之前确认您的设置。

您被定向到的默认 dialogflow 页面应该类似于此页面。
6.所以我们#幸运,因为我们可以访问默认的欢迎意向对话。太好了。我们要把这一切都扔掉!找到这些训练短语,点击文本字符串右边的垃圾桶图标,就可以把它们全部删除。
7.现在,让我们改变回答,针对我们的代理将询问的第一个问题进行定制。我们将通过请求地理定位您附近的星巴克来填充我们的第一个“欢迎,您好”意图。用类似“你住在哪里?”这样的问题填写这一部分或者“我们去星巴克吧。第一,你的邮编是多少?”提供足够的培训短语后,单击保存。单击顶部的蓝色按钮,您应该会在屏幕的右下方看到一个弹出的“intent saved”通知。

响应请求的示例。
8.现在,这里有一个很好的实践。在我们使系统变得更复杂之前,让我们测试第一个组件。有用吗?如果管道已经漏水了,你会延长管道吗?大概不会。所以,让我们转换一下话题。让我们回到 Dialogflow 的左侧栏,点击 Integrations。然后,点选谷歌助手,整合设置。****

点击 Google Assistant 主按钮中的“集成设置”以进入该屏幕。
9.在这里,您需要单击 Test。这将我们的动作加载到动作控制台模拟器中。这里有一些很酷的东西,这是由了不起的谷歌开发者社区提供的,他们把这些东西放在一起,不在这个视频的范围内。

为了达到这一点,我点击了“与星巴克博士交谈”,作为我的主要调用,它出现在你现在看到的“取消”的地方
10.因此,我们自然希望在之前对话的基础上再接再厉,因此我们将创建一个新的意图。当然,触发这种意图的训练短语必须是我们在前一个中预期的响应。因此,如果我要求一个邮政编码,让我们给系统一些可能的邮政编码有意义,对不对?让我们回到对话流程。然后,我们将单击意向,并将鼠标悬停在默认的欢迎意向上。接下来,我们将创建另一个意向,并填写以下字段。

当您将鼠标悬停在默认欢迎意向上时,右侧的文本会出现,为您提供“添加跟进意向”的选项在这里,我们可以创建我们的“收集数据”意图。
11.重要的是要记住,我们是用这种意图来收集信息的。请注意我是如何填写数据并使其成为必填项的,特别是“尺寸”、“饮料”和“温度”。“如果你从星巴克点餐,他们总是会问这个。欢迎您在这里发挥创意,只要确保创建现实的提示,确定并指定您的代理需要收集哪些参数来获得良好的星巴克订单。下面是一个例子。

在我们的后续意图中,请注意,从逻辑上讲,激活该意图的“训练短语”包含对先前意图提出的“回答问题”的回答:“您的邮政编码是多少?”

在“操作和参数”下,您可以指定代理将用于检索所需实体值的文本提示。在这种情况下,喝酒
12.最后一步是让你的星巴克代理指出你的订单的参数并检查它。例如,“你点了一杯大杯冰焦糖玛奇朵吗?”在您成功教会您的代理如何提供这种类型的回应后,我们可以结束对话。

请注意,前面确定的实体参数可能会在文本响应中引用。
从现在开始,你将有机会在 Google Assistant 测试平台中测试你自己的聊天机器人。当然,这是一个非常基础的“订购星巴克”聊天机器人的介绍版本,它实际上不访问任何 Firebase 数据库,这是一个更接近真实世界的应用程序。如果你有兴趣学习如何做到这一点,那么让我知道!同样,如果你已经看完了这篇文章,那么我希望这篇简短的教程能让聊天机器人不那么神秘。更好的是,如果我已经启发你开始进入人工智能的兔子洞,并建立你自己的聊天机器人!

在 Insta/Twitter 上找我:@seanbatir。在https://youtube.com/seanbatirPC:Mikita Zhur了解更多信息
如何成功转向数据科学职业
许多人希望有不同的职业道路,并希望过渡到数据科学家的职位,但这仅仅是努力工作和动机的问题吗?

罗斯·芬登在 Unsplash 上的照片
在我发表了关于我从业务发展转向数据科学的文章以及关于我的数据科学硕士没有教给我的东西的文章之后,许多人向我寻求关于他们自己职业转变的建议。他们中的一些人担心他们过渡到数据科学的能力,而其他人则询问哪个在线课程是最好的。虽然我显然没有所有的答案,但我想我会分享我自己在这个问题上的经验,并给那些希望在职业生涯中做出这样改变的人一些建议。
我从销售专员到数据科学家的转变&最大的挑战是什么。
towardsdatascience.com](/from-being-a-sales-rep-to-being-a-data-scientist-4bb1da79ba3f) [## 我的数据科学学位没有教会我什么—第 1 部分
&在开始我的数据科学职业生涯之前,我想知道些什么。
towardsdatascience.com](/what-my-data-science-degree-did-not-teach-me-part-1-3d7ff23875e5)
在线课程足以获得一份数据科学家的工作吗?
以我的观点和经验,如果你的背景与数据科学极度脱节(就像我的一样),在线课程根本不够。大多数在线课程提供的知识是有用的、有价值的,是你 LinkedIn 个人资料的一个很好的补充。然而,我认为大多数在线课程没有涵盖足够多的实际业务问题,无法让你成为一名有吸引力的数据科学家,知道在面临真正混乱、不可靠或难以访问的数据时该怎么办。
话虽如此,哪些网络课程最好?
虽然我过去也开设过一些在线课程,但我从未被一门课程的质量所折服,以至于不能说出它的名字并向每个人推荐它。可能只是因为我缺乏连续几个小时观看视频的纪律性。在任何情况下,我不想提及具体的在线课程,但我想强调的是,当你选择在线课程时,你应该注意什么。
- 选择有大量实践练习的课程。机器学习涉及大量编程,只能通过反复练习来学习。
- 选择课程包括项目。还是那句话,你只能通过自己编码和构建或应用模型来学习。
- 如果可能的话,选择那些老师(不仅仅是学生)可以检查你的作业并评论你可以做得更好的课程。
如何获得正确的体验?
我没有神奇的解决方法。对一个人有效的可能对另一个人无效。我也不知道一个国家和另一个国家的市场和对经验的需求是否有很大的不同。然而,我有许多来自不同背景的同事、朋友和熟人,他们通过共同的途径最终进入了数据科学领域。
- 实习机会
实习通常会为你打开许多机会之门,在那里你可以快速学习,并且(经常)在学习中获得报酬。
- 实习
在合适的公司投资合适的实习会对你的职业生涯产生巨大的影响。对我来说,合适的公司被定义为关注实习生的学习潜力并提供知识共享的支持性文化的公司。实习和见习都可以让你向该领域的前辈学习,在我看来,这是最好的学习方式。
- 自组织项目
公司的目标是找到能够像数据科学家一样思考,从而像程序员一样思考的候选人。他们希望看到你以前能够用数据和代码解决问题,即使你所构建的只是对你的个人任务有所帮助(想想你每月支出的预测工具或预测足球比赛比分的应用程序)。它也给你在工作面试中谈论的内容。
最重要的要求
当你来自商业背景或任何其他非常不同的领域时,这种职业转换需要努力工作,花很多时间学习,试图找出为什么你的代码不起作用,或者寻找对数据不一致的解释。
学习数据科学和优秀的编程需要非常陡峭的学习曲线,任何迟钝的学习者都将很难做出转变。这并不容易,而且可能会令人沮丧,所以在投入几个月的时间之前,请确保你真的想成为一名数据科学家。这个名字听起来有点性感,报酬也不错(不是所有地方都是..)但这项工作可能会很乏味,充满政治问题,而且在修复 bug 时相当无聊。你还需要不断学习,因为这个领域发展如此之快,虽然许多人喜欢学习,但不断的变化并不适合每个人。
在数据科学中,你学得越多,你就越意识到你有多少不知道的东西。
当有人问我他们是否认为可以做到时,我无法给他们一个明确的答复。这取决于他们能够并愿意付出多大的努力,他们的适应能力如何,还取决于学习资源的可用性。尽管如此,无论某人能否成为数据科学家,我都相信某人收集的数据科学知识将在未来使他们受益,更好地理解我们生活的技术,并将他们的职业生涯更多地转向他们热爱的领域。
感谢您的阅读!更多关于编程、数据科学和领导力的文章,请关注我的 中型 和Twitter,以便在新文章发布时获得通知!
如何用 Python 制作一个 Twitter 机器人
了解如何免费使用 Python 和 AWS Lambda 函数开发自己的 Twitter 机器人

作者图片
目录
- 什么是推特机器人?
- 制造推特机器人有哪些选择?
- 如何使用 Python 和 AWS Lambda 制作一个 Twitter 机器人
-建立一个 Twitter 开发者账户
-创建一个 Twitter 应用
-在你的本地机器上开发你的机器人 - 将您的 Bot 部署为 AWS Lambda 函数
- 结论
实际上,15%的推特用户可能是机器人。企业、品牌和有影响力的人使用机器人来管理他们的 Twitter 账户。就连我也在不久前做了自己的。
如果你在这里,我猜你想自己做一个。这篇文章将告诉你如何做。您将了解免费制作 Twitter 机器人的不同选项。而且,如果你有技术背景,你将学习如何使用 Python 和 AWS Lambda 来编码和部署一个机器人。
看完这篇文章,你会知道:
- 什么是推特机器人
- 制作 Twitter 机器人有哪些可用的选项
- 如何使用 Python 开发一个 Twitter 机器人
- 如何将自己的 bot 部署为一个 AWS Lambda 函数
我们开始工作吧!
什么是推特机器人?
这是一个通过 Twitter API 管理的 Twitter 账户,以自动方式执行操作。你经常通过 Twitter 的图形界面做的大部分事情也可以通过它的 API 来实现。例如,你可以在预定的时间自动发送推文,用预定义的文本回复推文,或者关注/取消关注其他账户。
尽管 Twitter API 非常灵活,但是您应该记住一些限制。根据 Twitter 的自动化规则,以下是你的机器人可以做的事情:
- 发布有用的信息
- 回复关注您内容的用户
- 回复直接信息
- 在不打破常规的情况下尝试新事物
下面是你的机器人不能做的事情:
- 违反这些规则中的任何一条
- 滥用 Twitter API 或试图规避费率限制。
- 尝试通过使用除 Twitter API 之外的其他机制来自动化其行为
- 通过推文或未经请求的直接消息向用户发送垃圾邮件
接下来,您将看到制作您自己的机器人的可用选项。
制造推特机器人有哪些选择?
根据你的目标,你有多种选择来制作一个机器人。其中一些几乎不需要编码技能。其他人需要部署 Docker 容器的经验。就成本而言,你会发现免费和付费的替代品。
以下是最受欢迎的:
社交媒体自动化平台:如果你的唯一目标是按照固定的时间表发送推文,你可以使用这个选项。像 Buffer 和 SocialOomph 这样的平台提供自动安排推文的服务。
- 优点:无代码,非常容易设置
- 缺点:只能通过付费订阅(Buffer)或有限免费计划(SocialOomph)获得
Amit Agarwal 的谷歌脚本:有一个流行的谷歌脚本用于制作 Twitter 机器人。它可以让你自动发送推文,发送直接信息,并以预定的速度转发。但你需要让它访问你的谷歌账户数据。这里有一个关于它的很好的教程。
- 优点:免费,低代码,易于设置
- 缺点:需要访问你的谷歌账户数据,除了预定义的行为之外很难定制,缺少文档
将机器人部署到服务器:如果你有技术背景,你可以用你喜欢的编程语言编写你的机器人,然后部署到服务器。有很好的 Python 和 NodeJS 的教程。
- 优点:完全可定制,免费或非常便宜
- 缺点:难以成立
如果你有一些编程经验,你可以走这条路。它允许你用 Python 或 NodeJS 这样的语言制作一个机器人,并把它部署成一个无服务器的功能。
- 优点:完全可定制,对许多用例都是免费的(使用 AWS Lambda 函数)
- 缺点:中等难度设置
这些是你可以用来制作机器人的选项。没有一个一定比其他的更好。根据你想用这个机器人做什么、你的编程经验和你的可用预算来做选择。
在下一节中,您将经历最后描述的选项。你将学习如何使用 Python 和 AWS Lambda 函数免费开发和部署一个简单的 Twitter 机器人。
注意:要阅读本教程,你必须了解 AWS Lambda 函数的基础知识,并具备 Python 的基础知识。
要快速了解 AWS Lambda 函数,请阅读这篇文章的简介
要了解 Python 的基础知识,请看一下这些资源
如何使用 Python 和 AWS Lambda 制作 Twitter 机器人
在本节中,您将使用 Python 开发一个 Twitter bot,并将其部署为 AWS Lambda 函数。它将遵循一个简单的规则:每天 10:00(UTC),它将从预定义的列表中随机发布一条推文。一旦你完成教程,你可以改变机器人的逻辑,以适应你的需要。
要创建您的机器人,您需要完成以下步骤:
- 建立一个 Twitter 开发者账户
- 创建一个 Twitter 应用
- 在本地开发你的机器人
- 将您的 bot 部署为 AWS Lambda 函数
最后,在继续之前,您必须准备好以下事项:
- 一个你想用作机器人的推特账号
- 访问 AWS 账户
- Python > =3.8
- Git
- 码头工人
- 如果你运行的是 Windows ,你将需要 WSL
建立一个 Twitter 开发者账户
首先在这里申请一个开发者账号的权限。
在上,你使用 Twitter 开发者工具的主要原因是什么?部分选择制作机器人。

作者图片
在上填写您的详细信息这是您,对吗?章节并继续。在下一个板块,你将如何使用 Twitter API 或 Twitter 数据?有点繁琐。您需要在多个地方描述您计划如何使用 API。
下面是我如何完成的一个例子,用你的话说描述:

作者图片
使用与我上面提供的描述不同的描述。Twitter 可能会自动检查非常相似的描述,并可能会将它视为垃圾邮件,从而延迟您的申请。
然后,在细节子标题下,为选择是您计划分析 twitter 数据吗?和您的应用会使用推文、转发、赞、关注或直接消息功能吗?提问。其他选择否。

作者图片
完成申请后,会要求您检查详细信息并接受 Twitter 开发者协议。

作者图片
最后,您需要确认您的电子邮件,一旦您的帐户获得批准,您就可以创建新的应用程序。这可能需要 48 小时。
一旦您能够访问 Twitter 开发者门户,请继续下一部分。
创建一个 Twitter 应用
在您的 Twitter 开发者账户被批准后,您将收到一封电子邮件,指引您进入 Twitter 开发者门户。您将为您的应用程序选择一个名称,并获得您的 API 密钥。然后,你将被重定向到你的应用程序设置。
在您的应用设置中,编辑您的应用权限。

作者图片
将您的应用权限从读取更新为读取和写入并保存更改。

作者图片
更新应用权限后。转到密钥和令牌。在那里,您需要重新生成 API 密钥和秘密,并生成访问令牌和秘密。

作者图片
你需要这些凭证来自动访问你的 Twitter 账户。把它们存放在安全的地方。
就是这样。你都准备好了。是时候让你的机器人在你的本地机器上工作了。
在本地机器上开发你的机器人
为了快速测试和做出更改,您将在本地使用您的机器人。一旦您对它的行为感到满意,您就可以将其打包并作为 AWS Lambda 函数进行部署。为了帮助你打包你的机器人,你将使用一个库和一些有用的脚本。
按照以下步骤设置您的本地开发环境:
1.在你的本地机器上克隆这个库
2.转到项目的根目录,创建一个虚拟环境并激活它:
$ python3 -m venv venv
$ source venv/bin/activate
3.使用 pip 在虚拟环境中安装所需的库:
(venv) $ pip install -r requirements.txt
4.在项目的根目录下创建一个名为.env的文件。将您的 Twitter 应用密钥和令牌放在那里:
ACCESS_TOKEN=<YOUR_ACCESS_TOKEN_HERE>
ACCESS_TOKEN_SECRET=<YOUR_ACCESS_TOKEN_SECRET_HERE>
CONSUMER_KEY=<YOUR_CONSUMER_KEY_HERE>
CONSUMER_SECRET=<YOUR_CONSUMER_SECRET_KEY_HERE>
到目前为止,您的项目结构应该如下所示:
twitter-bot-python-lambda/
├── venv/
│
├── src/
│ ├── lambda_function.py
│ └── tweets.csv
│
├── .env
├── buildpackage.sh
├── createlambdalayer.sh
├── entrypoint.py
├── LICENSE
├── README.md
└── requirements.txt
以下是这些文件的用途:
venv/:包含项目所需库的虚拟环境src/lambda_function.py:包含你的机器人逻辑的 Python 脚本。您将打包这段代码,并将其上传到 AWS Lambda 函数。src/tweets.csv:你的机器人用来发布的预定义 tweets 列表。这也包含在你上传到 Lambda 函数的包中。.env:包含您认证 Twitter API 的凭证的文件。它用于在本地测试你的机器人。buildpackage.sh:将src/的内容打包成一个名为lambda_function.zip的文件的实用函数。您将把这个文件上传到 Lambda 函数。createlambdalayer.sh:将需求中指定的库打包到一个名为layer.zip的文件中的实用函数。你将上传这个文件到一个 Lambda 层。entrypoint.py:您将用于本地测试您的机器人的 Python 脚本requirements.txt:指定项目所需库的标准方式LICENSE和README.md:存储库的许可和描述
存储库中最重要的文件是lambda_function.py。在其中,您将为您的机器人定义逻辑:
import os
import random
import json
from pathlib import Path
import tweepy
import csv
ROOT = Path(__file__).resolve().parents[0]
def get_tweet(tweets_file, excluded_tweets=None):
"""Get tweet to post from CSV file"""
with open(tweets_file) as csvfile:
reader = csv.DictReader(csvfile)
possible_tweets = [row["tweet"] for row in reader]
if excluded_tweets:
recent_tweets = [status_object.text for status_object in excluded_tweets]
possible_tweets = [tweet for tweet in possible_tweets if tweet not in recent_tweets]
selected_tweet = random.choice(possible_tweets)
return selected_tweet
def lambda_handler(event, context):
print("Get credentials")
consumer_key = os.getenv("CONSUMER_KEY")
consumer_secret = os.getenv("CONSUMER_SECRET")
access_token = os.getenv("ACCESS_TOKEN")
access_token_secret = os.getenv("ACCESS_TOKEN_SECRET")
print("Authenticate")
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
print("Get tweet from csv file")
tweets_file = ROOT / "tweets.csv"
recent_tweets = api.user_timeline()[:3]
tweet = get_tweet(tweets_file)
print(f"Post tweet: {tweet}")
api.update_status(tweet)
return {"statusCode": 200, "tweet": tweet}
这是lambda_function.py的代码。它有三个部分:导入库、get_tweets函数和lambda_handler函数。
在第一部分中,您导入所需的库。除了一些标准库之外,您还导入了tweepy,您将使用它与 Twitter API 进行交互。然后,将lambda_function.py所在的路径存储在一个名为ROOT的变量中。
import os
import random
import json
from pathlib import Path
import tweepy
import csv
ROOT = Path(__file__).resolve().parents[0]
接下来,你定义get_tweet。它接受两个参数,并返回您的机器人将在 tweet 上发布的文本。看看它是如何工作的:
def get_tweet(tweets_file, excluded_tweets=None):
"""Get tweet to post from CSV file"""
with open(tweets_file) as csvfile:
reader = csv.DictReader(csvfile)
possible_tweets = [row["tweet"] for row in reader]
if excluded_tweets:
recent_tweets = [status_object.text for status_object in excluded_tweets]
possible_tweets = [tweet for tweet in possible_tweets if tweet not in recent_tweets]
selected_tweet = random.choice(possible_tweets)
return selected_tweet
返回你的机器人将要发布的文本。它的第一个参数tweets_file是指向csv文件的路径,在这个文件中存储了预定义的 tweets 列表。第二个是excluded_tweets,是来自 Twitter API 的推文列表,您可以使用它来避免发布最近的推文。
最后,您定义了lambda_handler函数:
def lambda_handler(event, context):
print("Get credentials")
consumer_key = os.getenv("CONSUMER_KEY")
consumer_secret = os.getenv("CONSUMER_SECRET")
access_token = os.getenv("ACCESS_TOKEN")
access_token_secret = os.getenv("ACCESS_TOKEN_SECRET")
print("Authenticate")
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
print("Get tweet from csv file")
tweets_file = ROOT / "tweets.csv"
recent_tweets = api.user_timeline()[:3]
tweet = get_tweet(tweets_file)
print(f"Post tweet: {tweet}")
api.update_status(tweet)
return {"statusCode": 200, "tweet": tweet}
lambda_handler在 AWS Lambda 功能被触发时执行。它从环境变量中获取 Twitter 凭证,使用 Twitter API 认证您的 bot,获取最后 3 条 tweet,并发布由get_tweet检索的 tweet。
其余的文件您不需要详细查看。但是如果你好奇的话,可以自己去看一看。
现在一切都设置好了,你只需要遵循这个开发工作流程:
- 在
lambda_function.py中定义你的机器人的逻辑 - 通过从项目的根目录执行
$ python entrypoint.py来测试变更
一旦你对你的机器人的行为感到满意,打包代码:
- 向
requirements.txt添加您使用过的任何附加库 - 从项目的根目录运行
sh createlambdalayer.sh 3.8。它将在requirements.txt中为layer.zip中的 Python 3.8+运行时打包库 - 从项目的根目录运行
sh buildpackage.sh。它将为你的 Lambda 函数生成一个名为lambda_function.zip的 zip 文件
接下来,您将学习如何让您的 bot 进入 AWS Lambda 函数。
将您的 Bot 部署为 AWS Lambda 函数
将你的 bot 设置为 Lambda 函数很简单,但是你必须有条不紊地按照步骤进行。让我们过一遍细节。
首先,您将使用 bot 代码中使用的库(您之前生成的layer.zip文件)创建一个 Lambda 层。其次,您将创建一个 Lambda 函数,上传您的机器人代码(lambda_function.zip),并添加您创建的层。最后,您将添加一个触发器,该触发器将在每天 10.00 (UTC)执行您的 Lambda 函数。)
让我们从创建一个图层开始。
在服务下拉菜单中搜索λ。选择第一个选项(λ。)

作者图片
点击侧边栏上下的层。然后,选择创建图层。**

作者图片
在创建层部分,为您的层选择一个名称,上传您之前生成的layer.zip文件,并选择 Python 3.8 运行时。

作者图片
仅此而已!你刚刚创建了你的 Lambda 层。不错吧。
接下来,您将创建一个新的 Lambda 函数。
选择侧边栏上的功能。然后,点击创建功能。

作者图片
接下来,为您的函数选择一个名称,并选择 Python 3.8 运行时。

作者图片
你成功了!
接下来,您将上传您的代码,将 Lambda 层添加到您的函数中,并为它定义一个预定的触发器。
要上传代码,进入功能代码区,点击动作、并选择上传一个. zip 文件。上传lambda_function.zip并保存您的更改。

作者图片
除了代码之外,您还需要添加 Twitter API 键作为环境变量。转到环境变量,点击编辑,并将变量添加为键值对:

作者图片
接下来,您将向函数添加 Lambda 层。
选择图层和图层点击添加一个图层。

作者图片
在下一个屏幕上,选择自定义图层并找到您创建的图层。然后点击添加。

作者图片
现在,您已经上传了代码,设置了环境变量,并添加了层。您只是缺少执行您的功能的触发器。
选择添加触发器选项开始添加索具。

作者图片
在下一个屏幕中,按如下方式填写必填字段:

作者图片
此触发器将在每天 10.00 (UTC)执行您的 Lambda 函数。)如果你想添加一个不同的触发器,看看调度表达式文档。
最后,剩下的唯一一件事就是测试你的 Lambda 函数。点击测试按钮进行测试。它会要求您配置一个测试事件,您可以使用默认值。

作者图片
如果一切顺利,在您测试您的函数之后,您会看到一个绿色的横幅,上面有执行结果:成功消息。否则,返回到前面的步骤,并确保您正确设置了所有内容。你也可以留下评论,我会尽力帮你解决的。
结论
干得好!你的推特机器人活蹦乱跳,或者说,推特;)
您经历了开发和部署 Twitter bot 的端到端过程。创建和配置 Twitter 应用程序、在本地机器上开发 bot 的逻辑、创建和配置 AWS Lambda 函数来部署 bot 是一条漫长的道路。
在本教程中,您已经学习了:
- 什么是推特机器人,它们能做什么,不能做什么
- 你有哪些选项来制作推特机器人
- 如何在你的本地机器上使用 Python 开发一个机器人
- 如何使用 AWS Lambda 函数将您的 bot 部署为无服务器函数
如果你觉得这有用,请在 Twitter 上表达你的爱。
如何以编程的方式为你的博客制作文字云?
Python 中的文本语料库可视化工具
最近,我需要一张我们博客的图片,希望它有一些哇效果,或者至少有一个比我们一直使用的任何典型的更适合。思索了一会儿,云字在脑海中闪过。💡通常,你只需要一长串文本就可以生成一个,但我想到了解析我们的整个博客数据,看看是否有什么有趣的东西冒出来,并获得我们博客使用的关键词的整体视图。所以,我把这个作为自己的周末趣味项目。
PS:形象在营销中非常重要。给它质量!👀
弄脏你的手:
我们的博客托管在Ghost上,它允许我们将所有的帖子和设置导出到一个单独的、精彩的 JSON 文件中。而且,我们在 python 中内置了 json 包,用于解析 json 数据。我们的舞台已经准备好了。🤞
对于其他流行的平台,如 WordPress,Blogger,Substack 等。 它可能是一个或多个 XML 文件,你可能需要相应地切换包并在 python 中做基础工作。
在阅读 python 中的 JSON 之前,您应该了解它的结构、需要阅读的内容、需要过滤的内容等等。为此,使用一些 json 处理器来漂亮地打印你的 JSON 文件,我使用了jqplay.org,它帮助我找出我的帖子位于➡
t0】
接下来,您想调用pd.json.normalize()将您的数据转换成一个平面表,并保存为一个数据框。
👉注意:你应该已经为
*pd.json.normalize()*安装了熊猫的更新版本,因为它已经修改了旧版本中的名字。另外,保持编码为 UTF-8,否则,你很可能会遇到 UnicodeDecodeErrors。(我们有这些坏人:' \xa0 '、' \n '和' \t '等。)
*import pandas as pd
import jsonwith open('fleetx.ghost.2020-07-28-20-18-49.json', encoding='utf-8') as file:
data = json.load(file)
posts_df = pd.json_normalize(data['db'][0]['data']['posts'])
posts_df.head()*

发布数据框架
查看数据帧,您可以看到 ghost 保留了我们创建的帖子的三种格式, mobiledoc (没有 HTML 解析器的简单快速呈现器)、HTML 和明文,以及帖子的其他属性范围。我选择使用明文版本,因为它需要最少的清理。
清洁工作:
- 删除丢失的值(你可能有的任何空白帖子),以免在以后绘制图表时妨碍你的分析。我们有一篇草稿中的博客文章,里面什么也没有。🤷♂️
- 帖子中的 明文 几乎包含了所有可能不需要的字符,从空格和制表符 (\n,\xao,\t) ,到语法标点符号(点、逗号、分号、冒号、破折号、连字符、s 等)的 14 个标记。)甚至是要点。用空格替换它们。
- 接下来,我将每篇博文中的单词拆分到 明文 列下,然后将每个单元格的结果列表连接起来,得到一个很长的单词列表。这导致了 34000 字;我们有大约 45 篇已发表的博客,每篇平均 700 字,还有一些草稿,所以算出来是 45700=31500 字。一致!🤜*
*posts_df.dropna(subset=['plaintext'], axis=0, inplace=True)posts_df.plaintext = posts_df.plaintext.str.replace('\n', ' ')
.str.replace('\xa0',' ').str.replace('.',' ').str.replace('·', ' ')
.str.replace('•',' ').str.replace('\t', ' ').str.replace(',',' ')
.str.replace('-', ' ').str.replace(':', ' ').str.replace('/',' ')
.str.replace('*',' ')posts_df.plaintext = posts_df.plaintext.apply(lambda x: x.split())
words_list =[]
for i in range(0,posts_df.shape[0]):
words_list.extend(posts_df.iloc[i].plaintext)*
如果你现在就渴望得到结果,你可以在那个words_list上运行collections.Counter,并获得每个词的频率,从而了解你的词云可能是什么样子。
*import collectionsword_freq = collections.Counter(words_list)
word_freq.most_common(200)*
猜猜博客中最常用的词是什么?🤞
如果你说【the】你就对了。对于非常长的文本,冠词‘the’将优先于任何其他单词。而且,不仅仅是“the ”,还有其他几个介词、代词、连词和动作动词出现在最高频率列表中。我们当然不需要它们,要移除它们,我们必须首先定义它们。幸运的是,我们将用来生成 wordcloud 的库自带了默认的停用词,但它相当保守,只有 192 个词。所以,让我们来看看自然语言处理(NLP)中的库,它们处理大量的文本并致力于此类任务。🔎
- 国家语言工具包库(NLTK):它有 179 个停用词,甚至比 wordcloud 停用词库还少。不要仅仅因为这个原因就给它一个邪恶的眼神,这是 python 中领先的 NLP 库。
- Genism:它的集合中有 337 个停用词。
- Sci-kit learn:他们还有一个 318 个单词的停用词库。
- 此外,还有 Spacy:它有 326 个停用词。
我选择了空间,你可以根据自己的喜好选择。
但是…😓
这还不够!不过,从营销的角度来看,有些词看起来不太好,而且我们也没有尽可能地做好清理工作。因此,我将它们放在一个文本文件中(每个单词占一行),然后读取它,并加入 spacy 的停用词表。
*import spacynlp=spacy.load('en_core_web_sm')
spacy_stopwords = nlp.Defaults.stop_wordswith open("more stopwords.txt") as file:
more_stopwords = {line.rstrip() for line in file}final_stopwords = spacy_stopwords | more_stopwords*
设立设计室:
现在我们已经准备好了重新设计的停用词表,我们可以调用神奇的制造者➡的单词云功能了。通过 Jupyter/CLI/Conda 使用 pip 命令安装 wordcloud 库。
*pip install wordcloudimport matplotlib.pyplot as plt
import wordcloud#Instantiate the wordcloud objectwc = wordcloud.WordCloud(background_color='white', max_words=300, stopwords=final_stopwords, collocations=False, max_font_size=40, random_state=42)# Generate word cloud
wc=wc.generate(" ".join(words_list).lower())# Show word cloud
plt.figure(figsize=(20,15))
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()# save the wordcloud
wc.to_file('wordcloud.png');*
对于 python 用户来说,上述代码块的大部分内容都是不言自明的,不过让我们做一个简短的介绍:
background_color:你的文字云的背景,黑白最常见。**max_words:你想在 wordcloud 中显示的最大字数,默认为 200 个。stopwords:要从 wordcloud 中删除的停用词集合。collocations:是否包含两个词的搭配(二元组),默认为真。
什么是二元模型?
这是两个相邻单词的序列。看看下面的例子。

句子的二元结构
注意:将所有文本以小写解析到 wordcloud generator,因为所有停用词都是以小写定义的。它不会消除大写停用词。
好的,输出是这样的:

博客数据的文字云
对于一个做车队管理的公司来说,这是正确的!车队管理这个关键词比什么都有分量。
虽然,上面的图片错过了所有这一切的元素:车辆。幸运的是,你可以用 wordcloud 库在你选择的图片上屏蔽上面的 wordcloud。所以,我们开始吧。
- 选择您选择的矢量图像。我从 Vecteezy 中挑选了我的图片。
这次您还需要导入 Pillow 和 NumPy 库来读取图像并将其转换为 NumPy 数组。 - 下面是生成屏蔽的 wordcloud 的注释代码块,大部分内容和以前一样。
*import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import os# Read your image and convert it to an numpy array.
truck_mask=np.array(Image.open("Truck2.png"))# Instantiate the word cloud object.
wc = wordcloud.WordCloud(background_color='white', max_words=500, stopwords=final_stopwords, mask= truck_mask, scale=3, width=640, height=480, collocations=False, contour_width=5, contour_color='steelblue')# Generate word cloud
wc=wc.generate(" ".join(words_list).lower())# Show word cloud
plt.figure(figsize=(18,12))
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show()# save the masked wordcloud
wc.to_file('masked_wsordcloud.png');*
以下是输出结果:

瞧啊。我们以编程的方式制作了我们的 wordcloud!🚚💨
谢谢你读到这里!🙌
参考:
- https://amueller.github.io/word_cloud/generated/wordcloud.WordCloud.html
- 【https://nlp.stanford.edu/fsnlp/promo/colloc.pdf】
如何让 AI 在疫情中更有用
是什么限制了深度学习帮助测试、预测和预防的魔力?从人工智能社区的讨论中得到的一些教训。
自动化被吹捧为未来十年的灵丹妙药,但是当我们现在需要它的时候会发生什么——它会发生吗?从我阅读和讨论的内容来看,并不受限于技术的能力,而是受限于我们在不同环境中应用技术的能力。疫情的快速进化伴随着大量的噪音而不是大量的信号,所以这里是我将传授的见解的概要:
- 一些人工智能方法是潜在的影响,现在。
- 需要联合学习 —来自 covid19 患者的数据目前被锁定在每个医院的基础上。
- 处理不一致数据的方法 —最先进的方法在数据集上工作,当我们共享扫描时会发生什么?
- 整合 —医生需要能够使用这些工具。

来源—作者。
AI 能做什么?
人工智能可以提供帮助的方式数不胜数,我将分享几个:
- 强化学习 —将呼吸机的使用制定为一个强化学习游戏,这样我们可以更好地在短缺的高危患者中共享呼吸机。
- 计算机视觉n——用于未来患者风险的时不变图像分类器(不是每个住院的人都在相同的几天前生病)。
- 自我监督学习— 不断接受新数据并为不同子群的风险创建决策边界的辅助工具。对于医生来说,它将给出一个初始的行动过程,通过合并病人的个人资料来模仿过去的病人。

照片来自 Pexels
限制因素
数据被锁定—联合学习在哪里?
目前,为了将数据从一家医院传递到另一家医院,或者从一家医院传递到一群人工智能研究人员,律师必须为每个相关成员起草合同。
匿名数据需要能够流向一个安全的位置,即联邦位置,在那里可以优化模型。

照片由来自 Pexels 的 panumas nikhomkhai 拍摄
联合学习是消除这一障碍的工具。
联合学习是一种结构化、安全的设置,其中数据流向一个中心位置进行模型训练和分析。在医疗保健行业,该中心位置可以对个人身份信息进行加密和保护(PII),以便 1)技术公司(不会将个人识别为处于风险中,并向保险提供商出售该信息……)以及 2)可以创建更统一的全国性数据集。
- 我在 2019 年 12 月的这篇反思 AI 的文章中写了更多。
- 更多信息可以从谷歌,医疗和评论中找到。
数据一塌糊涂
从结构化数据集(基线)到现实世界实现的差距是明显的。在现实世界中,我们有来自不同医院和不同机器的数据。

胸部扫描是 covid19 患者的主要诊断手段。来源。
我们如何保证我们的模型在最先进的胸部 x 射线上具有恒定的性能,而不是为新患者从仓库中取出的十年前的机器?
医生在 covid19 上使用的主要初始诊断是胸部扫描。它显示了肺部结构的损伤程度。医生可以很容易地说出当前的风险水平,但很难预测未来的风险(来源 NYU 医生)。我们认为人工智能可以有所帮助,因为计算机视觉已经在许多其他任务中发挥了作用。
希望是有的,但是模型在历史上很难适应分布转移——验证(测试)集从训练集变化而来。我们需要更好的方法来 1)解决训练时的这种转变,或者 2)使用新的验证集进行微调(元学习?).相关来源是这里和这里。
没有人告诉医生如何使用它
医生需要有用且直观的工具。对病人来说,屏幕时间有增加而面对面时间减少的趋势。有人会认为这让医生更愿意使用自动化技术,但事实未必如此。
如果没有医生的参与,医疗技术通常是一种负担。
这听起来就像是如果机器学习研究人员希望医生对患者数据进行这样的工作流时会发生的事情:
git clone new-classifier.git
conda export stuff.yaml
python setup [] .e
python model/train.py data=43
做这件事有什么更好的方法?我认为需要一个完全不同的数据流。也许这可以内置到联合学习中,也许不能。这是下一次紧急情况需要改进的领域,因为现在我们需要利用我们已经得到的东西,并且知道 医生没有时间学习和调试人工智能模型。
这是另一篇关于技术和医疗保险互操作性困难的文章,以及这是如何减少病人有效时间的。
让我向你保证,人工智能社区真的很想帮忙。我们知道这些问题可以用简单的方法解决,但当拯救生命遇到额外的障碍时,医生和计算机工程师都感到愤怒。

关闭使得海湾地区的空气质量指数出现了前所未有的上升。来源——隔离骑自行车。
这些想法的灵感来自加州大学伯克利分校教授的电子邮件,NYU 医学和脸书人工智能研究合作的首次会议,以及将想法付诸实践的愿望。我希望我们现在可以通过了解缺点和为未来的挑战做准备来发挥作用。
注意安全,好好待着!
更多?订阅我关于机器人、人工智能和社会的时事通讯!
一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…
robotic.substack.com](https://robotic.substack.com/)
如何用 Python 制作分析工具

在 Unsplash 上由 Carlos Muza 拍摄的照片
S 自从去年 10 月的新政策以来,Medium 以不同的方式计算收益并且每天更新它们。在改变之前,它是基于成员的鼓掌次数和他们自己鼓掌的数量,但现在它是基于阅读时间。类似于 youtube 的算法,就是观看时间。
重要的是,它每天都在更新,你想知道在过去的 30 天里,你的故事制作了多少,有多少浏览量。
作为制作这个简单分析工具的示例网站,我们就拿中来说。但是你基本上可以在任何有你需要的统计数据的网站上做这件事。
这是 Python 的一个非常简单的用法,你不需要任何特殊的或者相当惊人的技能来和我一起做这件事。我们将一步一步来,从头开始建设一切。
让我们直接投入进去吧!

马克斯·杜济在 Unsplash 上拍摄的照片
编码
规划流程
构建这样一个工具需要几个步骤,首先,我们必须了解如何获得我们想要的东西。这是我们进入 Medium 欢迎页面的地方。

媒体的欢迎屏幕
它相当简单,我们有登录/注册按钮。我们将使用这些来登录我们的个人资料。我们将使这个工具自动化,让它点击、填写电子邮件、密码并让我们登录。之后,我们将得到我们需要的数据。
设置环境
你将不得不安装一个 chrome 驱动程序,它将使我们能够操作浏览器并向它发送命令以供测试和使用。
打开链接并下载适用于您的操作系统的文件。我推荐最新稳定版,除非你已经知道自己在做什么。
接下来,您需要解压缩该文件。我建议进入文件,通过右键单击手动操作,然后单击“Extract here”。

在文件夹里面,有一个名为“chromedriver”的文件,我们必须将它移动到你电脑上的特定文件夹中。
打开终端,键入以下命令:
**sudo su** #enter the root mode
**cd** #go back to base from the current location
**mv /home/*your_pc_name*/Downloads/chromedriver /usr/local/bin**
#move the file to the right location
请插入您的实际电脑名称,而不是您的电脑名称。
完成后,我们打开编辑器。我个人选择的是 Visual Studio 代码。它简单易用,可定制,并且对你的计算机来说很轻。
打开一个新项目,创建两个新文件。这是一个我的例子,看起来可以帮助你:

Visual Studio 代码—项目设置
在 VS 代码中,有一个“Terminal”选项卡,您可以使用它打开 VS 代码中的内部终端,这对于将所有内容放在一个地方非常有用。
当你打开它时,我们还需要安装一些东西,那就是虚拟环境和用于 web 驱动程序 selenium。在您的终端中键入这些命令。
pip3 install virtualenv
source venv/bin/activate
pip3 install selenium
激活虚拟环境后,我们就完全准备好了。
创建工具
我们将把它创建为一个类,并为它创建函数。所以我们开始吧!
用任何名字创建你的工具并启动 Chrome 的驱动程序。
class MediumBot():
def __init__(self):
self.driver = webdriver.Chrome()
这就是我们开始发展所需要的一切。现在转到您的终端并键入:
python -i scrape.py
这个命令让我们把我们的文件作为一个互动的游乐场。浏览器的新选项卡将会打开,我们可以开始向它发出命令。
如果你想试验,你可以使用命令行,而不是直接输入到你的源文件中。只是用 bot 代替 self 。
对于终端:
bot = MediumBot()
bot.driver.get('https://medium.com/')
现在来看看源代码:
self.driver.get('https://medium.com/')
现在,我们转到了灵媒欢迎页面,接下来我们需要登录。我们检查元素(键盘上的 F12)并复制元素 XPath。

右键单击标记为蓝色代码部分,并通过 XPath 进行复制。接下来,我们必须发出命令来为我们单击那个按钮。
**sign_in** = self.driver.find_element_by_xpath('//*[@id="root"]/div/div[4]/div/div/div[3]/div/div[2]/h4/a')
sign_in.click()
单引号(')是我的 XPath,如果你在做其他网站,你必须调整你的 XPath。
我将 XPath 保存到一个变量中,并对其执行 click()函数。
我已经做了两种类型的登录,分别是谷歌和脸书,你也可以选择哪种方法更适合你,但关闭双因素认证,这样这个过程会更容易。
对于脸书方法,您将选择“使用脸书登录”按钮,获取它的 XPath 并再次单击它。

现在我们必须输入我们的用户名和密码,我们通过 send_keys()函数来完成。

再次选择文本框,现在只需向该字段发送文本,如下所示:
email_in = self.driver.find_element_by_xpath('//*[@id="email"]')email_in.send_keys(username)
对密码做同样的操作,然后用 click()函数登录。登录后,我们可以访问我们想要的数据,我写了两个独立的函数来获得收入和你的故事的浏览量。
第一次查看:
def stats(self):
self.driver.get('https://medium.com/me/stats')
sleep(3)
total_views = self.driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div[3]/div/ul/li[1]/div/div[1]')
print(total_views.text)
现在是收益:
def earnings(self):
self.driver.get('https://medium.com/me/partner/dashboard')
sleep(3)
total_earnings = self.driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div[3]/section/div/div[2]/div/div/div/div[3]')
print(total_earnings.text)
在这两个示例中,我使用了 sleep()函数,该函数允许我将进一步的执行暂停一段时间,因此 sleep(1)将暂停 1 秒钟。你必须在代码的开头导入它。
一旦你提取完数据。您现在所要做的就是在类外创建这个工具的一个实例,并对它执行一个函数。
bot = MediumBot()
bot.login_facebook()
保存并运行脚本。亲眼目睹奇迹的发生!

我的分析
以下是我的 GitHub 页面上的完整代码:
为你的故事收集收入和数据。通过在…上创建帐户,为 lazargugleta/mediumBot 的发展做出贡献
github.com](https://github.com/lazargugleta/mediumBot/blob/master/scrape.py)
此外,您可以更改 creditentials.py 并用您自己的数据填充它以便登录。
我们完了!
后续步骤
如果你想更进一步,你还可以实现一些功能,比如在你达到某个目标时发送电子邮件,或者提取你想要跟踪数据的特定故事的数据。
我希望你喜欢这个小教程,并关注我更多!
感谢阅读!
跟着我上中型
在推特上关注我
如何使用 Folium 和 Imageio 在 Python 中制作动画 GIF 图
巴西高等教育史的可视化分析

罗马法师在 Unsplash 上拍摄的照片
最近一直在清理分析巴西高等教育机构(HEI)的数据。巴西“INEP 国家教育研究学院”保存了来自基础教育和高等教育学生、教师和机构的大量微观数据,以及来自衡量课程质量和学生学习发展的外部评估的数据。
有大量研究(学术或非学术)分析巴西的基础教育(小学和中学)数据。在我攻读经济理论硕士学位期间,我调查了社会配额对公立高中学生在中学期末择校的影响。
分析高等教育数据的研究不太常见,尤其是在巴西大学之外。鉴于这种现象,我开始组织、描述和翻译关于巴西高等教育的数据和信息。这一系列文章是将巴西高等教育数据的使用推广到巴西以外的首次尝试。
在这篇文章中,我强调了在更广泛的研究中产生的一个结果。也就是说,创建一组 choropleths 的代码映射了不同年份的图像,并将其转换为 Gif。
该产品
在乞讨,我的主要目标是有一个视觉代表的地理分布的高等教育提供多年来在巴西。我猜想巴西的大部分地区仍然没有机会接受高等教育。此外,考虑到过去 20 年公立高等教育机构的扩张过程众所周知(至少对巴西人而言),这一过程在中小城市的密集程度更高,我认为这张“高等教育普及图”最近有了很大改善。
为了达到这个目标,我选择每十年绘制一张 choropleth 地图,从第一个仍在进行的高等教育课程建立的那一年开始。幸运的是(或者不是),最终的产品表明我之前的猜测是正确的。
库导入
这个项目中使用了两个主要的库:
- 首先是 Imageio。这个库用于追加。png 文件在一个动画 gif。有关该库的更多信息,请点击此处。以下是 Imageio 网站上的简短描述:
Imageio 是一个 Python 库,它提供了一个简单的界面来读写各种图像数据,包括动画图像、体积数据和科学格式
- 第二个是令人惊叹的叶库。follow”使得在交互式传单地图上可视化用 Python 处理的数据变得容易。''.基本上,使用 leav,您可以轻松地创建以任何位置为中心的地图,自定义其样式,并根据位置输入或在 GeoJson 文件中添加标记、颜色和其他功能。
此外,其他库用于提取. zip 文件(zipfile)、打开 HTML 文件和截图(webdriver)、读取 json 文件(Json)、裁剪图像(Image)、定义色标(braca.colormap)、管理数据框(pandas)等等。以下是完整的列表:
数据
巴西高等教育普查带来了每个机构、课程、学生和教师的年度数据。这是一个公开的非常丰富的数据集,还没有被广泛探索。为了制作这个产品,我使用了 2018 年微数据中的课程数据。
下面的代码从 INEP 网站提取微数据文件,解压并组织到项目文件夹中,读取 pd.dataframe 中的课程数据
“清洗”
实际上,对于这个分析,不需要对课程数据框架进行重大清理。只有两列用于制作地图:
- “城市”,代表提供课程的城市的 id;和
- “DT_INICIO_DE_FUNCIONAMENTO”,表示课程开始提供的日期。
在只保留上述两列之前,我从数据库中删除了在线课程(约占所有课程的 8.3%)
从“DT_INICIO_DE_FUNCIONAMENTO”开始,我创建了一个新列“FOUNDATION_YEAR”,它仅指示课程开始提供的年份,不包括成立的月份和日期。

图 1 —缺失值分布的热图
快速“nan”值检查显示,FOUNDATION_YEAR 的 nan 值为 2.700(数据框的 5.1%)。热图(图 1)显示,这些缺失值在各个城市中分布良好。我在这里的选择是简单地放弃所有这些 nan 值。一个异常值也被删除。一门据说始于 2917 年的课程
清理课程数据框的代码描述如下。
GeoJSON 文件
为了制作 choropleth 地图,我们需要地理区域的 JSON 或 shapefile。巴西各城市的 GeoJSON 可在 Git 上获得。这项工作的一个小而有趣的改编是使用州或微区域边界,而不是市政当局。
下面的代码使用 JSON 库读取 GeoJSON 文件
由于没有任何高等教育课程的城市没有出现在我们的课程数据框架中,因此有必要将其包括在内。否则,当我们“绘制”地图时,这些城市将会消失。
下面的代码根据 GeoJSON 文件创建了一个包含所有城市 id 的字典,以供将来使用。
设置色彩映射表比例
我选择在每年的课程总数中应用 np.log。我这样做是因为圣保罗(巴西最大的城市)等城市的球场数量比小城市多得多(小城市通常提供不到 12 个球场)。对数函数有助于我们获得更均匀的色彩映射表。

图 2 —我们的色图量表(所有球场的记录)
创建自第一个球场成立以来每十年的 choropleth 地图
下面是一步一步地创建和颜色的地图使用叶。欢迎对改进代码和描述质量提出任何疑问或建议。
关闭地图缩放控制
树叶地图带有缩放控制,类似于谷歌地图的功能。考虑到我们将为每十年创建一个图像,而不是一个交互式的 HTML,我选择使用下面的代码去掉这个缩放控件。基本上,fileinput 函数打开每个 HTML 代码,将“zoomControl: false”替换为“zoomControl: true”,并以相同的名称保存文件。
将 HTML 文件转换为 PNG
要创建 Gif,需要的是图像,而不是 HTML 文件。不幸的是,follow 只生成 HTML 地图。下面的代码打开所有这些 HTML,一次一个,截取一个屏幕截图,并保存为. png 文件。
重要的是选择一个延迟,保证浏览器在截图之前有时间加载地图。
裁剪图像以获得更好的视觉效果
截图捕捉了地图外的大量空白空间。我用过。从 PIL 图像裁剪功能,以调整图像的大小,只保留我们的文件的“心脏”。
最后(!),使用 Imageio 创建我们的 Gif 地图
Imageio 使得追加非常简单。png 文件,并将其转换为动画 gif,每秒帧数(fps)可配置。为了保持我的项目文件夹整洁,我还删除了所有的 png 文件。
决赛成绩
好的。就是这样!:)下面是最终结果:

图 3 —我们的 Gif 地图,显示了几十年来每个直辖市的高等教育课程总数
超越
有了来自高等教育普查微观数据的“DM_CURSOS”数据库,我们可以做得更多。例如,可以区分私人和公共课程,在线和课堂,并获得每个城市的学生总数,而不是课程总数。
稍后,我将尝试为每个城市创建一个高等教育提供指数,比较公立和私立机构提供的席位数量以及高中最后一年注册的学生数量。
如果你想知道更多关于巴西高等教育的数据,我邀请你阅读这些帖子关于巴西高等教育的可用数据和我已经使用的的分析。如果你有什么建议,随时联系我。
如何在 R 中制作漂亮的小型多用户地图
一行代码就能让你的可视化更上一层楼

我最近偶然发现了一个关于美国难民接收情况的大型数据集。它包括难民来自的、以及前接收难民的各州的数据。
在之前的项目中,我探索了迁徙是如何在个地方展开的:迁徙者在哪里旅行,他们在哪里失踪,以及他们的旅程在哪里到达致命的终点。
有了这个新的数据集,我想看看收容国是如何应对移民和难民危机的,特别关注美国。在我看来,美国对日益增加的难民数量的反应的有效可视化需要呈现两件事:难民接受度如何随着时间的推移而变化以及各州难民接受度如何不同。**
呈现这两种趋势的一种有效方式是使用小型多重折线图。出于审美的目的,将这些倍数排列成一种隐约类似美国的形状也是不错的。(这也让读者更容易找到自己感兴趣的状态。)
互联网上有这种小型多重地图的例子。《华盛顿邮报》对选举团的概述如下:

你也可以在 PolicyViz 博客上找到为什么有效的概述,以及一些额外的例子:

在 R 制作
在 R 中创建一个小的多瓦片栅格地图的过程相对容易(就像在 R 中完成的大多数事情一样)。这在 D3.js 中要困难得多;如果你对那类事情感兴趣,你可以看看这个代码寻找灵感。
步骤 1:构建基本折线图
第一步(在讨厌的数据合并和清理之后)是对基本线图有个感觉。为了做到这一点,我们可以想象出所有州接受难民的宏观趋势。**
(变量名怪怪的;region_name_3对应年份,textbox37代表接受的难民人数。)
*data %>%
group_by(region_name_3) %>%
summarise(textbox37 = sum(textbox37)) %>%
ggplot(aes(x = region_name_3, y = textbox37)) +
geom_line() +
labs(title = "Refugee Acceptance on the Decline",
subtitle = "Number of refugees accepted annually, 2002 - 2019",
x = element_blank(),
y = element_blank()) +
scale_y_continuous(labels = scales::comma_format()) +
scale_x_continuous(breaks = c(2002, 2019))*

现在我们有了第一个问题的答案:随着时间的推移,难民接受度发生了怎样的变化?答案是:非常剧烈。美国在 2016 年接收了近 10 万名难民;两年后,这个数字刚刚超过 20,000。
第二步:做小倍数
接下来,我们制作 50 行:每一行代表美国的一个州。我们使用瑞安·哈芬的geofacet 软件包来实现。
这很简单,只需在我们之前的绘图中添加一行代码:
*facet_geo(~ state)*
这使得一个情节看起来像这样:

还可以,但不完美!我们肯定可以做一些改进。
首先,轴标签重叠。我们已经知道年份的范围是 2002 年到 2019 年之间(在我们的字幕里!).所以我们可以去掉 x 轴标签。
*theme(
axis.text.x = element_blank(),
axis.ticks.x = element_blank()
)*
第二,轴线(在两个轴上)似乎是不必要的,并且(特别是 x 轴)有时可以隐藏那些具有较低值的状态的趋势。让我们把那些也拿掉!
*theme(
axis.line.x = element_blank(),
axis.line.y = element_blank()
)*
最后,我不喜欢我的轴标签周围巨大的灰色方框。我们能让它们透明吗?
*theme(
strip.background = element_rect(color = "white")
)*
将所有这些加在一起(并调整字体大小),我们得到这样的结果:
*data %>%
group_by(region_name_3, state) %>%
summarise(textbox37 = sum(textbox37)) %>%
ggplot(aes(x = region_name_3, y = textbox37)) +
geom_line(color = "black") +
scale_x_continuous(breaks = c(2002,2019)) +
scale_y_continuous(breaks = c(0,12000)) +
facet_geo(~ state, grid = "us_state_grid1") +
labs(title = "Refugee Acceptance on the Decline",
subtitle = "Number of refugees accepted annually, 2002 - 2019",
x = element_blank(),
y = element_blank()) +
theme(
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.line.x = element_blank(),
axis.line.y = element_blank(),
plot.title = element_text(size = 24),
plot.subtitle = element_text(size = 18),
strip.background = element_rect(color = "white")
)*

好多了。但是我们仍然可以添加一些元素来使我们的可视化更上一层楼。
因为我们的数据跨越了近 20 年(2002 年至 2019 年),所以我们可以用其他感兴趣的变量来覆盖我们的小倍数,例如在特定时期谁是总统。
我们使用geom_rect来实现:
*geom_rect(mapping=aes(xmin=2009, xmax=2017, ymin=0, ymax=12000),
fill = "#ADD8E6", alpha = .05) +
geom_rect(mapping=aes(xmin=2017, xmax=2019, ymin=0, ymax=12000),
fill = "#FF9999", alpha = .05) +*
第一行代码创建了一个跨越 2009 年到 2017 年(奥巴马任期)的蓝盒子。第二行为特朗普的总统任期创建了一个红框(到目前为止)。
综上所述,代码和输出如下所示:
*data %>%
group_by(region_name_3, state) %>%
summarise(textbox37 = sum(textbox37)) %>%
ggplot(aes(x = region_name_3, y = textbox37)) +
geom_line(color = "black") +
geom_rect(mapping=aes(xmin=2009, xmax=2017, ymin=0, ymax=12000), fill = "#ADD8E6", alpha = .05) +
geom_rect(mapping=aes(xmin=2017, xmax=2019, ymin=0, ymax=12000), fill = "#FF9999", alpha = .05) +
scale_x_continuous(breaks = c(2002,2019)) +
scale_y_continuous(breaks = c(0,12000)) +
facet_geo(~ state, grid = "us_state_grid1") +
labs(title = "Refugee Acceptance on the Decline",
subtitle = "Number of refugees accepted annually, 2002 - 2019",
x = element_blank(),
y = element_blank()) +
theme(
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.line.x = element_blank(),
axis.line.y = element_blank(),
plot.title = element_text(size = 24),
plot.subtitle = element_text(size = 18),
strip.background = element_rect(color = "white")
)*

我把这个情节带到 Illustrator 中,让它看起来漂亮多了。这是最终版本:

我们注意到了什么?几个关键的州(德克萨斯州、加利福尼亚州、佛罗里达州和密歇根州)占了难民接收人数的绝大部分,而其他州几乎不接收难民。自 2017 年以来,几乎每个州都减少了难民接收量,但这一下降的大部分来自这些较大的州。
康纳·罗斯柴尔德的最新推文(@CL_Rothschild)。@RiceUniversity 本科。对数据感兴趣…
twitter.com](https://twitter.com/CL_Rothschild)
原载于 我的博客 。*
如何在数据和业务功能之间架起桥梁
数据科学家和业务经理之间的沟通问题可能会危及您的数据工作。这里有一些克服这种情况的方法。
数据科学家和业务经理之间的沟通问题是新进入数据世界的公司越来越头疼的问题。指责对方很容易,但事实往往更复杂,双方都有需要改进的地方。让我们了解一下,作为一名数据科学家,你如何成为一名桥梁制造者。
还有一个简单的问题你可以问数据科学家来衡量他或她当前的商业敏锐度:
那几天你在忙什么?”。**

你知道…复杂的东西…照片由克里斯·贾维斯在 Unsplash 上拍摄
这不全是技术问题
一些数据科学家,尤其是初级水平的(但不仅仅是!),会回答你:
“我正在根据我们的客户数据训练一个逻辑回归模型。准确性实际上比随机森林要好,但我现在必须做一些适当的交叉验证。
如果你与另一位数据科学家交谈,这没什么,但如果你与业务合作伙伴交谈,他们肯定会感到困惑。
许多数据科学家认为他们的主要任务是编码、创建模型和共享结果,在某种程度上,这是真的。但是,在不同的层面上,他们的工作是为你的公司——由业务经理代表——必须解决的问题提供解决方案。通常,数据科学家会失去这种视角,忘记他们想要解决的问题。
很难责怪他们。从深层的技术视角(例如,同时处理高级统计和编程概念)缩小到更高层次的业务视角(例如,当前的业务战略是什么)是困难的。在这两个世界之间架起一座桥梁是确保您公司的数据工作不会失败的最佳方式。
但是这里有一个好消息:有一些简单的方法可以改进这一点。
成为桥梁制造者
回到我们最初的问题,业务经理可能更喜欢这样的答案:
“我正在做我们的项目,预测客户重复购买的可能性,以便我们可以针对他们定制电子邮件活动。我已经开发出了一种精确度很高的方法,并在考虑投入生产之前对其进行验证。
你可以理解,你的业务经理可能会发现这更能提供信息:他们理解每一个字,了解项目的背景和目标,以及进展状态。
这里有一个方法可以提高你的商业头脑,并确保你与项目商业方面的沟通富有成效,而不是项目最终失败的原因。
写一些规格。阅读它们。
数据科学项目不能总是作为软件开发项目来管理,但这不应该阻止您编写一些规范,包括业务和技术团队。
除了我们在此不涉及的纯技术方面,良好的规格应强调:
- 我们要解决哪个问题?(例如,我们希望在我们的网站上吸引更多的重复购买)。
- 最终的成果是什么?(例如,我们将生成一个我们认为是潜在重复购买者的用户列表,以便我们可以针对他们开展特定的电子邮件活动)。
- 成功是什么样子的?(例如,至少 5%的目标用户会在下个月内进行新的购买)。
尽管数据科学家也应该参与讨论可行性(例如,我们有正确的数据吗?)和管理期望(例如,“不,我们不可能有 100%准确的模型”)。
一旦写好,不要忘记最重要的步骤:阅读它们。我不是说读一遍就开始编码。定期阅读。每次你召开关于项目进展的会议时,使用这份文件作为参考,看看你是否在轨道上,即使没有任何业务经理。如果需要更新,就去做,一直用新版本。**
使用这种方法可以减少不符合业务预期的可能性,因为双方都致力于同一个计划。
有一个过程
既然你已经和你的主要利益相关者定义了一个明确的目标,那么就设定一个过程来实现最终目标。
该流程应包括:
- 项目的主要里程碑是什么?(例如,数据探索、尝试两种潜在方法、优化这些方法中的最佳方法、生成建议)。
- 何时达到里程碑?(例如,允许一个时间框或当达到特定目标(如给定的模型精度)时)
- 你什么时候更新你的利益相关者?(例如,达到每个里程碑的时间或每周)
对于数据科学项目,你永远不会真正知道你最终会走哪条路到达最终目标,因为这取决于你在路上会发现什么。这样一个过程的作用是确保你不会迷路或偏离方向,并且你能有效地达到你的最终目标。
保持经常联系
上面概述的过程包括一些与你的利益相关者的定期交流,你应该确保他们根据需要的频率。这应该发生在不同的形式下。
- 每周更新。预定一个时间段来讨论这个项目,即使你不知道你会谈论什么。如果没有人真的有什么要讨论的,你仍然可以取消它。
- 里程碑更新。如果达到了一个重要的里程碑,发送一个更新,例如通过电子邮件或 Slack 消息。详细说明你到目前为止已经做了什么,以及它如何让你更接近目标。
- 要做的选择。你的规格永远不会涵盖所有的小细节。如果你面临一个必须做出重要选择的情况,通知你的利益相关者。
- 如果您打了电话(例如,由于数据质量问题,我们不会处理 2015 年之前加入的客户),请发送一份更新,解释问题所在以及您做出这一决定的原因,并在某个地方记录下来。
- 如果你不确定要做的决定,联系你的利益相关者,解释问题,什么是可能的解决方案,你认为什么是最好的。
这样做,您可以大大降低数据科学工作不符合业务预期的可能性。
不要太专业
当与你的利益相关者交流时,记住一件事:他们不关心技术细节。他们想知道你离交付还有多远,而不是知道你选择了哪种算法。**
因此,你的沟通不应该集中在技术上,而应该集中在以下两个方面:进步和信任。**
进展:你必须传达出你比上次谈话时离交付成果更近了。这就是这个过程的必要性。如果你首先定义了什么是交付之路,你就有了一个共同的参考来使用。例如,如果您最初说模型构建阶段需要两周时间,那么如果仅仅一周之后还没有最终的模型,就不会有什么坏的意外了。你也可以把它作为一个视觉参考(例如,上周我们在第 2 步,现在在第 3 步,下周我们应该到最后一步),人们往往会记得更好。
信任:如果你表现出你能掌控局面,人们会相信你能做好工作。诚实地面对你可能发现的障碍,并向他们展示你是如何超越它们的,从而为自己建立一些可信度。他们也不会关心你如何微调你的模型性能,他们会关注这个方法最终是否有效。
同样,你会相信人们会做好他们的工作,一次就把你的最终邮件列表发送出去,你不需要知道他们会如何设计他们的邮件活动,这是他们的工作。
这同样适用于你。你的工作是在适当的时候交付有用的东西。如果你能做到这一点,并表明你能控制你的项目,人们会相信你能做好工作,不会质疑你是如何做到的。
越过敌人的防线
我并不是说企业经理是敌人,但对一些人来说,他们的领域绝对是一个未知的领域。
良好沟通的关键是换位思考,这不适用于这种独特的数据科学<>业务关系。为了知道如何有效地与人交流,你必须了解他们的世界是什么样的,他们的主要关注点是什么,以及他们使用哪种词汇。你不会学到只和数据科学家交谈。
这就是为什么走出你的舒适区,去参加一些商务会议是很重要的。询问你的利益相关者你是否能参加他们的会议,这样你就能更好地了解他们的工作和目标。如果有帮助的话,主动提供一些小细节的帮助,比如写一份会议纪要。
一旦到了那里,尽可能多地观察和学习,并专注于:
- 他们的主要目标是什么?(例如,目前是否专注于获得新用户或利用现有受众)。这将有助于你确保你关注的是他们实际存在的问题,而不是他们此刻不关心的问题。
- 他们是如何交流的?他们关注最终产品吗?关于里程碑?只在下一步?
一旦你确定了他们的工作和思想是如何构建的,就用同样的结构与他们交流,以确保你的信息被更有效地理解。
准备好了吗?
你可以采取一些简单的步骤来确保你的项目的业务和技术部分更好地连接,正如你所看到的,它与技术没有什么关系。
发展人际交往和管理技能需要时间,但你可以从明天开始。要开始你成为桥梁制造者的旅程,下次你的业务经理问你工作进展如何,确保你谈论的是你朝着目标的进展,而不是技术。**
如何让 ML 在极端条件下工作?
ML 可应用于许多工业环境,以节约成本和改进流程。以下是方法。

数据科学可以应用于许多工业环境,以节省成本和改进流程。这种工业人工智能不仅包括驻留在计算机系统内部虚拟空间的智能算法和大数据概念,还包括物理设备本身。数据必须通过传感器获取。命令必须被发送到致动器和控制系统。这整个信息链和信息流,不管是无线的还是有线的,都要经过极端条件下的地方。从工厂、矿山或石油钻塔内部的操作点,到数据中心和控制室内部的大数据存储和巨大处理能力,还有很长的路要走。
工业生产设施、物理运输系统和分销渠道非常复杂,通常包含来自不同制造商的大量设备。随着自动化程度的提高,有许多现有的数字控制和管理系统。今天,您可以在工业环境中找到数据网络、监控和数据采集(SCADA)、可编程逻辑控制器(PLC)以及供暖、通风和空调(HVAC)。所有这些系统都是在不同的抽象层次上看待的。有复杂的概念和更高的管理级别,也有与物理挑战更紧密相关的较低级别。
越来越难了
现有的工业设施有许多电线和数公里长的电缆。这些复杂的网络保持运营。您拥有连接设备和交换机、提供网关和创建控制室连接的数字网络的工业标准。这些系统在恶劣环境下运行良好。随着数据科学和工业环境中新的全球数字连接的到来,新的智能设备也需要能够在这些极端条件下运行。ML 与工业物联网(IIoT)紧密相连,以提供更多的无线连接以及与企业范围系统和互联网的链接。
所有这些新系统都面临着自然的挑战和重工业机器的强大力量。生产设施可能位于遥远的地方,没有电网。想象一下在只有一条简易道路的丛林中作战。你必须通过发电机或电池自带所有能源。环境可能冷或热,有害气体会腐蚀电子设备或使其在爆炸中消失。但是热和冷不仅来自自然,也来自生产过程。熔化和冷冻工件可能是生产过程的一部分。许多工作发生在机械领域。你有高速运动的部件。你有制造振动和冲击的机器。数据科学现在主要以机器人和 IIoT 网络的形式面临这些物理挑战。
到处都有机器人
机器人是一项复杂的挑战。他们需要做事,他们需要把自己带到需要他们的地方。要在没有人类互动的情况下实现这一点,就需要这个机器人内部的 ML 大脑。但是,我们都记得机器人在核电站退役中的失败。在这种情况下,问题在于辐射破坏了电子设备。因此,需要一个坚强的大脑。此外,与外界的交流也很困难。在强辐射中,无线或有线通信是一个挑战。
然而,对于工业数据科学来说,不仅仅是核衰变的可怕性质,深海勘探或采矿的例子也是如此。它们也很有挑战性。由于缺乏通用基础设施,也没有固定电源或互联网可用,您需要调整现有的最佳实践,以适应数字化和数据驱动的转型。
您可能在日常生产设施的生产边缘找不到这些极端的例子。但是你会发现类似的挑战性情况。在工业生产中,运行中的环境和机器所造成的威胁无处不在。自主或准备成为自主机器人的舰队每天都在增长。
你有机器人手臂,行走和驾驶自动车辆,以及执行各种任务的飞行器。它们分为自动导向车(AGV)、无人驾驶地面车(UGV)、漫游者、自主水下车(AUV)、遥控水下车(ROV)、自主翻斗车、自主拖运或采矿车、无人驾驶飞行器(UAV)或无人机。
这些机器人以多种形式出现,以提高效率和成本效益。他们可以完成员工无法完成的任务。可能这些任务只是普通的长时间轮班,或者他们可能在更恶劣的环境中工作。他们可以随时随地根据需要进行检查。

一切都会联系起来
工业数据科学的第二大应用是整个企业中数据的连接和聚合。收集的所有传感器数据都将存储在一个大数据湖中。在工业物联网的帮助下,可以创建一个像生命体一样运行的网络。这里,无线和有线数据连接面向物理世界。电缆、交换机、路由器和网关需要坚固耐用。它们需要能够承受灰尘、振动、雾和水,以及更危险和有害的物质和物理效应。它们必须是可靠的,并且应该能够在没有维护人员帮助的情况下运行多年。
新的工业数据科学也面临着集成安全性和安全性的挑战。许多遗留系统多年来一直以微调的方式运行。他们为在极端条件下的出色表现提供解决方案。他们的优化过程已经持续了一年。因此,新的工业数据科学不应危及这一已实现的平衡。另一个问题是数据和操作安全性。一旦生产设施连接到全球互联网,攻击者理论上就可以进入系统。由于重工业的价值和风险非常高,这是另一个极端的现实。
现有的数据是坏的和破碎的
在建立工业数据科学时,用于创建智能建议和预测的数据源面临问题。工业环境中需要的大量数据是时间序列数据和在恶劣环境中收集的数据。这意味着单个数据点可能不可靠。由于环境条件,传感器本身可能提供不精确的值。
我们可以称之为工业大数据的“3B”。当你开始一个新的工业数据科学项目时,你需要意识到这些问题。
第一个 B 是坏的。大多数工业数据都有明确的物理意义。它需要无数的传感器来检测空气、流量或运动速度。各种噪音、湿度、泄漏或水平都是可以获得的。每天高达数百万亿字节的运动数据。由于物理测量,所有这些数据的质量都可能很差。与数字系统内部收集的数据(如在线购买和客户数据)相比,这些数据在使用前需要彻底清理。此外,很难通过数据的数量来提高质量。
第二个 B 代表坏掉了。用于训练数据科学模型以提出预测和建议的数据没有明确的健康状态。没有指示工作条件的故障模式或更高级别的数据抽象。这可能会在 ML 系统的实现中导致大量的假阳性和假阴性。
第三个也是最后一个问题 B 是背景。在复杂的工业环境中,传感器数据的解释需要领域专家的大量经验。新出现的模式可能非常短暂,它们需要专业知识来解释。仅仅通过收集的数值数据来训练数据科学模型是非常困难的。
解决身体上的挑战
要解决工业数据科学中存在的挑战,一种方法是了解工业运营的具体情况。人们不应关注现成的数据科学解决方案,而应关注现成的工业解决方案。面向工业物联网的加固型组件和设备已经上市。由于许多传感器可通过现有的设置获得,数据的收集发生在现有的控制系统层面。SCADA 系统和工业机器人和机器提供了要捕获的数据。在这里,专门的 IIoT 网关将数据传送到 ML 系统。这些额外的网关不会干扰现有的控制系统。
要完成数字化转型,人才是最重要的因素之一。为了保持低成本和管理新的网络,与主题专家的合作是必由之路。这些专业人员需要了解行业的具体情况和工业数据科学。他们帮助选择正确的硬件和概念。
做出正确的选择
极端条件不仅是对身体要求苛刻的环境,也是其他行业丰富资源的短缺。由于电力供应、网络基础设施和互联网连接方面的问题,需要阐述行业特定的概念。当连接不稳定和不可靠时,可以选择不依赖于连续网络连接的解决方案。电池供电的 IIoT 解决方案,电池寿命长达数年,功耗超低。边缘计算在设备内部提供自动推理和聚合,无需不间断地连接到数据中心系统。
ML 模型将在工业物联网基础设施设计良好的极端条件下工作。普通 IoT 和 IIoT 之间的差异需要解决。尽管物联网和 IIoT 有着共同的目标,但实施策略的基本要求却大相径庭。由于电力和连接挑战,工业物联网需要更加关注可靠性和鲁棒性。
本文最初发表于 AiThority 。
如何用 Python 制作 Instagram Unfollower 工具

照片由 Unsplash 上的 Georgia de Lotz
根据 2018 年 6 月的统计数据,我自己是一个很大的 Instagram 用户,据谷歌称,其他 10 亿人也是如此。
在使用 Instagram 和他们的“关注者”系统时,你肯定有过关注某人的时候,并想知道他们何时以及是否会关注你。
现在有了强大的工具和编程语言,我们可以创建简单的脚本来检查谁没有跟着我们。
这是 Python 的一个非常简单的用法,你不需要任何特殊的或者相当惊人的技能来和我一起做这件事。我们将一步一步地走下去,从头开始建设一切。
让我们直接投入进去吧!

编码
规划流程
构建这样一个工具需要几个步骤,首先,我们必须了解如何获得我们想要的东西。这是我们进入 Instagram 欢迎页面的地方。
Instagram 欢迎/登录页面
它相当简单,我们有登录/注册按钮。我们将使用这些来登录我们的个人资料。我们将自动化这个工具,以便它点击、填写电子邮件、密码并让我们登录。之后,我们将得到我们需要的数据。
在我们登录之前,你需要确保没有为 Instagram 设置双因素认证。
设置环境
你必须安装一个 ChromeDriver ,这将使我们能够操纵浏览器,并向它发送命令以供测试和使用。
打开链接并下载适用于您的操作系统的文件。我推荐最新稳定版,除非你已经知道自己在做什么。
接下来,您需要解压缩该文件。我建议进入文件,通过右键单击手动操作,然后单击“Extract here”。

在文件夹里面,有一个名为“chromedriver”的文件,我们必须将它移动到你电脑上的特定文件夹中。
打开终端,键入以下命令:
**sudo su** #enter the root mode
**cd** #go back to base from the current location
**mv /home/*your_pc_name*/Downloads/chromedriver /usr/local/bin**
#move the file to the right location
请插入您的实际电脑名称,而不是您的电脑名称。
完成后,我们打开编辑器。我个人选择的是 Visual Studio 代码。它简单易用,可定制,并且对你的计算机来说很轻。
打开一个新项目,创建两个新文件。这是一个我的看起来能帮助你的例子:

VS 代码设置
在 VS 代码中,有一个“Terminal”选项卡,您可以使用它打开 VS 代码中的内部终端,这对于将所有内容放在一个地方非常有用。
当你打开它时,我们还需要安装一些东西,那就是虚拟环境和用于 web 驱动程序 selenium。在您的终端中键入这些命令。
pip3 install virtualenv
source venv/bin/activate
pip3 install selenium
激活虚拟环境后,我们就完全准备好了。
创建工具
我们将把它创建为一个类,并为它创建函数。所以我们开始吧!
用任何名字创建你的工具并启动 Chrome 的驱动程序。我们还传递用户名和密码,这样我们就可以使用从另一个文件导入的它们。
*from* creditentials *import* username, passwordclass InstaUnfollowers:
def __init__(self, username, password):
self.driver = webdriver.Chrome()
这就是我们开始发展所需要的一切。现在转到您的终端并键入:
python -i unfollowers.py
这个命令让我们把我们的文件作为一个互动的游乐场。浏览器的新选项卡将会打开,我们可以开始向它发出命令。
如果你想试验,你可以使用命令行,而不是直接输入到你的源文件中。而且只是用 bot 代替 self 。
对于终端:
bot = InstaUnfollowers()
bot.driver.get('https://instagram.com/')
现在来看看源代码:
self.driver.get('https://instagram.com/')
现在,我们转到 Instagram 的欢迎页面,接下来我们需要登录。我们检查元素(键盘上的 F12)并复制元素 XPath。

接下来,我们必须发出命令来为我们单击那个按钮。
log_in = self.driver.find_element_by_xpath("//a[contains(text(), 'Log in')]")log_in.click()
我们通过 XPath 找到包含文本“Log in”的链接,并使用 click ()函数单击找到的链接。
单引号(')是我的 XPath,如果你在做其他网站,你必须调整你的 XPath。我还将向您展示 XPath 的更多用法。
在登录页面,我们必须像这样填写数据:
username_type = self.driver.find_element_by_xpath("//input[@name=\"username\"]")username_type.send_keys(username)password_type = self.driver.find_element_by_xpath("//input[@name=\"password\"]")password_type.send_keys(password)
再次使用 XPath,这次我们使用 send_keys ()函数将文本输入到字段中。

一旦我们完成了从登录开始的所有工作,是时候看看谁没有跟踪我们,所以我们必须比较追随者和跟随。
这是一个有点棘手的部分,但你会管理:
def get_people(self):sleep(2)scroll_box = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[2]")prev_height, height = 0, 1*while* prev_height != height:prev_height = heightsleep(3)height = self.driver.execute_script("""arguments[0].scrollTo(0, arguments[0].scrollHeight);return arguments[0].scrollHeight;""", scroll_box)links = scroll_box.find_elements_by_tag_name('a')names = [name.text *for* name in links *if* name.text != '']close = self.driver.find_element_by_xpath("/html/body/div[4]/div/div[1]/div/div[2]/button")close.click()*return* names
这段代码专门用于使用存储所有关注者的滚动框,它会自动滚动它,当它结束时,它会将所有的名字存储到列表中。
我使用 sleep()函数,它让我将进一步的执行暂停一段时间,因此 sleep(1)将暂停 1 秒钟。你必须在代码的开头导入它。

当我们同时拥有关注者和关注列表时,我们只需比较这两者并打印结果。使用 Python,这相当简单:
not_following_back = [user *for* user in following *if* user not in followers]print(not_following_back)
基本上就是这样。
这里有一个简短的视频,展示了这个脚本实际上是如何工作的:
作者在 Youtube 上的教学视频
这是我的 GitHub 页面上的完整代码:
[## lazargugleta/instagramUnfollowers
在 GitHub 上创建一个帐户,为 lazargugleta/instagramUnfollowers 的发展做出贡献。
github.com](https://github.com/lazargugleta/instagramUnfollowers)
我们完了!
用法说明
你可能想知道为什么你会使用这种方式来检查 Instagram 的粉丝,而不只是从商店下载应用程序?
嗯,有一个很好的原因,那就是 Instagram 很快就会关闭它的 API,那些相同的应用程序将不再能够这么容易地做到这一点。
如果你不知道 API 是什么,API 或应用程序编程接口是一组允许创建访问操作系统、应用程序或其他服务的功能或数据的应用程序的功能和过程。
小心不要过度使用这个脚本,让你自己因为太多太频繁的登录而被禁止。(我从没遇到过,但要小心)
后续步骤
您可能希望将这个脚本提升到下一个级别,并且您可以对它进行多种修改。
也许可以自动观看故事(如果你真的不在乎任何人发布什么),或者收集其他数据,如喜欢和评论,并观察这些变化。
在那之前,关注我获取更多!
感谢阅读!
在媒体上跟随我
在推特上关注我
如何让测度理论对你的问题有用?
深入研究勒贝格测度和概率分布

所有图片均由作者创作
一天晚上,一位数据科学家、一位工程师和一位数学家在酒吧相遇。
他们互相抱怨工作中的问题。
工程师说,“我有一个巨大的形状奇怪的容器,我需要知道它的体积。当然,我想做一件显而易见的事情,将整个容器装满水,然后称重以得到体积。遗憾的是,由于所有的密封和昂贵的材料,这是一个有点昂贵的设置。这就是为什么我的老板拒绝了这个想法。要是他能拒绝自己的年度奖金就好了……不管怎样,现在我必须用盒子填满整个容器,并估算出大致的结果。”
“那不是很不准确吗?我的意思是你如何填满所有的角落?”数学家问道,他对这种实用性的想法感到不安。
“也许吧,但应该足够好了。如果没有,我可以试着用电脑模拟,这样我可以更精确地估算容器的体积。”
"计算机是如何做到这一点的?"数学家插嘴说。
“有了计算机,我可以把小得多的盒子放进集装箱里,并且可以尽可能接近集装箱,”工程师回答道。
数学家很不服气地问,“但是当你减少容器中盒子的体积时,你怎么知道你的这种近似真的变好了呢?”如果你一直重复这个方法,你真的会得到容器的真实体积吗?这听起来很像是从有限逼近到无限逼近的过渡。这种情况下允许吗?”
“嗯,从技术上讲,计算机不能无限工作。娱乐你的想法。如果我没理解错的话,你是在问:如果我反复减小放入容器的盒子的大小,并总是尽可能多地装满容器,我的近似值是否接近容器的真实体积,对吗?”
“差不多,”数学家澄清道。“如果你永远这样做,或者更好地说(可数地)无数次,会发生什么。箱子的总体积接近集装箱的真实体积吗?我是说考虑一下。也许容器中有圆形部分。没有一个盒子能真正容纳整个体积。当然,你可以把盒子变小,放更多的盒子进去。但是不管你减少多少次你的盒子的大小,它们仍然不能完全捕捉到圆形。那么,如果你真的这样做了无数次,会发生什么呢?无限小的盒子能捕捉容器中的圆形和其他奇怪的角落,并给出容器体积的正确值吗?”
“听起来很数学,”工程师微笑着说。“我相信它会起作用的。只是从视觉上来说。但你是数学家。你告诉我。”
“嗯,你说得对。这正合我的胃口。让我在那上回复你。我确信测度论能以某种方式帮助回答这个问题。”
让数学家去思考,数据科学家开始说话,“你们不会相信我今天做了什么。你还记得在统计课上,我们总是要计算一个人的身高在两个值之间的概率吗?你猜怎么着。事实上,我今天不得不这么做。”
“没门。这位工程师感叹道:“我一直认为这些例子太过牵强。
“正是我所想的。当我们的统计学教授选择这个例子时,他们发现了一些事情。所以今天我重新计算了一下,感觉很怀旧。我甚至拿出我的旧标准正常 cdf 查找表来确定概率。”
“不错。我也会完全做同样的事情,”工程师同意道。
“哦,我记得,”数学家说。“难道不奇怪吗,我们可以积分这样的密度函数,并从中获得有效的概率测量。我是说,这怎么可能呢?”
“你总是带着你的问题,”工程师微笑着说。
“为什么不会呢?”数据科学家继续说道。“我的意思是对整个密度的积分是 1,部分积分总是返回 0 和 1 之间的值。对我来说,这似乎是一个显而易见的事情。”
“对于这样简单的应用,我同意,”数学家说。“但是你难道没有用它来做更多的事情吗?让我们以两个独立随机变量乘积的期望值为例。”
“但这只是个人期望值的产物,”数据科学家插话道。
“对。证明使用 Fubini-Tonelli 将两个随机变量乘积的期望值分割成单个随机变量的期望值。但是作为一个要求,这两个随机变量必须遵循一个真实的测度——理论上的概率测度。但是为什么密度函数的积分定义了一个恰当的测度——理论上的概率测度?”
“嗯……奇怪,”数据科学家说。“我以前从未想过这个问题。难道那个问题不会适用于几乎所有概率论的结果吗?”
“没错。”
“这么重要的一个细节在我的任何一次讲座中都没有提到,这难道不奇怪吗?”数据科学家沉思道。
“告诉你,”工程师对数学家说。“你为什么不花一天时间去寻找这些问题的答案呢?然后你可以告诉我们盒子是否真的可以近似圆形,以及为什么对密度函数的积分真的可以产生合适的概率度量。”
“这是一个伟大的想法,”数据科学家说。“我对这个答案很感兴趣。让我们进一步激励他。如果你能以一种可以理解的方式向我们解释,下次我们会为你的饮料买单。”
这个挑战让数学家很高兴,他离开了朋友,回到了家。
在桌前坐下后,数学家首先看他对测度论的预感是否能帮助解决他的两个问题。
为此,他打开他那本积满灰尘的旧测量理论书,开始阅读。
过了一段时间,数学家找到了两个无限逼近方案,肯定地回答了这样一个问题:如果工程师的容器可以用无限多个盒子来逼近。
- 第一个方案类似于工程师提出的方法。在这种方法下,人们需要找到一种方法,将越来越多的简单对象添加到容器中,并在无数次重复后填满整个容器。那么,测量理论保证了这些无限个体的体积之和等于整个容器的体积。这意味着,如果工程师能找到无限的策略来精确计算容器的体积,这是可能的。
- 或者,工程师也可以将整个容器装入一个盒子中,并开始凿出小形状。如果他在无数次移走物品后又找到了揭示容器的方法,那么他可以通过从装箱体积中减去无数次移走的体积来精确地计算出容器的体积。
这些方法只有在盒子测度是测度论定义下的恰当测度时才有效。
遗憾的是,通常不可能直接证明测度论测度的性质。一个合适的测度——理论上的测度必须能够测度无限大范围的物体。此外,它必须满足某些属性。除其他外,它必须完成上述计划。
幸运的是,测度论提供了一种方法来将简单的测度扩展为适当的测度——以一种合理的方式满足所有这些性质以及更多的性质的理论测度。
下面的列表描述了要使一个简单的候选度量成为一个合适的度量(理论度量)需要证明什么。
- 需要一个集合(没有任何属性)。
- 需要在集合上定义候选度量,这些集合是 1 中集合的子集。只有。
- 候选测量值需要总是大于或等于零,但可以是无穷大。
- 空集需要是可测的,并且它的测度必须等于零。
- 如果两个集合可以由候选测度来度量,那么它们的交集也需要由候选测度来度量。
- 如果我们把一个可测集从另一个可测集中去掉,那么这个新的可测集一定是可写的,它是有限多个互不相交的可测集的并集。注意,新的集合不需要通过我们的候选度量来度量。
- 如果两个可测集是不相交的,即两个集中都没有点,并且两个集的并集具有由候选测度定义的测度,那么并集的测度必须与两个单独集的测度相加相同。
- 1 中的集合。必须可写为可测集的(可数)无限并集,其单个测度不是无限的。
- 作为任何(可数的)单独可测集的无限联合的子集的任何可测集的测量值必须小于或等于单独测量值的无限和。
为了从盒子体积的测量理论中得到好处,数学家开始研究清单。
作为第一步,他从数学上定义了他的盒子测度。
三维的盒子可以写成一个集合:

其中 w₁ ≤ w₂,h₁ ≤ h₂,d₁ ≤ d₂都是实数。
要计算立方体的体积,只需将盒子的宽度、高度和深度相乘。
宽度:= w := w₂ - w₁
高度:= h := h₂ - h₁
深度:= d := d₂ - d₁
体积测量用 λ 表示,以纪念数学家勒贝格。
因此,我们的数学家也将使用 λ 来进行盒测量。
他对盒子体积的度量提出了如下定义。


然后,他继续检查清单上的项目,寻找他的盒子尺寸。
1.基本集合是三维实数的集合。
2.根据定义,每个盒子都是该集合的子集。
3.每个盒子的体积都大于或等于零。
4.他的定义目前还不能度量空集。4.要求空集需要有一个体积为零的盒子,即 λ ({}) := 0。这是有意义的,因为空集可以被看作是不测量任何东西的体积。
5.他需要证明两个盒子的交集也是一个盒子。
如果两个盒子不重叠,它们的交集就是空集,他现在可以测量它。
如果两个盒子重叠,不难想象它们定义了一个新的盒子。
更精确一点。对于任意两行,以下为真。
[a₁,a₂] ⋂ [b₁,b₂] = [max{a₁,b₁},min{a₂,bₙ}]
这对于三维的交叉点也是如此。这清楚地表明,两个盒子的交集确实是一个新盒子。
6.这里他需要证明,如果他从另一个盒子中去掉一个盒子,剩下的盒子可以写成有限多个不重叠的盒子的并集。
遗憾的是,他目前的方法发现了他的定义中的一个问题。看下面的例子,他意识到了自己的错误。
[1,3]³[2,4]³ = [1,2)³
根据他的定义,这不是一个有效的盒子,因为他将盒子定义为封闭的盒子。
幸运的是,他提出了一个简单的解决方案。他只是定义了一个左开右闭的盒子
b:=(w₂w₁]×(h₂h₁]×(d₂d₁)
并且保持他的盒子测度的定义不变。
有了这个定义,以前的问题就解决了:
(1,3]³(2,4]³ = (1,2]³
在这种情况下,从另一个盒子中移除一个盒子会产生一个有效的新盒子。
在正式测试了如何将一个盒子从另一个盒子中移除的各种组合,并看到新的对象都可以写成其他盒子的有限并集之后,他证明了 6。是真的。
不幸的是,数学家现在必须重新检查之前的 5 项。幸运的是,同样的论点也适用于新的盒子定义。
7.他需要证明两个不相交的盒子的并集(即盒子本身)的体积与两个盒子体积之和相同。
这很容易。合并两个不相交的框只能成为一个有效的框,如果它们可以在一个面上融合而没有任何重叠。这意味着三个维度中的两个(宽度、高度、深度)保持不变。不失一般性地假设盒子共享相同的宽度和高度配置。他得到了两个这样的盒子(⊍的意思是不相交的并集):
λ(b₁⊍b₂)= w h(d₁+d₂)= w hd₁+w hd₂=λ(b₁)+λ(b₂)
这也证实了。
8.在这里,他必须证明整个三维空间可以写成有限体积的盒子的(可数)无限联合。
幸运的是,这些盒子不必是分离的,它们可以包含自己。因此,他可以简单地从零附近的一个简单的盒子开始,让这个盒子在高度、宽度和深度上均匀增长。
形式上:

和

9.最后一步是关键的一步,它允许框度量与无穷大一起工作。
数学家必须证明,如果他有一个盒子被无限多个盒子以某种方式覆盖,那么被覆盖的盒子的体积小于或等于覆盖的盒子的体积之和。
形式上可以这样写。让

被装在盒子里

然后他必须表明:

要做到这一点,他必须建立更多关于盒测度的性质。
他必须证明如果一个盒子包含在另一个盒子里,那么外盒子的体积比内盒子的大。
这直接来自于盒子体积的定义。
使用测量理论,他可以从(I)和 1 得出结论。— 7.如果盒子 B 仅被有限多个盒子覆盖,那么盒子的体积小于或等于有限多个盒子的体积之和。显示除 1 之外的(I)。— 7.保护任何其他基本度量候选的该属性,并且不限于框度量。
证据主要集中在 5 左右。和 6。
使用这两个属性,测度论者可以移除盒子并相交盒子,并获得原始盒子作为有限不相交盒子并集的表示。使用 7。然后,他们可以将这些单独的盒子体积相加来计算盒子体积。应用(I ),他们然后显示组合中的某些盒子必须位于(潜在地)覆盖盒子的更大的盒子中,由此他们可以得出结论,各个体积的总和必须更大。有点技术性,但幸运的是其他人已经做了这一部分。
(iii)
现在他知道了对于有限多个盒子来说这个断言是正确的,数学家现在试图将覆盖从无限多个盒子减少到有限多个盒子。
为此,他必须使用拓扑学中的一个常用技巧。他稍微缩小了内盒,使它更紧凑。与此同时,他稍微扩大覆盖盒,使它们打开。然后他有一个由无数个打开的盒子组成的紧凑盒子的盖子。由于内盒的紧性,他然后从紧性的(拓扑)定义中知道,有一种方法可以从那些仍然覆盖紧内盒的无限多个盒子中选择有限多个盒子。
由于盒子体积的连续性,他可以控制紧凑的内盒与真正的内盒有多近,以及外部开口盒与覆盖盒有多近。因此,他可以将问题从无限多个覆盖盒简化为他知道(见(ii))该要求为真的有限多个覆盖盒。
更正式地写下来。让
B := (a,b] := ( a₁,b₁ ] × ( a₂,b₂)×(a₃,b₃)
类似地
Bₙ := (aₙ,bₙ):=((aₙ)₁,(bₙ)₁)×((aₙ)₂,(bₙ)₂))×((aₙ)₃,(bₙ)]
因此,他希望选择δ和δ(n)使得:

他选择

是相等分量大于零的三维向量。
根据紧性的定义,他得到:

其中 K 是自然数的有限子集。
“长方体测量”仅允许计算左侧打开和右侧关闭的长方体的体积。但这很好,因为(a + δ,b)⊂[a+δ,b],和

因此

如同

和

在 d 中是连续的他可以使体积任意接近

通过控制 d 和 dₙ 。
总的来说,对于任意的ε0,他得出如下结果:

现在他让 ε 趋近于零,他完成了清单的验证。
由于盒体积测度满足所有需要的性质,它可以唯一地扩展到所有"Borel-measured "集合的体积测度。
实际上,这意味着,任何现实生活中的物体的体积都可以使用上面两个方案概述的无限盒子的巧妙覆盖来精确测量。
在一些简单的线性代数的帮助下,可以证明体积在可逆矩阵变换下表现良好。
一个集合的每一点乘以一个可逆矩阵,得到一个物体,其体积与原体积乘以矩阵行列式的绝对值相同。使用它,现在只要知道原始体积,就可以非常简单地计算在任何维度上翻转、旋转或拉伸的任何变换对象的体积。这就是为什么一个球的体积随着半径的增加而立方增长。
度量理论保证的性质还有很多,跳过前 50-70 页后,可以从任何度量理论书籍中找到,因为它们大部分都包含了必要的证明,从而允许检查一些性质的过程。
走向数据科学家。数学家想要检查连续密度函数上的积分是否真正定义了测度论概念下的概率测度。为此,他将再次检查清单。第二次迭代会快得多,因为核对表的最后一个属性几乎与盒子度量的证明相同。
他首先定义了他想提升到测度论世界的基本测度。
让

是连续的密度函数。
然后,候选概率度量被定义为

随着

这一次,数学家直接定义了在第 6 项中左开右闭的基本对象。
他又来了。
1.基本集合是所有实数的集合。
2.这些集合都是实数的子集。
3.)由于中值定理

对于 x₀ ∈ (a,b)当 f 是连续的。
4.根据积分的定义,它遵循 P ({ }) = 0
5.和之前一样(a,b] ∩ (c,d] = (max(a,c),min(b,d)]这是在 P 的定义域内。
6.正如预期的那样,(a,b] \ (c,d)也在 P 的定义域内,因为它总是(x,y)形式的区间。
查看有四个容易检查的案例。
7.因此,积分是独立于划分的(⊍意味着不相交的并集)

8.和以前一样,实数可以写成一个并集

和

9.这个证明类似于勒贝格测度的证明。
当 f 大于或等于零时,积分是单调的。
从测度论中,我们知道,对于有限的和,这个要求是正确的。
微积分的基本定理表明

是可微的,因此在任何区间[a,b]都是连续的。
由此得出结论,区间(a,b)和(aₙ,bₙ)可以以可控的方式收缩和扩张,以创建一个紧集和一个开集的无限覆盖,对于这些开集必须存在一个有限覆盖。这样,无限索赔可以简化为一个有有限多个被加数的问题。
然后,使用与之前相同的计算方法进行索赔。
因为 f 是密度函数,我们知道

因此,P 可以扩展为测度论保护伞下的概率测度。因此,概率论和测度论的所有定理都适用于从密度函数得到的概率测度。
在找到问题的答案后,数据科学家、工程师和数学家再次在酒吧见面并点了饮料。
"你找到昨天那些问题的答案了吗?"工程师问数学家。
“是的,我做到了。这位数学家回答道:“我创建了一个简单的属性清单,需要对这些属性进行检查,以使一个候选测度成为测度理论框架下的一个适当测度。”。
“很好,”数据科学家说。"我想你已经检查过清单来回答这两个问题了吧?"
“没错,”数学家热情地表示同意。“我首先从一个简单的盒子体积测量开始。在检查清单时,我不得不两次修改我的定义,但最终,我能够证明清单中的属性。因此,如果你可以无限细化你放入容器的盒子,确实有可能精确计算出容器的体积。”
“很好,”工程师回答。"所以无限不再是一个问题了?"
“可数不定式不是。然而不可数不定式是另一个问题。对了,我还找到了另一种解决集装箱容积问题的方法。”
“我总是乐于接受可行的想法,”这位工程师大声说道。
“这个是可行的,”数学家继续说道。“除了用盒子填满容器,你还可以把容器放在盒子里,用小盒子填满容器和外盒之间的空间。最后,你可以简单地从外部盒子体积中减去单个盒子的体积。”
“等等,听起来是个好主意!今天我的老板否决了用盒子装满集装箱的想法。里面的材料显然太有价值了。你的想法解决了那个问题。我怎么没想到呢!?让我去找我的老板,把这个想法告诉他。谢谢!”说完,工程师离开了酒吧。
“我很久没见他这么兴奋了,”这位数据科学家笑着说。“那么你对分布函数有什么发现?你重复使用你的清单了吗?”
“是的,”数学家解释道。“更好的是,我可以将最具挑战性的证明几乎完全复制到分布函数中。这也使得检查清单变得非常简单。这里看一看。”
数学家将笔记交给数据科学家,数据科学家开始检查笔记。
“等一下,”数据科学家说。“这太直观了。利用紧致性将无限个被加数减少到有限个是非常聪明的。等一下。也许我可以用这个技巧来解决困扰我一整天的工作问题?我得去检查一些东西。干得好,你做得很好。回头见。我得走了。”
“等等,”数学家说,但是已经太晚了。他的两个朋友已经离开了酒吧。酒保正走向他的桌子。他为什么要把钱包留在家里?
[1]阿奇姆·克兰克,瓦赫尔斯·谢林凯茨理论(2020),施普林格
如何使 Python 成为静态类型——基本指南
类型提示、变量注释和强制运行时类型检查——您需要知道的一切。
Python 是一种动态类型语言——我相信你知道这一点。这对初学者来说既简单又有趣,因为不需要考虑数据类型。尽管如此,静态类型还是有一些好处。今天我们将探索如何使 Python 尽可能静态化。

不想看书?请观看相关主题的视频:
那么,动态类型语言是怎么回事呢?简单地说,这意味着没有代码编译,所以 Python 解释器在代码运行时执行类型检查。因此,允许在整个应用程序中更改变量类型。
这听起来像是一种优势,但是随着代码库变得越来越大,这可能会导致奇怪且难以跟踪的错误。
另一方面,静态类型语言在编译时执行类型检查(想想 C 或 Java )。此外,它们给了您一些安全感,因为您可以立即判断每个函数的参数类型。
在我们开始之前,有一个简短的声明——Python 将永远是一种动态类型的语言。你不能像 Java 或 c 一样把它变成静态的,因为 PEP 484 引入了类型提示,所以我们必须利用它。
这篇文章的结构如下:
- 类型提示
- 可变注释
- 表示更高级的数据类型
- 在运行时强制类型检查
- 结论
类型提示
类型提示仅仅是提示。它们向您展示了预期的数据类型,但是没有什么可以阻止您忽略它们。我们稍后将探讨如何通过 Python 解释器强制进行类型检查,但让我们先来看看基础知识。
让我们做一个没有类型提示的例子。下面是一个将两个数相加并返回总和的函数。Python 就是 Python,我们不必为参数或返回值指定数据类型:
函数调用的打印结果分别为 15 、 15.3 和 BobMark 。要引入类型提示,我们必须执行以下操作:
- 对于参数-将冒号(:)放在参数名称的右边,并在后面指定数据类型
- 对于返回值-将箭头符号和数据类型放在括号的右边
下面是如何给我们的sum_numbers函数添加类型提示:
这个函数现在看起来更清楚了,但是我们仍然可以传递任何数据类型——表明提示只是提示,而不是义务。
根据 PEP 8,以下是类型提示建议:
- 对冒号使用常规规则,即冒号前没有空格,冒号后有一个空格
- 将参数注释与默认值结合使用时,请在=符号周围使用空格
- 在->箭头周围使用空格
稍后我们将看到如何强制类型检查。
可变注释
我们还可以为变量提供类型提示。同样,这些只是提示,并不影响代码的运行。
下面是一个如何向变量添加类型提示的快速示例:
没有什么可以阻止你给变量age赋值 32.95,或者给is_premium赋值 no。暗示只是表示不应该。
表示更高级的数据类型
到目前为止,我们所介绍的一切都很好,但是如果您想声明一个字符串列表或一个键和值都是字符串的字典,该怎么办呢?
这就是typing模块发挥作用的地方。有了它,您可以使用任何更复杂的数据类型,比如列表、字典和元组。您也可以声明自己的数据类型,但这已经超出了今天的范围。
现在让我们使用typing模块来声明一个名字列表,然后是一个电子邮件字典,其中每封电子邮件都属于一个名字。在所有情况下,数据类型都是字符串:
冗长多了,但感觉更安全。更进一步,让我们看看如何使一个函数参数成为一个整数列表。这很简单:
您现在知道了如何使用类型提示来声明任何数据类型的变量,但是如何在运行时强制进行类型检查呢?接下来让我们来探索一下。
在运行时强制类型检查
我不知道在笔记本环境中有什么强制类型检查的方法——所以我们将切换到脚本。我做了一个名为static_typing.py的文件,但是你可以随意命名你的文件。
在继续之前,我们必须安装一个名为mypy的库。它用于在运行时强制进行类型检查,这正是我们所需要的。要安装它,从终端执行pip install mypy。
我们现在可以走了。static_typing.py脚本包含以下代码:
从终端,以传统方式执行脚本——通过编写python static_typing.py

图 1 —不带 mypy 的执行(作者图片)
代码将运行而不抛出错误。这相当于我们之前在笔记本中所做的。但是我们不希望这样。使用mypy,我们可以强制进行类型检查。从终端执行以下命令:mypy static_typing.py:

图 2 —使用 mypy 执行(图片由作者提供)
如你所见,程序崩溃了。这正是我们想要的行为,因为函数需要两个整数,但是我们没有在函数调用中提供数据类型。
这就是开始时你应该知道的。让我们在下一部分总结一下。
离别赠言
让我们以使用类型提示的利弊来结束这篇文章。
优点:
- 它们有助于记录您的代码——但不能代替 docstrings
- 出于显而易见的原因,它们有助于维护一个更干净的代码库
- 它们改进了代码编辑器的林挺功能——例如,如果检测到类型不匹配,PyCharm 会显示警告
缺点:
- 添加起来可能会很乏味,尤其是如果您不习惯它们的话
总结一下——类型提示不是必需的,但却是很好的实践,尤其是在处理大型代码库时——即使你决定不使用mypy。
你对类型提示有什么想法?您是一直使用它们,还是只是在代码库变大时才使用它们?请在下面的评论区告诉我。
加入我的私人邮件列表,获取更多有用的见解。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
原载于 2020 年 11 月 7 日 https://betterdatascience.com。
如何让远程工作对数据科学团队有效
团队成员、经理的想法和帮助您提高效率的工具
1973 年,在石油输出国组织石油危机和燃料价格飞涨的高峰期,美国宇航局科学家和南加州大学教授杰克·奈尔斯开始思考不需要通勤就可以完成工作的方法。尼尔斯的思想实验演变成了案例研究,无数的书籍,包括关于远程办公的原著,以及数十篇论文、文章和主题演讲。直到今天,Nilles 仍然是远程工作作为传统办公室的可行替代方案的主要倡导者之一。

两家不同公司远程办公的组织演变,来自电信运输权衡(Nilles)。
今天,认为尼尔斯的早期作品《透视》并不完全是夸张的。在过去的十年中,采用远程工作人员的公司急剧增加。由 Flexjobs 和 Global Workplace Analytics 汇编的一份 2019 报告发现,从 2005 年到 2017 年,美国远程办公的人数增加了 159%。随着围绕新冠肺炎的全球危机迅速发展,迫使越来越多的公司采取严格的在家工作政策,远程工作正进一步巩固其作为一种工作场所范式的地位,值得认真对待。
数据科学行业也不例外。就完全或部分远程工作的员工比例而言,大型计算机、IT 和软件开发行业属于增长最快的行业。远程工作的好处是有据可查的:Buffer 和 Angellist 发布的一份联合报告——对 3500 多名远程技术人员的调查——发现灵活的时间表、在任何地方工作的能力以及不用通勤是远程工作最有吸引力的好处。

Buffer 和 AngellistReport
尽管有这些好处,但部署这些系统以提高远程团队的效率和生产力并不容易。协作和沟通等简单的事情变得具有挑战性。员工更容易感到孤独、心烦意乱,或者觉得工作日永无止境。在数据科学团队中,行业最佳实践仍在成型,这些问题可能会更加突出。

缓冲区和 Angellist报告
这篇文章旨在强调一些在家工作的最佳实践,包括一般的和特定于数据科学的,以帮助数据科学家和团队在远程工作时保持生产力、联系和快乐。
数据科学团队成员的最佳实践
创建高效的工作空间
有一个专用的工作空间(阅读:不是你的床)。让你的手机远离你的工作场所,只在休息的时候查看。一定要保持你的工作环境整洁——在一个凌乱的环境中工作会令人难以置信地分心。
确保和你的同事聊天——即使你没有必要这样做
安排一天打几个视频电话来保持理智,即使它们不是绝对必要的。其中至少有一个是与同事/朋友的非工作相关的“远程咖啡”。始终打开摄像头,尽量扩大视频通话窗口,让您感觉像在进行一场真正的对话。
工作习惯
在你的日历中划出不受干扰的工作时间、锻炼时间、午餐时间等等。鼓励你的同事也这样做。过度沟通并假设意图良好。一条快速更新的信息可以确保你的经理对工作的进展感到放心。与此相关的是,同意每天与你的队友保持联系的节奏——例如每天早上的站立会议。
有一个明确的“关闭时间”(与您的团队达成一致)—远程的最大风险之一是您永远不会关闭和停止工作,因此在这一点上要积极主动
远程管理数据科学团队的技巧
当考虑如何管理远程团队时,首先强调远程工作的主要优点和缺点是很重要的。
从高层次来说,作为一名经理,你的好处是你的团队有可能提高生产力,因为没有通勤,更少的分心(希望如此),和更多的时间专注。
缺点通常是沟通效率较低,合作机会较少。有些人可能会说,你也可以远程协作和交流,但正如任何经济学家都会告诉你的那样:没有免费的午餐。虽然远程团队确实有缺点,但是有一些非常好的策略可以让你最小化这些缺点。
利用远程工作的优势
首先,关注并发挥远程工作的优势。你刚刚得到了一个比以前更有能力专注的团队。用那个!为此,您需要执行以下操作:
- ****相信你的团队。如果你从如何管理好一个远程团队中吸取了一点经验,那就是:相信你的团队能够有效地工作,并合理地管理他们的时间。如果你花很多时间做更多的微观管理,你将会放弃远程工作的几乎所有好处。
- ****设定明确的期望。如果你能设定清晰的工作优先级,并设定可衡量的里程碑,你就能让你的团队投入工作并专注。在这一点上,在家工作可能是一个巨大的优势,因为希望更少的干扰和更多的时间来完成工作。
如果你能设定明确的期望,并相信你的团队能完成工作,远程工作会是一个优势。例如,你可以在一天开始时与团队一起检查,设定期望,然后让每个人去工作。
建立系统和流程来平衡不利因素
现在,让我们来讨论一下它的缺点。沟通与协作。当你知道需要做什么,并且能够独立完成时,专注的工作是很棒的。但是那些面对面合作的偶然时刻呢?你如何复制它?我认为你不能完全。面对面的交流和合作可能总是更好(因此,没有免费的午餐),但这并不意味着你不能最小化远程工作的缺点。为此,我建议如下:
- 视频交流。我们交流的很多方式都是非语言的,在通话中不打开视频会损害你的交流能力。
- 在会议中不要总是直奔主题。对于远程团队,你没有时间进行“饮水机”式的讨论。在适当的时候,花些时间开会,只是为了保持联系。
- ****安排远程友好的团队建设活动。“水冷却器”讨论应该每天进行,但我也建议每月进行一次活动,集中时间放松和了解对方。我的团队最喜欢的是黑手党。
- 当接下来的步骤不明确,而您需要创造性的协作时,使用视频会议平台上的白板功能进行远程头脑风暴。不要只是参加一个虚拟会议,然后开始讨论想法。事先以书面形式发出目标,让人们单独进行头脑风暴,并将想法带到会议上,并允许每个人分享他或她的想法,然后进行讨论并确定优先顺序。这有时被称为无声头脑风暴,非常远程友好,往往更有效。
- ****培养一种彻底坦诚和心理安全的文化。你现在的一个弱点是沟通,因为你很偏远。确保你的文化在公开和诚实的反馈方面特别强大。正反都有!作为一名领导者,要在寻求、给予和接受反馈方面树立榜样。确保每个人在表达想法和发表意见时都感到安全。
这些步骤应该有助于在您的远程团队中建立友谊和信任,这两者对于强大的沟通和协作都是必要的。你无法享受面对面协作的偶然时刻,也无法享受人们共处一室时发生的会后讨论。
投资工具鼓励协作
你可以利用一些神奇的工具来提高沟通和协作的效率。
缩放
一个好的视频会议工具对于所有团队都是不可或缺的,尤其是远程工作的团队。我们每天使用 zoom 与远程团队成员开会。无论你选择什么样的视频会议工具,都要确保它易于使用,这样你的团队在和同事打电话时就可以尽量减少摩擦。
松弛
实时消息传递允许团队中的信息流动是临时的、对话式的和非正式的。这些都是至关重要的价值观,可以确保你保持你的团队能够轻松地、有机地、协作地开发创意。Slack 是一个流行且优秀的工具,允许团队这样做。
彗星
即使在同一个地方工作,数据科学团队也容易成为一群孤独的建模者。切换到远程,就更容易掉进这个陷阱。幸运的是,有工具可以让数据科学家、机器学习工程师或任何处理模型的人更容易地在分布式团队中实时记录、可视化、共享和重现他们的工作。Comet 提供了一个元机器学习平台,可在云中或本地/VPC 运行,允许数据科学团队这样做:重现完整的实验(而不仅仅是代码),管理大型分布式数据科学团队的用户,并为经理提供对团队贡献和绩效的洞察。
Comet 允许数据科学团队通过与许多用户创建协作项目来轻松管理分布式团队:

在 Comet 中添加合作者
如果您的团队是一个协作项目的一部分,每个数据科学家都可以在一个中心位置发布他们的实验,在这里可视化、比较、分析和调试团队范围的工作变得很容易,即使在远程工作时也是如此:

彗星项目页面
结论
随着新冠肺炎迫使许多团队进行远程工作,新远程团队的成员和经理们将很好地考虑如何充分利用他们的新远程办公。利用远程工作优势的团队将保持高效、沟通和快乐。此外,可以实施安全措施和流程来有效应对远程团队面临的许多常见挑战。帮你自己一个忙,今天晚些时候和你的一个同事安排一次 15 分钟的视频通话。这将是值得的时间。
本文与 Comet.ml 的 Nikolas Laskaris 共同发表。我是 Comet 的用户,他们没有为这篇文章付钱。
有兴趣了解有关 Python 数据分析和可视化的更多信息吗?查看我的课程。
如何在 Tableau 中制作桑基图

桑基图是一种图表,我们可以用它来可视化一个度量在多个维度上的流动。桑基图是由爱尔兰船长桑基发明的,用来描述蒸汽机中的能量流动。

M. H. Sankey 在维基百科上的第一张 Sankey 图(CC-PD)
有几个用例适合用 Sankey 图来可视化。一些例子是:
- 网站访问者行为
- 用户转化
- 交通模式
- 产品分配
在这篇文章中,我将一步一步地介绍如何使用 Tableau Pubilc 创建一个 Sankey 图。对于没有 Tableau 的你,你可以使用这个链接免费下载 Tableau Public。
步骤 1 导入数据集
我们使用的数据源是 Superstore Dataset 和 tableau。我们可以通过连接 Microsoft Excel 并选择一个超级商店文件来导入它。

导入数据集
步骤 2 创建参数、尺寸和测量
在这一步中,我们将创建两个参数和三个计算字段。这些参数和计算字段将用于为用户提供选择 Sankey 两侧尺寸的能力。
首先,为“选择尺寸 1”和“选择尺寸 2”创建参数,设置如下。为此,我们可以创建选择维度 1,然后复制并粘贴它,并更改选择维度 2 的名称。

选择维度 1 的配置
其次,我们需要创建计算字段作为所选维度的占位符。我们需要为选择维度 1 和选择维度 2 创建它。

维度 1 计算字段
然后,我们将为我们选择的度量创建一个计算字段,并为此选择 Sales。

选择的度量计算字段
步骤 3:创建数据加密框架
在这一步中,我们将我们的测量值与测量值的固定最小值进行比较。通过这样做,我们可以确保我们帧之间的两个数据点。

路径框架计算字段
接下来,我们将划分 bin 大小等于 1 的路径帧,并为该路径创建索引。

为路径框架创建箱

路径框架箱设置

路径索引计算字段
步骤 4 设置图表曲线
我们需要制作两个计算字段,以便在我们的 Sankey 中制作一条曲线。我们将采用 sigmoid 公式来完成这项任务。执行此任务的计算字段如下所示。


步骤 5 桑基臂尺寸
此计算字段将每个 Sankey arm 作为完整数据集的百分比。

第 6 步顶线和底线计算
此时,我们需要创建八个计算字段。这些字段用于创建每个 Sankey 的顶部和底部。在这些计算中,位置 1 是指左侧的尺寸 1,位置 2 是指右侧的尺寸 2。
以下是顶部和底部的计算字段:
最大位置 1:
RUNNING_SUM([Sankey 臂长])
最大位置 1 包:
WINDOW _ SUM([最大位置 1])
最大位置 2:
RUNNING_SUM([Sankey 臂长])
最大位置 2 缠绕:
WINDOW _ SUM([最大位置 2])
最小位置 1 的最大值:
RUNNING_SUM([Sankey 臂长])
最小位置 1:
RUNNING _ SUM([最小位置 1 的最大值]-[Sankey 臂尺寸]
最小位置 1 换行:
WINDOW _ SUM([最小位置 1])
最大为最小位置 2:
RUNNING_SUM([Sankey 臂长])
最小位置 2:
RUNNING _ SUM([最小位置 2 的最大值]-[Sankey 臂尺寸]
最小位置 2 换行:
WINDOW _ SUM([最小位置 2])
WINDOW _ SUM([最大位置 2])
步骤 7 三键多边形计算
该计算结合了上述所有计算,并为 Sankey 生成多边形。

步骤 8 创建桑基表。
此时,我们已经创建了三个新的维度、16 个度量和两个参数。在这里,我们将使用所有这些来制作桑基。

首先,拖动路径框架(bin),尺寸 1,尺寸 2,作为标记中的细节。接下来,将 T 放入列中,并使用路径框架(bin)计算它,同时将 Sankey 多边形拖动到行中。然后将标记更改为多边形,并将路径索引添加到路径中,并与路径框架(bin)一起计算。最后,单击右下角的 96 nulls 显示所有 null 值。

现在我们需要编辑桑基多边形的表格计算。我们需要一个一个仔细考虑。




总共有 12 个嵌套计算。编辑完计算表后,我们将把这张表准备好。

制作桑基手臂
我们继续通过创建两个新的表并如下设置,在 Sankey 的左侧和右侧创建 Sankey 手臂。

左侧桑基臂

右侧桑基臂
通过将选择的度量拖到行中,并将表计算改为占总数的百分比。然后添加颜色和文本的维度。另外,为 Sankey 右侧的颜色标记添加 INDEX()。
步骤 10 创建仪表板
最后一步,我们需要将所有的表和过滤器排列在一起,以得到我们的 Sankey 图。

结论
最后,我们得到了第一个 Sankey 图,可以用来显示超市数据集中的流量。您可以查看此 Sankey,并通过此链接下载工作簿。
此外,您可以更改数据源并按照步骤构建自己的 Sankey 图并共享您的作品。
参考
如何使用 Flask 和 FaunaDB 制作可伸缩的 API
帮助使用 Flask 和 FaunaDB 构建快速 API 的快速样板文件。

凯文·霍尔瓦特在 Unsplash 上的照片
随着无服务器技术的兴起,web 服务变得越来越简单。无服务器应用程序改变了应用程序的旧的整体架构,并促进了更多的微服务解决方案来解决技术问题。
凭借自动扩展和多区域部署的优势,无服务器应用近年来迅速崛起也就不足为奇了。无服务器的成本也重新定义了我们制作软件的方式,因为它现在是基于每个请求,而不是基于时间的服务。
更好的是,无服务器还使小型服务完全免费。大约一百万次请求后才需要支付。Azure Function 的消费计划就是一个例子。
无服务器和这个教程有什么关系?
这里提到无服务器的主要原因是因为 FaunaDB 是一个 NoSQL 数据库,它是为无服务器设计的。这个数据库的价格是基于请求的,这正是无服务器应用程序所需要的。
使用像 FaunaDB 这样的服务可以大大降低成本,以至于该应用程序的托管功能几乎是免费的。当然不包括开发成本。因此,对无服务器应用程序使用按月计费的数据库就失去了意义。
自由堆栈的例子是 Netlify、Netlify 函数和 FaunaDB 的组合。尽管它只对一定数量的请求是“免费的”。除非你开发的应用在部署的第一天就有成千上万的用户,否则我不认为这是什么大问题。
在我看来,对无服务器应用程序使用按月计费的数据库有点扼杀了这一点
另一方面,Flask 是用 Python 编写的微框架。它是一个极简框架,没有数据库抽象层、表单验证或其他框架提供的任何其他特定功能。
Flask 大体上是无服务器兼容的。你可以用 AWS Lambda 做一个无服务器的 Flask 应用。这里是来自 serverless.com 的官方指南。
入门指南
设置 Python 和 Pip
首先安装 Python 和 Pip。我不会列出所有可能的安装方式,对于 Windows 用户,你可以在这里获得安装程序。至于 Linux 用户,如果你使用的是基于 Debian/Ubuntu 的发行版,打开你的命令提示符,安装 python 和 pip,如下所示:
sudo apt update
sudo apt install python3 python3-pip
要检查安装是否正确,请尝试执行以下命令:
python --version
pip --version
然后会显示相应命令的版本号。
安装依赖项
环境设置完成后,下一步是安装 Flask 本身。安装过程很简单,只需输入:
pip install Flask
然后,为 FaunaDB 安装 python 驱动程序:
pip install faunadb
瞧!一切就绪!
制作待办事项应用程序
现在我们要用所有应用程序创意的之母制作一个示例应用程序,待办事项列表应用程序。
待办事项列表模板
对于这个例子,因为我们将主要关注如何制作 API,我们将使用 W3School 模板用于待办事项列表应用前端。

作者举例说明应用程序
基本项目结构
我们的项目将是一个助手模式的实现。我们项目的一个简单概要如下:
-/
|--app.py
|
|--services
|--todo_service.py
|--helpers
|--todo_helper.py
|--entities
|--faunadb_entity.py
FaunaDB 指数
等等,什么是索引?
索引是你在 FaunaDB 中做‘where’语句的方式。它允许您根据字段值获取特定的文档。
要创建新的索引,只需转到数据库的 Indexes 部分,然后单击 New Index 。

FaunaDB 索引页面,作者图片
创建索引时,选择您想要与之交互的集合。然后定义要搜索的字段名称。最后,定义你的索引名,确保它是唯一的和可读的。

FaunaDB 新索引表,作者图片
例如,让我们创建一个索引,在这个索引中我们可以获得现有集合中的所有数据。

所有待办事项索引,作者图片
哦,通过用户的电子邮件获取 todos 的索引怎么样?简单。

通过电子邮件获取待办事项,通过作者获取图片
如果要使术语唯一,请选中唯一复选框以添加约束。

在 FaunaDB 中添加约束,按作者排序的图像
要向某个集合添加约束,您需要使用包含唯一字段的术语创建索引。
为了帮助你更好地理解,这里有一篇来自《动物群》的官方文章来帮助你理解指数。
让我们制作 API
创建烧瓶启动文件
首先,编写一个运行 Flask 的 python 文件。
基本烧瓶应用程序
编写 FaunaDB 实体脚本
接下来,在我们开始编写服务和助手之前,我们必须首先定义一个实体文件来连接到 FaunaDB。
这用于通过索引获取 FaunaDB 文档。get 函数不返回多个文档,一次只能返回一个文档。
为了获得多个文档,我们需要使用一个映射函数,通过某个索引返回多个数据。
lambda 函数将传递索引中所需的数据,而 paginate 将在集合中搜索特定的文档,然后 map 函数将所有匹配的文档作为列表返回。
Get document by reference Id 是惟一一个不使用索引而是利用文档的引用 Id 的函数。
创建、更新和删除文档的代码是相似的。因为 FaunaDB 是一个 NoSQL 数据库,所以数据结构并不重要,只要它是作为字典传递的。更新和删除文档还需要一个额外的引用 Id 参数,类似于通过引用 Id 获取文档函数。
成为待办事项助手
在编写了 FaunaDB 实体脚本之后,为集合编写助手函数。辅助函数需要是精确的小函数,只做一件事。
制作待办事项服务
当所有的助手都准备好了,编写服务文件作为端点使用。所有的请求都在服务级别进行解析,因此助手级别将只接收处理过的数据。
将路由附加到服务端点
最后,当端点设置好后,将端点添加到 app.py
你完了!不要忘记在部署之前用 Postman 测试 API。
摘要
TL;你可以查看我的项目 Github 库,并尝试自己运行它。
[## agustinustheo/flask-faunadb
Flask 和 FaunaDB 项目的样板代码。
github.com](https://github.com/agustinustheo/flask-faunadb)
在本教程中,您已经学习了使用 Flask 和 FaunaDB 制作 API。
概括地说,我们已经取得了:
- 使用 Flask 的 API 端点。
- 动物区的索引 b。
- FaunaDB 的一个简单的实体助手。
- 未来 API 项目的可读样板。
当你想在几个小时内制作一个快速的应用程序时,你现在有了一个快速的模板设置。未来的计划包括在现有的样板文件中添加一个 Swagger 实现。
希望这是你的一个好的开始,祝你愉快!
如何充分利用 BERT 微调
资源受限的 BERT 微调
重量初始化、数据订单和提前停止

照片由德鲁·帕特里克·米勒在 Unsplash 上拍摄
在下游任务中微调像 BERT 这样的预训练语言模型在 NLP 研究和应用 NLP 中已经变得无处不在。这部分是因为使用预训练模型可以节省大量时间和金钱。它们也经常作为强基线模型,当微调时,显著优于从零开始的训练模型。
W 尽管微调 BERT 在理论上相对简单,但由于不同训练运行的结果似乎是随机的,因此在实践中可能会非常耗时且得不到回报。事实上,即使反复微调具有相同超参数的模型,由于(1)权重初始化和(2)数据顺序(数据集如何被打乱)的随机性,最终模型性能也可能存在很大程度的可变性。在小数据集上微调 BERT 时,这尤其是个问题。
最近的研究探索了这些经常被忽视的随机性来源。作者提供了 2 个实用技巧,在给定一定计算预算的情况下,您可以使用它们来微调更好的模型,从而充分利用 BERT 微调:
- 在一个时期内多次评估您的模型;和
- 尽早识别不良初始化并阻止它们。
除了这些实用技巧之外,本文还提供了两个有趣的见解:
- 使用与原始设置中相同的超参数训练 BERT,但使用不同的随机种子,导致性能大幅提高,使其在某些任务上可以与 ALBERT 等新架构竞争;和
- 有一些权重初始化在全局上比其他的更好:它们在多个任务上比其他初始化产生更好的模型。
实验装置
作者在 4 个不同的 GLUE 二元分类数据集上多次微调 BERT。其中三个相当小(MRPC、RTE 和可乐),一个相对大(SST)。
在每个数据集上,他们共同微调所有 BERT 参数,并在所谓的剧集中训练一个分类头。在每一集中,超参数是相同的,但是控制权重初始化和数据顺序的随机种子被修改。作者在小数据集上尝试了 25 种不同的随机种子,在 SST 上尝试了 15 种。也就是说,他们总共播放了 2100 集(3 x 25 + 15)。
技巧 1:经常评估
标准的机器学习工作流程相当于根据训练数据训练一定数量的模型,在验证集上挑选首选模型,并在测试集上评估其最终性能。
在这个工作流程中,训练更多的模型自然会导致最佳模型的更高的预期性能和更小的方差。但是训练更多的模型也需要更多的时间和资源。因此,从业者面临着预期性能和资源消耗之间的权衡。
了解这种权衡是什么样的非常重要。我们可以在运行一定数量的微调剧集后,通过绘制预期的验证性能来实现这一点:

x 轴:微调集的数量(训练的模型),y 轴:最佳模型的预期性能。每个时期评估模型 10 次比每个时期评估一次或在训练中评估一次会导致更高的预期性能。[ 来源
正如所预期的,当用一些超参数训练一个模型仅一次时,验证性能的差异是巨大的。随着更多模型(具有相同的超参数,但是用于权重初始化和数据顺序的不同种子)被训练,方差减小。类似地,最佳模型性能的期望值随着我们尝试的不同初始化的数量而增加。
关键要点是:
从上面的图表中我们可以看出,每个时期评估模型 10 次(蓝线)比每个时期评估一次或更少会导致更高的预期验证性能。因此,作者得出结论认为
“根据验证数据更频繁地评估模型会导致更高的预期验证值”
随机种子的影响有多大?
我们刚刚看到,如果我们仅微调 BERT 一次,在某个超参数设置下,验证性能会有很大差异。这是由于随机权重初始化 (WI) 和数据顺序 (DO) 。这些初始化对性能有多大影响?
为了回答这个问题,作者绘制了每个数据集的最佳/最差 WI/DO 种子的所有片段的验证性能分布:

对于最差的种子(绿色和红色虚线),验证性能的密度往往位于较低的性能区域。这对于 MRPC 和 RTE 来说尤其如此,其中分布呈现双峰。[ 来源
从上面的图表中,我们看到最好的种子在高性能区域比最差的种子有更多的密度。作者进行了方差分析测试,证明了最佳和最差种子的分布确实具有不同的均值。

用不同的随机种子多次训练 BERT 会比之前报道的分数有很大的提高[ 来源
权重初始化和数据顺序的不同随机种子会对性能产生很大影响。与之前报道的具有相同超参数和实验设置的分数相比,作者的最佳微调 BERT 模型表现得更好。在某些任务上,BERT 甚至可以与 ALBERT 这样的新型号竞争。
I 有趣的是,似乎有全局良好的初始化。因为所有 4 个任务都涉及训练二进制分类器,所以可以检查用于一个任务的权重初始化的好种子是否也适用于其他任务。作者发现情况是这样的:有一些初始化在所有任务中表现一致!这真的很令人兴奋,作者将这个问题留给未来的研究。
关键要点是:
最佳和最差随机种子之间的性能差异是显著的。我们能否在训练的早期识别出不良的随机种子,并从中获得实用的见解?(答案是肯定的!继续阅读)
秘诀 2:开始很多,早点停止,继续一些
在实践中,资源通常是有限的——无论是时间还是金钱。因此,考虑到强加给我们的约束,我们希望尝试并获得最佳模型。如果我们能够在训练过程的早期识别出导致糟糕的最终模型的情节,我们就可以阻止它们,并将我们的资源花在更有希望的情节上。幸运的是,作者证明了我们可以做到这一点。

每个任务 20 次随机初始化的训练曲线。不良的初始化可以在早期识别出来。[ 来源
T 上图表明,识别不良初始化是可能的,这将在训练结束时导致不良模型。对于较小的数据集来说尤其如此。对于较大的 SST 数据集,这在图中似乎不太明显,但在这种情况下,2 个时期后的验证性能与最终验证性能之间仍有很强的相关性。
然后,问题变成了如何决定何时停止训练一个模型,以及训练多少个模型。为此,作者使用了一种受超参数搜索早期停止标准启发的算法。该算法采用以下 3 个参数:
- t: 我们开始训练的车型数量
- f :何时评估模型,占总历元数的百分比
- 继续训练的表现最好的模特的数量
运行该算法需要(TF+p(1f))s个步骤来完成,其中 s 是总历元数(在本例中 s=3)。作者在 20–30%的范围内使用 f 获得了最佳结果。他们还运行实验,并显示不同计算预算的最佳参数。共同趋势是:
- t 应远大于p;还有
- p 应该大约是我们的计算预算允许我们完全训练的模型数量的一半(对于 s 时代)。
结果总结在下图中。它显示了对 4 个任务中的每一个使用上述算法时的相对误差减少。误差减少是相对于不使用上述算法而言的——也就是说,只需要完全训练一定数量的模型(x 轴)并选择最好的一个。正如我们所见,对于任何计算预算,早期停止算法都会带来可观的性能提升。

与仅完全训练 t 个模型(x 轴)[ 源 ]相比,使用上述提前停止算法微调 BERT 时的相对误差减少
关键要点是:
在预算有限的情况下对 BERT 进行微调时,启动许多模型,尽早停止坏的模型,并且只处理少数几个模型,可以获得更好的整体性能。
结论
在资源受限的环境中(有固定的计算预算),使用以下两个技巧来充分利用 BERT 微调:
- 在一个时期内多次评估你的模型;和
- 尽早识别不良初始化并阻止它们。
资源受限的预训练
如果您觉得这很有趣,您可能还想看看下面的文章,其中讨论了改进像 BERT 这样的 Transformer 模型的预训练的方法。
如何训练更快、更高性能的变压器
towardsdatascience.com](/this-is-how-to-train-better-transformer-models-d54191299978)
[1]:杰西·道奇,加布里埃尔·伊尔哈尔科,罗伊·施瓦茨,阿里·法尔哈迪,汉纳内·哈吉希尔兹,诺亚·史密斯,微调预训练语言模型:权重初始化,数据顺序和提前停止 (2020)。
[2]:杰西·道奇,苏钦·古鲁兰根,达拉斯·卡德,罗伊·施瓦茨,诺亚·a·史密斯,展示你的工作:改进实验结果的报告。进行中。EMNLP 的(2019)。
[3]:李丽莎,凯文·杰米森,朱利亚·德萨沃,阿夫申·罗斯塔米扎德,阿米特·塔尔沃卡,超波段:一种基于 bandit 的超参数优化新方法。《机器学习研究杂志》(2018)。
充分利用你的拓展实习
改变人生的远程技术实习——在这场新冠肺炎战役中堪称完美
什么是 Outreachy?
Outreachy 是一个带薪的全日制远程技术实习项目,每年进行两次。它对全世界的女性(包括异性恋者和变性人)、变性人和性别同性恋者开放。实习生与来自开源社区的经验丰富的导师一起工作,如 Mozilla、Python Foundation、Fedora 等。
我在 2018 年夏天在 Mozilla 的 Taskcluster 团队下做了一次外展实习。我的项目是建立一个code attribute,网站,让人们在 Mozilla 中找到好的第一个 bug。我的实习真的很棒!以下是我在实习期间喜欢做的一些事情,我希望能帮助那些对这个项目不确定的人。
像 Git 一样学习源码控制
大多数项目使用版本控制,例如 Git 或 Mercurial,它允许人们与其他人协作。此外,在应用阶段,您可能已经开始使用版本控制来为项目做贡献了。这真的迫使我使用版本控制,这是我在实习前很少在学校项目中采用的做法。你会犯错误(我想我在某个时候损失了一整天的工作😫)并学会问大量的问题,但你肯定会学到很多东西。
飞行和参加 Mozilla 全体人员

奥利弗·普拉特纳在 Unsplash 上拍摄的照片
在我被这个项目录取的几天后,我收到了 Mozilla All Hands 的邀请,这个活动将在我实习期间举行。这是一个非常激动人心的事件!整整一周的时间与所有其他 Mozilla 员工见面,与你的导师和现实生活中的其他人见面,并建立关系网。非常好玩!
有大量的研讨会要参加,也有很多好东西要抢。我得到了一本 Rust 编程书,并被告知作者也参加了 All Hands😆!我被解释说,通常会有一种“赠品”,他们打开一个房间,你可以拿走房间里的任何东西,如 t 恤,包,别针,以及可爱的笔记本电脑贴纸。可悲的是,我错过了那个赠品,因为我在别的地方聊天。然而,幸运的是,我在回机场的路上遇到的一个女孩随机给了我一些 t 恤,说它对她来说太小了!多么令人惊喜啊!!在整个旅程中,我真切地感受到 Mozilla 人是多么的友好,我是多么的幸运!
我也遇到了一些我以前在 IRC 中交谈过的人,他们在不同的团队工作,还有所有其他的外展和 GSOC 实习生。一切都包括在内:餐费、机票和旅馆费。尽早申请签证(如果你需要的话),并要求在签证面试时带上 Mozilla 的推荐信,以增加你获得签证的机会😃。
PS:最初我的父母很担心我一个人从新加坡旅行,但是一切都计划得很好。每小时都有巴士从旧金山机场接我们去酒店,所以没有必要自己安排交通。所以,如果你被邀请去,扔掉你所有的犹豫!
即使实习结束后也要管理你的项目
没错。你没听错!因为我的项目是开源的,所以即使在实习结束后,我也可以管理和贡献我的项目。这样做的好处是能够继续融入社区并向他们学习。我喜欢我的团队和环境,我试图分配一些时间为项目做贡献。
因此,实习的最后一天并不是你项目/学习的结束。此外,你的项目不是一个马上就被扔出去的实习生项目,而是成为一个更大的项目的一部分,彼此依赖。你的项目也可能是你为其他项目做贡献的开始。我见过其他实习生在实习结束后开始为其他项目做贡献。
有(一个/多个)导师
在实习项目期间,所有实习生都被指派一名或多名导师来支持他们。至于我,我被分配给 3 个导师。我想这可能是因为我的项目需要跨职能会议的性质。我非常感谢他们每一个人。
我确实认为有导师是无价的,因为他们不仅在技术上指导你,而且告诉你应该如何在你感兴趣的领域导航。我的导师让我感到很舒服,可以问问题,并在我的实习项目之外非常关心我,我们经常讨论我的兴趣和未来的计划。他们还分享了关于他们开始工作时做了什么,管理他们的工作机会等的见解。他们甚至鼓励我在实习结束后申请某个职位,并要求我在实习结束后保持联系。
学习一些编程技巧
我想这取决于你的项目,但对我来说,我在实习期间学到了很多前端技能以及如何编写可读的代码。以前,我总是匆匆忙忙地完成我的项目,不加考虑地命名事物,拥有巨大的函数做大量的事情,等等。我的导师通过严格的代码审查耐心地教我。我在实习期间的一个目标是在一次审查中通过拉请求哈哈😅。
加入一群过去的实习生
有一个外展校友小组,你可以加入,他们会不时分享一些机会或很酷的事件。你也可以看到其他实习生在做什么,并与他们交流。
货币($)
在我申请的时候,我不太考虑金钱上的好处,因为我非常渴望学习,即使他们什么都不付,我也可能会申请。此外,我在家乡找到的其他一些实习也是无薪的。此外,我觉得如果我设法从丰富的经验中学习,这在技术上就像是免费上学(如果没有报酬的话)。
然而,外展确实带来了一些金钱上的好处:
- Outreachy 在整个实习期间支付了 5500 美元。付款根据完成阶段划分。你可以填写一些表格,这样也可以免税😜。
- Outreachy 提供 500 美元的旅行津贴,用于会议或活动。这可以在实习期结束大约一年后申请。
- 如果你为 Mozilla 项目工作,你将会得到一台全新的笔记本电脑,甚至在工作结束后你也可以保留它。我呢,选择 13 寸的 Macbook Pro 2017,带 Touch Bar。
PS:
- 在您申请期间,福利可能会发生变化。我会尽量保持更新,但是,请仔细检查网站,因为它是真实的来源。
- 所有的货币都是美元
感谢您读到这里!希望这篇文章对你有帮助和启发😃!如果你碰巧是/认识以前的实习生,请在评论区分享你最喜欢的外展活动,以及我错过了哪些好处!
如何用 Python 制作按 Alpha 值的地图
关于如何用 Python 创建 Alpha 值映射的初学者指南和教程

自从我看到 Alpha 值地图的美丽美学,我就想做一个。当时,在 QGIS 或 ArcGIS 中稍加修改就能制作出它们并不困难。现在,由于 Pysal 库和 Splot,您可以使用 Python 制作按 alpha 值的地图。
在本教程中,我将指导你如何使用 Python 制作 alpha 值贴图。但是首先,让我们了解什么是按阿尔法值的地图,为什么要使用它,什么时候使用合适?
什么是阿尔法值图(VBA)
“按阿尔法值”是双变量 choropleth 技术,其中我们考虑两个相互影响的变量,例如,选举结果和人口密度。第二个变量充当另一个感兴趣的变量的均衡器。
因此,VBA 通过阿尔法变量(透明度)修改背景颜色。因此,较低的值会淡出背景,而较高的值会弹出。VBA 地图的出现是为了减少 choropleth 地图中较大的尺寸偏差。
除了美学部分,如果你想通过色彩而不是尺寸来突出聚光灯,使用 choropleth 技术,VBA 也是一个不错的选择。它确实比纯粹的 choropleth 图描绘了更好的信息。
但是,您首先需要有一个与感兴趣的变量相关的变量(即,拥有更多选民的县对选举结果有重要影响)。
如何用 Python 制作按 alpha 值排序的地图
我们将使用 Splot Python 库来创建我们的地图和 Geopandas 来读取地理空间数据。我们使用了 2012 年美国大选的子集数据。让我们首先读取数据,看看前几行。
import geopandas as gpd
from splot.mapping import vba_choroplethimport matplotlib.pyplot as plt
%matplotlib inlinegdf = gpd.read_file("data/MN_elections_2012.gpkg")
gdf.head()
从下表中可以看出,我们有一个包含不同列的地理数据框架。例如,巴拉克·奥巴列保存该区域的结果。

2012 年选举数据
我们大部分时间使用 choropleth 地图,但是正如我们在前面提到的,它有其局限性。让我们首先从数据中制作一个 choropleth 图,为数据可视化创建一个基准。例如,我们可以选择使用巴拉克·奥巴马专栏。
fig, ax = plt.subplots(figsize=(12,10))
gdf.plot(column=’BARACK OBA’, scheme=’quantiles’, cmap=’RdBu’, ax=ax)
ax.axis(“off”)
plt.show()

等值区域图
现在,我们创建一个 alpha 值图。为了创建我们的地图,我们需要两列。第一列是我们感兴趣在地图中显示的内容;例如,巴拉克·奥巴马的结果。第二列保存要均衡的 alpha 值。这种 alpha 均衡将从贴图外观中消除低值,并增加高值区域的聚光灯效果。我们可以选择总结果作为 alpha 值。
fig, ax = plt.subplots(figsize=(12,10))
vba_choropleth(
gdf[‘BARACK OBA’].values,
gdf[‘Total Resu’].values,
gdf,
rgb_mapclassify=dict(classifier=’quantiles’),
alpha_mapclassify=dict(classifier=’quantiles’),
cmap=’RdBu’,
ax=ax,
revert_alpha=False )plt.show()
“按 alpha 值”贴图会立即高亮显示高值区域,即使它们是 n。与大区域在视觉上占主导地位的 choropleth 贴图相比,“按 alpha 值”贴图会清楚地显示高值区域。

按 alpha 值映射
我们可以简单地使用黑色背景来强调聚光灯的效果。将下面的“按 alpha 值”贴图与上面的贴图进行比较。
plt.style.use('dark_background')
fig, ax = plt.subplots(figsize=(12,10))
vba_choropleth(
gdf[‘BARACK OBA’].values,
gdf[‘Total Resu’].values,
gdf,
rgb_mapclassify=dict(classifier=’quantiles’),
alpha_mapclassify=dict(classifier=’quantiles’),
cmap=’RdBu’,
ax=ax,
revert_alpha=False )plt.show()

alpha 值贴图-黑色背景
没有图例,按 alpha 值的图很难阅读。Splot 提供了一种创建图例的简单方法,甚至比其他重量级 GIS 软件应用程序都要简单。我们也回复到白色背景。
plt.style.use('default')
fig, ax = plt.subplots(figsize=(12,10))
vba_choropleth(
gdf[‘BARACK OBA’].values,
gdf[‘Total Resu’].values,
gdf,
rgb_mapclassify=dict(classifier=’quantiles’),
alpha_mapclassify=dict(classifier=’quantiles’),
cmap=’RdBu’,
ax=ax,
revert_alpha=False,
legend = True
)plt.show()

最后,我们可以给地图添加一些上下文。例如,我们可以添加主要城市,以帮助读者有效地阅读地图。
cities = gpd.read_file(“data/ne_10_populated_places.geojson”)
cities = cities.to_crs(“EPSG:26915”)fig, ax = plt.subplots(figsize=(12,10))
vba_choropleth(
gdf[‘BARACK OBA’].values,
gdf[‘Total Resu’].values,
gdf,
rgb_mapclassify=dict(classifier=’quantiles’),
alpha_mapclassify=dict(classifier=’quantiles’),
cmap=’RdBu’,
ax=ax,
revert_alpha=False,
legend = True
)
cities.plot(ax=ax, color = "white")
for x, y, label in zip(cities.geometry.x, cities.geometry.y, cities.NAME):
ax.annotate(label, xy=(x, y), xytext=(3, 3), textcoords="offset points")
plt.show()

现在,我们有了一个美观的地图,帮助我们传达聚光灯的效果,而没有 choropleth 地图的限制。
结论
按 alpha 值排序的地图是可视化地理空间数据的有效方法,避免了 choropleth 和 cartogram 地图的限制。在本教程中,我们已经探索了什么是 alpha 值贴图,以及如何使用 Splot 库创建一个。
本教程的代码可以从这个 Github 资源库获得。
Python 中 alpha 贴图的值。在 GitHub 上创建一个帐户,为 shakasom/vba 开发做贡献。
github.com](https://github.com/shakasom/vba)
如何做一个病毒式传播的项目?
这是一个个人项目到达 79 个国家的故事。

由 Jukan Tateisi 在 Unsplash 拍摄的照片
我们所要决定的是如何利用给我们的时间。~ 甘道夫
让我们从故事的结尾开始,这里是项目:
此页面显示最新的新冠肺炎统计数据。
yleprince.github.io](https://yleprince.github.io/corona/)
🌎️背景
和大多数法国人一样,我从 3 月 17 日起就一直生活在隔离区。我的工作变得 100%遥不可及,我的爱好也停止了。于是我浏览 thenews.im 消磨空闲时间。我发现这个冠状病毒 API:thevirustracker.com。它提供了关于新冠肺炎传播的全球视角。他们也有一个很好的关于世界形势的仪表板。约翰·霍普金斯大学的仪表板也是如此。这些板的主要问题是它们很难加载到智能手机上。他们正在加载沉重的地块和地图需要很多时间来显示。
💡️ ️The 理念
我想在我的手机上以光速获得新冠肺炎的最新数据。
👶第一版
我决定从简单开始,非常非常简单。这是该项目的第一个版本:

第一版:极简主义的全球信息
这再简单不过了。显示的数据正是 thevirustracker.com 提供的数据。它丑得要命,但仍然很轻,满足了我的需求。有了它,我能够在一秒钟内实时了解疫情的发展。
由于数量不多,我把这个链接分享给了我的家人和密友。很少有人见过这种发黄的版本。但是他们正在使用,并且给出了反馈。我妈要的是法语版。完成了。
为了更具包容性,我向前迈了一步,更改了页面外观。我为色盲的人使用了更多的对比色,为视障用户使用了尽可能多的 HTML 标签。众所周知,有些浏览器会根据底层结构大声读出网页。对于这一页,它曾经说“New section: Worldwide stats [...]”。我把标题空白分割成了一个<h1>标签(即。标题第一级)。现在包容性的浏览器都在说“【T2”,你可以基于这个结构在页面中导航。
这并不多,提供公共内容的人应该始终记住尽可能地包容。大多数时候不需要额外的努力。
👧️第二版
从第一个版本开始,我发现人们希望对传播进化有更多的见解。我决定添加一个折线图来显示一个国家或更多国家的趋势。

第二个版本:增加了分析国家趋势的折线图。
在左边,你有这个功能的截图。第一个下拉列表Add a country允许您选择国家。第二个选项让用户选择显示的数据(病例数、恢复数…)。
该图旨在表明版本 2 正在解决这一新的需求。此时,用户能够相互比较国家。你可以看到蔓延的趋势,并估计即将到来的情况。数据直接从 thevirustracker.com加载,提供最新数字。
为了更进一步,我添加了一个按钮Log scale,允许用户显示日志视图。它拉平了指数方面。这一特征证明非常有用,因为不同阶段的国家之间的比较在线性尺度上可能是困难的。
👩第三版
折线图便于探索/比较趋势,但无法准确洞察一个国家的情况。我从第二个版本的反馈中收集到,用户现在希望能够选择一个国家,并查看这个特定国家的实时数据。

第三个版本:添加地图以显示国家级别的见解
在左边,你可以看到一个新的特性:一个允许用户选择一个国家并显示详细数据的地图。
信息字段与第一次发布的版本相同。
在我从朋友和用户那里收到的反馈中,有一条很好地说明了这个项目是如何运作的:
一旦疫情达到几千人,数字就变得难以阅读。字体太细,数字之间距离太近。在他的评论中,我的朋友建议增加一个额外的空格以增加可读性。容易发现,更容易修复。受到了用户的热烈欢迎。这是一个快速的胜利!
👵️版本 4
第四个版本(这里将详细介绍的最后一个版本)包含一些视觉上的变化。用户界面中添加了两个按钮。

按钮来添加人类数量的比例
第一个允许用户根据人数来缩放数据。所以病例数变成了病例百分比。这个功能看起来很有用,但并没有被大量使用。页面查看者对这个参数并不感兴趣。

按钮来复制和共享配置链接
第二个按钮对页面的传播起到了巨大的作用。这是一个共享按钮,允许查看者复制页面配置。从这个阶段开始,每个用户都可以设置页面,并将其视图共享到自己的网络中。
📈️监控传播
就个人而言,我必须承认我喜欢探索数据。随着项目的展开,我的目标有了新的维度。我本可以决定停在版本 1,因为我的个人需求得到了满足。但是随着我的朋友、我的网络以及我朋友的网络使用这个页面,我有了更大的野心。我想改善网页带来的服务。这就是我监控页面使用的原因。
从技术的角度来说,每次用户在页面上做出改变,都会改变 url。将此与 Google Analytics 相结合,我能够看到如下指标:
- 目前浏览次数最多的配置:
被浏览最多的页面是中国、美国、法国和意大利的对比,地图上选择了美国。人口比例和对数比例均被禁用。
这是页面的链接:yleprince.github.io](https://yleprince.github.io/corona/?comp=CNUSFRIT&main=US)
- 使用最多的语言: fr 🇲🇫
- 页面被浏览的国家数量: 79

突出显示用户国籍的地图
- 独立访问者的数量:几千人
- 每个用户的平均访问次数: 1.9
- 一天中不同时间的用户数量:

突出显示每天每小时页面流量的热图
- 还有更多…
通过结合 url 持续更新和谷歌分析,我能够清楚地了解正在使用的功能和用户兴趣。在开发阶段对任务进行优先排序对我帮助很大。
💼️结论
就个人而言,这个项目是一次伟大的冒险。这是我的一个项目第一次接触到如此多的用户,他们来自不同的人群。我从一个想法开始,看到结果在十天内传播到世界各地是一种巨大的体验。尽管网络上已经有现成的工具,但它的简单性和包容性(智能手机、视障人士……)已经找到了它的受众。
从不了解你的人那里获得反馈是从客观评价中学习的最佳方式。
📌️外卖

简而言之,如何做一个像病毒一样传播的项目。
✍️ 后脚本
我希望我能够分享数据,为人们提供他们想要的信息。这个项目并不打算以任何方式从疫情获利。我投入了几个晚上的工作来满足人们的愿望,除了建设性的评论和良好的氛围,我一无所获。也就是说,项目中呈现的数据是 thevirustracker.com提供的数据。即使他们工作出色,每个人都应该考虑几个数据源。有多少个国家,就有多少种计算方法。
这是故事的结尾,我希望你喜欢读它,就像我喜欢生活一样!感谢所有在全球分享我的作品并给我反馈的粉丝们,没有你们,这篇文章就写不出来。
如果你想知道它是如何工作的,下面是代码:
基于 thevirustracker.com API 的项目。请随意贡献这段代码!
github.com](https://github.com/yleprince/corona)
呆在家里,保重🙏️*
如何使您的分类器安全
一个关于基于统计距离度量的机器学习/深度学习分类器的准确度估计的故事(SafeML 和 safe dl)——第一部分。

来自[https://github.com/ISorokos/SafeML]的 SafeML 标志
目录
- 简介
- SafeML 创意
- 统计距离
- 结论
- 参考文献
- 相关 GitHub 项目
- 相关中等岗位
1.介绍
如今,人工智能(AI)正在迅速发展,其应用涵盖了许多不同的学科。在这种快速增长的同时,对人工智能安全的担忧也在上升。对于人类生命、环境、金钱和隐私面临风险的安全关键系统,AI 安全不容忽视。(Amodei 等人,2016 年)已经讨论了认证该领域中运行的现代机器学习系统的不同现有问题。如下图所示,安全问题可分为五类,包括 A)安全探索,B)对分布转移的稳健性,C)避免负面副作用,D)避免“奖励黑客”和“电线接头”,E)可扩展的监督。

人工智能安全的五个主要类别
这个故事的主题可以被认为是人工智能安全中的“对分布变化的鲁棒性”问题。基于下图,我们将要解释的 SafeML 方法包括安全机器学习(SafeML)和安全深度学习(SafeDL)。

左:人工智能(AI) vs 机器学习(ML) vs 深度学习(DL)。右图:安全人工智能(SafeAI) vs .安全机器学习(SafeML) vs .深度学习(SafeDL)。
存在不同的现有方法来增加 ML 算法的安全性和鲁棒性。一些论文研究了分类器中结果的不确定性评估,而另一些论文则关注于提高对不确定性的鲁棒性。例如,下图显示了神经网络的 ETH 鲁棒性分析器(ERAN ),它对输入“8”使用可能的扰动,并试图创建一个抽象所有可能输出的形状。如果创建的形状违反了定义的边界,并且无法验证结果。否则,输出将得到保证。有关更多详细信息,请查看(Gehr,t .等人,2018 年和 Balunovic,m .等人,2019 年)。

神经网络的 ETH 鲁棒性分析器(ERAN)[https://github.com/eth-sri/eran
在第 2 节中,简单讨论了 SafeML 的思想,第 3 节通过一些 python 例子来说明统计差异度量的应用。第 5 节提供了一个简短的结论。一些相关的 medium 帖子和 Github 项目在故事的结尾有所暗示。
2.安全理念
SafeML 的想法是由(Aslansefat 等人,2020-b)提出的,目标是在没有可用标签时以某种方式监控分类器的决策。
下图展示了 SafeML 理念的流程图。在这个流程图中,有两个主要部分,包括培训阶段和应用阶段。

SafeML 流程图(Aslansefat 等人 2020-b)
a)训练阶段是一个离线过程,在该过程中,将使用可信或认证的数据集来训练智能算法,该算法可以是机器学习或深度学习算法。因此,将使用可信数据集来训练分类器,并且将使用现有 KPI(例如,ROC、准确性和 Kappa)来测量其性能。同时,每类的统计参数和分布将被估计和存储以用于比较(例如,平均值、方差值和经验累积分布函数(ECDFs))。
b)应用阶段是一个在线程序,其中实时和未标记的数据将被输入系统。例如,考虑一个已经被训练来检测不同安全攻击的安全攻击检测器,它应该过滤攻击者 IP。因此,在应用阶段,经过训练的分类器应该区分正常的网络流量和安全攻击(分类任务)。应用阶段的一个重要且关键的问题是数据没有任何标签。因此,不能保证分类器能够像训练阶段一样准确地运行。
在应用阶段,将根据分类器决策(未经认证)分离缓冲数据,并将存储每个类别的统计参数,以便与训练阶段的数据进行比较。使用将在下一节中解释的统计距离测量,将比较训练阶段和应用阶段中每个类的要素之间的距离。如果计算的距离和预期置信度(由专家定义)的差异非常低,则分类器结果及其准确性是可信的(系统是自主行动的),如果差异很低,则系统可以要求更多数据并重新评估以确定距离。在较大差异的情况下,分类器结果和准确性不再有效,并且系统应该使用替代方法或通知人工代理(在该示例中,系统将要求负责的安全代理手动检查网络流量并做出决定)。

SafeML 在安全入侵检测中的应用(如 CICIDS2017 数据集)
机器学习和深度学习在各种疾病的早期检测或诊断方面有无数的应用。例如,(Scudellari,S. (2020))写道“医院部署人工智能工具,在胸部扫描中检测新冠肺炎”。这种人工智能工具可以完全自主进行检测或诊断吗?他们安全吗?我们对他们安全的定义是什么?人们相信 SafeML 或类似的方法可能是这些问题的答案。下图说明了 SafeML 在医疗诊断中的应用(例如,使用肺部扫描的新冠肺炎诊断)。

SafeML 在医疗诊断中的应用(例如使用肺部扫描进行新冠肺炎诊断)
另一个例子可以是自动驾驶汽车或自动驾驶车辆中的交通标志检测器,它使用机器学习或深度学习来检测交通标志并生成所需的动作。下面的框图显示了如何在这个案例研究中使用 SafeML。这也可用于自主排系统(Kabir,s .等人(2020))。

SafeML 在自动驾驶汽车中的应用(如交通标志检测)freepik 创建的汽车矢量—【www.freepik.com
上述每一个应用程序都将使用 SafeML 实现,在我们接下来的文章(第二部分、第三部分和第四部分)中会有一些著名的案例研究。
3.统计距离及其在精度估计中的潜在应用
阈值线可以被认为是分类器的最简单版本。考虑下图;在这个简单的分类器中,阈值线(Xtp)以下的任何点将被认为是第 1 类,阈值线以上的任何点将被认为是第 2 类。假设我们知道时间 0 到 20 之间的点为 1 类,其他点为 2 类。从这个简单的例子中可以看出,x 和 v 点被错误分类。

假设信号和 Xtp 的简单阈值(Aslansefat 等人,2020-a)
如果我们估计每一类的概率密度函数(如下图),那么误差的概率可以计算为:

使用 1-P(误差)可以容易地获得分类器精度。在这个简单的分类器中,两个概率密度函数合并的区域导致误差。

第一类和第二类概率密度函数
Fukunaga ,K. (1990)表明,可以使用基于概率密度函数(PDF)的距离(如 Bhattacharyya 距离)来计算上限误差。基于 PDF 的距离测量通常依赖于均值和方差距离,如下图所示。然而,一些现有的先进方法也可以比较不同 pdf 的形状。

基于概率密度函数的距离度量
下图显示了四种众所周知的基于 PDF 的距离测量方法。

一些著名的基于 PDF 的距离测量
3.1 基于 Chernoff 和 Bhattacharyya 的上限误差
下面提供了基于切尔诺夫方法的上限误差概率估计的 python 示例。在这个代码中,如果考虑“s = 0.5”,那么它将是 Bhattacharyya 上界误差估计。
可以证明,误差概率与累积分布函数(CDF)之间的距离相关(Aslansefat,k .等人 2020-b)。一些著名的基于 CDF 的距离度量可以列举如下:

一些著名的基于 CDF 的距离度量
有时使用特征的经验累积分布函数(ECDF)会更容易。基于 ECDF 的距离测量的 Python 示例如下。
3.2 Kolmogorov-Smirnov 距离
假设我们有一个包含两个类和一个要素的数据集。下图显示了等级 1(蓝色)和等级 2(红色)的要素的 ECDF。Kolmogorov-Smirnov 简单地找到两个 ECDFs 之间的最大退出距离。

Kolmogorov-Smirnov 距离度量图
例如,您可以检查 Kolmogorov-Smirnov 距离测量的以下 python 代码:
3.3 柯伊伯距离
柯伊伯距离与柯尔莫哥洛夫-斯米尔诺夫距离具有相似的功能。然而,这种方法考虑了如下所示的两个最大距离;a)当蓝色 ECDF 的值大于红色 ECDF 的值时,b)当红色 ECDF 的值大于蓝色 ECDF 的值时。柯伊伯距离可以通过两个最大值相加得到。

柯伊伯距离度量插图
python 中的柯伊伯距离测量示例如下。
3.4 克莱姆-冯米塞斯距离
ECDF 是由许多小步骤形成的。考虑两个台阶在相同间隔内的绝对差作为高度。如果我们计算所有台阶的所有计算高度值的总和,那么我们就有了克莱姆-冯米塞斯距离。

克莱姆-冯米塞斯距离测量插图
您可以按如下方式检查 Cramer-Von Mises 距离的示例 python 代码:
3.5 安德森-达令距离
安德森-达林距离类似于克莱姆-冯米塞斯距离。唯一的区别是安德森-达林通过标准偏差(SD)对身高值进行标准化。请查看以下安德森-达令距离的 python 示例。
3.6 瓦瑟斯坦距离
Wasserstein 距离已经用于许多应用中。例如,它已被用作生成对抗性神经网络(GANs)中的损失函数(Gulrajani,I. 2017)。Wasserstein 距离我们考虑所有台阶的高度值和宽度值。当我们认为幂等于 1 时,这种方法以某种方式测量两个 ECDFs 之间的面积。当功率因数为 1 时,瓦瑟斯坦距离等于推土机距离。

Wasserstein 距离测量插图
您可以查看以下 Wasserstein 距离的 python 示例。
以上 python 代码在 Google Colab 上也有。如果使用 R 编程,建议使用二样本库。上面的 Python 代码是从这个库中改写的。对于 MATLAB 用户,推荐一组基于 ECDF 的距离测量函数。
要查看 SafeML idea 的一些示例和案例研究,请查看下面的 GitHub 项目:
https://github.com/ISorokos/SafeML
关于 SafeML 的更多细节可以在我们最近的论文[arXiv][research gate][DeepAI][paper with code]中找到。

4.结论
在这个故事中,人工智能安全的主题已经简要介绍,SafeML 的思想已经解释了一些可能的应用。一些著名的基于 ECDF 的距离测量算法都提供了简单的 python 示例。在我们接下来的故事中,上述 SafeML 的应用将提供代码实现。上述每一种基于 ECDF 的方法都适用于某一类系统。因此,系统的特征和基于 ECDF 的距离测量之间的关系将在接下来的故事中讨论。
SafeML 仍处于早期开发阶段,旨在将其扩展到处理时间序列数据、预测和回归算法(即 Schulam,p .等人(2019))和领域适应(即 Shen,j .等人(2018))。使用 SafeML 作为可解释的 AI 也是可能的,这将在后面讨论。应该提到的是,在“人工智能安全”研究的同时,还有一些其他研究工作专注于人工智能在改善安全模型方面的应用(Gheraibia,y .等人(2019))。
参考
Amodei,d .,Olah,c .,Steinhardt,j .,Christiano,p .,Schulman,j .,和 Mané,D. (2016)。人工智能安全的具体问题。 arXiv 预印本arXiv:1606.06565。
k .阿斯兰塞法特,Gogani,M. B .,Kabir,s .,Shoorehdeli,M. A .,和亚尔,M. (2020-a)。基于半马尔可夫过程的可变门限报警系统性能评估与设计。 ISA 事务, 97 ,282–295。https://doi.org/10.1016/j.isatra.2019.08.015
阿斯兰塞法特,k .,索罗科斯,I .,怀汀,d .,科拉加里,R. T .,帕帕多普洛斯,Y. (2020-b)。SafeML:通过统计差异度量对机器学习分类器进行安全监控。 arXiv 预印本arXiv:2005.13166。
Balunovic,m .,Baader,m .,Singh,g .,Gehr,t .,& Vechev,M. (2019 年)。证明神经网络的几何鲁棒性。在神经信息处理系统进展(第 15287-15297 页)链接。
Gehr,m . Mirman,d . drach sler-Cohen,t . tsan kov,p . Chaudhuri,s .,& Vechev,M. (2018 年 5 月)。Ai2:具有抽象解释的神经网络的安全性和鲁棒性认证。在 IEEE 安全和隐私研讨会(SP) (第 3-18 页)。https://doi.org/10.1109/SP.2018.00058
Gulrajani,I .,Ahmed,f .,Arjovsky,m .,Dumoulin,v .,和库维尔,A. C. (2017)。改进了瓦瑟斯坦·甘斯的训练。在神经信息处理系统进展(第 5767–5777 页)[ 链接。
Gheraibia,y .,Kabir,s .,Aslansefat,k .,Sorokos,I .,和 Papadopoulos,Y. (2019)。安全+人工智能:使用人工智能更新安全模型的新方法。 IEEE 访问, 7 ,135855–135869。https://doi.org/10.1109/ACCESS.2019.2941566
Kabir,s .,Sorokos,I .,Aslansefat,k .,Papadopoulos,y .,Gheraibia,y .,Reich,j .,… & Wei,R. (2019,10 月)。开放适应系统的运行时安全分析概念。在基于模型的安全和评估国际研讨会(第 332–346 页)。斯普林格,查姆。https://doi.org/10.1007/978-3-030-32872-6_22
Scudellari,S. (2020)医院部署人工智能工具在胸部扫描中检测新冠肺炎, IEEE Spectrum 。
舒拉姆,p .和萨里亚,S. (2019 年)。你能相信这个预测吗?学习后审核逐点可靠性。 arXiv 预印本arXiv:1901.00403。
沈军,瞿,杨,张,魏,于(2018 年 4 月)。领域适应的 Wasserstein 远程引导表征学习。在第三十二届 AAAI 人工智能大会上 环节。
相关 GitHub 项目
SafeML 项目:这个故事里已经简要说明过的想法。
NN-可信性工具包项目:人工神经网络软件可信性工程工具箱。
confidential-NN 项目:基于神经网络的分类中经验置信度估计的工具箱。
SafeAI 项目:不同的工具箱,如 SRILab ETH Zürich 的 DiffAI 、 DL2 和 ERAN ,专注于健壮、安全和可解释的 AI。
相关中等职位
佩德罗·a·奥尔特加、维沙尔·迈尼和 DeepMind 安全团队
medium.com](https://medium.com/@deepmindsafetyresearch/building-safe-artificial-intelligence-52f5f75058f1) [## 人工智能安全——你如何防止敌对攻击?
与 IBM 研究人员 Pin-Yu 和 Sijia 就他们最近关于“修剪”和……
towardsdatascience.com](/ai-safety-how-do-you-prevent-adversarial-attacks-ede17480a24d) [## 人工智能安全、人工智能伦理和 AGI 辩论
Alayna Kennedy 在 TDS 播客上
towardsdatascience.com](/ai-safety-ai-ethics-and-the-agi-debate-d5ffaaca2c8c) [## Zen 和自动驾驶中机器学习的安全保证艺术
西蒙·伯顿博士
medium.com](https://medium.com/@AssuringAutonomy/zen-and-the-art-of-safety-assurance-for-machine-learning-in-autonomous-driving-77ebb4c0a302) [## AI“安全”vs“控制”vs“对准”
定义我所说的“人工智能安全”、“人工智能控制”和“价值一致”的含义
ai-alignment.com](https://ai-alignment.com/ai-safety-vs-control-vs-alignment-2a4b42a863cc)
确认
我要感谢 SafeML 项目的贡献者:
- 雅尼斯·帕帕多普洛斯教授(赫尔大学)
- Ioannis Sorokos 博士(弗劳恩霍夫实验软件工程研究所)
- Ramin Tavakoli Kolagari 博士(纽伦堡理工大学)
- 德克兰·怀汀(赫尔大学和 APD 通信)
未完待续…*
如何让你的数据科学项目脱颖而出
创建有效的自述文件

马库斯·温克勒在 Unsplash 上的照片
介绍
所以你创建了一些 dope 模块化代码,用很少的推理时间得到了一个极其精确的模型,你把你的代码推到了 Github 上——你坐在云端。
不幸的是,这是大多数开源项目的终点。在我告诉你为什么它如此不幸之前,让我解释一下什么是开源。
什么是开源?
开源是指人们可以修改和分享的东西,因为它的设计是公开的。当你将你的项目推送到 Github 上的公共库时,你已经为开源做出了贡献,现在任何人都可以检查、修改和增强你的代码。
人们做开源项目的动机各不相同。有些人可能想获得一些实际项目的工作经验,有些人只是喜欢编码,有些人想让世界变得更好,但有一点是正确的,不管开发人员背后的动机是什么。
人们必须知道如何参与你的项目!
不幸的是,当代码被推送到 Github 时,没有人知道如何参与你的项目,Github 知道这一点,所以他们提供了一个叫做 README 的东西,但没有得到充分利用。
如果人们不知道如何使用你的代码,那么在 Titanic 数据集上获得 101%的准确率毫无意义!
这个问题的解决方案很简单,但它会让你远远领先于许多其他人,这些人认为纯粹建立一个 3000 个模型的集合来挤出额外的 1%的准确性就足以让他们受到注意。
如何写自述文件…
我们已经确定,没有自述文件的项目是没有用的,因为它无法提供对已构建内容的深入了解——我们没有让尽可能多的人可以访问该项目。现在的问题是,我们如何写一个好的自述文件。
如果你和我一样,你没有写自述文件的原因是因为你不知道如何写。因此,我将向你展示我到底学到了什么…看看下面的指南:
是的,我知道很多!但接下来的部分很简单。数据科学中使用的 3 个流行框架是什么:
我已经链接了每个框架的 Github 概要文件,剩下你要做的就是访问每一个 Github 库并阅读它们的自述文件——就这么简单(记住,如果你不确定的话,有示例可以帮助你)!
现在你已经掌握了在自述文件上写什么,你会想要添加一些格式来给它额外的推动,所以下面我将链接到互联网上告诉你 Github 格式的最佳资源。
要创建标题,请在标题文本前添加一到六个#符号。你使用的#的数量将决定大小…
docs.github.com](https://docs.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax)
包裹
在很多情况下,建立一个更好的模型就足以让你受到关注,比如在 Kaggle 上。然而,许多人每天都在向 Github 发送大量的源代码,即使你有一些看起来很有趣的东西,如果没有自述文件,人们也不会知道如何浏览你的作品。你的工作是让参与你的项目的任务尽可能简单,这个简单的改变会让你的项目脱颖而出。
让我们继续 LinkedIn 上的对话…
[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
提高深度学习代码质量(第一部分)
构建开源时间序列深度学习框架的经验教训。

作者照片(在马基雅斯米的卡特勒海岸保护区徒步旅行时拍摄)
注意这大致是基于我二月份在波士顿数据科学会议小组 上做的一个 演示。你可以在这里找到 全幻灯片 。我还附上了一些最近的经历和见解,以及对我遇到的常见问题的回答。
背景
当我第一次开始我的河流预报研究时,我设想只用一个笔记本。然而,我很清楚,有效地跟踪实验和优化超参数将在任何河流模型的成功中发挥至关重要的作用;特别是,我想预测美国超过 9000 条河流的流量。这让我走上了开发 flow forecast 的轨道,它现在是一个多用途的时间序列深度学习框架。
再现性
机器学习(尤其是深度学习)最大的挑战之一是能够重现实验结果。其他几位已经谈到这个问题,所以我不会花太多时间详细讨论。要想更好地了解再现性为何如此重要,请参见乔尔·格鲁的演讲和幻灯片。TLDR:为了建立在先前的研究基础上,我们首先需要确保它是有效的。类似地,为了部署模型,我们必须能够容易地找到最佳“一个”的工件
我的第一个建议是不要使用 Jupyter 笔记本或 Colab(至少不要全部使用)。Jupyter Notebooks 和 Colab 非常适合快速构建模型或利用现有的代码库(我将在稍后讨论)进行实验,但不适合构建模型或其他功能。
写出高质量的代码
- 编写单元测试(最好是在编写代码的时候)
我发现测试驱动开发在机器学习领域非常有效。人们问我的第一件事是,我如何为一个我不知道其输出是什么的模型编写测试?基本上,您的单元测试应该属于以下四个类别之一:
(a)测试您的模型返回的表示的大小是否正确。
这可能是最简单的测试之一。有了这个,你就可以简单地看到形状是否正确。尽管这看起来微不足道,但我多次看到人们弄乱了他们模型的维度,然后想知道为什么它不收敛。
(b)测试您的模型针对您指定的参数正确初始化,并且正确的参数是可训练的
另一个相对简单的单元测试是确保模型按照你期望的方式初始化,并且正确的参数是可训练的。
(c)测试定制损失函数和训练循环的逻辑:
经常有人问我这是怎么做到的?我发现最好的方法是创建一个具有已知结果的虚拟模型来测试定制损失函数、指标和训练循环的正确性。例如,您可以创建一个只返回 0 的 PyTorch 模型。然后用它来编写一个单元测试,检查损失和训练循环是否正确。
(d)测试数据预处理/加载程序的逻辑
另一个要涵盖的主要内容是确保您的数据加载器以您期望的格式输出数据,并处理有问题的值。数据质量问题是机器学习的一个大问题,因此确保您的数据加载器经过正确测试非常重要。例如,您应该编写测试来检查 NaN/Null 值是否被填充或者行是否被删除。
最后,我推荐使用工具 CodeCov 和 Codefactor。它们对于自动确定您的代码测试覆盖率非常有用。
2。利用端到端代码覆盖的集成测试
进行单元测试是好的,但是确保代码以端到端的方式正确运行也很重要。例如,有时我发现一个模型的单元测试运行,却发现我将配置文件传递给模型的方式不起作用。因此,我现在为我添加到存储库中的每个新模型添加集成测试。集成测试还可以演示如何使用您的模型。例如,我用于我的集成测试的配置文件,我经常作为我的完整参数扫描的主干。
3。利用类型提示和文档字符串:

同时拥有类型提示和文档字符串大大增加了可读性;尤其是在传递张量的时候。当我写代码的时候,我经常不得不回头看文档串来记住我的张量是什么形状。没有它们,我必须手动打印形状。这浪费了大量时间,并可能增加您后来忘记移除的垃圾。
4。创建良好的文档

我发现为机器学习项目创建文档的最佳时间是在我写代码的时候,甚至是之前。经常设计 ML 模型的架构设计,以及它们如何与现有的类接口,在实现代码时节省了我大量的时间,并且迫使我批判性地思考我所做的 ML 决策。此外,一旦实施完成,你已经有了一个良好的开端,告知你的同行/研究人员如何使用你的模型。
当然,您需要添加一些东西,比如您传递的参数及其类型的细节。对于文档,我通常在 Confluence (或者 GH Wiki 页面,如果没有的话)中记录更广泛的架构决策,而在 ReadTheDocs 中记录关于代码/参数的细节。我们将在第二部分讨论。拥有良好的初始文档也使得添加模型结果和解释设计工作的原因变得非常简单。
5。利用同行评审

同行评审是在运行实验之前确保代码正确的另一个关键步骤。很多时候,第二双眼睛可以帮助你避免各种各样的问题。这是不使用 Jupyter 笔记本的另一个好理由,因为检查笔记本的差异几乎是不可能的。
作为同行评审者,花时间一行一行地检查代码并在你不理解的地方进行评论也是很重要的。我经常看到审阅者只是快速批准所有的更改。
最近的一个例子:在为大 RNN 添加元数据时,我遇到了一个 bug。这部分代码确实进行了集成测试,但不幸的是,它缺乏全面的单元测试。结果,我做的几个实验,我以为使用了元数据,结果却没有。这个问题非常简单;在第 23 行,我在调用编码器时忘记包含元数据。
通过编写一个单元测试来检查元数据模型的参数在向前传递时是否被更新,或者通过一个测试来检查有和没有元数据的结果是否相等,这个问题可能已经被避免了。
在本系列的第二部分中,我将讨论如何让您的实验具有可重复性,因为您已经拥有了高质量且(大部分)无 bug 的代码。具体来说,我将关注诸如数据版本化、记录实验结果和跟踪参数之类的事情。因此
相关文章和资源:
如何通过情感分析让你的 iOS 应用更智能
情感分析在 Swift 时尚客户评论中的应用

很长一段时间以来,我一直对数据分析感兴趣,以寻找改进移动应用程序的新方法。我最近花了一些时间来试验神经语言处理,这是一个与我日常工作相关的非常具体的用例,对顾客对时尚商品的评论进行情感分析。
语境
我从事时尚电商已经快四年了,对于任何电商来说,真正重要的是顾客评论。所以我在想,“如果我们可以预测客户的评论,这样我们就可以在他们提出要求之前帮助他们”。如果你看看亚马逊,或者应用商店的评论,想象一下如果你能减少所有的负面反馈。所以我更仔细地研究了一下,只花了几个小时就让它工作了。
比方说,我们有一个产品页面,客户可以在那里留下评论,作为一家企业,我想限制负面评论,但也帮助我的客户。从这个角度来看,我的想法很简单,如果客户输入否定的东西,我们会显示一个客户支持按钮。但是怎么知道是不是阴性呢?
嗯,这才是有趣的地方。我将使用一些基本的神经语言处理(NLP)算法对其进行情感分析。与 iOS 开发相比,这部分混合了更多数据分析知识和一点机器学习,但请相信我,苹果为我们做得非常简单。
资料组
首先,我需要一些数据来训练我的模型。足够幸运的是,我在 Kaggle 上找到了一个包含 2 万多条记录的女装评论数据集。这就足够开始了。它包括评级和评论,但不包括建议字段。
根据这些数据,我需要定义什么是“积极的”反馈和“消极的”反馈。我不是数据科学家,我没有太多这方面的背景,所以我只应用了一个简单的逻辑:如果客户对该项目的评分是 4 或 5(满分为 5),或者如果客户推荐了该项目,那么我会认为它是积极的。否则,它将是负的。我相信,我真的相信我也是这样做的:如果我向朋友推荐一项服务,或者如果我留下一个好的评价,它至少会是 4。

理想情况下,你也希望保持中立的评论,以保持平衡,但我暂时会保持简单。
从那时起,我将该规则应用于整个数据集。现在我们可以在 Swift 中训练我们的机器学习模型。
培训模式
通过 CoreML 和 CreateML,苹果让开发人员可以非常容易地基于预定义的计算模型创建新的机器学习模型。因为我对文本中的情感分析感兴趣,所以我将使用 MLTextClassifier。我很惊讶构建它的代码有多短。
培训模式
运行时,这将需要几分钟时间。与我之前在时尚图像分类器中的尝试相比,感觉要快得多。
Parsing JSON records from /Users/benoit/Desktop/clothing-review.json
Successfully parsed 23486 elements from the JSON file /Users/benoit/Desktop/clothing-review.json
Tokenizing data and extracting features
10% complete
20% complete
30% complete [...]
Iteration 19 training accuracy 0.993544
Iteration 20 training accuracy 0.993597
Iteration 21 training accuracy 0.993703
Iteration 22 training accuracy 0.993756
Finished MaxEnt training in 2.00 seconds
Trained model successfully saved at /Users/benoit/Desktop/FashionSentimentClassifier.mlmodel.
现在我的时尚情绪分析模型的第一个版本已经准备好了,我们来测试一下。还好,我在 Xcode 游乐场还能这么做。
Xcode 游乐场中的测试模型
从结果来看,工作似乎还不错,,这让我很震惊。
当然,我可以设法让假阳性使用更复杂和微妙的句子,例如双重否定,但对于我花在这上面的时间,我对第一个结果非常满意。
下一步是什么?
从这里,我可以将这个模型放入一个 iOS 应用程序,当用户在评论期间暂停输入时,我可以让设备对它进行快速情绪分析,并显示“呼叫客户支持”以防止他留下差评,同时帮助他改善整体用户体验。
我还可以对模型本身做进一步的工作,你拥有的数据越多,你花在调整模型上的时间越多,你就会得到更好的准确性。每个项目都不一样,我感觉每个模式都应该,适应你自己的问题。
结论从用户体验问题或者业务问题出发,我们找到了一种利用机器学习和简单的数据分析概念来改善用户体验的方法。如果这看起来与 iOS 的日常开发相去甚远,那么它的第一个版本的原型开发速度之快让我感到惊讶。显然,你的应用程序(和产品)越复杂,你需要提炼的数据就越多,并保持高精度。
目前,这个仅限于女装,但它让我想知道我们能走多远,以保持我们的 iOS 应用程序的 UX 非常清晰。
关于https://benoitpasquier.com可以阅读原文。
很长一段时间以来,我一直对数据分析感兴趣,以寻找改进移动应用程序的新方法。我已经…
benoitpasquier.com](https://benoitpasquier.com/2020/01/how-to-make-your-ios-app-smarter-with-sentiment-analysis/)
如何让你的求职变得更容易
关注团队结构

找工作有时感觉就像在我们不熟悉的黑暗房间里找蜡烛。我们没有完整的信息,每个公司都有不同的标准,不清楚这个职位在未来几年可能会把你带到哪里。这是事实,尤其是在数据科学领域,因为数据科学工作远未标准化。您的工作与另一位数据科学家的工作相比,有许多不同的层次和级别。
之前我谈到过你最终能在获得什么样的职位(内部/顾问数据科学家/自由职业者/等等)。)和职位的年资之差。但是还有另外一层:团队结构。
这听起来可能是一件微不足道的事情,但团队结构可以给你一些提示,告诉你什么类型的数据科学工作会被期待,以及你的职业发展方向。
了解不同的团队结构以及它们如何影响你的数据科学工作,也将使你更容易在公司之间做出选择。更不用说它会给你一个坚实的申请理由,所以当你被问到“为什么是我们公司?”你会有一些实质性的东西可以分享。
作为一名数据科学家,您可以选择的工作方式包括:
- 在一个致力于 AI、ML 或数据科学的部门/团队,与其他数据科学家、数据工程师、
- 在一个部门(比如营销,战略等。)作为数据科学家之一,
- 公司中唯一的数据科学家或顾问
根据这些职位的不同,你将承担不同程度的责任和创造性的工作量。
当涉及到他们的工作时,AI 或 DS 团队往往更自由。他们的目标是为公司的其他团队或最终用户开发相关的工具和技术。拥有人工智能团队的公司将部分精力投入研究并不罕见。这些公司了解人工智能的价值以及它可以给他们的工作领域带来什么,并了解创造性或基于研究的工作对于跟上世界上发生的事情和适应最新技术是必要的。这就是为什么,在这样的人工智能团队中,你更有可能做创造性的工作,追求新技术,应用最近发明的东西。这些团队的工作倾向于从开始到结束。你可能需要交付完整的产品。因此,可能需要多种技能。这些团队中的人倾向于在他们选择的领域有专攻和发展的自由,只要它与公司的目标一致。
如果你是一个部门中为数不多的数据科学家之一,你的工作更可能是一次性的快速任务,如创建分析,建立数据模型。这项工作有可能会被标准化,你会被期望定期做类似的事情。不太可能期望你构建独立的最先进的产品。像这样的团队倾向于希望他们的团队成员产生可靠的、低风险的解决方案。你将使用成熟的技术。可能会有足够的自由来做出自己的选择,因为你将是少数几个了解数据以及如何使用数据的人之一。随着你在这些团队中获得经验,你将有可能成为某个部门的专家(可能是市场营销、销售等。)并成为该领域的数据专家。
如果你是团队里唯一的数据科学家,那你创造产品的可能性就更小了。不过,你将会是任何与数据有关的事情的最佳人选。就责任而言,这是一个危险的地方,因为期望可能非常高。但是,如果你喜欢承担责任和负责事情,这可能是一个爆炸。这项工作可能会是快节奏的日常工作,因为会有来自公司不同部门的大量输入,你需要提供所需的数据支持。如果这家公司不是高科技或数据驱动的机构,你可能最终会使用非常陈旧的技术,而这些技术大多被技术更先进的公司所抛弃。尽管在这样的公司里,你可能更接近商业决策。你很可能会对商业决策产生更大的影响,你可能会成为公司最有价值的资产之一。你在这个职位上的未来可能会倾向于商业方面。
好了,这是对不同团队如何使用数据科学家以及基于团队类型的工作差异的一些观察。当然,不要忘记这些仅仅是观察,而不是坚如磐石的事实。我在这篇文章中谈论的一切都是基于我自己的经历和我迄今为止从我的播客嘉宾那里听到的。你可能会找到一家公司,在那里你是唯一的数据科学家,但你在做摇滚明星级别的研究。或者你可能会在一个数据科学专门团队中结束,那里还没有使用机器学习。不过,了解可能的团队结构会让你知道自己想要什么,不想要什么。你可以在面试中问一些更直接、更有针对性的问题。
所以现在是你决定的时候了,你是想使用最先进的工具,生产独立的产品,在快节奏的环境中建立模型还是帮助企业更快地发展?你不必做一个一成不变的决定,当然,决定会改变,梦想会发展成其他的梦想。但至少简单地定义你的目标会帮助你更有效地搜索,并激发你的信心。
👉对数据科学领域以及如何开始学习感到困惑? 免费参加数据科学入门迷你课程 !
如何使用 python 制作自己的带面部识别的 Instagram 滤镜
实践教程

图片由 teguhjati pras 拍摄;通过 Pixabay 获得知识共享许可
在过去的 10 年里,面部识别技术发展迅速,并迅速开发出多种用途。从实用的(解锁手机),到好玩的(Instagram 滤镜),再到有争议的(安全、监控和警务),我们的脸可以在许多方面被技术使用。好奇如何自己创造一些面部识别技术吗?脸书提供了 SparkAR 平台,为脸书和 Instagram 创建面部识别过滤器。 然而 ,我们可以很容易地使用 python 中的 OpenCV 包自己创建一个,因此我们可以在任何地方使用面部识别。
背景信息:计算机是如何“看见”的?
对计算机来说,图像只是一系列指示像素位置的数字。计算机程序员可以创建算法,教会计算机如何识别图像中的独特特征。有趣的是,计算机“看”到了类似于人类如何解决拼图游戏。考虑下图:

图片由比尔·塞拉克拍摄;通过 Flickr 获得知识共享许可
三叶草的拼图块很容易放置,因为它们有不同的形状,逻辑上只能放在一个地方。边缘件还具有明显的扁平特征,限制了它可能到达的位置,只有沿着边缘的一组可能性。剩下的碎片可能真的在任何地方。这个过程被称为特征图像提取,其中用户识别图像的特征以帮助他们构建整体图像。计算机可以通过像素数据的趋势来模仿这种思路。数据科学家使用机器学习算法来教计算机如何识别这些日益复杂的趋势。对于面部识别,首先识别眼睛(面部最显著的特征之一),然后使用模板绘制面部的其余特征。
第一步:在照片中寻找面孔
现在我们知道了计算机视觉的基本原理,我们可以开始构建过滤器了。首先,让我们在静态图片中找到人脸和眼睛。首先在您的计算机上安装,然后将 OpenCV (一个用于图像处理的开源 python 包)导入到 py 文件中。OpenCV 中的所有图像结构都可以与 NumPy 数组相互转换,因此导入 NumPy 也很有用。一旦你安装了 OpenCV,你应该可以访问。包含面部识别和其他图像处理算法的 xml 文件。在本教程中,我们将使用一种叫做哈尔级联的算法来处理人脸和眼睛。如果你找不到这些文件所在的目录。xml 文件是,我建议快速文件搜索“haarcascade”。一旦找到存储 Haar 级联的目录的路径,调用 CascadeClassifier 并通过它传递路径:
太好了,现在我们设置好了,我们可以加载图像并寻找人脸。请注意,哈尔级联和许多面部识别算法要求图像是灰度的。所以,在加载图像后,将其转换为灰度,然后使用 face_cascade 来检测人脸。得到脸部后,在它周围画一个矩形,在脸部区域搜索眼睛。然后在每只眼睛周围画矩形。
通过程序输出传递来自 Unsplash 的库存图像:

照片由 Gustavo Alves 在 Unsplash 上拍摄;由作者修改
酷!效果很好!请注意,有时 Haar Cascade 无法正确识别人脸和眼睛,特别是如果有人没有完全面对相机,有时它会认为嘴角和鼻子是眼睛。如果发生这种情况,对于本教程,我建议使用另一张照片。否则,您将需要自己创建一个完整的其他算法,而不是使用 OpenCV 的 Haar Cascade。
步骤 2:创建你的图像过滤器
对于我的过滤器示例,我将使用女巫帽,因为本周末是万圣节。编辑上面的代码,我们可以在图片中读取一个女巫的帽子和我们的库存照片。因为我们要把帽子放在库存照片的上面,所以我们必须得到放置帽子的坐标。我们还必须弄清楚我们实际上想要使用女巫图像的哪些部分。我们可以通过使用 cv2.threshold()和 cv2.bitwise_not()方法来确定我们希望保留女巫图像的哪一部分,不保留哪一部分(这称为遮罩)。
然后,对于每一张脸,我们必须把女巫的帽子放在哪里。使用面部的高度和宽度确定面部区域边界的坐标。然后调整女巫图像(或您选择的任何滤镜)的大小以适合面部区域,并选择适当的坐标来放置它。你可能不得不摆弄这些坐标,以获得你选择的图像降落在正确的地点。在我的女巫示例中,我必须上移过滤器/女巫图像,如下面的 witch_y1 所示,因为帽子的边缘应该落在人的前额上。如果我没有这样做,帽子图像将被准确地放置在脸部区域。一定要检查你的滤镜图像是否超出了主图像的框架。最后,使用遮罩来雕刻出放置滤镜的地方。
在我们的股票图像上运行这个新脚本:

古斯塔沃·阿尔维斯在 Unsplash 上的照片;由作者修改
我们已经成功构建了静态图像的面部识别过滤器!
步骤 3:应用到实时视频源
到目前为止,我们已经识别了静态照片中的人脸,并在它们上面放置了过滤图像。最后,我们需要用活动图像来做这件事。代码和以前一样,但是这次我们让 OpenCV 访问我们计算机的摄像头,而不是静态图像。我们还需要在 while 循环中包装我们在前面两步中使用的 faces 循环,以保持它在我们提供的每一帧直播视频中查找人脸。用户可以按字母“q”退出程序。
步骤 4:屏幕截图或屏幕录制
在这一点上,最简单的方法就是使用我们电脑内置的屏幕捕捉或屏幕记录来保存我们摄像头过滤后的视频。

Mitchell Krieger 创建的 GIF
或者,如果你想用代码做任何事情,或者对捕获或记录有更多的控制,你可以使用 PIL 或 PyAutoGUI 通过代码捕获你的屏幕。
对我的原创剧本好奇吗?签出 这个 GitHub 库
如何让您的 Python 代码更具功能性
以及为什么这会使您的代码更加健壮、可测试和可维护

Python 很棒。以下是让它变得更好的方法。大卫·克洛德在 Unsplash 上的照片
近年来,函数式编程越来越受欢迎。它不仅非常适合像数据分析和机器学习这样的任务。这也是一种使代码更容易测试和维护的强大方法。
趋势显而易见:尽管它们仍处于小众位置,但像 Elm 和 Haskell 这样的纯函数式语言正在获得关注。有些功能性的语言,如 Scala 和 Rust ,正在起飞。像 C++、Python 这样的流行语言也在它们的清单中加入越来越多的函数式编程。
如果你已经习惯了面向对象的代码,那么写函数式程序一开始看起来会很吓人。好消息是,您可以很好地混合使用函数式代码和面向对象代码。函数式编程的一些调整通常足以获得一些好处。所以让我们开始吧!
从 Python 到 Haskell,这种趋势不会很快消失
towardsdatascience.com](/why-developers-are-falling-in-love-with-functional-programming-13514df4048e)
纯函数
非函数式编程的讨厌之处在于函数可能会有副作用。也就是说,它们利用了不一定出现在函数声明中的变量。
考虑这个简单的例子,我们将两个数字相加:
b = 3
def add_ab(a):
return a + b
add_ab(5)
全局变量b没有出现在add_ab的声明中,所以如果你想调试它,你必须检查一下b是否被使用了。听起来很简单,但是对于更大的程序来说可能会很乏味。我们可以很容易地解决这个问题,只要诚实地说出我们在函数中放入了什么:
def add_ab_functional(a, b):
return a + b
add_ab_functional(5, 3)
这只是一个愚蠢的小例子。但是对于更大的程序,你会注意到当你不需要担心副作用时,理解和调试代码会容易得多。
高阶函数
在函数式编程中,可以嵌套函数:要么设计一个以另一个函数作为参数的函数,要么编写一个返回另一个函数的函数。
作为一个采用另一个函数的函数的例子,假设您有一个数字数组,并且您想要计算该数组的正弦、余弦和指数。理论上,你可以这样写(numpy是一个数学的 Python 包):
import numpy as np*# make a list of numbers as input values for functions*
numbers_list = np.arange(0, 2*np.pi, np.pi/10).tolist()*# calculate sine* def do_sin(numbers):
return np.sin(numbers)
sin_list = do_sin(numbers_list)*# calculate cosine* def do_cos(numbers):
return np.cos(numbers)
cos_list = do_cos(numbers_list)*# calculate exponential* def do_exp(numbers):
return np.exp(numbers)
exp_list = do_exp(numbers_list)
这很好也很简单,但是用完全相同的结构写三个不同的函数有点烦人。相反,我们可以编写一个函数,像这样使用其他函数:
import numpy as np*# make a list of numbers as input values for functions*
numbers_list = np.arange(0, 2*np.pi, np.pi/10).tolist()*# calculate with some function* def do_calc(numbers, function):
return function(numbers)*# calculate sin, cos, and exp*
new_sin_list = do_calc(numbers_list, np.sin)
new_cos_list = do_calc(numbers_list, np.cos)
new_exp_list = do_calc(numbers_list, np.exp)
这不仅更加简洁易读。它也更容易扩展,因为您只需要为一个新的function添加一行,而不是上面例子中的三行。

函数式编程的一个关键概念是将函数嵌套在一起。照片由this engineering RAEng在 Unsplash
还可以把函数中函数的概念倒过来:不仅可以让一个函数把另一个函数作为自变量;你也可以让它返回一个参数。
假设您有一个数字数组,您需要将数组的每个元素递增 2:
def add2(numbers):
incremented_nums = []
for n in numbers:
incremented_nums.append(n + 2)
return incremented_numsprint(add2([23, 88])) *# returns [25, 90]*
如果你想增加一个数组的元素,当然,你可以复制粘贴这个函数并用这个增量替换2。但是有一个更优雅的解决方案:我们可以编写一个函数,它接受任何增量,并返回另一个函数来执行add2所做的事情,但是针对任何增量。
def add_num(increment):
def add_inc(numbers):
incremented_nums = []
for n in numbers:
incremented_nums.append(n + increment)
return incremented_nums
return add_incadd5_25 = add_num(5.25)
print(add5_25([23.37,88.93])) *# returns [28.62, 94.18]*
使用这个例程,每个新函数只需要一行来定义,而不是五行。像接受函数的函数一样,返回函数的函数更容易调试:如果你在add_num中有一个错误,你只需要修复它。你不需要回去修改add2和其他任何你用同样方式定义的函数。项目越大,回报就越多。
注意,尽管add_num是以函数式风格编写的,但它并不纯粹是函数式的。它有一个副作用,numbers,这使它成为一个不纯的函数。但是没关系:你不需要成为一种编程范式的奴隶;相反,你可以充分利用这两者来最大化你的生产力。

装饰者可以让你的代码更加优雅。费尔南多·埃尔南德斯在 Unsplash 上拍摄的照片
装修工
当然,你可以将上面的两种方法结合起来,编写一个函数,它不仅接受一个函数作为参数,还返回一个函数。考虑这段代码,我们从上面扩展了add_num函数:
def add_num(message):
def add_inc(increment, numbers):
message()
incremented_nums = []
for n in numbers:
incremented_nums.append(n + increment)
return incremented_nums
return add_incdef message1():
print("Doing something...")**message1 = add_num(message1)** print(message1(5, [28,93]))*# Doing something...
# [33, 98]*
与上面示例的一个不同之处在于,您可以定制屏幕上输出的消息。例如,在一个更大的程序中,你可以扩展它来考虑不同的错误信息。
线条message1 = add_num(message1)是魔法发生的地方:名字message1现在指向add_num的内层,即add_inc。这叫装饰。
另一个区别是参数increment被向下推了;这只是让下一步更容易处理。
我们可以用@语法让装饰更加漂亮(其中的def add_num部分保持不变):
**@add_num** def message1():
print("Doing something...")print(message1(5, [28,93]))
实际上,这只是编写装饰的一种更加简洁的方式。注意,使用 decorator并不意味着你的代码是有效的。更确切地说,装饰者受到函数式编程的启发,就像嵌套函数一样。上面的例子并不纯粹是函数式的,因为它包含了两个副作用,但是它仍然受到了函数式编程的启发。
了解如何使用 Python 中的 lambda、map、filter 和 reduce 函数来转换数据结构。
towardsdatascience.com](/elements-of-functional-programming-in-python-1b295ea5bbe0)
生成器表达式和列表理解
列表理解和生成器表达式是 Python 从纯函数式编程语言 Haskell 复制的概念。考虑下面的例子,我们试图计算几个平方数:
numbers = [0, 1, 2, 3, 4]
square_numbers = []for x in range(5):
square_numbers.append(x**2)square_numbers *# [0, 1, 4, 9, 16]*
这很笨拙,因为我们需要定义两个数组并编写一个for循环。一个更简洁优雅的方法是用列表理解来做这件事:
square_numbers = [x**2 for x in range(5)]
square_numbers *# [0, 1, 4, 9, 16]*
通过添加一个if条件,您可以只选择特定的元素。例如,假设我们只想要偶数的平方数:
even_square_numbers = [x**2 for x in range(5)
if x%2 == 0]
even_square_numbers *# [0, 4, 16]*
列表理解将列表的所有值存储在内存中。这对小对象来说很好,但是如果你处理大的列表,它们会让你的程序变得很慢。这就是生成器表达式发挥作用的地方:
lots_of_square_numbers = (x**2 for x in range(10000))
lots_of_square_numbers *# <generator object <genexpr> at 0x1027c5c50>*
生成器表达式不会立即计算对象。这就是为什么如果你试图调用它们,你只会看到一个有趣的表达式(输出的确切形式取决于你的操作系统)。但是,它们使它们以后可以访问。您可以像这样调用生成器表达式的元素:
next(lots_of_square_numbers) # 0
next(lots_of_square_numbers) # 1
next(lots_of_square_numbers) # 4
...
或者,您可以创建生成器表达式中前几个元素的列表,如下所示:
[next(lots_of_square_numbers) for x in range(10)]
*# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]*
与其他技巧一样,这不会自动使您的代码变得纯粹实用。这只是从函数式编程中借用的一个概念,在许多情况下都很有用。

Lambda 表达式可能是常规函数定义的一个很好的替代品。图片由 NESA 制作在 Unsplash 上拍摄
小函数和 lambda 表达式
如果想写一个小函数,这样写也没什么不好:
def add_ab(a, b):
return a + b
然而,你也可以用一个lambda式的表达:
add_ab2 = lambda a, b: a + b
它的长度几乎是一样的,一旦你习惯了它的语法,就很容易读懂。用不用真的看个人口味了。但是正如我们将在下面看到的,它在某些情况下非常方便。
如上所述,使用lambda-表达式不一定会使你的代码功能化,即使它们是函数式编程的一个关键思想。
内置 Python 函数
地图()
函数map()主要返回生成器表达式。这是一个简单的例子:
numbers = [0, 1, 2, 3, 4]
squared_numbers_map = list(map(lambda x: x**2, numbers))print(squared_numbers_map)
*# [0, 1, 4, 9, 16]*
正如你前面看到的,你可以用列表理解做同样的事情。然而,当您使用map()函数时,有时您的代码会更具可读性。
过滤器()
这类似于使用if子句的列表理解,例如:
squared_numbers_map_even = list(filter(lambda x: x%2 == 0, squared_numbers_map))print(squared_numbers_map_even)
*# [0, 4, 16]*
你也可以像这样嵌套map()和filter():
squared_numbers_map_even_new = list(filter(lambda x: x%2 == 0, list(map(lambda x: x**2, numbers))))print(squared_numbers_map_even_new)
*# [0, 4, 16]*
枚举()
如果你在遍历一个列表,并且需要跟踪索引,enumerate()是一个不错的选择:
for num in enumerate(squared_numbers_map_even):
print(num)
*# (0, 0)
# (1, 4)
# (2, 16)*
zip()
如果需要从两个列表中创建元组,可以使用zip():
list(zip(['a', 'b', 'c'], (1, 2, 3)))
*# [('a', 1), ('b', 2), ('c', 3)]*
因为zip()像生成器表达式一样只返回可迭代的对象,所以list()包含在这个表达式中。
functools 模块
有时候你会有一个函数,它有几个参数,但是你需要修改几个参数。考虑这个简单的例子:
import functoolsdef add_lots_of_numbers(a, b, c, d):
return a + b + c + dadd_a_and_b_27 = functools.partial(add_lots_of_numbers, c=18, d=9)
add_a_and_b_27(1,2) *# 30*
在这个模块中,除了functools.partial()之外,还有几个功能,但这是迄今为止最重要的一个。和以前一样,partial()并不总是导致函数式代码,但是它是从函数式编程中借用来的一个简洁的概念。
让你的软件更快、更易读和更易维护并不需要这么难
towardsdatascience.com](/the-ultimate-guide-to-writing-better-python-code-1362a1209e5a)
几个简单的小技巧就能帮上大忙
当你开始编码的时候,你可能听说过很多关于面向对象编程的东西,而不是关于函数式编程的。这确实有道理,因为面向对象编程非常有用。
但是最近几年,我们遇到了越来越多的问题,当你掌握一些函数式编程的技巧时,这些问题就更容易解决了。
你不需要马上学习像 Elm 或者 Haskell 这样的函数式编程语言。相反,您可以提取它们最有用的方面,并直接在 Python 代码中使用它们。
一旦你知道了窍门,你会发现到处都有机会使用它们。编码快乐!
如何管理一名初级数据科学家
让你和你的团队保持快乐和高效的个人思考
你是否曾经希望你能克隆一个自己?信息永远不会在翻译中丢失,你会确切地知道你的直线报告能够做什么工作,他们会觉得你的笑话很好笑。

弗兰克·麦肯纳在 Unsplash 上拍摄的照片
但是我们不能这样做,尽管我对自己的看法有些夸大,但这并不是特别可取的。相反,当团队拥有多样化的背景和思维时,他们工作得最好。另外,知道你的经理可能也有同样的想法也是一种有益的谦虚练习。
因此,在这个没有克隆的世界里,你需要在初级数据科学家开始实地工作时,迎接管理他们所带来的挑战和回报。
一点点判断,大量的尝试和错误,让我停下来思考和反思那些对我有效的事情,以及那些失败的事情。
冒着听起来像是一篇自助文章的诱饵的风险,我挑选了 6 个关键点,作为一名经理,我会记住它们。
本文主要是为管理团队中更多初级成员的数据科学家(或高级)而写的,但希望对每个人都有帮助。
让我们来看看我的 6 个观察。
一对又一对
配对是软件工程师之间的一种常见技术,两个工程师使用双显示器或共享屏幕来处理相同的代码。通常,一个人是领航员,指导工作并编写代码,而另一个人是导航员,沿途进行观察或提出建议,在适当的时候也可以直接编写代码。

照片由阿米尔-阿巴斯·阿卜杜拉里在 Unsplash 上拍摄
结对的美妙之处在于你可以互相学习,发现你自己不会发现的错误,并且作为一个集体写出更高质量的代码。
感觉配对在数据科学中变得越来越普遍,因为软件工程的界限越来越模糊。结对在整个团队中产生了巨大的成果,尤其是对初级成员而言。
如果您正在向他们介绍新的或令人畏惧的东西,结对是一个很好的机会,在移交控制权之前,您可以作为试点开始您的项目,在实践中演示代码,以便您的团队成员可以在实践中学习,您可以在他们旁边提供指导。
这可能是你已经不太正式做的事情,但我发现如果你在某个时间预订并说…
让我们两人一组,一起写这个
…而不是简单地事后审查一些代码,或者在没有帮助他们开始的情况下向他们抛出一个新话题。
试一试,找到适合你们两个人的动力,确保你在日历上留出适当的时间,让你们不受干扰地富有成效地配对。
选择你的战斗
随着开始结对越来越多,我也注意到自己说的越来越多。虽然沟通是关键,但开始吹毛求疵并纠正任何作品直到它看起来完全像你写的一样是很容易的。

这种模式让我思考(担心),所以我拿出了我给我的直线报告的最后 5 条书面反馈。重读我的信息后,我很快意识到其中大部分源于个人偏好。本质上,我是说我不会用一种特殊的方式写代码,或者我会用我的风格展示一些幻灯片。
而不是问“这份工作和我自己的相比如何?”,我应该问唯一重要的问题,“这项工作是否达到了我们设定的目标?”。
例如,我有什么资格说这个代码…
df.rename(columns={“old_name”: “new_name”}, inplace=True)
…比这更好…
df = df.rename(columns={“old_name”: “new_name”})
实际上,我列出了数据科学的一些方面,这些方面是我认为普遍良好的实践,并希望我的团队遵循。如果我对一个不在清单上的主题提供反馈,它就像一个有用的电击,因为如果它不是必须的,那么它可能就没那么重要了。

当涉及到反馈和评审工作时的优先级。图片由作者提供。
什么会出现在你的清单上?你可能会发现,放下不太重要的东西会让你的评审更有效率,也不太可能让你的团队感到被反馈轰炸了。
在职和脱产学习
数据科学是一个广阔而动态的领域,不可能与所有的进步保持同步,也不应该指望你能跟上。
尽管如此,无论你是数据科学通才、ML 工程师还是研究人员,一个不可回避的事实是,你需要了解你的洋葱并拥有一定的技术技能。

蒂姆·莫斯霍尔德在 Unsplash 上的照片
冒名顶替综合征可能会袭击团队的任何成员,不仅仅是初级成员,但初级数据科学家应该得到足够的耐心和支持,特别是要稳步掌握这个角色。比以前的经验更重要的是他们学习交易的意愿、热情和好奇心。
明确你的团队可以花一些时间专注于可能对他们有益的新技能,例如每月一个星期五专门用于培训。
一定程度的学习也必须发生在工作之外。分享教程、为团队订阅时事通讯、参加聚会以及经营日志俱乐部都是鼓励持续学习的好方法。这也是一个有用的酸性测试;如果你的团队没有以某种形式致力于个人发展,警钟应该敲响了。
定义进展
这是我团队中一名成员的坦率反馈。在我们每周一次的谈话中,他们说…
我不确定我在公司的发展方向,也不知道我需要做些什么才能进步
不是一个好地方,也不是一个好经理。但是他们是绝对正确的,我们从来没有真正坐下来讨论过车队的发展会是什么样子。

林赛·亨伍德在 Unsplash 上拍摄的照片
这个反馈作为一个有用的唤醒电话来执行两个动作。
- 创建一个文档,表达初级数据科学家的职责和特点,以及下一步的发展方向。这不需要太多的规定,但它有助于透明地显示他们应该以什么为目标。
- 询问他们在这个角色中最开心的是什么。他们什么时候感到最自豪?如果可以选择,他们最想做什么类型的工作?了解某人是个人贡献者还是将自己视为未来的团队领导者,意味着你可以相应地调整他们的进展。
你对团队内部的发展有清晰的规划吗?你应该为你自己和你的初级数据科学家创建一个透明的描述,说明你的期望,以及他们需要展示什么来证明一个令人信服的晋升案例。

来自数据科学家的关怀和喂养的职业阶梯示例。https://or eilly-ds-report . S3 . Amazon AWS . com/Care _ and _ Feeding _ of _ Data _ scientists . pdf
寻找合适的机会
如上所述,团队成员应该有一定的自由来表达他们想成为什么类型的数据科学家,以及他们觉得自己的专长是什么。
尽管如此,您仍然需要一个了解交付数据科学项目的完整端到端流程的团队。拥有一个不知道如何将他们的模型投入生产的机器学习专家或者一个不能与利益相关者互动的强大的编码员是没有用的。
如果你已经定义了进展的样子,下一步就是确保你准备好帮助你的团队到达那里。

我发现一起坐下来,为数据科学家应该具备的不同技能以及他们在每个领域的暴露程度创建一个记分卡是一个有用的练习。
这个练习不是关于优势,而是关于他们是否有机会获得他们需要的技能。这样做是双赢的,因为他们将有一个明确的发展计划,而你也将因此拥有一个更全面的团队。
例如,您的生产线报告可能会说…
- “在过去的几个月里,我一直埋头于 SQL 代码和摄取管道,我想回到一些机器学习上来”。
- “我做过很多模型,但总是有人接手并为我在生产中部署它。”
创建记分卡可以让你直接听到他们关心的问题或发展需求,然后提出解决盲点的计划。
这是记分卡的一个高级示例。这个练习可以是你想要的任何形式,但是你们应该一起做。

记分卡示例。图片由作者提供。
OKR 的
你是数据科学家。你喜欢测量东西。在为你管理的人设定目标时,你应该运用这种思维。
关于 SMART 目标、 OKRs 、 BHAGS 以及任何你能想到的其他缩写词的文章数不胜数。可以说,目标应该是相关的、雄心勃勃的、可衡量的。

数据科学家通常是一群充满激情的人,我们可能会因为想要学习最新和最伟大的框架或寻找使用深度学习的机会而分心。但我们不是在泡沫中工作,最终,我们的雇主会期待一些有价值的东西回来。
因此,在个人发展目标之外,指定一个与商业成果相关联的目标是有意义的。
比方说,你的公司每月都要发邮件来吸引新客户,收到邮件的人中有 10%会成为客户。
数据科学团队被要求提高其绩效,这对初级数据科学家来说是一个完美的项目。在开始工作之前,你可以设定这个目标和可衡量的结果…
目标:提高邮件活动的转化率
关键 结果:预测谁应该成为目标的一个模型
似乎是个不错的起点。我们有一个项目要做,做这个项目的人需要交付一个模型是有意义的。但是这个模型发生了什么,它是如何投入使用的,我们如何知道这项工作是否成功?
也许关键结果的下一次迭代会是…
关键结果:一个预测谁应该是 60%召回目标的模型
我们离成功越来越近了,但它依赖于像召回这样的统计测量,而不是影响业务 KPI 的东西。
如果你强迫自己从商业角度思考,你可以和 CRM 和财务团队谈谈,了解什么是有意义的改进。也许他们会告诉你转换率必须从 10%增加到 15%,以证明更新他们的工作流程和将你的模型合并到产品中的额外工作是合理的。
太好了。接下来,你必须考虑如何测量,以及实验会是什么样子。如果你得到了你无法衡量的东西,你还应该继续努力吗,因为你永远不知道它是否值得?
这个关键结果感觉比较扎实…
关键结果:使用数据科学模型与现有方法进行活动的 A/B 测试,证明通过使用该模型,转化率至少提高了 15%
你无法控制的事情总会发生。你可能交付了世界上最好的模型,但是利益相关者没有以正确的方式使用它。在这些情况下,至少你开始时有了正确的意图,并且可以在你的评估中考虑减轻因素。
首先从一个有商业头脑的目标开始,并考虑你想要进行的实验来验证你的工作,你的团队将开始变得对你和你的公司更有价值。
那是一个包裹
就像生活中的所有事情一样,当涉及到数据科学和管理时,还有很多东西需要学习,但我希望这 6 条建议中的一些可以帮助你一路走来。
- 配对
- 定义你必须拥有的东西,放下个人喜好
- 重视日常工作之外的学习
- 传达从初级晋升到高级所需的特质
- 为工作的不同元素创建记分卡
- 设定商业目标
祝你和你的团队好运!
当你在这里的时候
请随意查看我的其他文章:
如何管理与 ESB 替代方案的数据集成
了解如何在几分钟内设置 N8N 并实施工作流程
在我们开始讨厌独石之后的一秒钟,集成已经在我们的必备清单上占据了一席之地。如今,在现实世界的应用程序中,不可避免地会出现多个系统相互通信的情况。就像人类一样,交流是非常困难的。你可能会失去连接,在某一方有计划外的改变,错误可能会在任何地方发生。这就是为什么交流太重要了,没有工具是不行的。手工制作的解决方案以噩梦告终。企业模式建议我们将 ESB 解决方案添加到我们的架构中,但是在许多场景中这可能很昂贵。在本文中,我们将学习如何使用免费且简单的工具 n8n 解决最常见的集成问题。

图片来自 geralt 的 pixabay
什么是 ESB
一条企业服务总线 ( ESB )就是数据高速公路。它不仅将数据从 A 分发到 B,还创建了一个基于 API 的公共集成层(面向服务的架构,SOA,面向旧时尚定义爱好者)。在这种体系结构中,多个软件只使用一条总线来通知本地变化和数据变化。简单地说,在这个架构中,您不必集成多个系统,只需集成一个系统:ESB。将变更传播给可能对该信息感兴趣的其他参与者的将是 ESB 本身。所有这些过程对你来说都是透明的。这就把系统间的网状通信问题变成了星型拓扑。对于那些没有多点集成经验的人来说,这意味着您将减少集成成本和维护。您将降低成本,因为所有的集成都将支持相同的格式和标准。您将减少维护成本,因为由其他系统引起的所有更改都将被 ESB 吸收(希望由有效管理这些问题的专业团队来完成)。许多现代 ESB 维护流入管道的信息的副本。这意味着一个包含公司所有战略信息(黄金记录)的数据库,可以由使用结构化 API 协议(如 GraphQL)的各方使用。
这里总结了 ESB 的职责:
- 在系统间发送消息
- 监控、记录和控制此消息流,包括错误报告
- 提供一个稳定的 API 架构,可以被所有系统集成
- 使所有格式符合标准
- 对事件进行排队,保持性能,出错时动作的可重复性。
- 可选功能,如在本地存储数据以作为 MDM 或内部工作流来转换信息
N8N 是什么?
N8N 不完全是 ESB,更像是一个工作流自动化工具。在官方网站上,它将自己定义为领先的点对点集成云解决方案 Zapier 的免费内部替代方案。
这样的解决方案不是 ESB,因为基本上,它提供了一个网状集成网络。当你把 A 和 B,C 和 D 直接连接起来时,就会发生这种情况,这很自然。理论上,这样做,您会失去 ESB 的大部分好处,就像所有数据都在其中流动的真正总线一样。
无论如何,即使通信仍然是点对点的,只要在同一个平台上管理它,就可以通过简单的用户界面完全控制所有的集成。
N8N 的关键特性是什么?
- 免费您可以在您的内部数据中心或云中免费运行 n8n。无论你的公司规模或整合数量。
- 易于扩展您可以使用市场上的连接器,也可以自己创建连接器。
- 你的数据会留在身边你可以在本地运行。这是安全的、高效的、高性能的,并且避免了像向云开放 VPN 或在内部安装代理以允许云工具进入您的 l an 这样的痛苦。
最常见的场景是什么?
- 循环作业您可以处理像“每 Y 小时运行 X”或“每天将数据从 X 移动到 Y”这样的用例
- 同步数据您可以从源和目标创建移动数据,使它们保持一致。您可以有任何种类的源或目的地,比如 API、RDBMS、NoSQL 和文件。
- 对事件做出反应所有的工作流都可以通过一个 API 调用来启动。这让我们可以管理类似“当用户在 Y 应用程序中执行 X 操作时,也执行该操作”的场景我们需要的唯一部分是调用 Y 应用程序上的 API。
如何设置 N8N
N8N 的设置非常简单。我跳过了每次手动安装,因为我是 docker 爱好者,但如果你愿意,你可以使用传统的安装过程。如果你是一个 docker 爱好者,或者不太害怕容器,你可以使用下面的 docker-compose 文件并运行“docker-compose up”命令
version: '2'services:
n8n:
ports:
- "5678:5678"
image: n8nio/n8n
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=admin
- DB_TYPE=mongodb
- DB_MONGODB_CONNECTION_URL=mongodb://root:password@mongo:27017/n8n?authSource=adminmongo:
image: mongo
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=password
- MONGO_INITDB_DATABASE=n8n
ports:
- 38017:27017mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_DATABASE: mysql
MYSQL_USER: mysql
MYSQL_PASSWORD: mysql
这个 docker-compose 创建了一个链接在一起 8N 实例和一个 MongoDB 数据库。对于生产用途,您将需要像往常一样持久化数据和管理备份,但是对于快速启动来说就足够了。compose 还包含一个 MySQL 实例,我们将使用它进行测试。
配置您的第一个工作流
我们要配置的第一个工作流是一个简单的作业,它从 web 服务中读取数据并将其转储到数据库中。
首先,我们需要创建一个工作流。我们可以轻松设置步骤:
- 下载数据
- 如果不存在,则创建目标表
- 转换数据
- 将数据保存到目标目的地
所有这些步骤都将由 UI 来管理,不用写一行代码,真好!
该示例是手动触发的(点击或调度),以尽可能简单地维护该工作流,但也可以通过 API 调用来激活。

数据传输的工作流程
下载数据
我使用了一个生成随机数据的 Mockaroo API。数据将类似于:
curl -H "X-API-Key: XXXXX" [https://my.api.mockaroo.com/test.json](https://my.api.mockaroo.com/test.json)[{ "id": 1, "first_name": "Atlante", "last_name": "Hick", "email": "ahick0@blog.com", "gender": "Female", "ip_address": "64.230.69.253" }, { "id": 2, "first_name": "Kaitlynn", "last_name": "Klaes", "email": "kklaes1@hexun.com", "gender": "Female", "ip_address": "247.25.175.87" },...]
这个步骤被配置为指向 API,传递身份验证头,并获取数据。请注意,使用不同的配置,我们也可以处理所有其他 HTTP 操作。

HTTP 请求步骤预览中 API 的结果
如果不存在,则创建数据表
这一步可以通过运行一个简单的查询语句来轻松管理。为了连接到数据库,我们需要设置连接字符串(在本例中,是我们的本地 MySQL 数据库)。

创建数据库连接的这一步

创建目标表的步骤(如果不存在)
转换数据
因为我们只有一个 json 输出,所以我们需要将数据分成行。基本上,n8n 中的下一步是对每个输入元素执行的。将直接输出传递给 insert 语句将导致对整个有效负载只执行一次。这不是预期的行为。在这一步中,我使用了一个 javascript 块来转换数组中的有效负载,并将其作为输出。这将导致每行执行一次下一步。

这一步将数据从 json 数组转换成行。
插入语句
insert 语句非常简单。只要映射字段,所有的工作就完成了。这将对每一行执行一次,在数据库上转换一组 insert 中的输入行。

这一步是插入,json 在插入中被转换
如果我要做一个 insert 或 update 语句会怎么样?
在这个例子中,我们将行插入到表中。这是测试该工具的一个很好的例子,但是在现实世界中,我们需要 upsert(更新或插入)数据。实际上,该工具本身并不允许这样做。无论如何,检查行是否存在,然后插入或更新一般都很昂贵。为了不浪费时间地完成这个目标,我们可以使用两种模式:
- 使用原生 MySQL 语句 INSERT 或 UPDATE。这仅对 MYSQL 有效,并且需要一个定制的 SQL 语句。
- 使用分段表。您可以创建一个临时表来保存数据。这个操作很快,因为插入是更快的操作。然后,作为最后一步,您可以添加一个 SQL 合并,将真实表与临时表同步
带什么回家
ESB 是企业架构中的一个重要组成部分,但是:
- 没有它我不能出去。你愿意不穿衣服走出家门吗?不能。因此,不要在没有 it 的情况下设计公司基础架构。另一种选择是点对点集成,这就是问题所在。我们必须为处理所有遗留架构花费大量精力(时间&金钱),所以请为新设计做出正确的选择。
- 它不能手工制作。这不仅是一个不重新发明轮子的问题,而且是一个事实,即从零开始(当然是在有限的时间和预算内)创建像商业系统一样的系统是不可能的。
- 工作流自动化不是 ESB,但总比没有好。 ESB 解决方案并不便宜。商业工具齐全但成本高。如果您预算不足,可以选择手动或通过 ETL 来管理数据流。工作流自动化工具呢?像 Zapier 或 N8N 这样的产品性能好,性价比高。
如何管理人工智能的风险
面向未来的现代方法,来自英国数据保护局

来源: Mixkit
前提 :本文意在作为‘活’文档。这意味着当我们有来自监管机构的更新时,我将增加审查跟进(我有时间…)。
22.09.20 更新 :几周前,监管机构发布了关于该主题的最终指导意见。除了一些小的调整(特别是关于人工智能、安全性、合成数据和透明度的潜在“偏见”)和额外的术语表,该文件几乎与之前的草案相同。
在 AI 公司工作,基本上有两种潜在的团队类型。这些可以概括为:
1)“我们已经采取了所有安全措施来保护我们的机器学习系统及其数据”,以及
2)“有了所有新的指导方针和程序,我们需要做一些事情,但我们不知道具体做什么或如何做”。

来源: Mixkit
如今,这两种方法都是可以理解的。随着我们看到的关于人工智能和数据保护的不同论文,很难判断最好的做法是什么。
我们应该等待更明确的规则,还是继续前进?
【更新】今天,我将总结 ICO(英国数据保护局)的最新指南及其关于管理人工智能培训和部署的实用建议,以及一些关于相关风险的进一步建议。
我保证,我会尽量避免任何形式的法律术语,但请记住,数据保护领域的基本知识将有助于理解这些内容。
如果您想立即跳到可执行任务的章节,您可以跳到最新章节( [+1】)。那么,我们该怎么办?’)。
好,我们开始吧。
1.DPIA 是基本支柱
ICO 以特别关注数据保护影响评估(DPIA)的实施而闻名,这是人工智能系统处理个人数据时所需的。
ICO 规定,将所涉及的数据主体的所有风险降低到零是“不现实的”(事实上法律并不要求这样做)。相反,最主要的一点是在可行的最大程度上识别和减轻风险。
现在,我们有几种工具可以实现这一点。

关于人工智能领域,DPIA 的实施应具体解决并提供:
- 可能影响过程公平性的任何相关变化或与系统相关的误差范围的解释(见第 3 节)。详情);
- 人工智能系统作出的所有决定的记录;
- 过程中任何人类参与的程度,其影响(换句话说,是否有意义)以及人工智能系统产生的输出的可能覆盖;
- 需要考虑或做出的任何权衡(例如,在隐私权和其他竞争权利之间;统计准确性、透明度、商业秘密和商业知识产权方面)。
尽管如此,ICO 指出,在两个独立的评估中描述所有不同的方面可能是有用的:为 ML/IT 专家和工程师提供的全面的技术描述,以及更通用和易读的概述,其中包含有关输入、输出和所涉及的个人数据逻辑的所有关键信息。

来源:作者
2.你在人工智能项目中的角色是什么?
假设您与一家公司合作,该公司提供具有处理和存储功能的专用云计算环境,以及一套用于机器学习的通用工具。您可能需要定义想要使用的数据和模型、关键的模型参数,以及评估、测试和更新这些模型的过程。
在这种情况下,很容易看出你的供应商是一个“加工者”(他们代表你行事,根据你的指示,只决定非必要的细节),而你是一个“控制者”(你对项目的最终结果有完全的控制权,你最终负责加工)。
但是,如果您的供应商将这些数据用于其他目的(例如,改进他们的培训系统),会发生什么情况呢?
在这种情况下,他们立即成为此类处理的控制者,这需要与您就您的数据的披露和进一步处理达成另一份具体协议。
当考虑到一些公司向其客户提供实时人工智能预测和分类服务时,该框架可能会变得更加不清楚。
它们是控制器、处理器还是联合控制器?这取决于部署的每个阶段。我认为信息图在这种情况下会有所帮助。

3.让我们试着做到(统计上的)准确
在人工智能中,“准确性”的衡量标准强调了人工智能系统猜测正确答案的频率。这些答案通常包括个人数据作为可能的预测或推断。简单干净。
也就是说,ICO 补充说,该系统在统计上越准确,处理过程就越有可能对相关数据主体公平。
这就是为什么应该在持续的基础上评估系统的统计准确性,重点关注精确度(即被确定为阳性的病例的百分比实际上是阳性的)和召回率(所有被确定为阳性的病例的百分比)。
4.法律基础
另一个要考虑的方面是为人工智能项目收集和处理个人数据的适当法律基础。抛开同意、法律义务、重大利益和执行公共任务(这在大多数现有活动中似乎难以申请)不谈,我们能否依赖合同的履行和企业的合法利益?
答案是肯定的。
该指南阐明,人工智能可能是向相关个人交付合同服务或在合同前阶段提供支持(例如,人工智能衍生的服务报价)所必需的。
在这种情况下,“履行合同”是使用系统(交付阶段)的最佳理由,但它可能不是前一阶段(人工智能系统的培训/开发)的最佳选择。
因此,“合法利益”似乎是最合适的法律基础来训练你的人工智能模型,但不要忘记实施你的合法影响评估来平衡所有涉及的变量。
请记住:即使您有处理个人数据的适当法律依据,仅仅一些数据可能有用的可能性本身并不足以让组织证明处理这些数据对于构建模型是必要的(稍后将详细介绍数据最小化)。
5.针对歧视和偏见的措施
实施人工智能最常见的抑制因素是它可能产生的歧视形式,特别是当我们有不平衡的训练数据或只是过去歧视的眩光时。该指南建议的一些措施是:
- 训练单独的模型;
- 反分类;
- 结果/错误奇偶校验;和
- 同等校准。
我不会深入讨论这些方面,因为我们可以花几天时间来讨论与每个方面相关的困难。关于这个主题的精彩论文可以在这里找到。
【更新】该指南还强调,每项衡量标准也应保持平衡,因为它们会对人工智能系统性能的统计准确性产生影响。
6.安全性和数据最小化
(注:这一小段比较有技术含量。我试图尽可能地简化,但对于这些方面的大部分,你需要一个强大的人工智能相关的技术知识。)
在人工智能中,安全性值得大多数企业关注。
如果你认为工程团队通常使用第三方框架和代码库是为了创建、维护和开发人工智能系统,那么你就会明白每个人工智能公司都可能存在的潜在风险。幸运的是,社区已经在致力于减少这些算法及其开源包背后的潜在漏洞,但我们仍处于这种方法的初级阶段。(更多技术细节此处)。
在这个问题上,ICO 描述了每家公司可能面临的一些具体风险。特别是:
- '模型反演':如果攻击者已经获得了训练数据,他们可以从 AI 模型中推断出进一步的个人信息(更多细节在此和在此);
- “成员推断”:攻击者能够推断出特定个体是否存在于 ML 模型的训练数据中的风险。在这种情况下,他们不需要了解任何关于所涉及的数据主体的额外个人数据;
- “对抗性示例”:不是适当的数据保护风险,但这些示例可能被故意修改,以至于它们被错误分类,从而对 IT 系统构成风险。在这种情况下,值得注意的是,这可能被视为违反了网络和信息系统指令( NIS 指令)。
抛开适用于开发工作的维护代码和管理安全风险的标准要求,ICO 基本上建议,“系统中的数据越少,就越安全”(数据最小化原则)。
为了实现这一目标,指南探讨了可以实施的不同措施,包括:
- 特征选择,通过从训练系统中移除所有不相关的属性(技术细节此处);
- 记录和记载个人数据从一个位置到另一个位置的所有传输和存储,包括第三方系统;
- 差分隐私,以便了解和评估在培训系统中增加干扰或“噪音”的潜在影响(更多技术细节此处);
- 联合学习,允许多方根据自己的数据训练模型(“本地”模型)。然后,您可以将识别出的一些模式(称为“梯度”)组合成一个更准确的“全局”模型,而不必彼此共享任何训练数据(更多详细信息此处);
- 在从源中提取和共享训练数据之前,对其进行去识别;
- 直接在生成查询的设备上的本地推断,该设备已经收集并存储了每个数据主体的个人数据(而不是在云服务器上);
- 隐私保护查询方法(更多详情此处);
- 【更新】使用合成数据,与真人无关,而是人工生成的(更多详情此处)。
7.快完成了:如何管理数据主题请求?
出于几个原因,用户请求(“数据主体请求”或“DSRs”)似乎是新技术最复杂的方面之一。
例如:
- 通常,训练数据只包括与预测相关的信息,而不包括联系方式的详细信息。然而,即使数据已经通过某种技术过程进行了转换,训练数据仍可能被认为是个人数据。
- 即使没有直接收集,也可以从采用的模型中推断出更多的个人数据。
在这种情况下,简单地访问他们的个人数据可能会很麻烦,有时,您也无法识别培训数据中的个人。
此外,可移植性请求可能是最难解决的一个问题,尤其是当数据以机器可读的形式大量转换时。原始数据可以提供,但是,ICO 指出,如果这种转换很重要,则产生的数据可能不再被视为由数据主体“提供”,因此不再受可移植性请求的约束
(尽管它仍然是个人数据,所以可以是不同请求的焦点,例如访问权限)
另一方面,可能的擦除或纠正请求可能是可管理的,并且应该对所构建的模型有较小的影响。
然后,该指南强调,在自动决策的情况下,个人请求人工干预的流程应该简单且方便用户(例如,带有链接或清晰信息的网页,允许个人联系可以参与进来的工作人员)。
这里的关键点是透明度:制定一个隐私政策,用常见和可理解的术语解释人工智能系统的整体结构,其目的和从中做出的决定。这可以极大地帮助建立用户的信任,并且(希望)减少收到的请求数量。
有人说‘黑盒’?
是的,这是真的,对于非常复杂的系统来说,可能很难理解系统的逻辑,也很难解释它们是如何工作的。此外,一些方法可能会意外泄露有关人工智能模型的敏感专有信息,并有助于暴露外部参与者的隐私攻击。解释指南可以帮助你。
[+1].那么,我们该怎么办?
如果你一直关注我的文章,并且同意我的观点,你可能会想知道你现在可以采取什么行动。
为了给你一个答案,我创建了一个人工智能数据保护清单,它完整地追溯了 ICO 官方文件,可以作为你在人工智能团队中识别和控制风险的路线图。
这是团队合作,不是一个人的项目!
你的同事对上述每一步的看法可能是简化流程的关键,也是最终结果的关键。支持性的组织文化是基础。
简单地
【更新】该指南还阐明,它将不断努力为这一新兴领域提供更多支持,并在未来几年内发布适当的“工具包”和新的“云竞争指南”。
尽管如此,该文件已经提供了 ICO 的相关建议,并说明了减轻人工智能风险所需的关键步骤,以及可以立即采取的步骤。
PS:
你想多读点吗?下面你可以找到更多关于这个主题的论文:
欧盟委员会- 人工智能白皮书
隐私论坛的未来- 警告标志
AEPD - 嵌入人工智能处理的 RGPD 符合性|简介
ICO - 大数据、人工智能、机器学习和数据保护
ICO 和艾伦图灵研究所- 项目解释
如何管理你的专业人工智能实践
在世界舞台上竞争时的考虑

企业和政府正慢慢开始在其组织内建立真正的数据科学部门,扩展离散团队的工作。(这是一份过时但仍然适用的普华永道报告。)这在很大程度上是由于关于职能部门化的现代管理理论(是的,这是一个真实的词),它将关键的组织活动分成专门的团队。
数据科学恰好变得与职能 IT 团队或适当的人力资源部门一样对组织有价值。从应用数据科学中出现的专业行业正在慢慢地在组织部门之间分离,类似于会计和 IT,以及提供战略和实施服务的咨询。如果我们将数据科学团队的未来与这两个特定部门进行比较,我们可以很好地了解该行业在几年后的样子。
例如,在这些部门中通常有程序团队(簿记和 IT 支持)、管理团队(会计和 IT 主管)和战略团队(CFO 和 CTO)。这非常类似于数据输入专家、数据科学家和机器学习工程师,以及首席数据官。
因此,如果你试图提供人工智能/人工智能咨询服务,你应该如何定位你的专业实践?这里有一个简单的回顾和一些关于提高你的公司的专业性的建议,或者更好地构建你的人工智能团队以实现最大的客户价值交付。
从能力到战略产品
就像这两个部门有外部审计师和安全评估公司一样,现在市场上也有提供方向指导和建议的战略咨询需求。下一步建什么比怎么建更重要,这意味着 AI 咨询正在从技能型向指导型转变。(以下是 2020 年企业 AI 采用情况的奥赖利报告。)
这种从战术到战略的转变是可以从客户那里获得高层次价值的地方,但只有当你有能力从知识、经验和智慧中提供建议时才是有效的。您过去是否实施过类似的解决方案?即使数据不同,您是否有可以探索的可靠的解决方案模式?战斗伤痕和经验教训呢?所有这些都会在客户对话中出现。
如今,创办并运营一家成功的人工智能咨询公司需要什么?好吧,要称自己为人工智能咨询公司,现在真的只需要一个自封的头衔。然而,要成为一家 值得信赖的 和 合法的 咨询公司,你需要建立可信度和正当理由,让人们相信你有他们的人工智能需求。这就是营销定位的由来。
三个朋友:专业知识、经验和效率
让我们在这里进行一次思考练习:如果你没有经营一家人工智能商店,而是仅仅经营一家通用咨询公司,你将如何经营你的商店?你如何将你的服务打包成可重复的过程?
在《管理专业服务公司》一书中,David Maister 提到了专业服务公司倾向于依赖的三种主要营销策略:专业知识、经验和效率。这些策略非常适用于人工智能咨询,并可能揭示出大男孩们偶然(或有意)的误导。
专长
专家说“我们很熟练。我们有能力。我们有血统。”这是人工智能商店的主要途径。你为什么不展示你员工中的博士名单呢?
仅仅依靠专业知识的问题是,你不能把你的专利和出版物强加给一份工作声明。你必须向潜在客户展示你能解决他们的问题。实用性胜过优雅。通过强调你的研究的特殊性和对你的客户的明确定义的问题的证明,你将能够展示候选的解决方案,因此移动到合同。
体验
另一方面,经验说“我们已经看到了一切。我们有战斗的伤疤,所以你不必。我们有故事。”(这是大型或老牌公司的主要类别。)
在人工智能咨询领域,经验是一把双刃剑。是的,人们依靠你来推荐早期原型的解决方案架构和关键模型选择,但是在 devops 的世界里事情变化很快,在 AI 的世界里变化更快。是什么让你 10 年前的经历在今天仍然适用?
在客户端,您必须专注于您熟知的常量。KPI。交货时间表。维护和支持条款。客户参与的坚实基础需要成为你的面包和黄油。如果问题被很好地定义,许多解决方案选项都是有效的,并且可以进行实验。
专业精神会让你越过终点线。
效率
最后,效率意味着:“我们可以优化。我们可以精简。我们可以调整。我们可以以更低的价格生产。”
当一个系统已经在生产中,或者当一个客户至少有一个实现的基线时,效率通常就来了。至少,效率公司倾向于需要客户提供的强大的护栏来在给定的约定中取得成功。我们通常看到这些团队执行更多的数据整合工作(获取、清理和预处理)和其他明确界定范围的活动(UI/UX、数据仓库和网络搜集)。
如果你是一个效率团队,就做一件事,并做到最好。
选择您的方法
这些不同的关注领域适用于客户参与的不同时间点。你不会把效率作为构思和原型制作的主要动力,就像你不会仅仅依靠专业知识来完成基本的 ETL 工作一样。每种方法都有它的位置和时间。
你想在一个非常嘈杂的市场环境中了解自己的独特产品。找一个接近荒岛的地方,把它变成你自己的,然后成长为另一个。
进入巨人队
为了比较你可能与现任者的情况,让我们看看人工智能咨询营销的流行模型。
品牌力量
已经成立的大型咨询公司决定推出或收购一个新的人工智能咨询团队,并在上面打上他们的巨大品牌。这是一种试图假装既专业又高效的体验。在现实中,人工智能咨询是如此年轻,以至于没有人能真正声称他们已经“做了”多年。
(注:如果你是这些大事务所之一,请告诉你的审计分支机构去看看我们的姐妹公司audit map . ai,因为没有人喜欢阅读成千上万的内部审计报告。)
专业平台提供商
这是一个明确的专业信号。这是 AWS、Azure、IBM 和 Google 为个人和组织提供大量 API 和解决方案的地方。
你需要和世界上一些最大的公司竞争吗?嗯,你很幸运!这些公司的动机绝不是专业服务——他们不想提供这些服务,但他们不得不提供。事实上,他们有广泛的合作伙伴计划(如 APN 和合作伙伴世界)的唯一目的是卸载专业服务。他们通过持续消耗他们的资源和 API 来赚钱,而不是通过咨询。
你可能需要经历向这些渠道中的每一个申请的折磨,但是你会带着合法的徽章从另一端出来。
基于产品的咨询
这是一种混合模式,在这种模式下,一个专注的小型团队开始构建一个解决方案,并仍在努力寻找适合市场的产品,将在他们的产品试图服务的同一领域提供咨询服务。
如果你试图在提高产品市场适应性的同时创造收入(仅供参考,这是种子投资者的最佳选择),这是确保你打造一款可靠产品的可靠方法。
然而,如果咨询是你通过这个渠道获得收入的唯一来源,那么你的服务就真的和你的产品一样好。这可能是一场很难赢的比赛。
我们是如何做到的
当我们创办我们的公司时,人工智能咨询公司还是一片没有法律的荒地,充斥着魔法和城市传说。从那时起,人们就希望客户表现出高度的专业性,这与其他咨询行业类似。
如果你是一个小团队,我可以给你一些希望:
- 首先,每一家大型咨询公司通常都是由较小的组织组成的网络,而不是一个庞大的单一机构。所以,你实际上不是在和德勤竞争。你的竞争对手是多伦多的小型 OMNIA 团队,他们的办公室上面刚好有一个大大的 D。
- 第二,这些团队通过提供大量辅助服务来赚钱,其中一些服务是不必要的臃肿。(老实说,这正是我们提高参与度的方式。)当你竞标项目时,这通过提供一台精简、吝啬的人工智能机器给你带来了优势。
就如何定位您的服务而言,我们注意到我们有三种主要的接洽形式。
问题到想法
这就是你的经典咨询服务的用武之地。可行性研究、头脑风暴会议和人工智能路线图都是有效的可交付成果。这种参与背后的前提是,即使在客户可以采取下一步之前,他们也需要知道下一步应该朝哪个方向走。
这种类型的销售有点困难,因为客户有效地获得了一份报告,而这不是管理团队承诺的性感,性感的人工智能。
我们通过提供候选项目的推荐列表,在这种类型的参与中取得了很大的成功。这些项目中的每一个都是根据已知的风险、时间表、资源需求、成本以及您在参与之前应该知道的任何其他内容进行评估的。这种清晰很难获得。
从想法到原型
我可以毫无疑问地说,这是迄今为止我们拥有的最有趣的参与方式。
每个项目都是目标驱动的,分为数据科学、机器学习工程和部署。这是最著名的人工智能咨询方法,客户定义一个问题,顾问或团队建立一个解决问题的方案。
然而,如果你是专业的,很多时候很多研究需要提前进行,甚至在签署工作说明书之前。准备好投资研究以达成销售。
从原型到生产
人工智能咨询经常被遗忘的一点是,最终的模型需要驻留在不在你的笔记本电脑上的某个地方。
如果您为客户端构建一个模型,那么有一些部署就绪性问题是您在实验室中不会考虑的。一百万并发用户的延迟是多少?边缘案例呢?保安?存储?自动模式转换?
人工智能咨询的这一方面需要 devops、ML 工程和业务理解的融合,因为在你推出产品之前需要做出一些设计决策——因为一旦产品上线,你就无法进行硬重置。
混合策略、架构和实施
我们开始让自己出名的地方是我们将人工智能与客户的基本商业案例联系起来的能力。我们已经执行了一些艰难的项目(正如我们的clutch.co 简介可以证明的),但我们的成功很大程度上是因为我们能够帮助我们的客户完成解决方案的长期战略部署。我们走后谁将拥有这个项目?他们应该如何降低成本?
没有人会赢得一场比赛
重要的是要记住,在任何拥挤的市场都会有商品化。
我和 Dan 每周都会收到多次关于东欧、亚太甚至南美新数据科学团队的电子邮件。他们的价格极具竞争力,我们无法在通用产品上击败他们。但这只有在客户寻找通用产品时才有效。
重要的是要记住,在人工智能咨询的世界里,人工智能不是一个编码程序,而是对更美好明天的承诺。如果你能说你客户的语言,你就有优势让他们看到一个更好的明天。所以他们会不断回到你身边。
咨询愉快!
马特。
如果您对本文或我们的 AI 咨询框架有其他问题,欢迎通过LinkedIn或通过email联系。
你可能喜欢的其他文章
如何像老板一样在 Python 中操纵日期和时间
常用的日期时间函数及示例

伊莲娜·科伊切娃在 Unsplash 上的照片
使用 Python 时,我们都有试图弄清楚如何“操纵”日期和时间的时刻。
这是我创建的一个备忘单,涵盖了 Python 中最常用的日期时间相关函数。如果你想要一些简单但实用的例子,看看吧!
我们将涵盖以下所有 7 个热门话题:
- 不同格式的今天的日期和时间
- 字符串到日期的转换
- 日期时间计算的差异
- 日期时间加/减某段时间
- 日期时间比较
- 时区设置
- Unix 时间戳/纪元时间计算
不同格式的今天的日期和时间
让我们从最基本的开始热身。下面是打印当前年、月、日、小时、分钟、秒和毫秒的代码。
**In:** from datetime import datetime d = datetime.now() #today's datetime
d**Out:**datetime.datetime(2019, 12, 22, 13, 14, 18, 193898)
这是非常有用的信息,但我们通常只需要其中的一部分。我们可以打印下面不同的部分。
**In:** print(d.weekday()) #day of week - Monday is 0 and Sunday is 6
print(d.year)
print(d.month)
print(d.day)
print(d.hour)
print(d.minute)
print(d.second)**Out:** 6
2019
12
22
13
14
18
此外,可能需要某些日期/时间格式。我们可以使用下面的列表来定制不同的日期格式。这也可以被认为是将日期转换为字符串的一种方式。完整的名单可以在这里找到。

**In:** print(d.strftime("%A %d/%m/%Y")) # date to string**Out:** Sunday 22/12/2019
字符串到日期的转换
下面的示例显示了两个被转换为日期格式的流行字符串:
**In:** date_string = '2016-02-01 12:00PM'
print(datetime.strptime(date_string, '%Y-%m-%d %I:%M%p'))**Out:** 2016-02-01 12:00:00**In:** date_string = '02/01/2016'
d2 = datetime.strptime(date_string, '%m/%d/%Y')
print(d2)**Out:** 2016-02-01 00:00:00
日期时间计算的差异
下面的示例打印天数的差异(例如今天和 2016 年 2 月 1 日):
**In:** from datetime import timedelta d = datetime.now()
date_string = '2/01/2016'
d2 = datetime.strptime(date_string, '%m/%d/%Y')
print(d - d2)**Out:** 1420 days, 13:18:27.386763
我们也可以只打印两个日期时间的差异,以天、周或年为单位,等等。
**In:** date_diff = (d - d2)/timedelta(days=1)
print('date_diff = {} days'.format(date_diff))**Out:** date_diff = 1420.5544836430902 days**In: ** date_diff = (d - d2)/timedelta(weeks=1)
print('date_diff = {} weeks'.format(date_diff))**Out:** date_diff = 202.93635480615575 weeks**In:** date_diff = (d - d2)/timedelta(days=365)
print('date_diff = {} years'.format(date_diff))**Out:** date_diff = 3.8919300921728497 years
日期时间加上/减去某一段时间
让我们按秒、分、小时、天、周或年的不同时间间隔做一些“时间旅行”:
**In:** print(d + timedelta(seconds=1)) # today + one second print(d + timedelta(minutes=1)) # today + one minute print(d + timedelta(hours=1)) # today + one hour print(d + timedelta(days=1)) # today + one day print(d + timedelta(weeks=1)) # today + one week print(d + timedelta(days=1)*365) # today + one year **Out:** 2019-12-22 13:18:28.386763
2019-12-22 13:19:27.386763
2019-12-22 14:18:27.386763
2019-12-23 13:18:27.386763
2019-12-29 13:18:27.386763
2020-12-21 13:18:27.386763
日期时间比较
日期之间的比较用通常的比较符号很简单:
**In:** print(d < (d2 +(timedelta(days=365*6)))) # d is no more than 6 years (assume each year has 365 days) after d2?
print(d > (d2 +(timedelta(weeks=52*6)))) # d is more than 6 years (assume each year has 52 weeks) after d2?
print(d != d2) # d2 is not the same date as d?
print(d == d2) # d2 is the same date as d?**Out:** True
False
True
False
时区设置
我们还可以比较不同时区的时间,比如多伦多和上海:
**In:** import pytz
timezone = pytz.timezone("America/Toronto")
dtz = timezone.localize(d)
print(dtz.tzinfo)
print(dtz)**Out:** America/Toronto
2019-12-22 13:18:27.386763-05:00**In:** shanghai_dt = dtz.astimezone(pytz.timezone("Asia/Shanghai"))
print(shanghai_dt)**Out:** 2019-12-23 02:18:27.386763+08:00**In: ** (dtz - shanghai_dt)/timedelta(days=1) # same datetimes**Out:** 0.0
如果您对不同时区的完整列表感兴趣。使用下面的代码将打印它们:
**In:** for tz in pytz.all_timezones:
print(tz)**Out:** Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa *(Only showing the first three as examples)*
Unix 时间戳/纪元时间计算
Unix 时间戳通常用于操作系统中的文件。通常它们也会出现在数据集中。
首先,我们可以获得当前的 Unix 时间戳:
**In:** from datetime import timezone dt_now = datetime.now(timezone.utc)
print(dt_now)
print(dt_now.tzinfo)
print(dt_now.timestamp()) # the unix timestamp.**Out:** 2019-12-22 18:21:28.681380+00:00
UTC
1577038888.68138
此外,我们可以将 Unix 时间戳转换为日期时间格式:
**In:** utc_timestamp = 1377050861.206272
unix_ts_dt = datetime.fromtimestamp(utc_timestamp, timezone.utc) print(unix_ts_dt)
print(unix_ts_dt.astimezone(pytz.timezone("America/Toronto")))
print(unix_ts_dt.astimezone(pytz.timezone("Asia/Shanghai")))**Out:** 2013-08-21 02:07:41.206272+00:00
2013-08-20 22:07:41.206272-04:00
2013-08-21 10:07:41.206272+08:00
更多数据科学相关文章来自 Lianne 和 Justin:
为企业 Windows 环境量身定制
towardsdatascience.com](/how-to-visualize-a-decision-tree-in-5-steps-19781b28ffe2) [## 根据模拟,30 岁退休需要多少钱
很多人年纪轻轻就有辞掉工作的梦想,活在世上没有经济上的牵挂。怎么…
towardsdatascience.com](/how-much-do-you-need-to-retire-at-age-30-based-on-simulation-424fa9e0922b) [## 买彩票的最佳时机是什么时候?
根据理性(或统计)分析
towardsdatascience.com](/when-is-the-best-time-to-buy-lottery-tickets-7735191b3c76)
如何操纵和可视化数据以进行比较分析 NBA 的关键时刻
使用 Python 和 Pandas 和 Plotly 对数据进行切片、分组和可视化,以获得新的见解(代码和数据在我的 GitLab repo 中)。

Jason Dent 在 Unsplash 上的原始照片
在这篇文章中,我演示了如何操作和可视化数据以获得比较性的洞察力。我从一个数据集开始分析,将对其进行分析以找到合适的分割,并找到与剩余数据进行比较的最佳子集。
实际上,这篇文章着眼于上个赛季的 NBA 数据,以了解接近,比赛后期的情况。有些人喜欢林格氏比尔·西蒙斯称之为“关键时刻”。
我们将使用数据来了解这些高风险时刻的更多信息。真正的关键时刻是什么时候?这期间的游戏玩法有什么不同吗?这里采用了什么样的策略?
和往常一样,本文的重点将是适用于您自己的领域和数据的数据分析,而不是特定于篮球的输出。
我们走吧。
在开始之前
数据和代码
我在我的 GitLab repo here (在 basketball_crunchtime 目录中)中包含了这方面的数据和代码,所以请随意下载并使用它/改进它。
包装
我假设您熟悉 python。即使你相对较新,这个教程也不应该太难。
你需要pandas和plotly。用一个简单的pip install [PACKAGE_NAME]安装每一个(在你的虚拟环境中)。
创建“关键时刻”数据
这里的假设很简单。在篮球运动中,有些情况会得到不同的对待,会得到球员和教练更多的努力和关注。让我们称之为“关键时刻”,看看数据是否显示出它与游戏其余部分之间的任何差异和模式。
我们的数据集包括 2018-19 赛季的详细数据。正如你可能想象的那样,在我可以过滤的数据中没有' crunch time '特性。但根据我们的直觉,关键时刻数据与剩余时间有限且分数差异较小的时期相关似乎是合理的。
首先,我们将研究这些数据,看看选择关键时间子集的合理标准是什么。
在熊猫中创建新栏
现有数据集不包括剩余时间或得分差异的要素,但它包括这些要素的基础数据。
在 Pandas 中创建新列有多种方法,但我更喜欢使用.assign方法,因为它返回一个全新的对象。这有助于避免操作错误对象的麻烦。
数据集特征包括period,共 4 分钟,以及每个时间段的elapsed时间(共 12 分钟)。period数据是整数,elapsed时间是字符串,所以我们想把它们转换成一致的时间单位。
Pandas有一个timedelta函数可以方便地将字符串转换为时间,而timedelta64函数numpy可以将时间转换为秒,所以将它们相加就可以得出游戏所用的总时间。
让我们也为当前得分差异创建一个新列:
shots_df = shots_df.assign(tot_time=(shots_df.period-1)*np.timedelta64(60*12, 's') + pd.to_timedelta(shots_df.elapsed, unit='s'))
shots_df = shots_df.assign(score_diff=abs(shots_df.home_score-shots_df.away_score))
以前max(shots_df.elapsed)给‘0:12:00',现在max(shots_df.tot_time)给Timedelta(‘0 days 00:48:00’)。(我暂时排除了超时)
过滤数据
这些新列现在可以用来过滤我们的数据集。我们将使用它们来生成一些潜在的关键时间子集进行比较。
首先,我想看看镜头的分布是否会改变。在之前的一篇文章中,我们把球场分成了不同的区域,就像这样:

每个镜头都有一个特征编码,记录它来自这 7 个区域中的哪一个。
拍摄位置的改变可能和精度的改变一样有意义。实际上,情况可能更是如此,因为数据可能没有射击精度那么“嘈杂”。
因此,让我们捕捉这些区域的拍摄分布是否发生了变化,将每个区域的拍摄精度/频率等统计数据添加到我们的数据帧中。
为了评估各种时间和分数阈值的效果,我构建了一个具有各种时间和分数阈值的嵌套循环,并使用 pandas 根据循环中的这些值过滤数据帧:
for time_thresh in [12, 10, 8, 6, 4, 2]:
for score_thresh in [2, 4, 6, 8, 10]:
filt_shots_df = shots_df[
(shots_df.tot_time > np.timedelta64(60*(48-time_thresh), 's'))
& (shots_df.score_diff <= score_thresh)
]
每个统计数据也是作为与整体数据相比较的相对值被捕获的,因为我们希望在关键时刻捕获游戏的变化。
如果你不确定如何使用?groupby methods with dataframes,这里是文档。
这给了我们一个可行的数据框架进行比较,我们已经准备好开始研究我们的数据集。
可视化“关键时刻”数据
健全性检查—样本大小
每当我处理数据的子集时,我都希望警惕引入随机错误,或无意识的偏差,这可能会导致我得出错误的结论。
在这里,让我们快速看一下分布情况,以了解每场比赛在每个分数差异范围内花费了多少。
我们的数据库包含整个 NBA 赛季大约 217,000 张照片。粗略估计,每分钟包含 4500 个镜头。将这些绘制成直方图:
import plotly.express as px
fig = px.histogram(shots_df, x='score_diff', nbins=40, histnorm='probability density', range_y=[0, 0.09])
fig.update_layout(
title_text='Score differences in an NBA game',
paper_bgcolor="white",
plot_bgcolor="white",
xaxis_title_text='Score difference', # xaxis label
yaxis_title_text='Probability', # yaxis label
bargap=0.2, # gap between bars of adjacent location coordinates
)
fig.show()

同样,在最后的 6 分钟里:

即使在最后 6 分钟,NBA 比赛也有约 4.5%的比分在 1 分以内,约 10%在 3 分以内。
在超过 215,000 张照片的基础上,获得这些子集似乎是合理的,但这是值得关注的事情,特别是当子集是基于时间和分数导出的。
识别关键时刻
我们有两个感兴趣的变量,剩余游戏时间(time_thresh)和得分差(score_thresh)。我们还有拍摄区域的变量(zone_name)。有三个变量要考虑,这对于气泡图来说是完美的,一个变量沿着 x 轴,另一个是颜色,第三个是支线剧情。
使用这段代码,我们创建了一个这样的气泡图:
fig = px.scatter(
summary_df, x='score_thresh', y='rel_shots_freq', color='time_thresh', size='filt_shots_freq',
facet_col='zone_name', hover_data=['filt_shots_taken'])
fig.show()

支线剧情/颜色系列可以像这样翻转,产生:
fig = px.scatter(
summary_df, x='time_thresh', y='rel_shots_freq', color='score_thresh', size='filt_shots_freq',
facet_col='zone_name', hover_data=['filt_shots_taken'])
fig.show()

这些图已经告诉我们很多。
他们告诉我们,在比赛后期,三分球投得比比赛其他时间多得多。这随着分数差距的增加而增加(即,团队冒更大的风险来追赶)。
现代分析指出,最好的投篮来自靠近篮筐和角落的 3s ,而这里的数据显示,这些投篮变得越来越难。据推测,这是由于防守投入了更多的努力,特别是在比赛的后期,当比分接近时(看看紫色的< 2 分比赛数据)。
仔细观察底部的情节也可以发现,在大多数次要情节中,大约在 8 分钟或 6 分钟处有一个拐点。这一点在第一个支线剧情(4 英尺以内)和第五个(短 3s)中表现得最为明显。
让我们来看看射击精度。它告诉我们一个相似的故事吗?

好像是这样的!随着得分差距的增加,在近距离投篮时,准确性往往会增加,而在远距离投篮时,准确性会降低。这可能是因为领先的球队对三分球保持警惕,以防止他们的对手迅速追上来,而落后的球队更经常从远距离射门。上图中显示的频率证实了这一点。
总的来说,这些支线剧情中的许多都表明在游戏还剩 6 分钟的时候发生了一些变化。这似乎是一个很好的门槛。
分数呢?当我们从越来越大的分数差距中观察数据时,虽然对数据的影响是渐进的,但我的观察是,分数在 2 分以内的情况下的数据点在大多数这些支线剧情中脱颖而出。(自己看看,如果你不同意,请告诉我。)
所以让我们采用关键时刻的定义,即剩余时间为 6 分钟或更少,得分在 2 分以内。
紧缩时间 vs 常规(平稳?)时间
既然我们已经为 crunch time 设置了参数,我们可以创建一个新列来区分这两个数据集。
shots_df = shots_df.assign(
crunchtime=(shots_df.tot_time > np.timedelta64(60*(48-6), 's'))
& (shots_df.score_diff <= 2))
crunch_df包含 3886 个镜头,没什么可轻视的。(但我们可能不希望变得更小。)
让我们基于这个属性来比较两个数据集。现在,只需围绕crunchtime变量的布尔值构建数据,即可轻松实现这一点:
for crunch_bool in [True, False]:
filt_shots_df = shots_df[shots_df.crunchtime == crunch_bool]
或全部:
结果很有意思。

虽然比赛很接近,但球队没有采取极端的策略(例如更多的三分球)。但是很明显,想要在 1 区、4 区和 5 区拍出理想的照片是很难的。或许我们应该看看相对于整体平均值的百分比:

很明显,防守队员的额外努力迫使球队在效率低的位置(2,3,6 和 7)投篮更多,而在好的位置(1,4 和 5)投篮更少。虽然这可能只是数据中的噪声,但下降来自已知的理想拍摄区域这一事实使我怀疑这一点。
看看拍摄的准确性,画面变得更加有趣。

在比赛的最后 6 分钟,当比分接近时,在越过三分线之前,投篮命中率会全面下降,从而变得更加准确长距离。这令人困惑,但是有一些潜在的解释。
一个是选择偏差,在团队中最优秀的球员这个时候得到这些镜头。另一个是与博弈论相关的,因为防守可能会在某种程度上鼓励球队采取这些相对较低比例的投篮(在正常情况下)。
尽管如此,研究这些数据的团队会说,进行长时间的三分可能是一个令人惊讶的高价值命题。
为了总结这一点,让我们使用拍摄图表来更详细地查看数据。

在三分线内的几乎所有地方,投篮都变得越来越不准确,三分角球变得明显更加困难,这可能是因为防守增加了压力。
虽然我们预计这些数据可能会有点嘈杂,因为只有 3886 张照片,而不是超过 210,000 张),但这里反映了全面的下降。
出于这个原因,我不会对方向差异做过多解读。给定小样本量,左/右的差异可能只是噪声,而不是趋势的反映。
总结
我个人发现,尽管现在找到大型数据集相对容易,但它们并不总是包含允许我轻松地对数据进行切片、进行比较或从中得出结论的功能。
相反,我经常不得不从现有的数据中创建新的特征,并使用我的直觉来评估创建数据子集的适当截止点。
为此,我希望上面的例子对你有用,也可能有趣。
请下载数据和代码,玩一玩,用你自己的数据集构建类似的东西。我很想听听你的经历或评论!
如果你喜欢这个,比如说👋/在 twitter 上关注,或关注更新。我还写了这些关于篮球数据的文章,可能对本文有帮助,如果你以前没看过的话。
[## 如何用 Python 可视化数据中的隐藏关系 NBA 助攻分析
使用交互式快照、气泡图和桑基图操纵和可视化数据,使用 Plotly(代码和数据…
towardsdatascience.com](/how-to-visualize-hidden-relationships-in-data-with-python-analysing-nba-assists-e480de59db50) [## 用 Plotly 实现交互式篮球数据可视化
用 hexbin shot 图表分析体育数据,用 Plotly 和 Plotly Express 分析气泡图(源代码&我自己的数据…
towardsdatascience.com](/interactive-basketball-data-visualizations-with-plotly-8c6916aaa59e)
如何掌握 Python 命令行参数
使用命令行参数创建自己的 Python 脚本的简单指南

照片由émile Perron在 Unsplash 上拍摄
我相信我们大多数人都运行过这个命令行来执行您的 python 脚本。
$ python main.py
我们能不能在这个脚本中定义我们自己的论点?答案肯定是肯定的!
$ python main.py arg1 arg2
我们将使用 Pythonarg parse模块来配置命令行参数和选项。argparse 模块使得编写用户友好的 命令行界面 变得容易。该程序定义了它需要什么参数,并且 argparse 将计算出如何解析来自 sys.argv 的参数。当用户给程序无效的参数时, argparse 模块也会自动生成帮助和用法消息,并发出错误。
Argparse 入门
正在安装 Argparse
像往常一样,我们需要做的第一件事是安装这个 Python 模块。
conda install argparse
定义位置参数和可选参数
用这个脚本的描述用ArgumentParser创建一个parser对象。Positional Arguments和Optional Arguments用add_argument函数定义。用help添加了对该参数所做工作的简要描述。
位置自变量是需要包含在适当的位置或顺序中的自变量。
可选参数是用关键字和等号输入的关键字 参数,可选。
- 让我们尝试使用 help 参数
-h运行这个脚本。
$ python employee.py -h
usage: employee.py [-h] [--address ADDRESS] name titleThis script is going to create an employee profile.positional arguments:
name Name of Employee
title Job Title of Employeeoptional arguments:
-h, --help show this help message and exit
--address ADDRESS Address of Employee
-h和--help在argparse中默认定义。它将显示我们在脚本中定义的描述,以帮助用户使用脚本。
- 我们试着输入
name和title。
$ python employee.py Alex Manager
Name : Alex
Job Title : Manager
Address : None
由于缺少地址参数,在这个脚本中,NoneType被传递给Address。为了打印它,我们必须把它转换成字符串。
- 让我们只用
name试试
$ python employee.py Alex
usage: employee.py [-h] [--address ADDRESS] name title
employee.py: error: the following arguments are required: title
因为 title 也是Positional Argument,所以在这个脚本中是需要的。
- 这次我们用
name、title和address试试。
$ python employee.py Alex Manager --address 123 Baker Street
usage: employee.py [-h] [--address ADDRESS] name title
employee.py: error: unrecognized arguments: Baker Street
因为123 Baker Street包含空格,所以脚本会将Baker Street视为其他参数。在这种情况下,我们需要双引号。
$ python employee.py Alex Manager --address "123 Baker Street"
Name : Alex
Job Title : Manager
Address : 123 Baker Street
name和title如果名称或标题不止一个单词,则需要双引号。
定义布尔参数
让我们将上述代码添加到现有的脚本中。我们将使用default=True定义一个可选参数。意思是即使我们从来没有在这个参数中输入任何东西,默认情况下也等于True。
这里使用type=strtobool来确保输入被转换成布尔数据类型。否则,当脚本在输入中传递时,它将是字符串数据类型。如果我们需要一个整数参数,我们也可以将其定义为type=int。
%(default)s)在帮助中是检索参数中的默认值。这是为了确保描述不是硬编码的,并且随着缺省值的变化是灵活的。
- 让我们用
name、title和address再试一次
$ python employee.py Alex Manager --address "123 Baker Street"
Name : Alex
Job Title : Manager
Address : 123 Baker Street
Alex is a full time employee.
默认情况下,isFullTime是True,所以如果我们不向isFullTime输入任何参数,Alex 就是全职员工。
- 让我们用一个
False输入试试。
$ python employee.py Alex Manager --address "123 Baker Street" --isFullTime False
Name : Alex
Job Title : Manager
Address : 123 Baker Street
Alex is not a full time employee.
行动。亚历克斯现在不是全职员工。
定义参数中的选择
我们还可以用choices参数限制输入参数的可能值。这有助于防止用户输入无效值。例如,我们可以使用这个choices=[“Singapore”, “United States”, “Malaysia”]将国家值限制为新加坡、美国和马来西亚。
- 让我们看看如果我们不在选项中输入国家值会发生什么。
$ python employee.py Alex Manager --country Japan
usage: employee.py [-h] [--address ADDRESS]
[--country {Singapore,United States,Malaysia}]
[--isFullTime ISFULLTIME]
name title
employee.py: error: argument --country: invalid choice: 'Japan' (choose from 'Singapore', 'United States', 'Malaysia')
我们将遇到一个无效选择的错误。这些选择在--help总是可用的。
现在你已经学会了如何创建带有自定义参数的 Python 命令行。希望这篇文章对你有用。如果我犯了任何错误或错别字,请给我留言。
可以在我的 Github 中查看完整的脚本。干杯!
如果你喜欢读这篇文章,你可能也会喜欢这些:
轻松在 Python 2 和 Python 3 环境之间切换
towardsdatascience.com](/manage-your-python-virtual-environment-with-conda-a0d2934d5195) [## 使用 Python 访问您站点上的 Google 搜索控制台数据
谷歌搜索控制台(以前的谷歌网站管理员工具)是由谷歌提供的网络服务,帮助您监控和…
towardsdatascience.com](/access-google-search-console-data-on-your-site-by-using-python-3c8c8079d6f8)
你可以在 Medium 上找到我其他作品的链接,关注我 这里 。感谢阅读!
如何用 Python 找到最佳匹配
给定个人偏好,如何最大化总偏好?
方案
恭喜你!你是由 8 名优秀员工组成的新团队领导。你想把他们分成 4 组,分别负责 4 个不同的项目。作为一名有经验的领导者,你知道员工在和他们喜欢的人一起工作时效率最高。所以你想出了一个员工评级系统。等级从 1 到 10,10 分意味着员工真的喜欢另一个员工,1 分意味着雇主根本不想和另一个员工一起工作。进行调查后,您会得到以下结果:

因为雇员不能给自己评分,所以对角线元素为零。好消息是你知道每个雇主有多喜欢其他人。坏消息是你不知道如何搭配它们,这样每个人都会对他们的队友感到满意!作为一个热衷于数据的人,你知道一定有某种方法可以用数据来解决这个问题。你是对的。
这个问题可以通过数学编程轻松解决。虽然机器学习在从数据中学习和做出预测方面很棒,但它在做出最佳决策方面有局限性。当你的问题涉及多种约束并允许多种可能的解决方案时,只有数学规划有能力找到最佳解决方案。
让我们来看看如何用数学编程来匹配你的员工!

迪伦·吉利斯在 Unsplash 上的照片
纸浆优化
如果您不熟悉 PuLP,它是一个 python 库,使您能够解决优化问题。你可以在这里找到关于这个图书馆的纪录片。我将使用这个方便的包来制定和解决我们的问题。
安装软件包并定义问题
!pip install pulpfrom pulp import *prob = LpProblem("Matching Employees", LpMaximize)
在LpProblem方法中,第一个参数是问题的名称,而第二个参数是你的目标(最大化或最小化)
因素
您需要匹配 8 名员工。NumPy 数组是简介中显示的 8 名员工的偏好矩阵。
变量
使用LpVariables创建变量y,这是一个决策变量,用于确定是否将员工 I 与员工 j 进行匹配

y = LpVariable.dicts("pair", [(i,j) for i in employees for j in employees] ,cat='Binary')
目标
最大化员工 I 和 j 之间的偏好得分

prob += lpSum([(c[i][j] + c[j][i]) * y[(i,j)] for i in employees for j in employees])
限制

for i in employees: prob += lpSum(y[(i,j)] for j in employees) <= 1 prob += lpSum(y[(j,i)] for j in employees) <= 1 prob += lpSum(y[(i,j)] + y[(j,i)] for j in employees) <= 1prob += lpSum(y[(i,j)] for i in employees for j in employees) == 4
解决问题
在定义了参数、变量、目标函数和约束条件之后,我们就可以用一行代码来解决问题了!
>>> prob.solve()
1
打印解决方案
print("Finish matching!\n")
for i in employees:
for j in employees:
if y[(i,j)].varValue == 1:
print('{} and {} with preference score {} and {}. Total score: {}'.format(names[i],names[j],c[i,j], c[j,i], c[i,j] +c[j,i]))

对结果的解释

在用这个结果匹配你的员工之前,我们先仔细看一下结果,看是否合理。请记住,目标是最大化一对中双方的偏好,而不仅仅是一个个体。
- 凯特将弗朗西斯科作为她的首选,弗朗西斯科也将凯特作为她的首选。所以他们绝对是很好的一对。
- 阿尔弗雷多把本作为他的首选。即使本不像弗朗西斯科那样喜欢阿尔弗雷多,但本仍然喜欢阿尔弗雷多(偏好得分为 7)。
- 乔治似乎不喜欢克里斯,但克里斯非常喜欢乔治。所以也许克里斯会让乔治更喜欢他,因为他们一起工作?
- 奥利维亚和 Thinh 之间的配对似乎不是奥利维亚想要的。她一点也不喜欢这件事!但是 Thinh 真的很喜欢 Olivia,所以也许他会热心帮助 Olivia;因此,这对整个团队都有好处?
你可以成为一个伟大的媒人
这个结果仍然有一些局限性:一些人没有把他们的队友作为他们的首选,甚至讨厌他们的队友。但总的来说,该算法很好地将它们分成对,以便最大化整个组的匹配分数。更好的是,您不需要处理做出最佳决策的难题,因为算法已经为您完成了!
这篇文章的笔记本可以在我的 Github 库中找到。如果你想知道如何将你的员工或朋友分组,我建议你创建一个偏好分数的小调查,并尝试这个算法。也许最大化偏好会创造一个高效的工作环境?
在Github repo中,您可以随意使用本文的代码。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
你创建了一个待办事项清单来提高效率,但最终却把时间浪费在了不重要的任务上。如果你能创造…
towardsdatascience.com](/maximize-your-productivity-with-python-6110004b45f7) [## 用 Python 选择要投资的股票
您计划在未来 3 年投资几只股票,每只股票的每一美元都有不同的预期回报…
towardsdatascience.com](/choose-stocks-to-invest-with-python-584892e3ad22) [## 用于机器学习的线性代数:求解线性方程组
代数是机器学习算法的底线机制
towardsdatascience.com](/linear-algebra-for-machine-learning-solve-a-system-of-linear-equations-3ec7e882e10f) [## 字典作为 If-Else 的替代
使用字典创建一个更清晰的 If-Else 函数代码
towardsdatascience.com](/dictionary-as-an-alternative-to-if-else-76fe57a1e4af) [## 当生活不给你喘息的机会,如何学习数据科学
我努力为数据科学贡献时间。但是发现新的策略使我能够提高我的学习速度和…
towardsdatascience.com](/how-to-learn-data-science-when-life-does-not-give-you-a-break-a26a6ea328fd)
如何用 R 来衡量股票投资组合的表现
利用印尼股市数据进行投资组合分析的案例研究

克里斯·利维拉尼在 Unsplash 上的照片
股票市场是人们安排买卖上市公司股票交易的地方
印尼被世界银行命名为东南亚最大的经济体。作为世界上人口最多的四个国家之一,有超过 2 亿人生活在这个国家,印度尼西亚有着成为世界上最大的经济体之一的议价能力。印度尼西亚经济状况的良好前景使这个国家成为投资的最佳选择之一。
印尼股市有 600 多家上市企业,在冠状病毒爆发前仍处于上升趋势。一些上市企业是国有企业,对于这个案例研究,我将只分析 17 家国有企业,它们是最新的 IDX-布朗 20 指数的成员。
用于分析的股票:
ANTM。JK,BBNI。JK BBRI。JK BBTN。JK,BJBR。JK BMRI。JK 艾尔莎。JK,JSMR。JK,KAEF。JK PGAS。JK PTBA。JK PTPP。JK SMGR。JK,TINS。JK,TLKM。JK,WIKA。JK,WSKT。女高中生
本案例研究的假设是:
- 股票在投资组合中的权重对每个企业都是一样的。
- 基于 2013 年 1 月 1 日至 2020 年 7 月 26 日的历史调整收盘价数据的分析。
- 无风险利率:4.5%
- 投资组合再平衡季刊
导入和准备股票数据
我们将使用 getSymbols() 函数从 quantmod 包中导入股票价格数据。 getSymbols() 函数是加载和管理来自各种来源的财务数据的特定函数,但是对于这个例子,我们将使用 Yahoo Finance 作为我们的数据源。
从 Yahoo Finance 导入股票价格数据
默认情况下,我们会将每个股票价格数据作为 xts 对象分配给它们的股票代码(例如:ANTM。JK 价格将存储在 ANTM。JK 变量作为 xts 对象)。为了便于分析,我们应该将所有这些独立的数据收集到一个 xts 对象中。
将单独的数据收集到单个 xts 对象中

图一。索引 xts 对象预览
投资组合分析
我们已经制作了一个投资组合,它作为单个 xts 对象存储在名为 Index 的变量中。我们存储在该变量中的数据仍然是每个交易日的收盘价格式,因为大多数投资组合分析方法需要通过回报数据来提供,我们必须在进入投资组合分析之前先计算其回报。

图二。回报计算公式
幸运的是,在 R 中我们不必每天手动计算每只股票的回报,我们只需要调用 return。calculate()函数,它将以 xts 对象格式返回输出。
因为没有人能预见未来,大多数股票市场投资者在决定买哪只股票之前依赖两件事,第一是基本面分析,第二是技术分析。基本面分析涉及到经济和金融数据的运用(如生产、消费、可支配收入等。)来预测未来的价格,而技术分析主要(通常是唯一)基于对价格数据本身模式的研究。本文将只涵盖一些可用的技术分析方法。
对于第一个分析,我们将尝试从年化回报的回报和风险的角度来看每只股票的表现,因为投资者有时希望看到他们的投资与其风险相比是否有良好的回报,而夏普比率是一个可以衡量这一切的伟大计算。较高的夏普比率意味着,与投资期间的风险相比,我们的投资回报丰厚。为了计算,我们假设印度尼西亚的无风险利率为每年 4.5%。
如何计算 R 中的年夏普比率

图三。投资组合中每只股票的夏普比率
年化是指我们每年重新计算一定时期的数字,例如 ANTM 回归。在 2013 年至 2020 年期间,JK 为-5.35%/年。我们的投资组合年化表现显示,不同股票之间存在差异。我们投资组合中表现最差的是 PGAS。JK 收益为负,期间波动太大,使得 PGAS。JK 夏普比率是其中最低的。我们投资组合中表现最好的是 BBRI。JK 显示最高的回报,最小的标准差和最高的夏普比率。

图 4。BBRI。JK 对 PGAS。JK 调整收盘价图表
如果我们比较我们投资组合中表现最好的股票和表现最差的股票的折线图,我们可以明显看出它们之间的差异。BBRI。JK 有更一致的运动,并且逐年稳步增加,与 PGAS 相反。JK 运动在波峰和波谷之间有一个巨大的跨度。
我们还可以使用 ggplot2 包中的标签图,大致了解我们的股票表现与无风险利率资产(4.5%年回报率)相比如何。

图五。股票表现与无风险利率资产
如果我们从大的方面来看,在此期间,10 家公司非常值得投资,这意味着如果我们投资这些股票,我们将比投资无风险资产获得更多。利用这个图,我们知道多样化在投资中是多么重要,我们的一些投资会有很高的回报,但其他投资正在失去它的价值。
现在,我们将开始将这些股票作为一个投资组合进行分析,如果我们从 2013 年到 2020 年 7 月以相同的比例持有所有这些股票,我们将看到其表现如何。
首先,我们将看看我们的投资组合日收益率分布。使用这个分布,我们将看到我们的投资组合给我们带来正回报的频率,以及它失去价值的频率。

图六。投资组合日收益分布
每日回报分布图显示我们的投资组合在某段时间平均正回报接近于零。它可以在一天内给出超过 10%的回报,但另一方面,它也可能在一天内损失超过 10%的价值。我们将使用时间序列每日回报图来证明这一点,并找出我们的投资组合何时损失如此之大,何时获得最高回报。

图七。时间序列每日回报图
从时间序列图中,我们可以明显地看到我们的大部分回报将在 5%的范围内,尽管有一些异常值,最近的一次是由于冠状病毒在 2020 年上半年的影响。
仅使用每日回报不足以显示我们的投资组合表现如何。幸运的是,有图表。R 中的 PerformanceSummary() 函数将产生投资组合累积回报、日回报和提款图作为其输出。
- **累积回报:显示我们从投资组合中获得多少回报的时间序列图。
- **每日回报:显示我们投资组合每日回报的时间序列图。
- **下降:时间序列图显示波峰和波谷之间的距离,以及需要多长时间才能恢复其值
***charts.PerformanceSummary**(Portfolio_Return, main = 'Portfolio Performance Summary')*

图八。投资组合表现摘要图表
业绩摘要图表总结了我们在分析我们的投资组合在此期间的业绩时需要的所有信息。从累积回报图来看,我们知道我们的投资组合在 7 月 26 日之前仍将有超过 100%的回报,尽管一些股票的负回报和冠状病毒效应在很大程度上扰乱了世界上所有的股票市场活动。从每日回报图中,我们将获得关于哪个时期我们的投资组合回报波动如此之大的信息,利用这些信息,我们可以深入了解某个时期的重大事件如何扰乱股票市场交易,并制定未来是否会有任何其他重大事件的计划。从跌势图、中,我们可以了解我们的投资组合在跌势中表现如何,以及它能恢复多久,这样我们就可以有一个适当的策略,如果未来跌势发生,我们如何持有股票。
摘要
技术分析是利用历史模式和市场统计数据来预测股票价格的变动。本文讨论了如何使用 R-计算来提取模式,并深入了解我们的投资组合在特定时期的运动和表现。
对于未来的投资,我们可以将分析结果作为我们将要采取的每一个行动的基础。例如,我们可以将这种分析划分为一个更小的时间段,并根据形状比率修改我们的投资组合构成。
还有一种方法可以根据历史数据找到我们投资组合的最佳权重。希望它能在其他文章中讨论。
注意:只要数据源中的数据可用,我们就可以为每只股票和每个时期重建本文中的每个代码。只是试着把它改成你的投资组合构成,看看你的投资组合在某个时期表现如何。
[1] Schwarger,Jack.D .,& Etzkorn,M. (2017),期货市场完全指南,第二版,John Wiley & Sons,Inc .,新泽西州霍博肯。**
如何衡量您组织的数据成熟度

数据到人工智能成熟度量表
今天,大多数组织都在努力提高数据的使用(见我们最近的文章为什么你的人工智能项目会失败)。好消息是,使用数据来提高团队的能力并为员工创造更多价值非常简单(不需要在技术上进行巨额投资,也不需要雇佣大量新技术人员)。第一步是认识到你今天在通往人工智能成熟的旅程中所处的位置——这正是数据到人工智能剧本中的第一个工具向你展示的。
让我们看看数据到人工智能成熟之旅的五个阶段。

第一阶段:手动数据处理
我们不断听到销售管理人员讲述他们对手工数据处理的失望。销售人员正在创建他们自己的电子表格跟踪器,以跟踪他们的客户在做什么,以及他们的佣金或奖金是如何根据销售业绩形成的——这是一个对他们特别重要的数据点。这些销售人员也在处理业绩数据,并与他们的现场销售经理分享。
现场经理提取数据并分析销售代表的表现。因为他们还需要创建整个现场团队的绩效图,所以他们必须运行不同的报告(现场销售团队无权访问这些报告),汇总信息,然后创建 PowerPoint 演示文稿以“向上”发送给他们的区域经理。
区域经理也在做同样的事情。他们查看各个地区的表现,手动创建整个地区的数据和可视化摘要,然后发送给国家领导人。依此类推……在组织中一路向上。每个级别查看他们自己的表现(出于个人原因),然后创建一个文档来“向上”传递。
由于每个人都在创建一个独特的文档,这种手动方法缺乏一致性,导致大量时间浪费在探究具体数字是如何得出的以及验证准确性上,而不是理解数据想要告诉我们什么。

第二阶段:仪表盘死亡
数据共享挑战通常通过向链中的每个个体发送更多数据来解决。BI(商业智能)是企业中最常被误用的工具之一。难怪员工生产力的死亡呼喊是…
“如果我们可以将它加载到 BI 工具中,团队可以根据需要对其进行操作和深入研究,那么每个人都将获得相同的信息!”
不幸的是,现在组织中的每个人都需要成为分析师,才能了解他们的世界正在发生什么。这通常会鼓励影子 IT 和数据团队的创建(本地团队成员创建工具来回答他们团队在整体数据和 IT 责任链之外的许多特定问题)。
然后是神奇的“仪表板”。最初的设想是提供一个关于组织中正在发生的事情的简化视图(想想你汽车上的仪表板,上面有不到五个数据点),仪表板迅速成为每一个可能项目的垃圾场,通常类似于航天飞机的驾驶舱,有数百个刻度盘、读数和闪烁的灯。我们见过用户导航的网站仪表板,或者创建 100 多页的幻灯片,以涵盖讨论中的每一个可以想到的问题和场景。再一次,大量的时间被浪费在创建和浏览这些工具以试图找到答案上。
手动数据处理和神奇的仪表盘都掩盖了这个成熟阶段的一个核心问题:多个不一致的真相来源。相同的答案存在于不同的系统中,组织的每个部分在不同的地方寻找答案。当数据被处理时,数据的副本被分散开来,报告作者通常会抓住最容易访问的内容,因为通常只有关键的个人知道在哪里以及如何获得事实的来源。
这就把我们带回了关于报告中的数据来自哪里的争论,因为用于生成答案的业务逻辑并不明显。

第三阶段:数据讲述故事
随着组织的数字化发展,数据开始向他们的团队讲述故事。这通常始于工作重点是了解不同角色的员工成功完成工作实际需要哪些信息。这种关注简化了数据讨论,并使业务和 IT 合作为这些员工服务。
关注员工角色级别还揭示了回答最有价值的问题(我们的销售业绩如何,为什么?)需要查看和组合来自整个组织当前使用的多个系统的数据。为了防止这种情况给团队带来更多的信息过载,必须将汇总的数据分解为回答手头问题所特别需要的内容。
这种简化的、以角色为中心的方法允许将数据转化为员工的简略答案,在一个屏幕上提供他们需要的一切,以了解正在发生的事情并相应地做出更好的决策。此外,他们没有浪费时间点击无数的报告、工具和仪表板来显示所需的数据,并手动将其混合在一起。
成功实现以角色为中心的数据需要 IT 和业务部门密切合作,以了解角色的需求,并在正确的时间提供正确的答案。例如,了解各种角色的交集(即销售人员和现场销售经理)并确保有工具支持这些交互非常重要。这些工作直接影响数据在链上和链下的一致性,并确保交互的人面前有相同的信息,而不管每个角色的特定工具。

第四阶段:智能出现
随着来自数据的智能开始出现,组织开始看到真正的业务成果。随着员工学习工具,提高对数据的理解,变得更加舒适,创造价值的速度开始加快。随着您在设置警报和例外方面变得越来越老练,员工应该会感觉到主动信息提供了更多支持。然而,即使你的数据提供了更多的相关信息,好的跨职能开发团队仍然是至关重要的。
在这个成熟度级别,个性化的客户体验可以成为现实。您的数据已经足够成熟,可以更好地识别个人需求,并为您的员工提供必要的工具来提高客户服务水平。这并不意味着建立更多的呼叫中心规则和程序;这只是意味着您可以更密切地衡量独特的客户,员工也可以做出相应的反应。
与直觉相反,您的团队可能开始与客户和供应商员工共享更多数据,因为您的信息现在更加可靠。根据我们的经验,您组织中从未与客户交谈过的人将开始这样做,并且自然希望分享有价值的相关信息。
如果您确实发现您的员工正在共享更多的信息,请确保您的数据治理流程正在高效地工作。例如,拥有与客户和供应商共享数据的可行指南。这包括共享哪些数据、易于理解的限制以及如何共享数据的流程。
在这一阶段,仅限于少数关键用户的限制性传统数据访问(在第 2 阶段中描述)应该会消失,员工应该普遍对根据需要访问数据感到满意。员工可以自由地在数据范围内进行调查,从而得出新颖的解决方案。
最后,随着数据成熟度的提高,改进的业务成果应该更加有形和可衡量。虽然你可能刚刚开始机器学习和其他人工智能应用,但你的员工应该已经从你的数据中获得了重大价值。你的组织积累的价值应该很高——足以暂停你的机器学习工作,并简单地收获所有团队辛勤工作的好处。

第五阶段:组织转型
不管你在网上看什么,现阶段运营的机构很少。无论现在这个阶段有多么令人向往,它仍然是大多数企业的目标阶段。在这个阶段,机器学习是成熟的,你的数据是干净的,你的团队拥有广泛的数据科学技能。
您的员工使用数据代表彼此和客户开展工作。他们较少受到限制性规则和审批层级的约束,更有能力使用数据来“做正确的事情”。总的来说,组织的运作结构更加扁平化,治理的跨职能性比部门领导更强。
机器学习正在自动化低价值的重复性工作,员工能够专注于高价值的活动,特别是异常处理。他们使用算法对竞争性定价、服务、产品盈利能力、预测等进行更深入的分析。事实上,你对市场的新数据驱动观点正在改变游戏规则。
我们认为,这一阶段最困难的管理问题是使用算法来创建可能影响员工角色的新商业模式的压力。虽然这会威胁到员工,但改变从来都不容易。团队可能是多余的,不仅仅是因为被淘汰的低价值工作,而是因为你如何定价、开发产品以及如何与彼此、供应商和客户互动的变化。这些算法如何支持你的团队,并使他们能够接受新的挑战,这将是成功的关键,而不仅仅是将人们自动化出今天的流程。
下一步是什么?
确定您的组织在数据到人工智能成熟度曲线中的位置对于创建一个推动数据使用的计划至关重要。一旦你知道你的立场,你就可以采取行动。我们的数据到人工智能行动手册的下一步将涵盖在成熟阶段之间前进所需的内容,并保持您的数据成熟之旅向前发展。

亚历克斯·布拉顿和凯文·格林
关于作者:
亚历克斯·布拉顿作为 Lextech 的首席执行官兼首席极客,亚历克斯领导着一个创造员工体验的团队,为员工赋权并实现业务成果。他热衷于改善工作的未来,帮助组织从固定的工作场所过渡到任何地方工作。Alex 是《十亿美元应用》的作者,也是北伊利诺伊大学计算机科学的兼职教授。
lextech.com
凯文格林凯文是一名 3x 首席信息官,领导人工智能的早期工作,为数据团队带来新的工具和流程。凯文被评为 2019 年芝加哥首席信息官年度创新者。他是西北大学微软 IT 项目顾问委员会的主席。
laminargroup.com
如何合并与熊猫“不匹配”的时间序列
如何使用 merge_asof 函数

时间序列数据有许多定义,所有这些定义都以不同的方式表示相同的含义。一个直截了当的定义是,时间序列数据包括附加到连续时间戳的数据点。
Pandas 由 Wes Mckinney 创建,旨在提供一个高效灵活的工具来处理时间至关重要的财务数据。因此,Pandas 是处理时间序列数据的一个非常好的选择。
金融数据通常包括在非常短的时间内(例如在秒级)进行的测量。因此,当我们合并两个由时间序列数据组成的数据帧时,我们可能会遇到测量值相差一两秒的情况。对于这种情况,熊猫提供了一种由 merge_asof 完成的“智能”合并方式。
假设我们正在合并数据帧 A 和 B。如果左侧数据帧(A)中的一行在右侧数据帧(B)中没有匹配的行, merge_asof 允许获取其值接近左侧数据帧(A)中值的一行。
左和右是根据函数中参数的顺序定义的。pd.merge_asof (A,B,…)表示 A 是左边的那个。
“亲近”是有一些限制的。根据“on”参数指定的列进行比较,右数据帧(B)中的值必须小于左数据帧(A)中的值。简单解释一下,merge_asof 的意思是:
没有匹配的,取前面的。
当我们看一些例子时,它会更有意义。
样本 A 和 B 数据帧如下:

我们想按“名称”列合并“时间”上的这些数据帧,但一些时间值不匹配。例如,在第二行中,A 中的时间比 b 中的时间晚一秒,假设我们可以容忍 2 秒的延迟。
在这种情况下,可以使用 merge_asof :

- 第一行:时间匹配,因此根据行索引取值。
- 第二行:左侧数据帧(A)上的时间为 00:00:03,但右侧数据帧(B)此时没有值。因此,merge_asof 会查看前面的步骤,如果在指定的时间间隔(2 秒)内有一个值,它会将最后一个值放入合并的数据帧中。在时间 00:00:00 只有一个先前值,它落后 3 秒,因此不在指定的时间内。因此,values_b 列这次用 NaN 填充。
- 第三行:左侧数据帧(A)上的时间是 00:00:06。右数据帧(B)在这一秒没有值,但它在 00:00:04 有一个值,该值在指定的内部时间内,因此 merge_asof 获取该值并放入合并的数据帧中。
- 第四行:这一行很重要,所以请密切注意。左侧数据帧(A)上的时间是 00:00:09。右侧数据帧(B)此时没有值,但在指定时间间隔内的 00:00:08 时有值。但是,“名称”列也必须匹配,因为我们是按“名称”列合并的。由于名称不同,merge_asof 不接受该值,因此 values_b 列用 NaN 填充该行。
- 第 5 行:两个数据帧都有时间值 00:00:12,并命名为 FFF。
如果我们不指定时间间隔,merge_asof 将查找前一个时间间隔,而不考虑时差。

当时间间隔为 2 秒时,values_b 为 NaN。如果没有指定的时间间隔,则用之前的值 5 填充。
Merge_asof 还提供了一个排除精确匹配的选项。如果 allow_exact_matches 设置为 False,merge_asof 仅在右侧数据帧中查找以前的值,匹配行中的值不会放入合并的数据帧中:

测量时间的方法是无限的,因为我们可以精确到纳秒。根据不同的任务,我们可以选择最佳的测量频率。Merge_asof 允许我们在匹配时间序列或者有序数据时有一定的余地。
感谢阅读。如果您有任何反馈,请告诉我。
如何不挖而挖金子
卡尔曼滤波器
估计黄金暴露量的随机模型和统计方法

迪翁·比森在 Unsplash 上拍摄的照片
黄金通常被视为避险资产或对冲市场动荡、货币贬值和其他经济或政治事件的工具。例如,在信贷危机期间,道琼斯和标准普尔 500 指数下跌了约 20%,而黄金价格从每金衡盎司 850 美元上涨到 1100 美元。然后今年,S&P500 经历了急剧下降,最近才回到 COVID 之前的水平。与此同时,黄金 ETF (GLD)自 2020 年 2 月以来上涨了 25%以上。

在 2020 年 2 月 18 日至 2020 年 8 月 17 日(6 个月)期间,S&P500 ETF(绿色间谍)经历了大幅下跌,然后才回到 covid 之前的水平。与此同时,黄金 ETF(蓝色 GLD)涨幅超过 25%。
为了获得黄金投资,有许多相关产品,包括黄金交易所交易基金(ETF)、杠杆交易所交易基金(LETFs)、黄金期货和黄金矿业股票。
然而,黄金价格并不存在于真空中。黄金必须被开采,而从事这一开采过程的公司本身就是上市公司。这为投资者提供了另一种投资黄金的途径,同时允许他们通过标准的股票研究技术来决定投资决策。
除了现货黄金,还有许多单名金矿股票和(L)ETF 可供交易。尽管普通股票类 ETF 是目前市值最大的 ETF,但黄金矿业 ETF 是市场上最受欢迎的短期交易工具之一。另一方面,在 AUM 的排名中,没有一只黄金矿商 ETF 进入前 20 名,这表明最近对黄金和黄金矿商股票的主要兴趣在很大程度上是由寻求类似黄金风险的投机交易者驱动的。因此,了解黄金矿商 ETF 回报的潜在因素动态对于分析流行的交易策略(如 pairs trading)非常有用。
黄金矿商股票是实物黄金的杠杆投资。
标准股票市场研究已经建立了几个经验法则来理解投资金矿和黄金本身的区别。尽管从长期来看,金价和矿商股价之间存在明显的相关性,但价格差异并不罕见。例如,金矿公司的短期业绩对市场贴现率和未来股息支付非常敏感,这是由一般股票市场决定的。此外,在单个公司层面,管理层可以通过高超的投资技能、矿山的开矿和关闭、成本削减或市场时机选择对股本回报产生重大影响。然而,从长远来看,淘金者赚钱的唯一途径是从地下挖出黄金,然后在公开市场上出售。
因此,在我们最近的论文中,我们提出了一个模型来描述黄金和矿业股票之间的联系。这是一个易处理的结构模型,通过一个组合的最优控制和停止问题的 T2,直接将黄金价格与黄金矿商权益的价值联系起来。这种实物期权模型要求黄金矿商设定一个内部生产函数,当黄金价格下跌超过一定水平时,清算公司资产。特别是,我们的模型表明,实物黄金的动态投资组合将与黄金开采者的实际投资组合表现相同。
我们的模型给出了企业资产价值、企业权益价值的显式解析表达式,并精确地识别了影响企业杠杆的参数。事实上,我们检查了我们的实物期权模型的预测,发现黄金矿业公司的杠杆的一个重要部分可以在实物期权框架内解释!
此外,我们使用我们的结构模型的见解开发了一种方法来复制黄金矿业股票,仅使用实物黄金和市场股票组合,这可以解释黄金矿业股票回报约 70%的变化。我们的主要经验表明,金矿股票有类似看涨期权的回报,这导致相对于实物黄金的更高的 隐含杠杆和负 alpha 。

Barrick Gold (ABX)、Gold Corp (GG)、Gold Miners ETF (GDX)、Junior Gold Miners ETF (GDXJ)的模型隐含黄金杠杆(原始)与隐含黄金杠杆的卡尔曼滤波时间序列(红色)和简单移动平均线(绿色)的曲线图。
在本文中,我们解释了如下所示的卡尔曼滤波过程:

参考
K.郭,T. Leung,B. Ward,如何在不挖矿的情况下开采黄金,国际金融工程杂志,2019 年第 6 卷第 1 期[ PDF
如何用 R 建模一个社交网络
网络理论实用介绍

由 Unsplash 上的 Clarisse Croset 拍摄的照片
使用网络来表示我们的数据给了我们一个视角,通过这个视角,问题往往变得更容易解决。当我们有兴趣了解更多关于连接对象之间的交互时,网络特别有用。一些典型的用例包括通信渠道的分析,流行病传播的建模,或者一群人内部的社会互动的研究。
在本文中,我们将看看我们通常如何表示网络数据。
什么是网络?

资料来源:剑桥大学,通信原理课程材料(2010-11),网络理论介绍,幻灯片 2
图形是抽象的数学结构。当我们将现实世界的场景映射到这个结构上时,我们称之为网络。您可能会听到“图形”和“网络”这两个词可以互换使用。
这是一个用来展示人与人之间长期互动的网络示例:
在建立网络模型时,我们会考虑三个主要因素:
- 节点
- 链接
- 以及它们的属性
节点
节点是网络中的点(在图论中也称为顶点)。它们代表了我们想要建模的实体。让我们以一个社交网络为例,其中每个节点模拟一个人。

样本社交网络中的节点
链接
链接是连接节点的线(在图论中称为边)。它们代表了我们想要在网络中的实体(节点)之间建模的连接。我们可以画出链接来显示在这个网络上谁是谁的朋友。

示例社交网络(节点+链接)
属性
属性给了我们更多关于网络的信息。在我们的社交网络中,节点属性描述了系统中的个体,包括年龄、姓名、性别等细节。
链接属性描述了两个人之间的联系。例如,它可以显示关联的强度,或者表明人与人之间的关系类型。
我们可以用不同的颜色或尺寸在网络上显示这些属性。

带有属性的示例社交网络。在这个例子中,链接的大小表示个体之间关联的强度。
我们如何代表一个网络?
既然我们已经介绍了网络的基础知识,那么让我们来看看几种常见的表示网络数据的方法。
邻接矩阵
邻接矩阵是二维正方形阵列,其中行和列由图中的节点索引。矩阵的元素不是零就是一…
简单地说,邻接矩阵是一种在表格中表示网络的方式。我们的社交网络中的每个人(节点)都在表格的一行和一列中表示。我们对行和列保持相同的顺序。例如,如果我们的第一行是“卡内拉,那么我们的第一列也将是“卡内拉”。

示例(空)邻接矩阵-由节点名称索引的列和行
表中的条目显示两个节点之间是否存在链路:
- 行 Ghassan 中的 1 ,列 Canela 表示这两者之间有联系。
- 0 表示两个节点之间没有链接。

让我们假设我们想要指出人们相互交往的频率。我们可以将此视为链接属性(它告诉我们关于两个节点之间的连接的一些信息)。在网络上,我们可以用链接的相对粗细来表示这一点,其中较粗的链接意味着更频繁的交互。
我们可以通过在网络中使用除 1 以外的数字在邻接矩阵中显示这一点。在我们的例子中,数字越大,那对人之间的互动越有规律。当表中的值不是二进制(不是 1 或 0)时,我们说我们的矩阵是“加权的”。

加权链接-网络的邻接矩阵表示,上面呈现了链接属性。注意重量为 2 的连杆被画得更粗。
邻接矩阵是一个受欢迎的选择,因为它使大型图形易于分析。举以下例子:

悲惨世界人物网络
在这种情况下,我们可以对网络的邻接矩阵进行简单的计算,以快速识别网络的属性。
然而,在 IDE 中创建这些网络时,更常见的选择是用两个单独的表来表示网络。
单独的表格
在创建要显示的网络结构时,我们通常使用两个表的格式——一个用于节点,另一个用于边。

两个独立的表用于描述一个网络。链接表和节点表。
节点表:
- 包含网络中所有唯一节点的列表
- 第一列通常是每个节点的唯一标识符
- 我们可以为节点属性添加其他列

节点表,带有性别属性(男性/女性)
链接表:
- 包含网络中所有链路的列表
- 一列显示每个链接从哪个节点开始
- 一列指示链接在哪个节点结束
- 我们可以为链接属性添加其他列

具有“链接类型”属性的链接表
现在我们已经介绍了基础知识,让我们看看如何在 r 中创建一个网络。
用 R 创建一个网络
我们将尝试复制上面创建的示例。我们的目标是创建一个由九个人组成的小型社交网络,他们随机连接在一起。对于本例,我们将采用使用两个单独的表来创建网络的方法。在添加属性时,两个表为我们提供了更大的灵活性。在我们开始之前,让我们将任务分解成一步一步的组成部分。
- 加载所需的库。
- 创建一个随机节点列表。我们将使用该名称作为每个节点的唯一 id。
- 创建一个链接表。我们将从节点列表中随机选择每个链接的起点和终点。
- 绘制我们的网络。
- 向图中添加属性。
加载库
在开始之前,我们需要加载所需的库。这些功能使我们能够创建自己的网络。在我们的例子中,我们将使用以下内容:
- tidy verse:这是一个用来操作和绘制数据的包的集合——R 开发者工具包中的一个标准。
- ggraph :我们将要用来绘制我们的网络的库。
- tidy graph:用于创建一个“表格图形”对象,一种我们可以很容易转换成网络的格式
- 婴儿名字 :库包含了 SSA 提供的 1980 年到 2017 年间的婴儿名字列表。我们将使用它来为网络中的节点选择随机名称。
library(tidyverse)
library(ggraph)
library(tidygraph)
library(babynames)
创建节点表
我们想从我们放入环境的婴儿名字数据中得到 9 个随机的名字。我们首先看一下数据的结构,如下所示:
head(babynames)
这将返回婴儿姓名表的前 6 行。我们利用这一点来了解数据的结构:

这里我们可以看到,我们有一个名字、性别和一些其他变量的列表,这些变量可能不会直接应用到我们的用例中。这种结构表明,名称每年重复出现,并且 prop ( proportion)和 n (number) 的值不同。
我们想确保我们随机抽取的名字是唯一的。快速检查显示,婴儿姓名表中有 1,924,665 行。虽然两次抽中同一个名字的几率很低,但还是有可能的。这告诉我们,我们的解决方案将需要包括一些东西,以确保我们在最后的抽签中没有重复。
要获得一个唯一的随机名称列表,最好是编写一个小函数,我们可以重用它来生成一个大小为 n 的节点列表(我们将来可能想要绘制一个更大的网络)。
下面是我们可以采取的步骤的概要:
- 过滤表格以删除任何重复的名称
- 从 1 到我们过滤后的表中的行数之间随机选择一个 n 的数字样本(没有替换——意味着一旦一个数字被抽取,就不能再被抽取)
- 从过滤后的表中,取出由我们选择的随机数索引的行
- 返回这些行—这将是我们的节点表
下面是我们如何在 R 中实现这一点:
get_random_names <- function(n) {
unique_babynames <- distinct(babynames, name, .keep_all = TRUE)
index <- sample(1:nrow(unique_babynames), n, replace = FALSE)
names <- unique_babynames[index, ]
names
}nodes <- get_random_names(9)
创建链接表
为了创建链接表,我们将首先分别考虑源列和目标列。从 source 列开始,我们得到一个从 1 到 9 的随机数字样本(因为只有 9 个节点)。这一次,我们用替换的对进行采样,因为每个节点可以连接多个链接。我们对目标列重复相同的过程。在 R 中:
source <- sample(1:nrow(nodes), nrow(nodes)*2, replace = TRUE)
target <- sample(1:nrow(nodes), nrow(nodes)*2, replace = TRUE)
这给了我们一对列表,如下所示:

随机生成的源向量和目标向量
然后,我们将这两个列表粘在一起,得到我们的链接表(或数据框):
links <- data.frame(src, target)
看起来是这样的:

一旦我们有了这张桌子,就该稍微清理一下了。在绘制我们的网络之前,我们需要考虑几个案例。
- 将节点连接到自身的链接——这在某些用例中有意义,但在我们的社交网络中没有意义。这里,我们可以通过过滤掉链接表中源值和目标值不匹配的行来实现。
- 重复链接—我们不希望在相同的两个节点之间绘制两次链接,因为如果我们决定将链接属性添加到我们的图形中,这可能会导致一些麻烦。在它继续绘制我们的网络之前,我们可以很容易地解决这个问题。

links <- data.frame(src, target) %>%
filter(!(src == target)) links <- unique(links[c("src", "target")])
关于我们应该画多少个链接,这将取决于你希望你的网络的连接程度。在本例中,我们在删除冗余链接之前,任意创建两倍于节点数量的链接。
用图形绘制网络
准备好节点和链路表后,我们就可以开始绘制网络了。在将表传递给创建列表的函数之前,我们还需要完成最后一步。
在我们将这些表格传递给绘图函数之前,我们只需要确保它们的格式正确,以便 ggraph 包进行解释。这里,我们将独立的表转换成一个名为 tbl_graph 的对象。
social_net_tbls <- tbl_graph(nodes = nodes,
edges = links,
directed = FALSE)
现在,我们准备开始绘图。ggraph 包遵循与其他流行绘图包相同的图形语法原则。基本的想法是,我们建立我们的图形层。 这篇文章 很好地解释了这个概念。在我们的示例中,我们按照以下顺序对网络进行分层:
- 我们从数据开始(我们刚刚创建的 tbl_graph 对象)
- 选择我们图表的布局
- 指定属性——被称为美学映射的一部分
- 添加节点,名称为文本,然后链接层-称为几何
- 修改主题(改变背景颜色)
在 R 中:
social_net <- ggraph(social_net_tbls, layout = "stress") +
geom_node_point(size = 2) +
geom_node_text(aes(label = name), nudge_y = 0.05, nudge_x = 0.2)+
geom_edge_link() +
theme_void()
将所有这些整合在一起:
奖金👀
干得好,文章写到这里。关于这个话题,我还有一件事要分享。

虽然 ggraph 在渲染网络时提供了简单性和灵活性,但在视觉美学方面,还有另一个包值得一提— networkD3 。networkd 3 包将一些 Java Script D3 的功能扩展到 R 程序员。我们可以使用与上图相同的链接和节点表来生成这个网络。

网络 3 的几个优点是:
- 它是交互式的——你可以放大和缩小,拖动节点,在悬停时添加显示/隐藏选项,等等
- 与图形网络相比,它们开箱后看起来更好
主要的缺点是不容易定制。为了充分利用 networkD3 的定制选项,需要精通 JS。
有用的链接
- 你可以在 github 这里 查看完整的项目。
- 这篇文章包含了一个动画网络的例子,它是用 ggraph 和 ganimate 包创建的。
新冠肺炎会压垮我们的医疗系统吗?
towardsdatascience.com](/will-covid-19-overwhelm-our-healthcare-systems-f5bc49bc77a2)
- Github 回购。对于简单的动画图形这里的。
参考
- 剑桥大学。(2010–11).网络理论导论。【在线】。可用:https://www . cl . cam . AC . uk/teaching/1011/princcom/slides/graph _ theory _ 1-11 . pdf
- 麻省理工学院。乌勒、布雷斯勒。数据科学和大数据分析:做出数据驱动的决策:网络和图形模型;代表一个网络。访问时间:2020 年 6 月 21 日。【在线】。
如何通过 SARIMA 模型对时间序列建模
季节性时间序列建模教程。

来自 Pixabay 的openclipbart-Vectors
在本教程中,我将向你展示如何通过 SARIMA 模型对季节性时间序列进行建模。
在这里你可以下载本教程中描述的代码的 Jupyter 笔记本。
入门指南
将数据集转换为时间序列
在这个例子中,我们将使用到达意大利的游客数量。数据摘自欧洲统计:旅游业年度数据。首先,我们导入与 2012 年至 2019 年 10 月抵达意大利的外国游客相关的数据集,然后将其转换为时间序列。
为了执行到时间序列的转换,需要两个步骤:
- 包含日期的列必须转换为 datetime。这可以通过函数
to_datetime()来完成,该函数将字符串转换成日期时间。 - 将 dataframe 的索引设置为包含日期的列。这可以通过应用于数据帧的函数
set_index()来完成。
import pandas as pddf = pd.read_csv('../sources/IT_tourists_arrivals.csv')
df['date'] = pd.to_datetime(df['date'])
df = df[df['date'] > '2012-01-01']
df.set_index('date', inplace=True)

通过describe()函数,我们可以得到一些与时间序列相关的有用的统计数据。
df.describe()

初步分析
绘制时间序列以检查季节性
初步分析包括对时间序列的直观分析,以了解其总体趋势和行为。首先,我们创建时间序列,并将其存储在变量ts中。
ts = df['value']
然后,我们绘制出ts趋势。我们使用 Python 提供的matplotlib库。
import matplotlib.pylab as plt
plt.plot(ts)
plt.ylabel('Total Number of Tourists Arrivals')
plt.grid()
plt.tight_layout()
plt.savefig('plots/IT_tourists_arrivals.png')
plt.show()

计算模型的参数
调整模型
我们建立了一个 SARIMA 模型来表示时间序列。SARIMA 是季节性自回归综合移动平均线的缩写。它由 AR 和 MA 两个模型组成。该模型由三个参数定义:
- d =所涉及的一阶差分的程度
- p = AR 部分的顺序
- q =移动平均部分的阶数。
p 的值可以通过 ACF 图来确定,ACF 图显示了测量观察值与其前一个观察值之间关系的自相关。d 的值是积分的阶数,可以计算为使时间序列稳定所需的变换次数。q 值可以通过 PACF 图来确定。
为了确定d的值,我们可以执行 Dickey-Fuller 测试,该测试能够验证时间序列是否平稳。我们可以使用包含在statsmodels库中的adfuller类。我们定义一个名为test_stationarity()的函数,如果时间序列为正,则返回 True,否则返回 False。
from statsmodels.tsa.stattools import adfullerdef test_stationarity(timeseries):
dftest = adfuller(timeseries, autolag='AIC')
dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
for key,value in dftest[4].items():
dfoutput['Critical Value (%s)'%key] = value
critical_value = dftest[4]['5%']
test_statistic = dftest[0]
alpha = 1e-3
pvalue = dftest[1]
if pvalue < alpha and test_statistic < critical_value: # null hypothesis: x is non stationary
print("X is stationary")
return True
else:
print("X is not stationary")
return False
当时间序列变得稳定时,我们通过diff()函数对时间序列进行多次变换。
ts_diff = pd.Series(ts)
d = 0
while test_stationarity(ts_diff) is False:
ts_diff = ts_diff.diff().dropna()
d = d + 1
为了计算 p 和 q 的值,我们可以分别画出 ACF 和 PACF 图。我们可以使用statsmodels库中的plot_acf()和plot_pacf()函数。p 值对应于 ACF 图中置信区间之外的最大值(以浅蓝色显示)。在我们的例子中,正确的 p = 9。
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(ts_trend, lags =12)
plt.savefig('plots/acf.png')
plt.show()

类似地,q 的值对应于置信区间之外的 PACF 图中的最大值(显示为浅蓝色)。在我们的例子中,q 的正确值= 1。
plot_pacf(ts_trend, lags =12)
plt.savefig('plots/pacf.png')
plt.show()

建立萨里玛模型
如何训练萨里玛模型
现在我们已经准备好构建 SARIMA 模型了。我们可以使用statsmodels库提供的SARIMAX类。我们拟合模型,通过get_prediction()函数得到预测。我们还可以通过conf_int()函数检索置信区间。
from statsmodels.tsa.statespace.sarimax import SARIMAXp = 9
q = 1
model = SARIMAX(ts, order=(p,d,q))
model_fit = model.fit(disp=1,solver='powell')
fcast = model_fit.get_prediction(start=1, end=len(ts))
ts_p = fcast.predicted_mean
ts_ci = fcast.conf_int()
我们绘制结果。
plt.plot(ts_p,label='prediction')
plt.plot(ts,color='red',label='actual')
plt.fill_between(ts_ci.index[1:],
ts_ci.iloc[1:, 0],
ts_ci.iloc[1:, 1], color='k', alpha=.2)plt.ylabel('Total Number of Tourists Arrivals')
plt.legend()
plt.tight_layout()
plt.grid()
plt.savefig('plots/IT_trend_prediction.png')
plt.show()

计算一些统计数据
检查模型的性能
最后,我们可以计算一些统计数据来评估模型的性能。我们通过scipy库提供的pearsonr()函数计算皮尔逊系数。
from scipy import stats
stats.pearsonr(ts_trend_p[1:], ts[1:])
我们还计算了 R 平方度量。
residuals = ts - ts_trend_p
ss_res = np.sum(residuals**2)
ss_tot = np.sum((ts-np.mean(ts))**2)
r_squared = 1 - (ss_res / ss_tot)
r_squared
吸取的教训
在本教程中,我已经演示了如何通过 SARIMA 模型对时间序列进行建模。概括地说,你应该遵循以下步骤:
- 将数据框转换为时间序列
- 计算 p、d 和 q 的值以调整 SARIMA 模型
- 用计算出的 p、d 和 q 值建立 SARIMA 模型
- 测试模型的性能。
对拟议模型的改进可以包括将时间序列分成两部分:训练集和测试集。通常,训练集用于拟合模型,而测试集用于计算模型的性能。
文献学
- 时间序列分解分析的可视化指南
- 时间序列的一个例子
- ARIMA 模型 Python 示例—时间序列预测
- ARIMA 模型预测不丹布姆唐的国际游客量
- Python 中的增强 Dickey-Fuller 测试
- 汽车 ARIMA 使用金字塔 ARIMA Python 包
- Python 中 t 检验的置信区间(均值之间的差异)
- 从数据中提取季节性和趋势:使用 R 分解
- 如何用 Python 创建时间序列预测的 ARIMA 模型
- 如何使时间序列平稳?
- 如何用 Python 中的差分变换去除趋势和季节性
- 如何在 Python 中调优 ARIMA 参数
- 非季节性 ARIMA 车型
- 解读偏自相关函数(PACF)
- 使用扩展的 Dickey-Fuller 测试进行平稳性测试
- 信号和噪音
- 时间序列分解
- 时间序列预测:使用 Python 的基本介绍。
- Python 中的时间序列分析—包含示例的综合指南
- Python 时间序列预测案例研究:波士顿每月武装抢劫案
- 使用 SARIMAX 的时间序列预测
- 了解 ARIMA 并调 P、D、Q
如何对黄金价格建模
现实世界中的数据科学
利用领域知识和监督学习模型理解和预测黄金价格

在本文中,我将通过依次介绍以下内容,向您展示一个非常简单但功能强大的黄金价格模型:
- 黄金的历史和当前用途;
- 理论上影响黄金价格的因素;
- 用于预测黄金价格的回归模型:
- 回归模型在投资决策中的应用。
对于忙碌的读者,文章还提供了 TL;附录中的博士,连同免责声明,浓缩 Jupyter 笔记本,和源列表。

1.我们为什么需要黄金?
公元前 3600 年左右,古埃及首次冶炼出黄金。300 年后,第一枚金币在土耳其西部的一个古代王国铸造,从此被强大的王国作为一种实物货币。
在现代,黄金已经从实物货币演变为货币储备。1819 年,英国通过将其货币与黄金挂钩,正式采用了有史以来第一个金本位制。到 1900 年,除了中国,大多数国家都采用了金本位制。然而,当第一次世界大战开始时,由于许多国家需要印刷钞票来支付战争费用,金本位最终消失了。
今天,黄金在我们的生活中有多种用途,如造币、珠宝、电子和牙科治疗。然而,货币政策和金融需求的影响会对黄金价格产生更大的影响。

2.有哪些因素可以影响金价?
理论上,有很多基本面、宏观面和情绪因素会影响金价。在基本面方面,央行、珠宝买家和交易所交易基金对实物黄金有需求,而在宏观空间,则有通胀、利率、货币供应和美元走强。此外,一些交易员跟踪 CFTC 净头寸数据,以判断投机者的情绪。

每个因素理论上如何影响金价?
基本面因素的影响是最容易理解的。政府和人民购买的黄金越多,市场上的黄金就越少,价格就会攀升。
在宏观空间中,通货膨胀(通货紧缩)率是衡量一篮子商品和服务价格上涨(下降)的指标。如果通货膨胀率上升,我们的午餐和黄金价格也会上涨。相反,如果利率上升,作为投资工具的黄金相对于美国国债就变得没有吸引力了。就像巴菲特说的,黄金是不下蛋的母鸡。
“如果你永远拥有一盎司黄金,那么你还拥有一盎司黄金。”—沃伦·巴菲特
最重要的因素之一是货币供应量,它衡量一个经济体中可用的货币总量。让我们举两个例子来解释为什么货币供应量的增加会提高黄金价格。
- 想象一下,你和你的朋友们组成了一个小型经济体,他们同意用你的垄断资金互相买卖黄金。如果你开始在你的车库里印大富翁的钱,并开始从你的朋友那里购买所有的黄金,那么相对于你的大富翁的黄金价格将会攀升。换句话说,如果美联储开始印刷成吨的美元,黄金相对于美元的价格可以攀升。
- 再想象一下你和你的朋友们使用美元进行贸易的小型经济体。如果你印钱并给每个人免费的钱,商品和服务的价格会上涨,因为免费的钱会被用来购买额外的商品和服务。货币供应量的增加最终会导致通货膨胀率的上升,因此黄金价格会上涨。
最后但同样重要的是,美元的强势会影响黄金和任何其他以美元计价的商品的价格。如果美元变弱,其他国家可以购买更多的美元,然后购买更多的黄金,推高金价,以及其他商品,只要它们以美元报价。

3.我们如何对黄金价格建模?
为了对黄金价格建模,我们首先收集输入数据并应用数据转换。利用转换后的数据,我们使用线性回归模型来解释预测因素和黄金价格之间的关系。为了验证模型,进行样本外回测,并计算 R 值来衡量模型的性能。
3.1 数据收集
为了准备分析和模型开发,收集并清理了自 1981 年以来的以下数据:
- XAUUSD:黄金现货价格以美元计价。
- 美国 CPI:该指数跟踪城市消费者支付的商品和服务价格的变化(即通货膨胀率)。
- 美国 M2:货币供应包括现金、支票存款和容易兑换的货币。
- 美国 GDP:这一特色指标衡量美国经济产出的规模。
- 美元指数:追踪美元相对于一篮子外币价值的指数。

输入数据和来源
数据的一个显著挑战是,这些因素在不同的频率下被观察到。为了调整频率,这些值按季度分组,然后取平均值。
3.2.数据转换和特征工程
3.2.1.目标变量
该模型的目标变量是经通胀调整后的黄金现货价格。为了通过通货膨胀来调整黄金现货价格,我们通过美国 CPI 来紧缩黄金现货时间序列。今后,这个经通胀调整的黄金时间序列将被称为“黄金现货价格”、“黄金价格”或“XAUUSD”。
3.2.2.预言者
这个回归模型有两个预测指标:货币供应量与国内生产总值(M2/国内生产总值)的比率和美元指数。虽然美元指数可以保持不变,但我们需要用美国 M2 除以美国 GDP 来得出这个比率。货币供应量与 GDP 的比率比货币供应量更受青睐,因为它是衡量经济中过剩货币供应量的指标。
3.2.3.对数变换
在两次转换之后,我们对目标变量和预测值应用对数转换,因为所有值都是正的,并且表现出很高的正偏度。这将有助于任何线性模型更容易找到模式。

相关矩阵表明预测值和目标变量之间有很强的关系。
使用转换后的变量,我们绘制了一个相关矩阵,以了解黄金价格和预测之间的线性关系。如图所示,黄金现货价格与货币供应量占 GDP 的比例高度相关,与美元指数有一定的负相关关系。

黄金价格与货币供应量和 GDP 之比:正相关
更重要的是,这两个预测值几乎不相关,相关度为 -0.08 。这表明,尽管美元指数的相关性小于货币供应量与 GDP 比率的相关性,但美元仍然有用,因为它可以添加非重叠信息。

黄金价格与美元指数:负相关
3.3.模型训练和回溯测试性能
现在使用预测值和目标变量,我们使用两个预测值和一个线性回归方程来拟合黄金价格。

黄金价格线性回归模型
请注意,添加 L1 和 L2 正则化参数以减少过度拟合不太可能增加该模型中的值,因为预测值数量较少,预测值之间的相关性也较小。不管怎样,其他算法包括随机森林和 XGBoost 也可以被训练。

样本外回测结果表明不需要复杂的模型。
为了评估该模型,通过使用 100 个季度的滑动窗口重复训练该模型,并预测下一季度的平均黄金价格,来进行样本外回测。最终,将预测值与实际值进行比较以计算 R,R 大约为 92% 。
r 是决定系数,代表模型可以解释的总变异的百分比。因此,这个简单的模型可以解释黄金价格总体变化的巨大差异。

4.我们如何使用这个模型?
使用这个模型,我们可以通过将我们对货币供应量对 GDP 、美元强势和通货膨胀率的看法转化为对黄金价格的影响来预测黄金价格。
在我看来,货币供应量与 GDP 的比率在短期和长期内都会增加,因为各国政府将继续印钞,以分别抵消全球封锁和信贷市场担忧的影响。
然而,美元指数可能会因避险需求而走强。当市场出现抛售时,对美元等避险资产的需求增加,从而推高美元。
综合这些因素,我预计金价在短期内仍将保持相当大的波动,因为这两个预测因素可以相互抵消。然而,从长期来看,我相信期待已久的牛市将会回归。

附录
TL;速度三角形定位法(dead reckoning)
在疫情和货币战争中,黄金可以成为意外通货膨胀、极端货币贬值和经济增长缓慢的完美对冲。数据分析表明,黄金价格主要受以下因素驱动:
- 通货膨胀率
- 相对于经济规模的货币供应量
- 计价货币的强势和弱势
其他可能影响金价的基本面和情绪因素有:
- 利率
- 中央银行要求
- 黄金 ETF 需求
- 珠宝需求
- CFTC 职位
放弃
这篇文章的唯一目的是通过表达作者的个人观点来教育读者。内容仅反映作者在写作时的观点,不构成任何财务建议,也不反映作者附属组织的任何观点。
源代码
来源
- https://fred.stlouisfed.org/
- https://www.investing.com/
- https://articles . royalmintbullion . com/a-history-of-gold/
- https://www.econlib.org/library/Enc/GoldStandard.html
如何通过偏斜正态分布模拟意大利新冠肺炎疫情

本教程使用 Python 分析与意大利新冠肺炎趋势相关的数据。数据由意大利公民保护组织发布。在下面的文章中描述了这个预测器背后的一般概念:https://medium . com/@ angelica . lo duca/predicting-the-end-of-the-coronavirus-epiderations-in-Italy-8da 9811 f 7740。在我的上一篇文章中,我使用线性回归来逼近数据,在本文中,我们通过偏斜的正态分布来逼近 EPI,这似乎比线性回归更好。
您可以从 my GitHub repository 下载笔记本,在那里您也可以找到线性模型的实现。
入门指南
导入数据并计算 EPI
首先,我们从意大利 Protezione Civile 的 Github 库导入数据,然后计算流行病进展指数(EPI)。我们提取列totale_casi,其中包含自疫情开始以来的新冠肺炎感染总数,以及tamponi,其中包含自疫情开始以来的新冠肺炎拭子总数。我们将 EPI 存储在y变量中。最后,我们打印所有有数据的日期列表(data[‘data’])。
import pandas as pd
data = pd.read_csv(“[https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-andamento-nazionale/dpc-covid19-ita-andamento-nazionale.csv](https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-andamento-nazionale/dpc-covid19-ita-andamento-nazionale.csv)")
data.head()

然后,我们计算要分析的指标:流行病进展指数(EPI)并将其存储在y变量中。我们还定义了X来存储天数。最后,我们跳过前 15 天,来考虑限制法的影响。
tc = data['totale_casi']
tt = data['tamponi']
y = []
tt_increase = []
for i in range(1, len(tt)):
current_epi = (tc[i] - tc[i-1])/(tt[i]-tt[i-1])
tt_increase.append(tt[i]-tt[i-1])
y.append(current_epi)X = []
for i in range(1, len(y)+1):
X.append(i)skip = 15
X = X[skip:]
y = y[skip:]
现在我们可以绘制 EPI 趋势。
import matplotlib.pyplot as plt
import matplotlib
import numpy as npdef my_plot(X,y):
plt.plot(X, y, color="black", linewidth=1)plt.grid()
plt.xlabel('Number of days')
plt.ylabel('EPI')
plt.show()my_plot(X,y)

提取样本
在训练集和测试集中拆分数据
为了测试模型,我们将X和y拆分成X_train和y_train。我们将在训练变量上训练模型,并将在测试变量上进行测试。
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
模型定义
通过偏斜正态分布近似数据
我们可以通过偏斜的正态分布来近似计算数据。我们将X和y转换成 numpy 数组,并定义了一个名为skewnorm()的函数,它包含了偏斜正态分布的公式。我在这里找到了公式。查看这里的了解更多关于偏斜正态分布的细节。或者,我们可以使用函数scipy.stats.skewnorm,这里定义,这里定义,这里定义。
import numpy as np
import math
from scipy.optimize import curve_fit
import scipy.special as spX = np.array(X)
y = np.array(y)def skewnorm(x, sigmag, mu, alpha, c,a):
normpdf = (1/(sigmag*np.sqrt(2*math.pi)))*np.exp(-(np.power((x-mu),2)/(2*np.power(sigmag,2))))
normcdf = (0.5*(1+sp.erf((alpha*((x-mu)/sigmag))/(np.sqrt(2)))))
return 2*a*normpdf*normcdf + c
现在我们能够通过scipy函数curve_fit()用训练数据拟合模型。曲线拟合是构建曲线或数学函数的过程,它对一系列数据点具有最佳拟合。curve_fit()函数将样本和初始参数作为输入。该函数返回最佳参数popt和协方差矩阵pcov作为输出。
popt, pcov = curve_fit(skewnorm, X_train, y_train, p0=(1./np.std(y_train), np.mean(y_train) ,0,0,0))
拟合后,我们绘制训练集的结果。我们通过简单地调用函数skewnorm()并使用函数curve_fit()返回的参数来计算预测y_train_pred。
y_train_pred = skewnorm(X_train,*popt)plt.scatter(X_train, y_train, color="black", linewidth=1, label='train')
plt.scatter(X_train, y_train_pred, color="red", linewidth=1, label='model')
plt.grid()
plt.legend()
plt.xlabel('Number of days')
plt.ylabel('EPI')
plt.show()

模型评估
我们在X的剩余部分,即X_test上测试模型。我们将函数skewnorm()应用于X_test。
y_pred = skewnorm(X_test,*popt)
我们将预测值与实际值进行比较。
df = pd.DataFrame({'Actual': np.array(y_test).flatten(), 'Predicted': y_pred.flatten()})
df

我们计算所有的评估指标。请看:https://www . data Vedas . com/model-evaluation-regression-models/了解更多详情。
我们希望 RMSE 值尽可能低,RMSE 值越低,模型的预测就越好。
from sklearn import metrics
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

我们还计算皮尔逊相关系数,以确定实际值和预测值之间是否存在相关性。我们使用包含在stats库中的pearsonr()函数。该函数返回皮尔逊相关系数作为第一个参数,p 值作为第二个参数。
皮尔逊相关系数
完美:如果值接近 1,那么它就是完美的相关性:随着一个变量的增加,另一个变量也会增加(如果为正)或减少(如果为负)。
高度:如果系数值介于 0.50 和 1 之间,则称之为强相关。中度:如果该值位于 0.30 和 0.49 之间,则称之为中度相关。低度:当值低于+ .29 时,则称之为小相关。无相关性:当值为零时。相关页面:https://www . statistics solutions . com/pearsons-correlation-coefficient/
p 值
我们想让它尽可能小。相关页面:https://it.wikipedia.org/wiki/Valore_p
from scipy import statsstats.pearsonr(y_test, y_pred)
将模型扩展到全体人口
将模型应用于所有可用数据
整个种群由X和y组成。我们通过将skewnorm()函数应用于X来计算y_pred。然后我们绘制结果。
y_pred = skewnorm(X,*popt)
plt.scatter(X_train, y_train, color="gray", label='train')
plt.scatter(X_test, y_test, color='green', label='test')
plt.plot(X, y_pred, color='red', linewidth=2, label='prediction')
plt.legend()plt.show()

未来趋势预测
将模型应用于未来的日子
现在我们试着预测未来 50 天的趋势。我们从包含在X中的最后一天+ 1 开始构建一个列表X_future。然后,我们将函数skewnorm()应用于X_future,并绘制结果。
X_future = []
n_start = skip+len(X)
for i in range(n_start, n_start + 50):
X_future.append([i])y_future = skewnorm(X_future,*popt)plt.scatter(X_train, y_train, color="gray", label='train')
plt.scatter(X_test, y_test, color='green', label='test')
plt.plot(X_future, y_future, color='red', linewidth=2, label='prediction')
plt.legend()
plt.grid()
plt.show()

现在,我们可以预测新冠肺炎疫情的结束。当 y 的值等于偏移c时,就会发生这种情况,偏移在 skewnorm 公式(y[i] = c)中定义。由于c是一个浮点数,我们在移动逗号后将其转换为 int。c的值包含在curve_fit()返回的popt变量中。通过应用与c相同的技术,我们也将y_future转换为 int。最后,我们使用函数np.where()找到索引i,使得y[i] = c。
c = int(popt[3]*10**9)
y_search = np.array([int(i*10**9) for i in y_future])
i = np.where(y_search == c)
我们获得两个索引,我们取第一个并将其存储在x0中。
x0 = i[0][0] + n_start
y_future[i[0][0]]
将天数转换为日期。数据从 2020 年 2 月 24 日开始。那我们已经跳过了 15 天。
from datetime import datetime
from datetime import timedelta
data_eff = datetime.strptime(data['data'][skip], '%Y-%m-%dT%H:%M:%S')
现在我们能够计算新冠肺炎疫情的结束时间,只需将x0转换成日期。根据这一模型,疫情不会在 2020 年 6 月 13 日登记任何病例。
def n_to_date(n):
return data_eff + timedelta(days=n-skip)n_to_date(int(x0))
最后,我们实现了一个函数来预测某个通用日期的 EPI 值。
def date_to_n(my_date):
initial_date = datetime.strptime(data['data'][0], '%Y-%m-%dT%H:%M:%S')
return (my_date - initial_date).days + 1my_date = datetime.strptime("2020-04-25", '%Y-%m-%d')
n = date_to_n(my_date)
predict = skewnorm([[n]],*popt)
predict
摘要
对所吸取教训的简短总结
在本教程中,我们学习了以下概念:
- 在为数据集选择模型之前,重要的是绘制数据,以便了解数据是否具有特定的形状;
- 许多不同的模型可以用来表示数据。因此,评估模型的表现非常重要。在本教程中,我们使用了不同的度量来评估模型:平均绝对误差、均方误差、均方根误差、皮尔逊相关系数和 p 值;
scipy库提供了函数curve_fit(),该函数允许对任何形状或曲线进行建模。困难在于定义表示曲线的数学方程。
如何用线性回归对时间序列数据建模
探索时间序列建模
用 Python 代码进行时间序列建模

在 Unsplash 上 tangi bertin 拍摄的照片
欢迎回来!这是专栏的第 4 篇文章,探讨用 Python 代码分析和建模时间序列数据。在前三篇文章中,我们已经介绍了单个时间序列变量的分析 和 多个时间序列变量的分析 。从这篇文章开始,我们将进一步探索使用线性回归建模时间序列数据。
1.普通最小二乘法(OLS)
我们在学校都学过线性回归,线性回归的概念似乎很简单。给定因变量 y 对自变量 x 的散点图,我们可以找到一条与数据非常吻合的直线。但是等一下,我们如何衡量一条线是否很好地符合数据?我们不能只是将图形可视化,然后说某条线比其他线更符合数据,因为不同的人可能会做出不同的评估决策。如何才能量化评价?
普通最小二乘法(OLS)是一种量化评价不同回归线的方法。根据 OLS,我们应该选择使观察到的因变量和预测的因变量之间的差的平方和最小化的回归线。

OLS 回归图解
2.高斯-马科夫假设
根据 OLS 的评价标准,我们可以找到一条最符合观测数据的直线。该行的一般格式是:

在这里,μᵢ是剩余的术语,是 yᵢ的一部分,xᵢ.无法解释我们可以根据 OLS 的要求找到这条最好的回归线,但是我们能肯定 OLS 产生了最好的估计量吗?一个例子是,当存在异常值时,根据 OLS 计算出的“最佳”回归线显然不符合观察到的数据。

OLS 没有生成描述数据的最佳回归线的情况
2.1 截面数据的高斯-马尔可夫假设
事实证明,只有当某些假设得到满足,OLS 计算出最好的线性无偏估计量(蓝色),很好地估计人口参数。对于横截面数据,高斯-马科夫假设有六个假设,确保使用 OLS 计算的估计量是蓝色的。当任何一个高斯-马科夫假设被违反时,使用 OLS 计算的样本参数不再能很好地代表总体参数。
- 参数的线性。这个假设要求参数β是线性的。然而,对自变量的线性没有要求。yᵢ=α + βxᵢ +μᵢ和 yᵢ=α + βIn(xᵢ) +μᵢ都有线性β。
- 自变量 x 和因变量 y 都是随机变量。值得一提的是,如果 x 和 y 都是随机变量,则余项μ不会自相关。
- 多个独立变量 x₁和 x₂.之间不存在完美的共线性如果存在完美的共线性,线性回归结果将是随机的,因为它不能区分 x₁和 x₂.的贡献通常,当 R 结果很好,但每个独立变量的 t 检验很差时,这表明存在共线性。
- 剩余项μ是内生的。要内生性,μᵢ不随 xᵢ.而变它可以表达为 cov(μᵢ,xᵢ)=0.内生性可能产生于反向因果关系或 x 中的测量误差,导致 cov(μᵢ,xᵢ)!=0.
- 剩余项μᵢ.的同方差性它要求μᵢ的方差不随 xᵢ.而变
- 剩余项μᵢ.没有自相关它可以表达为 cov(μᵢ,μⱼ)=0.μᵢ的自相关可由遗漏的独立变量、错误指定的回归函数、独立变量中的测量误差和聚类误差引起。
时间序列数据的 2.2 高斯-马尔可夫假设
时间序列数据与横截面数据略有不同。对于横截面数据,我们从总体中获取样本,高斯-马尔可夫假设要求自变量 x 和因变量 y 都是随机变量。对于时间序列数据,我们是从同一个过程中得到样本,不能再假设自变量 x 是随机变量。因此,高斯-马尔可夫假设对于时间序列数据在内生性、同方差性和无自相关性方面更为严格。由于 x 不再是一个随机变量,需要满足所有时间点的所有 xₖ的要求,而不仅仅是剩余项μᵢ.在该时间点的 xᵢ
3.线性回归的假设检验
3.1 Python 中的线性回归
这里,我们继续使用从雅虎财经获得的历史 AAPL 价格和间谍价格。我们先把 AAPL 价格和间谍价格分开。然后,为了发现 AAPL 价格在多大程度上可以由整体股票市场价格来解释,我们将建立以 SPY 价格为自变量 x 和 AAPL 价格为因变量 y 的线性回归模型
使用 Python 中的 statsmodels 库可以轻松完成线性回归。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as smAAPL_price = pd.read_csv('AAPL.csv',usecols=['Date', 'Close'])
SPY_price = pd.read_csv('SPY.csv',usecols=['Date', 'Close'])X = sm.add_constant(SPY_price['Close'])
model = sm.OLS(AAPL_price['Close'],X)
results = model.fit()plt.scatter(SPY_price['Close'],AAPL_price['Close'],alpha=0.3)
y_predict = results.params[0] + results.params[1]*SPY_price['Close']
plt.plot(SPY_price['Close'],y_predict, linewidth=3)plt.xlim(240,350)
plt.ylim(100,350)
plt.xlabel('SPY_price')
plt.ylabel('AAPL_price')
plt.title('OLS Regression')print(results.summary())

连同可视化 OLS 线性回归结果的绘图,我们可以打印一个汇总表,如下所示:

我们为什么要做这些复杂的假设检验?我们如何解释这些假设检验结果?我们将在接下来的会议中回答这些问题。
3.2 为什么要对线性回归进行假设检验?
由于我们使用样本来估计总体,我们需要评估样本参数估计总体参数的效果。对样本参数进行假设检验,需要知道样本参数分布。
根据中心极限定理,当样本量足够大时,β的样本分布为正态分布:

然而,我们不知道确切的总体剩余方差(σ)。我们可以用样本残差方差(σʰᵃᵗ)来估计总体残差方差,但这样样本β分布就不再是正态分布了。它变成了 t 分布:
****
β的样本分布服从 t 分布,因为我们不确切知道总体残差方差的方差。标准误差是样本参数的方差。
3.3 如何解读 OLS 统计摘要?
现在是时候回到 OLS 回归结果表,并尝试解释汇总结果。
汇总表的第一部分有 R 和 F 统计量,它们衡量自变量对因变量的总体解释能力。
r 是解释的误差平方和除以误差平方和。R 介于 0 和 1 之间,R 越大,说明自变量能更好地解释因变量。R =解释的误差平方和/误差平方和。自变量越多,得到的 R 将越接近 1,但同时,自变量越多可能导致过拟合。通过惩罚多余的自变量,调整后的 R 偏好较少的自变量。
独立变量联合效应的统计检验。F 统计检验的低 p 值表明自变量不能很好地解释因变量。
汇总表的第二部分是 t 统计量,对每个独立变量进行测试。同时使用 F 统计量和 t 统计量有助于检查自变量中是否存在共线性。好的 F 统计量和差的 t 统计量表示共线性。
Durbin-Watson 和 Jarque-Bera 在第三次会议的汇总表中报告了残差项的平稳性和正态性,这将在下面的会议中详细讨论。
4.线性回归残差
剩余项很重要。通过使用残差项检查高斯-马科夫假设是否成立,我们可以推断线性回归的质量。

样本β的期望值

样本β的方差

4.1 常态测试
检验残差是否正态分布是很重要的。如果残差不是正态分布的,则残差不应用于 z 检验或任何其他从正态分布导出的检验,如 t 检验、f 检验和 chi2 检验。

import pandas as pd
import statsmodels.api as sm
from scipy import statsAAPL_price = pd.read_csv('AAPL.csv',usecols=['Date', 'Close'])
SPY_price = pd.read_csv('SPY.csv',usecols=['Date', 'Close'])X = sm.add_constant(SPY_price['Close'])
model = sm.OLS(AAPL_price['Close'],X)
results = model.fit()residual = AAPL_price['Close']-results.params[0] - results.params[1]*SPY_price['Close']print('p value of Jarque-Bera test is: ', stats.jarque_bera(residual)[1])
print('p value of Shapiro-Wilk test is: ', stats.shapiro(residual)[1])
print('p value of Kolmogorov-Smirnov test is: ', stats.kstest(residual, 'norm')[1])
输出:
雅尔克-贝拉检验的 p 值为:0.0
夏皮罗-维尔克检验的 p 值为:9.164991873555915e-20
科尔莫戈罗夫-斯米尔诺夫检验的 p 值为:1.134826980654097 e-55
如果我们选择 0.05 的显著性水平,那么所有三个正态性检验都表明残差项不遵循正态分布。
4.2 同质性测试
三种常用的异方差统计检验是 Goldfeld-Quandt 检验、Breusch-Pagan 检验和 White 检验。在同样的序列中,检验更一般的同质性。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import statsmodels.stats.api as smsAAPL_price = pd.read_csv('AAPL.csv',usecols=['Date', 'Close'])
SPY_price = pd.read_csv('SPY.csv',usecols=['Date', 'Close'])X = sm.add_constant(SPY_price['Close'])
model = sm.OLS(AAPL_price['Close'],X)
results = model.fit()residual = AAPL_price['Close']-results.params[0] - results.params[1]*SPY_price['Close']print('p value of Goldfeld–Quandt test is: ', sms.het_goldfeldquandt(results.resid, results.model.exog)[1])
print('p value of Breusch–Pagan test is: ', sms.het_breuschpagan(results.resid, results.model.exog)[1])
print('p value of White test is: ', sms.het_white(results.resid, results.model.exog)[1])
输出是:
Goldfeld–Quandt 试验的 p 值为:2.3805273535080445 e-38
breus ch–Pagan 试验的 p 值为:2.599557770260936e-06
白色试验的 p 值为:1.0987132773425074e-22
如果我们选择 0.05 的显著性水平,那么所有三个正态性检验都表明残差项不遵循正态分布。
4.3 平稳性测试
Durbin-Watson 测试检测滞后为 1 的残差项的自相关,而 Breusch-Godfrey 测试检测滞后为 N 的残差项的自相关,具体取决于测试中的设置。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as smAAPL_price = pd.read_csv('AAPL.csv',usecols=['Date', 'Close'])
SPY_price = pd.read_csv('SPY.csv',usecols=['Date', 'Close'])X = sm.add_constant(SPY_price['Close'])
model = sm.OLS(AAPL_price['Close'],X)
results = model.fit()import statsmodels.stats.api as sms
print('The Durbin-Watson statistic is: ', sms.durbin_watson(results.resid))
print('p value of Breusch-Godfrey test is: ', sms.acorr_breusch_godfrey(results,nlags=1)[3])
输出:
德宾-沃森统计量为:0.06916423461968918
布氏-戈弗雷检验的 p 值为:4.6463126097712 e-150
Durbin-Watson 和 Breusch-Godfrey 检验都表明滞后为 1 的剩余项存在自相关。当德宾-沃森统计量为 2 时,不存在自相关。当德宾-沃森统计量趋向于 0 时,存在正自相关。
5.解决违反高斯-马科夫假设的问题
5.1 违反高斯-马科夫假设
当违反高斯-马科夫假设时,从样本计算出的估计量不再是蓝色的。下表显示了违反 Gauss-Marcov 假设如何影响线性回归质量。

5.2 加权最小二乘法(WLS)
为了解决异方差误差,可以使用加权最小二乘法(WLS)。WLS 变换自变量和因变量,因此 OLS 在变换后保持蓝色。

5.3 广义最小二乘法(GLS)
为了考虑异方差误差和序列相关误差,可以使用广义最小二乘法(GLS)。GLS 转换自变量和因变量的方式比 WLS 更复杂,因此 OLS 在转换后仍为蓝色。

摘要
在这篇文章中,我们了解到只有当高斯-马科夫假设成立时,OLS 才能产生好的估计量。因此,线性回归后,检查残差项以确保不违反高斯-马科夫假设总是很重要的。幸运的是,使用 Python 中的 statsmodels 库,在线性回归过程中会自动进行许多统计测试。OLS 线性回归汇总表的简单打印使我们能够快速评估线性回归的质量。如果违反了高斯-马科夫假设,WLS 和 GLS 的进一步解决方案也可用于转换自变量和因变量,使 OLS 保持蓝色。
希望您喜欢使用线性回归学习时间序列数据建模!
如何用 Python 建模时间序列
理解随机游走模型和移动平均过程

在本文中,我们引入两个模型来开始建模时间序列:
- 随机游动
- 移动平均过程
这篇文章旨在实践。所以,一定要开始你的 Jupyter 笔记本,并遵循!
完整的笔记本可以在这里找到。
我们开始吧!
深入时间序列分析,应用高级模型,如 SARIMAX、VARMAX、CNN、LSTM、ResNet、自回归 LSTM 等,并使用 Python 中的应用时间序列分析。
随机行走模型
随机行走模型由以下公式表示:

随机游动
换句话说,这意味着当前时间 t 的位置是先前位置和噪声之和,用 Z 表示。这里,我们假设噪声是正态分布的(均值为 0,方差为 1)。
当然,我们从 0 开始随机行走,我们可以说任何时间点都是到那时为止所有噪声的总和。数学上:

从 0 开始的随机漫步
让我们用 Python 模拟一次随机漫步。
首先,我们将导入本文这一部分和下一部分所需的所有库:
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.arima_process import ArmaProcess
from statsmodels.tsa.stattools import acfimport matplotlib.pyplot as plt
import numpy as np%matplotlib inline
然后,我们生成一个包含 1000 个数据点的数据集。起点为 0,我们将随机噪声添加到上一个点,以生成下一个点:
steps = np.random.standard_normal(1000)
steps[0]=0
random_walk = np.cumsum(steps)
绘制数据集时,我们看到以下内容:
plt.figure(figsize=[10, 7.5]); # Set dimensions for figure
plt.plot(random_walk)
plt.title("Simulated Random Walk")
plt.show()

模拟随机行走
现在,你的随机游走可能与上面的图不同,因为噪声是完全…随机的。因此,也许你的随机漫步实际上是在时间中向上移动。
现在,让我们来看看随机游走的自相关图(或相关图):
random_walk_acf_coef = acf(random_walk)
plot_acf(random_walk, lags=20);

随机游走的相关图
不管你的随机漫步看起来像什么,你应该得到一个非常相似的相关图。如你所见,即使有 20 的滞后,相关性也是非常重要的。因此,该过程不是静止的。
现在,一切都表明我们的数据集中存在一种趋势。有可能消除这种趋势吗?
是啊!
知道一个随机游走给前一个点增加了一个随机噪声,如果我们取每个点和它前一个点的差,就应该得到一个纯随机的随机过程。
让我们用 Python 来验证一下。为了区别对待,我们做到了:
random_walk_diff = np.diff(random_walk, n=1)
然后,我们绘制结果,我们应该得到:
plt.figure(figsize=[10, 7.5]); # Set dimensions for figure
plt.plot(random_walk_diff)
plt.title('Noise')
plt.show()

噪音
如你所见,上面的图在趋势和方差上没有系统的变化,也没有季节性。因此,我们肯定有一个纯粹的随机过程。
查看差异的相关图:
plot_acf(random_walk_diff, lags=20);

随机过程的相关图
我们看到这是一个纯随机过程的相关图,自相关系数在滞后 1 时下降。
移动平均过程
让我们从什么是均线过程的直觉开始。
假设你将一块石头扔进一池水中,并且随着时间的推移,你正在追踪水面上单个水滴的位置。当然,当岩石撞击表面时,会形成波纹,所以我们的水滴会上下移动。现在,让我们假设表面上的波纹只持续两秒钟,之后表面就完全变平了。
那么,我们可以说,我们的水滴的位置可以表示为:

二阶移动平均过程
上式表示,时间 t 的位置 X 取决于时间 t 的噪声,加上时间 t-1 的噪声(具有一定权重θ),加上时间 t-2 的一些噪声(具有一定权重)。
这称为二阶移动平均过程,也可以表示为 MA(2)。
广义的符号是 MA(q)。在上面的例子中,q = 2。
让我们用 Python 来模拟这个过程。
具体来说,我们将模拟以下过程:

这又是一个 2 阶移动平均过程,但是我们指定了权重。您可以随意更改它们并试验参数。
我们从指定滞后开始。这里,我们使用的是滞后 2。
ar2 = np.array([2])
然后,我们指定权重。在本例中,权重为[1,0.9,0.3]。
ma2 = np.array([1, 0.9, 0.3])
最后,我们模拟该过程并生成一千个数据点:
MA2_process = ArmaProcess(ar2, ma2).generate_sample(nsample=1000)
现在,让我们想象一下这个过程及其相关图:
plt.figure(figsize=[10, 7.5]); # Set dimensions for figure
plt.plot(MA2_process)
plt.title('Moving Average Process of Order 2')
plt.show()plot_acf(MA2_process, lags=20);

二阶模拟移动平均过程
同样,由于噪声是随机产生的,您的图形可能与我的不同。然而,相关图应该类似于下图:

MA 的相关图(2)
正如你注意到的,在滞后 2 之前,相关性是显著的。之后,相关性不再显著。这是有意义的,因为我们指定了一个滞后为 2 的公式。
这意味着你可以使用相关图来推断时间序列的滞后。如果您发现在特定的滞后 q 之后,相关性不显著,那么您可以将您的时间序列建模为 MA(q)过程。
就是这样!你现在了解了什么是随机漫步以及如何模拟它。此外,您还学习了移动平均线过程,如何对它们建模,最重要的是,如何确定移动平均线过程的顺序。
通过以下实践课程了解有关时间序列的更多信息:
干杯!
如何削减 Db2 但保留您的代码
蒙特·兹韦本,吉恩·戴维斯和卡罗尔·皮尔森

资料来源:BillionPhotos.com/Adobe
这是一个关于由 DB2 支持的遗留应用程序现代化的故事。它描绘了一个将应用程序迁移到云并使用人工智能扩展它的旅程——无需更改该遗留应用程序中的任何应用程序或 SQL 代码。
背景
我们最近与埃森哲合作,会见了世界上最具标志性的金融服务公司之一,该公司意识到,为了快速进入新兴市场,它需要使其企业业务系统更加灵活。该应用程序运行其业务的重要部分。它管理多个企业和国家的客户、接触点、产品、合同和支付/支出。几十年来,该公司在应用程序的业务逻辑和底层 SQL 代码上投入了大量资金,不想丢掉这一极具竞争力的资产。

来源:拼接机
该公司面临的问题是,它希望迅速扩张到新兴市场。为了最大限度地加快上市速度,该公司需要在创纪录的时间内实施这一全面的应用程序,使用新配置的产品和服务来满足当地需求和新市场的法规。不幸的是,这传统上需要在每个地区建立一个新的数据中心,但这限制太多了。
此外,该公司向全球其他公司推出了新的 SaaS 商务产品。随着他们获得新的 SaaS 客户,他们现在面临着快速扩展应用程序的实施和运营的需求。
解决方案:云迁移

资料来源:ktsdesign/Adobe
基于云的架构将使企业能够根据本地需求配置其产品和服务,从而实现显著加快上市时间的目标。对于 IT 组织来说,迁移到云的好处也是显而易见的。它希望避免供应商锁定并保持云主权,即时提升存储和计算资源而无需采购新硬件,并从各种即时可用的服务中进行选择。通过迁移到云,该公司将拥有基于消费的定价的可预测性和灵活性,因此它可以避免扩大 it 预算。
基于云的架构可以独特地解决业务和 IT 问题,而无需在每个市场都建立新的数据中心。
扩展应用:注入人工智能
但该公司有更大的抱负,不仅仅是云敏捷性。他们希望在实时业务应用中直接使用机器学习(ML)。他们已经投资了人工智能和人工智能,并建立了几个预测模型,在检测欺诈、个性化营销报价、风险定价等方面与人类团队相媲美。但是由于体系结构的限制,他们不能将这些模型直接操作到企业业务系统中。
大多数 ML 部署都有独立的计算阶段。通常,原始运营数据是从交易系统中提取的,通过分析引擎转化为客户和相关数据的摘要,然后发送到统计机器学习框架来训练模型。这本来就是一个缓慢的过程,并且由于通常与业务应用程序分离的模型部署的延迟而加剧。有时这个过程可能太长,以至于运行数据变化太快,模型无法准确预测。
该公司有更广阔的视野。如果您可以将预测模型直接注入到业务应用程序中,以便在第一次通知损失时直接预测索赔欺诈,或者在客户就计费问题致电呼叫中心时向他们提供非常及时和个性化的报价,情况会怎样?
为此,他们想探索一种新的方法。称之为“应用程序翻新”。云迁移将为他们带来灵活性,但也可能成为一个新的可扩展平台的基础,该平台可以支持内嵌智能,而 ML 是业务应用的原生产品。
所以他们的问题是,是否有现代数据库可以促进这种云和人工智能的旅程。
从 DB2 到云
几十年来,DB2 数据库在行业中占据了至高无上的地位,这是有充分理由的:DB2 为应用程序提供了可靠的、符合 ACID 的性能和强大的动力。架构师和开发人员喜欢它的可靠性、全面的 SQL 和低延迟操作。
该公司意识到,如果它想利用多样化数据、人工智能和云可用性的结构性转变,可能还有其他现代数据库选项。除了不是云原生解决方案之外,扩展 DB2 的成本可能很快变得难以承受。即使对于能够承担这些成本的公司来说,他们仍然需要在可操作的 DB2 实例、分析性 DB2 实例和独立的 ML/AI 框架之间构建和维护 ETL 管道。在一个独立的平台上构建 ML 模型会使其操作化变得很麻烦,并妨碍其大规模采取即时行动的能力。
云锁定问题
除了这些功能需求,该公司不希望被一家云基础架构供应商所束缚。每个云供应商都提供无数的计算和存储原语,他们引诱公司将它们组合在一起,直到他们意识到他们只是陷入了专有水泥中。他们留下了大量集成脚本和连接专有云服务的延迟,用于运营、分析和机器学习工作负载。该公司想要一个多云解决方案,即他们的新“智能”业务系统可以在任何云上轻松灵活地配置、操作和维护。
评估现代解决方案:拼接机
该公司的战略技术咨询合作伙伴埃森哲向该公司引入了 Splice Machine 的横向扩展 SQL 数据库,作为一种全新的现代解决方案,它可以:
- 运行最初为 DB2 设计的企业业务应用程序,几乎不做任何修改;
- 支持多种云;
- 弹性伸缩。
作为一个额外的奖励,Splice Machine 的 ML Manager 可以让他们直接将人工智能注入到他们的应用程序中,使其更加智能,或许可以使整个数据科学过程更加高效。
因此,该公司与埃森哲和 Splice Machine 合作,对云迁移和应用程序现代化进行了技术评估。
考虑到修改原始遗留应用程序的成本和风险,该公司希望在不做任何修改的情况下运行企业应用程序。
我们认为任何其他数据库都可能需要大量重写。
概念验证
为了最大限度地降低任何严重阻塞的风险,该公司使用拼接机进行了概念验证(POC)。POC 的目标是验证 Splice Machine 作为现有 DB2 平台的可行替代方案,为某些应用程序提供支持。该公司为其企业应用程序提供了测试数据库的 DB2 备份,以及大约 5,000 个最常见的 SQL 查询的执行查询日志,这些查询涉及创建用户、合同和更新客户信息等。他们还提供了一些绩效目标。
Splice Machine 使用其数据迁移工具来提取模式、数据、索引、触发器、键等。进入我们的平台。这代表了数百个表和数千个索引。在某些情况下,在此过程中发现了一些缺口,并为此创建了解决方法。我们将在下面更详细地讨论这些。
一旦拼接机数据库创建完毕,该公司就可以对其进行 5000 次查询。这些查询中的大多数具有“事务”性质,并且由拼接机的事务引擎处理,尽管当拼接机的基于成本的优化器基于统计认为合适时,一些由分析引擎处理。请参考下面拼接机的双引擎架构。我们将开源组件与由独特的分布式 ACID 事务引擎包围的优化接口无缝集成。

来源:拼接机
POC 揭示了我们需要调整查询以简化性能的几个地方。例如,团队分析并改进了涉及连接的语句中最昂贵部分的性能。有时系统会将查询误认为是分析性的,并选择了错误的连接算法。POC 团队使用了一种变通方法,即暗示使用嵌套循环连接,这对于快速执行 OLTP 风格的操作至关重要。他们还创建了额外的索引,并向优化器提供提示,以实现某些查询的特定连接顺序。
在调优这些查询之后,Splice Machine 能够在除了一个查询之外的所有查询上达到或超过性能目标。该测试数据库的数据量相对较小(约 1.5TB),因此测试没有展示 Splice Machine 在较大数据集(5TB-PB)上的横向扩展架构,我们认为我们在这方面的性能远远优于传统数据库。
但是,我们必须用额外的索引、语法重写和提示来修改应用程序代码。
由于 POC 的成功,该公司要求我们解决已确定的差距,并展示 Splice Machine 可以在没有额外索引、语法重写和提示的情况下运行其应用程序。
如果这个后续的“launchpad”项目成功,我们将有可能在新兴市场甚至大型现有运营实体中推动他们的应用。这是一个巨大的挑战,但非常值得去做。
无需修改即可启动应用——真正的考验

资料来源:Mariusz Blach/Adobe
“launchpad”项目比 POC 更具挑战性,因为该公司要求在不更改应用程序中任何 SQL 的情况下运行应用程序。
在概念验证期间,Splice Machine 被允许修改一些查询,甚至在极少数情况下提示优化器正确执行或实现目标性能。但在项目实施阶段,这些选项不再适用于拼接机。
如前所述,在概念验证期间,Splice Machine 的团队发现了平台中的许多差距。其中包括:
- SQL 语法的简单扩展(例如,某些内置函数、标识符中的特殊字符)
- 完全外部连接支持
- 尚不支持更复杂的触发处理功能(条件逻辑、信号、每个触发多个动作等)。)
- 错误代码支持匹配遗留数据库错误代码和处理
“launchpad”项目的第一阶段解决了 Splice Machine 数据库引擎中的这些缺口。
在这个阶段,Splice Machine 从公司数据库的最近备份开始,并再次应用其数据库迁移工具来创建托管在 AWS 中的新 Splice 数据库。数据库迁移包括映射全套外键、触发器和值约束,因为维护应用程序内的引用完整性至关重要。
该客户的应用程序是一个“富客户端”Windows 应用程序,这意味着填充表单和创建用户选择选项所需的大部分数据也存储在数据库中,并且需要在应用程序正常运行之前进行检索。
“不改变应用程序”的要求引发了额外的挑战,因为该团队遇到了 Splice Machine 当时不支持的新 SQL 语法,并且在最初的 POC 中没有公开。例如,这需要特定的查询简写,以便在 UNION 语句中为多个子查询指定别名。拼接机解决了遇到的这些异常情况。在将应用程序配置为使用 Splice Machine 作为数据存储后不到三周的时间内,应用程序无需修改即可成功运行。
为了验证功能等效性,该公司确定了 22 个反映其核心业务功能的多步骤测试场景。然后,他们执行这些复杂的多语句工作流,包括值约束、多个触发器和外键,而无需更改应用程序中的一行 SQL 语句。这些场景都被公司成功验证。
虽然应用程序现在运行在 Splice Machine 上而没有进行任何更改,但仍有一些工作流运行速度明显慢于运行版本。这并不奇怪,因为 Splice Machine 现在正在执行许多超出原始 POC 中所见的新查询,并且这些查询是在考虑现有数据库优化器的情况下编写的。在一个例子中,有一个应用程序广泛使用的涉及左外连接的查询模式。原始数据库可以在不到一秒钟的时间内运行这个查询模式,而 Splice Machine 需要 60 秒或更长时间。但是 Splice Machine 优化团队很快就为这类查询更新了优化器的解决方案搜索逻辑,也实现了亚秒级时间。此时,一些查询的执行速度仍然比最初的查询稍慢,但是性能通常被认为很容易在以后的优化器中进行调整。此外,Splice Machine 将全外连接查询提高了 50 倍以上的能力让该公司相信,以后的性能调优(必要时)应该不成问题。

来源:拼接机
下一阶段:运营准备
"发射台"项目如期成功交付,尽管项目有所发展,需求和实施优先事项也有所调整。该公司现在正与我们讨论一个新项目,以使拼接机在操作上做好准备,部署在他们选择的地点和时间。这将需要在真实的环境条件下对应用程序进行广泛的测试和跟踪,并执行操作程序,如备份、复制、故障转移和升级。
扩展应用程序:整合实时人工智能
将某些应用程序迁移到可扩展的分布式云原生平台将加速公司扩展到新的高增长市场的主要业务目标。但故事并没有就此结束:在将其应用程序迁移到 Splice Machine 平台后,该公司将能够利用它已经建立的 ML 模型,并在数据库中执行它们,从而大大减少阻止这些模型在应用程序中运行的数据延迟。它将能够在廉价的基于云的环境、内部环境或混合环境中,无限扩展为这些模型存储和使用的数据量。使用 Splice Machine 的触发器和存储程序,该公司将能够立即采取行动来检测欺诈性交易,交叉销售/追加销售个性化产品和服务,所有这些都基于实时信息,等等。在运营就绪项目的同时,我们计划与该公司的数据科学团队合作,将他们的 ML 模型直接注入业务系统,以证明这一点,然后在稍后阶段使其投入运营。这是拼接机器 ML 管理器的描述和演示,将在项目中发挥作用。

来源:拼接机
摘要
这只是应用程序现代化之旅的一个例子。在这里,我们展示了将遗留数据库应用程序迁移到 Splice Machine 并使其无需修改即可运行的初始步骤。
要获得 Splice Machine 的演示或您自己在云上的试验,以调查您的现代化之旅,请单击此处。
如何赚钱足球
按目标
足球协会开始意识到数据科学的潜力,以及国际象棋大师的选择

利物浦赢得欧洲冠军联赛——世界上最负盛名的足球赛事之一
利物浦足球俱乐部不仅仅赢得了英格兰超级联赛。他们完全绝对地控制着它。
在前 25 场比赛中取得了 24 场胜利和一场平局,他们是顶级足球 133 年历史上最快达到 70 分的球队。唯一一支在英超联赛中保持不败的球队在整个 38 个赛季中取得了 26 场胜利。简单来说,他们现在的表现是没有先例的。
所有这些对于热情的球迷群体来说都是非常受欢迎的,他们的球队在 30 年内没有赢得过联赛冠军——对于足球鉴赏家来说更是如此,他们在这个过程中享受到了一些真正出色的足球。
欧洲足球史上最伟大的比赛之一…
鉴于利物浦相对节俭,他们最近的成功或许更令人惊讶。当然,“相对”是一个关键词——足球是一项充斥着金钱的运动,许多欧洲顶级球队都被极其富有的财团所拥有,这些财团为他们注入了大量资金。例如,利物浦最接近的竞争对手曼城足球俱乐部(Manchester City FC)归阿布扎比王室成员所有,价值至少 170 亿英镑。在过去的十年里,曼城在球员净值(即买入球员的成本减去出售给其他俱乐部的球员的价格)上花费了令人眼红的 10.7 亿英镑。
利物浦在同一时期的花费减少了 70%,甚至在过去五个赛季中的三个赛季在球员转会上实现了净利润。在有史以来最昂贵的 50 次转会中,利物浦只占了三次(他们过去两个赛季的最佳射手穆罕默德·萨拉赫甚至没有出现在名单中,他曾经被英格兰对手切尔西以微不足道的 1350 万英镑卖掉)。Trent Alexander-Arnold 和 Andy Robertson,可以说是目前世界上最好的边后卫,他们两人的身价只有 810 万英镑。他们现在被认为价值 1 . 71 亿英镑。
那么利物浦是如何做到这一点的呢?正如 Bruce Schoenfeld 为《纽约时报》撰写的精彩文章所详述的,该俱乐部最近的成功至少部分归功于数据和分析的广泛使用。

利物浦主帅于尔根·克洛普——AMA/盖蒂图片社
这方面的一个早期例子是收购了尤尔根·克洛普,利物浦神秘的经理和他们高效的“葛根普斯”踢球风格的设计师。带着多特蒙德在他的祖国德国获得德甲荣誉后,克洛普的股票在 2014-15 赛季下跌,当时球队获得了相对较低的第七名——这是八年来最差的成绩。
尽管这个明显的失败,他在从多特蒙德辞职后的几个月内被钦点为利物浦的新经理。利物浦的共同所有者(约翰·w·亨利,他的芬威体育集团也拥有波士顿红袜队)没有依靠公众声誉来做出招聘决定,而是求助于剑桥物理学家伊恩·格雷厄姆。格雷厄姆建立了一个广泛的世界足球数学模型,并发现多特蒙德令人失望的赛季远没有受到糟糕管理的影响,而是运气不好的结果。
足球是一项靠一点运气就能左右比赛的游戏。得分通常很低(3-3 平局是“高分”),只有 10-15%的射门得分。因此,一场比赛的最终得分可能并不代表一支球队的实际表现。格雷厄姆回忆起 2014 年的一场比赛,克洛普的多特蒙德队以 2 比 0 输掉了比赛,尽管他们在其他各方面都占据了比赛的主导地位——他们在 64%的时间里控制着球,角球次数是他们的七倍,射门次数是他们的两倍多。
当然,数据和体育的最初联姻是《T2 金钱球》(Moneyball ),这本书讲述了奥克兰运动家队(Oakland Athletics)2001 年棒球赛季的故事,奥克兰运动家队的经理比利·比恩组建了一支由廉价的“不适应”球员组成的非常成功的球队,并提供了吸引人的基本统计数据。后来芬威体育集团的约翰·w·亨利找到了比恩,他热衷于在波士顿红袜队复制这种方法(红袜队继续赢得了 2004 年世界系列赛——这是他们自 1918 年以来的第一次——使用了比恩开创的许多方法)。
虽然统计数据可以帮助职业球队在体育史上占有一席之地,但热情的业余爱好者也开始受益…
12 月 16 日,有史以来最伟大的国际象棋大师之一芒努斯·卡尔森,发现自己在一个拥有 750 多万棋手的全球联赛中名列榜首。不过,不是象棋联赛,而是梦幻超级联赛。
梦幻超级联赛(又名 FPL,或梦幻足球)是一款在线游戏,跟随现实世界的超级联赛赛季。给定 1 亿虚拟英镑的预算,每个球员(或“经理”)必须召集一个现实世界的球员团队,然后根据他们在现实生活游戏中的表现获得 FPL 积分(例如,前锋每进一个球将获得 4 分 FPL 积分,后卫每不失球将获得 4 分,守门员每 3 次扑救将获得 1 分,以此类推)。

在赛季的第一周,我自己的团队(严重不足)
问题是不同的球员有不同的价格——像穆罕默德·萨拉赫这样的明星球员可能要 1250 万英镑,而在一个较小的球队相对不知名的球员可能只要 400 万英镑。因此,不可能让你的球队充斥着每周都占据头条的超级巨星。
作为一个额外的复杂因素,经理们可以每周从他们的团队中换出一名球员(当然,保持在预算之内),带来一名替代球员,他可能状态更好,或者有更轻松的比赛。通常在几周前计划这些转会“步骤”以获得这样的球员,这使得这项运动被比作国际象棋(尽管卡尔森坚持认为运气也起了很大的作用)。
因此,成功的 FPL 经理人最能发现基本面良好的廉价球员,他们有潜力每周“在雷达下”获得 FPL 积分。显然,这是一个赚钱时机已经成熟的游戏。
这就是我的新项目的全部内容。计划是建立一个分类算法(可能是一个神经网络)。它将获取关于一名球员的基本表现,以及他们将要比赛的球队的表现的数据。然后它会告诉我们他们是否会是 FPL 队的好选择。

每周玩家 FPL 积分的热图,以及他们在游戏中的价格(按玩家位置)。
初步分析确实表明这应该是可能的——上面的热图显示,价格较低的玩家完全有能力获得大量积分(见每个图左上角的彩色斑块)。当然,视觉效果也显示,许多更便宜的玩家在每场比赛中得分很少(见左下角更暗的补丁)。
没人说赚钱容易——这就是利物浦的首席数据科学家拥有哈佛大学粒子物理学博士学位的原因。
这是一个新的博客系列'的第一篇,在这个博客系列中,我将尝试为梦幻英超建立一个模型。我很乐意听到关于这个博客的任何评论,或者这篇文章涉及的任何概念。欢迎在下面留言,或者通过 LinkedIn 联系我。
如何使用 HyperDash 远程监控和记录您的机器学习实验
培训需要很长时间才能完成,但你需要去洗手间休息一下…
动机
你有没有发现自己在训练一个机器学习模型的时候,眼睛长时间盯着笔记本电脑屏幕?尤其是在 Google Colab 上训练深度学习模型的时候,你想知道训练什么时候完成,这样你就可以在失去连接之前在笔记本电脑前。

史蒂夫·哈拉马在 Unsplash 上拍摄的照片
如果实验需要几个小时才能完成,想象一下在这段时间里你能做什么?散步、做饭、上厕所时不要把笔记本电脑带进浴室。如果有一种工具可以帮助你远程监控实验,那岂不是很神奇?
超破折号
幸运的是,有了 Hyperdash ,你可以远程监控你的训练(网络、iOS 和 Android)。你可以看到进度并且在实验完成时得到通知。更好的是,记录你实验的结果和超参数!
装置
$ pip install --upgrade pip && pip install hyperdash
注册 Hyperdash 帐户
$ hd signup
你可以选择注册电子邮件或 GitHub。然后使用您刚刚创建的帐户登录
$ hyperdash login
如果你决定用电子邮件联系。这是你将会看到的

在您的手机上安装
Hyperdash 在 Appstore 和 Google Play 中都有。您可以下载并登录您的帐户。
一旦您登录,您在笔记本电脑上的实验将会显示并保存到您的手机上!让我们通过运行来确保它有效
$ hd demo
你可以看到程序同时在终端和你的应用程序中运行

酷!那么我们如何利用这一点呢?Hyperdash 的伟大之处在于它非常易于使用和入门。让我们看看如何在您的数据科学项目中使用它。
监控你的机器学习实验
我将使用来自 Kaggle 的心脏病数据集。我们的任务是预测病人是否有心脏病。为了快速了解 Hyperdash 是如何工作的,你可以在这个资源库中运行笔记本,观察你手机上的 Hyperdash 应用程序是如何变化的!
首先将数据分成训练集和测试集
使用 Hyperdash 记录你的实验
使用超级破折号的步骤:
- 名称:用
Experiment(name)声明你每次运行的实验对象 - 参数:用
exp.param('name', value)记录任意超参数的值 - 指标:用
exp.metric('name', score)记录您希望看到的任何指标的值 - 结束:用
exp.end()结束实验
就是这样。当运行上面的代码时,您应该能够看到在您的手机上运行的实验

在指标选项卡中,您可以看到您在exp.metric()中记录的指标

观察超参数

在日志中,您还可以看到有关用于训练的模型的更多信息,如大小、形状以及有关原始数据的信息。这些信息被写入。json 格式。

室内装饰实验
用上面的方法,你的实验不会在没有代码exp.end().的情况下停止运行。你可以通过将你的实验包装在一个函数中来避免记住这个代码的麻烦
当你运行这段代码的时候,这个实验已经在你的手机上完成了!
你还能用这些指标做些什么?
您还可以通过记录每个迭代中的度量来观察每个迭代的度量
您会看到一个漂亮的图表,其中显示了精度和损耗函数随时间的变化

结论
Hyperdash 确实是一个很酷的 app,但是除非你使用它,否则它不会有用。当你想远程监控实验并快速保存你得到的结果和度量时,我推荐你使用它。但是为了记录更多关于实验的复杂信息,我推荐使用 Mlf flow或 W eights 和 bias。如果你对如何使用这些工具感到好奇,请关注我关于这些神奇工具的下一篇教程。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
美国之于加拿大,就像汉堡之于 _?
towardsdatascience.com](/how-to-solve-analogies-with-word2vec-6ebaf2354009) [## 如何找到和 Python 很好的搭配
给定个人偏好,如何匹配使得总偏好最大化?
towardsdatascience.com](/how-to-match-two-people-with-python-7583b51ff3f9) [## 如何用 Faker 创建假数据
您可以收集数据或创建自己的数据
towardsdatascience.com](/how-to-create-fake-data-with-faker-a835e5b7a9d9) [## 凸包:包装数据的创新方法
如何利用包装算法实现数据可视化
towardsdatascience.com](/convex-hull-an-innovative-approach-to-gift-wrap-your-data-899992881efc) [## 如何用 Altair 创建交互式剧情
在 5 行简单的 Python 代码中利用您的数据分析
towardsdatascience.com](/how-to-create-interactive-and-elegant-plot-with-altair-8dd87a890f2a)
如何在 Docker 容器中挂载目录
专注于编写代码,无需担心环境管理

马克斯·威廉姆斯在 Unsplash 上的照片
它在我的机器上工作;那么让我们运送你的机器吧!简而言之,那就是码头工人。它允许我们通过使用容器化技术在任何计算机上运行 Docker 映像中的应用程序。Docker 容器是一个基础 OS ( alpine 、 ubuntu 等)的包。)和其他必要的软件依赖项,您可以在 docker 映像中定义它们。现在,您可以使用该映像创建一个容器,在不同的机器上运行您的应用程序,甚至在云平台上运行( AWS 、 GCP 、 Azure 等)。)而不用担心环境管理(开发、测试和生产)。
Docker 因其可移植性、安全性和性能而成为 DevOps 的流行工具之一。在这篇文章中,您将学习 Docker 的一些基本概念和命令,它们将教您如何在 Docker 容器中挂载一个目录。我几乎每天都使用 Docker 进行本地开发——例如,你可以在这里看到我是如何为一个个人项目Docker 化一个 Ruby on Rails 应用程序的。
设置
首先,你需要安装 Docker 。出于演示的目的,我们将使用预先构建的 Ruby 和 macOS 的官方映像。
- Docker Image: 这是一个包含创建容器指令的模板。
- Docker 容器:容器是图像的运行实例。
docker run命令用于从图像运行容器。这里我们使用 ruby 映像创建容器,但是您也可以使用自己的映像。如果主机上不存在 ruby 映像,Docker 将从 Docker Hub 中获取该映像。一旦下载到本地机器上,Docker 将使用相同的映像来连续创建容器。要装载一个卷,只需在终端中运行以下代码:
docker run -v /host/directory:/container/directory
现在,您将在容器的脚本文件夹中挂载脚本文件夹。这是最佳实践,因为您不必担心不同机器上的环境管理。
docker run -it --rm -v $HOME/Desktop/scripts:/scripts --name scripts ruby bash
标志-i -t(通常写为-it)用于以交互模式访问容器。--rm标志(可选)在您退出或停止容器以释放系统资源(CPU、内存)时移除容器。如果您在停止或退出容器后不使用它,如果您想释放磁盘空间,必须手动删除它。-v标志用于挂载一个主机文件夹,它由冒号分隔的两个字段组成。第一部分是主机中的路径。第二部分是容器中的路径。
-v /host/directory:/container/directory
--name标志(可选)用于给容器一个特定的名称。如果你不想提供一个,Docker 会随机分配一个名字,所以如果你想更容易地跟踪你的容器,你可以选择一个。ruby命令用于加载图像。如果你想使用 Ruby 的2.5版本,使用ruby:2.5命令。
docker run -it --rm -v $HOME/Desktop/scripts:/scripts --name scripts ruby:2.5 bash
最后但同样重要的是,bash命令用于获取容器内部的 bash shell。

在 Mac 上运行
要运行 python 代码,请使用 Python 映像。
docker run -it --rm -v $HOME/Desktop/scripts:/scripts --name scripts python bash
停止和移除容器
正如我在上面解释的,如果您想要释放系统资源和磁盘空间,您需要停止并删除容器。您可以在主机上运行docker ps命令来查看正在运行的容器列表。要停止容器,使用带有容器 id 或容器名称的docker stop命令。您可以使用-a标志来查看所有停止或退出的容器。
docker stop d61f09eb42ad
# or
docker stop scripts

docker ps VS docker ps -a
要手动删除容器,请使用以下命令之一。
docker rm d61f09eb42ad
# or
docker rm scripts
移除图像
如果您想要删除一个图像来释放磁盘空间,例如,您刚刚创建的 Ruby 图像,使用docker rmi命令。但是首先,让我们试着去理解引擎盖下到底发生了什么。为此,我们将使用docker images和[docker system df](https://docs.docker.com/engine/reference/commandline/system_df/)命令来显示 Docker 守护进程的磁盘空间使用信息。docker images命令列出您机器上的所有图像。

在这种情况下,我的机器上有三个图像

一个活动容器正在使用一个活动图像
[docker system df](https://docs.docker.com/engine/reference/commandline/system_df/)命令告诉我,我只能要求 65%的磁盘空间,因为我仍在运行脚本容器,而该容器正在使用 ruby 映像。如果您添加剩余的两个映像,您将获得 65%的可回收磁盘空间。
933MB (python) + 643MB (java) = 1.576GB (65%)
好了,通过在停止容器后运行[docker system df](https://docs.docker.com/engine/reference/commandline/system_df/)命令,告诉我们现在可以要求 100%的磁盘空间。

没有活动容器和活动图像
请注意,如果您试图删除一个容器正在使用的图像,您会得到以下错误。
Error response from daemon: conflict: unable to delete 121862ceb25f (cannot be forced) - image is being used by running container d61f09eb42ad
最后,我们可以使用带有图像 id 的docker rmi命令来删除图像。
docker rmi 121862ceb25f
# remove multiple images by putting a space between them
docker rmi efdecc2e377a d23bdf5b1b1b
包裹
现在您知道了如何在 docker 容器中挂载一个目录。Docker 极大地帮助了我在多台机器上轻松创建本地开发环境,而无需任何额外的努力和时间。这是一项你想放在包里的技能,无论是为了个人还是工业目的。我希望这能帮助你开始接触 Docker 的神奇世界。

GIF by GIPHY
根据吴恩达的观点,如何在机器学习的职业生涯中导航

约瑟夫·巴里恩托斯在 Unsplash 上拍摄的照片
报告的
了解如何在机器学习领域取得成功
“找一份你不会厌倦的工作”
介绍
今天,许多人都希望以某种形式参与人工智能(AI)。你不能责怪他们。AI 是很多行业的未来。
对许多人来说,进入人工智能领域的直接途径是在机器学习(ML)领域寻求职业生涯。
因此,这篇文章涵盖了 YouTube 上众多斯坦福讲座之一吴恩达的教导。
更具体地说, Andrew 为你如何在机器学习的职业生涯中成功导航提供了极好的建议。
在本文中,我将为您提供以下内容:
- 如何在机器学习领域找到工作
- 招聘人员和员工在他们的理想候选人身上寻找什么
- 成功人工智能实践者的模式
- 如何选择工作
- 导航机器学习职业的错误方法
这篇文章与大多数处于职业生涯不同阶段的机器学习从业者相关。
方向

在完成学术研究后,机器学习学生通常会从事机器学习工作,或者以博士的形式进行进一步的研究。
拿我来说,在获得机器学习硕士学位后,我很快就进入了一个 ML 角色。通常情况下,人工智能角色存在于两种类型的公司中:要么是大型科技公司,如脸书、谷歌,要么是年轻、令人兴奋的初创公司。
安德鲁提到的一件事是,无论你选择哪个方向,你都必须确保你进行的是重要而有意义的工作。我将在本文后面详述安德鲁提到的重要而有意义的工作。
但是首先,让我们先弄清楚如何找到一份工作。
如何找到工作

机器学习领域的工作竞争非常激烈,但你已经知道了。
你可能没有意识到招聘人员和员工在他们理想的候选人身上寻找的品质和技能。
Andrew 拥有多年在人工智能团队中工作的经验,并领导过大大小小公司的团队。
“作为谷歌大脑团队的创始领导者,斯坦福人工智能实验室的前主任,以及百度约 1200 人人工智能团队的总领导者,我有幸培养了许多世界领先的人工智能团队,并开发了许多人工智能产品,供数亿人使用。”—吴恩达
现在,安德鲁建议招聘人员在招聘人工智能角色时应该寻找什么:
1.编码/技术技能
机器学习研究工作要求个人至少具有已经获得的平均水平的技术技能。
你一般的程序员都懂两到三种编程语言,都是中级水平。
机器学习从业者往往拥有编程技能,并被期望能够理解一套常用的编程语言,如 Python 、 Java 、 JavaScript 和 R 。
你可能会问,为什么你需要掌握这么多种语言的实用知识。
嗯,作为一名计算机视觉工程师,我在三种不同的编程语言之间周旋。我用 Python 实现模型( TensorFlow ),写脚本;我还使用 javascript 来实现模型( tfjs ),最后,我将模型和计算机视觉技术集成到 iOS 应用程序中,因此我利用 Swift 语言来开发 iOS 应用程序。
2.回答技术问题的能力
在你的简历被审核后,你就进入了面试的下一阶段,接下来的阶段通常是电话面试和现场面试。
在两个面试阶段,你都可以期待被问到机器学习相关的话题。期望解释梯度下降变量之间的差异;或者新颖的神经网络结构的独特特征是什么。
3.理论知识的实际应用
你可能已经在某种形式的学术机构呆了几年或更长时间,习惯了大学和学院采用的基于理论的考试方法。
另一方面,招聘人员正在寻找优秀的候选人,他们不仅理解机器学习中的主题理论,而且可以适当地应用概念、技术和想法。
例如,确保你在概念层面上理解批量标准化的描述和好处,但是为了在招聘人员面前脱颖而出,一定要准备好 Jupyter 笔记本或 GitHub repos,记录你使用批量标准化的地方。
方项目
证明你理论知识应用的一个实用方法是在你的文件夹里有两个或更多的副业项目。兼职项目是你展示技术、创造力和解决问题能力的为数不多的机会之一。
4.不断学习的能力
一些传统的角色不需要你更新你所在领域或行业的知识。
在机器学习中,这是完全相反的,新技术每天都在开发,更多的工具和库每周都在更新,大量的研究论文每月都在发表。
在机器学习中,你永远不会停止学习。我目前参与了深度学习领域,并利用了研究和开源项目中的技术。然而,通常情况下,有一种新的闪亮的神经网络似乎已经推动了特定计算机视觉任务的前 5 名精度,并且现在是最新的艺术技术。
招聘人员和雇主希望看到你不会满足于一个角色而停止求知。机器学习从业者通常处于人工智能行业新兴技术的前沿。
成功人工智能实践者的模式

照片由 Iswanto Arif 在 Unsplash 拍摄
人工智能是一个包含其他子领域的领域,如机器学习、自然语言处理、语音识别、神经网络、计算机视觉、图像处理和许多其他子领域。
根据 Andrew 的说法,工作角色的最强候选人和成功的人工智能实践者都有一个跨越人工智能子领域的“T”形学习方法。
这意味着他们在人工智能的大多数子领域都有广泛的知识,在少数领域有深入的知识。
以我自己为例,我从事了机器学习、计算机视觉和机器人学方面的高级研究。通过学习,我获得了人工智能一些关键子领域的基础知识。通过我的论文、个人项目和职业道路,我专注于三个主要领域,即计算机视觉、自然语言处理和深度学习。
学术机构将通过引入跨子领域的基础知识来进行机器学习的教学。他们将为学生提供通过选修课、论文和课程作业获得深入知识的能力。
下面是我大学毕业后,开始我的 pwn 项目和职业生涯后,我的 T 形知识路径的例子。
在完成了我在 ML,CV 和机器人学硕士学位的所有必修课程后,我获得了人工智能主要子领域的基础知识。

大学毕业后的 AI 领域知识
随着我完成论文并在职业生涯中继续前进,我的学习道路已经成型为你在下面看到的 T 形路径。
我的专业是深度学习,这是计算机视觉的一个子领域。
碰巧你在神经网络,机器学习,NLP(图像字幕)和图像处理方面学到了更多的知识,这是子领域重叠和有相关主题的结果。
就个人而言,在我认为自己是深度学习和计算机视觉专家之前,我还有很长的路要走。

AI 领域知识完成后的学位论文和职业生涯开始
深入的知识
我已经多次提到“深入的”知识,但是它意味着什么和包含什么。根据 Andrew 的说法,深入的知识由以下因素指导和定义:
- ✅项目
- 开源捐款✅
- 研究✅
- 实习✅
再说一次,在特定的子领域从事个人项目会加深你的知识和专长。这不仅会让你成为一名成功的人工智能实践者,而且你更有可能被考虑担任更多的人工智能角色。
如何选择工作

塞萨尔·阿布纳·马丁内斯·阿吉拉尔在 Unsplash 上的照片
安德鲁认识到这样一个事实,即具有机器学习专业知识的个人是有需求的。
这一事实可能会使大量的选择对一些人来说是一种相当紧张的经历,而对另一些人来说,这可能会导致做出错误的决定。
下面的陈述和列表来自安德鲁对他的学生的建议,关于他们应该如何选择工作来拥有一个快乐而有意义的职业生涯。
在一个好的团队中工作
在他的讲座中,Andrew 专注于他认为个人在选择工作角色时需要考虑的具体要点和提示,他关注的一个特定领域是选择优秀的团队。
在选择团队时,您需要考虑一些因素,它们是:
- 互动
- 沟通
- 成长。
安德鲁建议,你应该在一个团队中工作,在那里你可以很容易地与其成员互动。通常,这样的团队包含(10-30)个人。他建议你应该关注团队有多努力,以及他们的个性和职业道德是否能对你产生积极影响。
团队中的个人往往是你大部分时间与之相处的人。根据行为研究,你最终是和你相处时间最长的五个人的平均值。
了解你的角色
在决定接受一个提供的角色之前,确保你了解你将要从事的工作。
通常情况下,职位公告栏上的职位描述并不能反映实际工作中的角色和职责。
有时候,工作岗位上的责任被过分夸大了,这会导致失望。
其他时候,招聘广告低估了新员工被期望承担的工作量,这可能会导致职业生涯过早耗尽精力。
避免失望和筋疲力尽的最好方法是直接与你的上司交谈,了解对任务和交付时间的期望。
此外,与类似角色的团队成员交谈,询问他们日常活动中的问题。
忽略公司
当安德鲁第一次提到忽略你正在考虑工作的公司时,我有点困惑。但是经过进一步的澄清,这个信息变得清晰了。
公司拥有外部声誉和认可度,这通常被称为公司的品牌。公司的品牌一般是公司如何向外界传达自己。这样做的问题是,你通常只会向外界展示你最好的一面,这让你在选择公司时的决定有点偏差。
正如 Andrew 所说,从一般经验来看,一家公司的品牌与你在该公司的个人经历的相关性很弱。
在选择人工智能的角色时,团队的考虑比公司的选择更重要。在选择工作行业时,也可以这么说。
简单来说,石油公司和医疗中心的图像分类机器学习项目之间的差异只是用于训练 ML 模型的数据集及其应用的问题。ML 技能可以跨行业转移。
对工作机会感到兴奋,并考虑长期目标。

卢克·斯塔克波尔在 Unsplash 上拍摄的照片
人类是受到内部和外部因素激励的生物,当两者都缺乏时,我们就会开始后悔、担忧,在某些情况下,会进入抑郁状态。
安德鲁直截了当地说:
在找一份你不会厌倦的工作。
我真的很喜欢安德鲁关于为什么过早扮演一个角色不一定是最好的主意的演讲。
利用他学生的个人轶事和经验,使他所有的观点和关注非常相关。
在我找工作的时候,我拒绝了几份看起来不错的工作,但是需要一定程度的个人牺牲,这是我不愿意接受的。
此外,我拒绝的一些角色可能在短期内听起来很棒,但看看我在未来十年的职业生涯中想要达到的目标,它们并不是最佳选择。
我渴望成为一家成功公司的人工智能领导者,这要求我比平常更快地投身其中。因此,在一个大团队中,我的知名度很低,没有明显的影响,对我来说不是最好的选择。然而,在一家为我提供自主权和学习环境的初创公司工作(更像是)意味着我的职业发展和成长会加快。
一般来说,选择一个最适合你个人目标和长期发展的角色。
机器学习生涯的错误导航方式

做一个万事通
人工智能是一个不一定值得成为“万金油”的领域,这意味着在人工智能的所有子领域都拥有浅薄的知识并不是确保你在人工智能或机器学习领域拥有长期成功职业生涯的最佳方法。
从长远来看,注意获得深入的知识是有回报的,尤其是在像人工智能这样的领域,规范往往是首选。
没有耐心
我为没有耐心而感到内疚,但老实说,在机器学习这样一个快速发展的领域,你几乎会觉得自己吸收信息的速度不够快。
但是,通过对拥有长期成功职业生涯的个人进行更深入的观察,我意识到,在任何人工智能子领域中建立真正的技能、专长和知识都需要时间。
也就是说,我们这一代人习惯于即时满足,获取知识的速度也是我们渴望看到快速、切实结果的受害者。
没有真正的实质性项目
在整篇文章中,拥有一个辅助项目的要求被认为对你的机器学习生涯有很多好处。兼职项目的问题在于,它们必须足够强大,以展示打动外部评审所需的技能水平。能够创建具有这种影响力的附带项目需要大量的努力和时间。
因此,拥有 10 个平庸的副业项目并不比完成 2-3 个真正有影响力的项目更好,并能很好地展示你的技术能力。
安德鲁认为,在这件事上,质量胜于数量。
结论
Andrew 的讲座以关注有助于个人在机器学习领域获得成功和长期职业生涯的关键要素而结束;它们是:
- 确保在促进学习的环境中工作
- 确保你正在以一种积极的方式从事对他人的生活有意义的项目和任务。一般而言,在提高他人生活质量的领域内开展业务。
- 做出有助于你个人目标的决定,这将为你的长期成功奠定基础。
我在看讲座和写这篇文章中学到了很多,我希望你能从这篇文章中得到一两个可操作的项目。如果你有任何其他的提示和建议想分享,那么我邀请你使用评论区。
[## 根据吴恩达(斯坦福深度学习讲座),你应该如何阅读研究论文
关于如何通过知名人士发表的研究论文获取知识的指导。
towardsdatascience.com](/how-you-should-read-research-papers-according-to-andrew-ng-stanford-deep-learning-lectures-98ecbd3ccfb3) [## AlexNet 给深度学习世界带来了什么
花一分钟来了解琐碎的技术和神经网络架构,革命性的如何深入…
towardsdatascience.com](/what-alexnet-brought-to-the-world-of-deep-learning-46c7974b46fc)
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
- 订阅我的 YouTube 频道 了解即将推出的视频内容
- 跟着我上 中
- 在 LinkedIn 上连接并联系我
如何中和量子安全威胁
随着量子计算的加速,我们可能会面临对当今安全协议的巨大威胁。为了找到解决办法,我们需要迅速行动。

如果我们想免受量子计算机的攻击,我们需要快速行动。在 Unsplash 上拍摄的 ThisisEngineering RAEng
一种新型计算机有可能打破当今的安全协议,不管它有多复杂。量子计算机正处于成熟的边缘,它们非常强大,可以在几分钟内解决复杂的数学问题,而传统计算机需要几千年才能解决。
解决这些问题有助于在人类努力的每个领域取得巨大进步,从揭开宇宙的奥秘到改进金融工具到在癌症研究中找到突破。不幸的是,它们也是今天的加密方法所依赖的那种问题。如果量子计算机能够解决这些问题,它们也可以侵入互联网上的任何账户。
专家们一致认为,量子计算达到这一点还需要几年时间,甚至可能超过十年。这些新机器将需要能够部署数百万个量子位来破解今天的密码。在这种情况下,谷歌最近在 2019 年末建造的具有 53 个量子位的量子计算机听起来微不足道。
谷歌机器的量子体积为 32,量子体积是衡量量子计算能力的指标。到 2020 年 6 月,霍尼韦尔宣布已经将他们自己机器中的量子容量增加了一倍,达到 64。两个月后, IBM 也达到了那个里程碑。
有了这些进步的迹象,专家预计量子用例,如医学、金融或其他领域的研究模拟,最早将于 2022 年出现。成熟的应用程序应该在 2026 年投入使用,量子计算的商业应用应该在 2030 年普及。
这些预测还意味着,到这个十年结束时,我们今天使用的几乎任何加密技术都可能是无用的。在最糟糕的情况下,一个不负责任的量子计算先锋可能会闯入政府、企业或全球组织的系统,造成严重破坏。
在这种情况下,人们生活所依赖的 IT 系统,如电力网络、医院资源、物流供应链和许多其他系统可能会在几秒钟内停机。尽管这样的未来仍需数年才能实现,但我们必须现在就开始努力,防止这一威胁成为现实。我们需要考虑建立比量子计算机更聪明的加密技术,这样我们就可以获得这些机器的好处,而不会让它们危及我们的安全。
在技术成熟的边缘,初创公司正在将量子计算推向下一个阶段。但这是一场革命还是泡沫?
towardsdatascience.com](/will-we-see-a-quantum-computing-revolution-a16b6d677308)
当今的安全协议
自达芬奇密码时代以来,加密的基本原理就没有改变过:在算法的帮助下,一条信息被转换成胡言乱语。当消息到达它的目的地时,它通过反向使用相同的算法被解密。
例如,我可以通过将字母表中的每个字母向后移动四位,并转换大写和小写来加密短语“达芬奇密码”。由此产生的乱码将是“高清 zMRGM GSHI。”为了确保接收者理解消息,我需要告诉他们解密密钥是什么:再次转换大写和小写,并将字母表中的每个字母上移四位。
当然,这是一把非常简单的钥匙,一个 10 岁的孩子只要有足够的雄心就能打开它。今天的 IT 系统使用复杂得多的数学公式。这些密钥以位的形式存储,就像传统计算机上的任何东西一样。有了这些复杂的公式,即使是今天的超级计算机——已经比今天的量子计算机慢了数万倍——也无法破解你在手机上发送的无聊短信。更重要的是,他们无法破解你的银行账户和其他所有可能存储敏感数据的地方的密码。

使用量子计算机,今天的加密密钥可以更快地被破解。 LinkedIn 销售导航员在 Unsplash 上的照片
量子威胁
如果你想破解私钥,你需要尝试每一种可能的位组合。由于每一位都可以取两个值,要么是 0,要么是 1,所以一个比另一个长一位的键将有两倍多的可能值。因此,有了一把多一点的钥匙,你将需要两倍的时间来尝试所有的可能性,直到你找到正确的。
Grover 的算法是量子密码术的重要元素,它预测量子计算机破解私钥的时间将是经典计算机的一半。但这意味着反应很直接。只要将所有私钥的长度增加一倍,您就恢复了旧的安全级别。
真正的问题是,您可以使用公钥从数学上计算私钥。公钥是公开的。对于经典计算机来说,如果公钥很长,例如 2048 位,执行这种计算就非常困难。但是未来的量子计算机可以在几个小时内从公共密钥中获得私人密钥。肖尔的算法提供了一个可能的途径,原因很简单,量子计算能力如此强大。
想象一下,如果一个外国特工计算出美国政府系统的密钥,会发生什么。使这个问题变得更糟的是,今天的 IT 系统经常依赖于共享架构。因此,当黑客侵入一个系统时,他们可能会进入更多的系统。
在亚原子水平上,我们所知道的关于经典物理学的每一件事都破裂了,不仅仅是小幅度的破裂,而是大规模的破裂…
towardsdatascience.com](/quantum-computing-explained-a114999299ca)
迄今为止的反应
美国政府意识到了量子计算对密码学造成的威胁。2018 年,白宫发布了量子信息技术的国家战略,其中包括关于量子安全的目标。国会随后通过了国家量子倡议法案,该法案要求总统也要了解该领域的发展。此外,该法案让国家标准与技术研究所(NIST)负责检查量子开发,特别是量子网络安全。
NIST 认真对待自己的角色:到 2022 年,它的目标是为后量子密码术发布一套新的标准。这些标准将包括甚至量子计算机都无法破解的算法。幸运的是,我们已经知道许多不同的可能有效的方法。来自不同公司的研究人员,如 IBM 、微软和谷歌,已经提交了他们的算法,现在正在审查中。一旦这套标准公之于众,量子安全密码术将需要包含在网络浏览器、应用程序以及企业和政府部门的所有 IT 系统中。
这一发展听起来好像美国正在为量子计算时代的到来做准备。但是这种反应越早越好:在医疗保健、卫星、运输和工业控制等领域,IT 系统的寿命可以持续几十年。在最后一刻更新这些系统以实现后量子安全既昂贵又危险。这就是为什么在量子计算到来之前准备好这些标准是至关重要的。

我们需要在开发量子安全加密技术上有所创新。照片由克里斯蒂娜@ wocintechchat.com在 Unsplash 上拍摄
政府仍然需要做什么
向总统和其他政府官员提供量子安全方面的建议,让 NIST 负责安全协议,无疑是迈向安全未来的极其重要的步骤,但我们不能止步于此。与人工智能一样,成立全球委员会监督技术的发展,并制定一系列指导进一步发展的原则,将是一项重要举措。这一战略还将加强国际合作,并激励所有参与者不要利用未来的安全漏洞。
正如世界经济论坛建议的那样,我们还需要在政府官员中建立所谓的量子素养。这种培训会让他们减少对持续建议的依赖,并让他们更快地做出根本性的决定。然而,这一指导方针不仅仅适用于政府。企业领导人也应该精通量子技术。
最后,像 NIST 那样建立一套标准是不够的。即使政府和企业领导人意识到了这一威胁,他们也可能很晚才采用后量子加密,甚至可能为时已晚,因为这在他们的优先事项列表中还不够高。因此,我们需要考虑为早期采用新的安全协议设置激励措施,例如通过税收优惠或美国政府的特别拨款。
企业需要做什么
对于企业来说,除了培训领导和采用安全协议之外,还有一些重要的准备步骤。企业应该致力于让他们的整个基础设施和他们的产品加密敏捷,也就是说,一旦新的安全协议可用,就能够采用它们。
实现这一点的一个方法是使用一个证书管理平台,提醒用户证书即将到期,并帮助实施新的证书。记录你的努力将有助于你和你的员工了解你在后量子安全的学习曲线上的位置。此外,您应该检查任何合作企业是否也保持最新的安全性。
如果你的软件有很长的生命周期,投资量子安全的硬件安全模块也是值得的。这些模块是特殊的硬件部件,即使在面临量子攻击时,也能保证加密密钥的安全。一些已经可以从像 Ultimaco 和 ISARA 这样的公司买到。
此外,公司应该接受 SSL 永远在线的原则,即使没有量子威胁。这意味着,除了别的以外,员工只能访问 HTTPS 的网站,并确保你的通信更难被破解。这一过程最终不会防止量子威胁,但它会让量子计算机更难拦截你的连接。
最后,确保您定期测试您的安全策略,并在必要时进行调整。这包括在白帽黑客试图闯入的虚拟环境中定期测试您的 IT 系统。这在短期内可能看起来昂贵且不必要,但它是值得的,因为可以提前发现并修复安全风险。
了解量子计算,它背后的物理和数学,基本量子电路的基础,以及更多…
towardsdatascience.com](/the-ultimate-beginners-guide-to-quantum-computing-and-its-applications-5b43c8fbcd8f)
不要惊慌,做好准备
和大多数最坏的情况一样,量子安全末日并不是所有情况中最有可能发生的。美国政府在后量子安全领域投入巨资,顶级科技公司参与新协议的开发,这一事实令人欣慰。尽管如此,你不应该假装威胁对你来说不存在。
根据 TechRepublic 的调查,71%的全球组织将量子计算视为主要威胁,95%的组织表示他们正在讨论至少一种策略来保护自己免受危险。超过一半的组织,确切地说是 56 %,已经开始投资后量子加密技术。
他们这样做是对的。即使破解密码的量子计算机还有几年的时间,如果我们现在不采取行动,其影响可能是相当灾难性的。
本文原载于 内置 。
如何不部署 Keras/TensorFlow 模型
以及如何使用模型服务器来实现智能化

火箭发射失败—www.pikist.com
虽然大多数关于深度学习的文章都集中在建模部分,但关于如何将这种模型部署到生产中的文章也很少。他们中的一些人说“生产”,但是他们经常简单地使用未优化的模型并将其嵌入 Flask web 服务器。在这篇文章中,我将解释为什么使用这种方法不能很好地扩展并且浪费资源。
“生产”方法
如果您搜索如何将 TensorFlow、Keras 或 Pytorch 模型部署到生产中,有很多好的教程,但有时您会遇到非常简单的例子,声称生产就绪。这些例子经常使用原始的 keras 模型,一个 Flask web 服务器,并将其封装到 docker 容器中。这些例子使用 Python 进行预测。这些“生产”Flask 服务器的代码如下所示:
from flask import Flask, jsonify, request
from tensorflow import keras
app = Flask(__name__)
model = keras.models.load_model("model.h5")
@app.route("/", methods=["POST"])
def index():
data = request.json
prediction = model.predict(preprocess(data))
return jsonify({"prediction": str(prediction)})
此外,他们经常展示如何封装 Flask 服务器,并将其与您的模型捆绑到 docker 中。这些方法还声称,它们可以通过增加 docker 实例的数量来轻松扩展。
现在让我们回顾一下这里发生了什么,以及为什么它不是“生产”级的。
没有优化模型
首先,通常模型按原样使用,这意味着示例中的 Keras 模型只是由 model.save()导出。该模型包括所有参数和梯度,这些参数和梯度是训练该模型所必需的,但不是推断所必需的。此外,该模型既不修剪也不量化。因此,使用未经优化的模型会有更高的延迟,需要更多的计算,并且文件也更大。
B5 Efficientnet 示例:
- h5 keras 型号:454 兆字节
- 优化的张量流模型(无量化):222 兆字节
使用 Flask 和 Python API
下一个问题是使用普通 Python 和 Flask 来加载模型和提供预测。这里有很多问题。
首先让我们看看您能做的最坏的事情:为每个请求加载模型。在上面的代码示例中,当调用脚本时使用模型,但是在其他教程中,他们将这一部分移到了预测函数中。这就是每次你做预测的时候都要加载模型。请不要这样做。(这里的比较不能与那种方法相比)
话虽如此,我们还是来看看 Flask。Flask 包含一个强大且易于使用的 web 服务器用于开发。在官方网站上,你可以读到以下内容:
虽然轻量级且易于使用, Flask 的内置服务器不适合生产,因为它没有很好的扩展性。
也就是说,你可以在谷歌应用引擎中使用 Flask 作为 WSGI 应用。然而,许多教程并没有使用 Google App Engine 或 NGIX,他们只是照原样使用它,并将其放入 docker 容器中。但是,即使他们使用 NGIX 或任何其他 web 服务器,他们通常也会完全关闭多线程。
让我们更深入地研究一下这个问题。如果您使用 TensorFlow,它会为您处理计算资源(CPU、GPU)。如果加载模型并调用 predict,TensorFlow 将使用计算资源来进行这些预测。发生这种情况时,资源正在使用中,也就是被锁定。当您的 web 服务器当时只服务于一个请求时,您就没事了,因为模型是在这个线程中加载的,predict 是从这个线程中调用的。但是一旦您同时允许多个请求,您的 web 服务器就会停止工作,因为您无法从不同的线程访问 TensorFlow 模型。也就是说,在这个设置中,您不能一次处理多个请求。听起来不像是可扩展的,对吧?
示例:
- Flask 开发 web 服务器:1 个并发请求
- TensorFlowX 模型服务器:并行度可配置
用 docker 扩展“低负载”实例
好吧,web 服务器不能扩展,但是扩展 web 服务器的数量呢?在很多例子中,这种方法解决了单个实例的伸缩问题。没什么好说的,它确实有效。但是以这种方式扩展会浪费金钱、资源和能源。这就像有一辆卡车,放入一个包裹,一旦有更多的包裹,你会得到另一辆卡车,而不是更聪明地使用现有的卡车。
延迟示例:
- 长颈瓶服务如上所示:每张图片约 2 秒
- Tensorflow 模型服务器(无批处理,无 GPU):每个图像约 250 毫秒
- Tensorflow 模型服务器(无批处理,GPU):每个图像约 100 毫秒
不使用 GPU/TPU
GPU 使深度学习成为可能,因为它们可以大规模并行进行操作。当使用 docker 容器将深度学习模型部署到生产中时,大多数例子都没有利用 GPU,他们甚至没有使用 GPU 实例。每个请求的预测时间在 CPU 机器上要慢得多,所以延迟是一个大问题。即使使用强大的 CPU 实例,您也无法获得与小型 GPU 实例相当的结果。
只是一个旁注:一般来说,如果主机安装了正确的驱动程序,在 docker 中使用 GPU 是可能的。Docker 完全可以放大实例,但是要放大正确的实例。
成本示例:
- 2 个 CPU 实例(16 核,32gb,1.4x 大):0,816 美元/小时
- 1 个 GPU 实例(32G 内存,4 个内核,Tesla M60,g3s . xlarge):0.75 美元/小时
已经解决了
如您所见,加载训练好的模型并将其放入 Flask docker 容器并不是一个优雅的解决方案。如果你想在生产中进行深度学习,从模型开始,然后考虑服务器,最后考虑扩展实例。
优化模型
不幸的是,优化推理模型并不像它应该的那样简单。但是,它可以轻松地以倍数减少推理时间,所以毫无疑问是值得的。第一步是冻结重量,去除所有的训练开销。这可以通过 TensorFlow 直接实现,但如果您来自 Keras 模型,则需要将您的模型转换为估计量或 Tensorflow 图(保存的模型格式)。TensorFlow 本身对此有一个教程。为了进一步优化,下一步是应用模型修剪和量化,其中不重要的权重被移除,模型大小被减小。
使用模型服务器
当你有一个优化的模型时,你可以查看不同的模型服务器,这意味着生产中的深度学习模型。对于 TensorFlow 和 Keras,TensorFlowX 提供了 tensorflow 模型服务器。还有其他像 TensorRT,Clipper,MLFlow,DeepDetect。
TensorFlow 模型服务器提供了几个特性。同时为多个型号提供服务,同时将开销降至最低。它允许您对模型进行版本化,在部署新版本时无需停机,同时仍然能够使用旧版本。除了 gRPC API 之外,它还有一个可选的 REST API 端点。吞吐量比使用 Flask API 高很多,因为它是用 C++编写的,并且使用多线程。此外,您甚至可以启用批处理,在这种情况下,对于非常高的负载设置,服务器会将多个单个预测批处理为一批。最后,您可以将它放入 docker 容器中,并进一步扩展。
提示:tensorflow_model_server 在每个 AWS-EC2 深度学习 AMI 映像上都有,有了 TensorFlow 2 就叫 tensorflow2_model_server。
使用 GPU 实例
最后,我建议在推理环境中使用 GPU 或 TPU。这种加速器的延迟和吞吐量要高得多,同时节省了能源和资金。请注意,只有当您的软件栈能够利用 GPU(优化模型+模型服务器)的能力时,它才会被利用。在 AWS 中,您可以查看弹性推理或只使用 Tesla M60 (g3s.xlarge)的 GPU 实例。
最初发布于 digital-thnking.de







浙公网安备 33010602011771号