如何在媒体上嵌入交互式图形
了解如何使用 Datawrapper 在中型帖子上嵌入交互式图形
在 Unsplash 上由 Carlos Muza 拍摄的照片
作为数据科学家,我们喜欢好的图表。有数不清的编程软件包致力于数据可视化。仅在 Python 中,我们就有 bokeh、seaborn、Plotly、Geoplotlib 和许多其他库。图表是用数据讲述故事的一种很好的方式,当它们是交互式的时,它们甚至更加身临其境。在一些 web 空间中,可以通过 HTML 代码嵌入交互式图形,但 Medium 目前不允许这样做。但是你可以使用网络工具 Datawrapper 得到交互式图形。最重要的是,它完全免费使用。让我们来看看。
什么是 Datawrapper?
Datawrapper 是一个创建图表的在线工具。他们是一家德国公司,曾与包括《纽约时报》、《NPR》和《彭博》在内的一些重量级媒体合作。虽然 Datawrapper 对企业使用该工具收费,但对你我来说是完全免费的。不过,在开始使用该工具之前,您确实需要创建一个帐户。
如何创建交互式图表
让我们看一个简单的例子。我想看看“普遍基本收入”这个词在过去两年的搜索趋势。我将使用谷歌趋势下载这些数据。
作者截图
接下来,我从 CSV 文件中复制相关数据并粘贴到 Datawrapper 的接口中。在这一点上,我应该提到你可以添加来自一系列来源的数据,如下图所示。对于这个例子,我已经通过复制和粘贴我的数据做了最简单的事情。继续在界面中前进,直到到达发布和嵌入页面,使您的图形符合您的要求。
作者截图
要将互动图嵌入到你的 Medium 帖子中,复制 URL,*而不是 HTML 源代码,*并将其粘贴到 Medium 的草稿编辑器中。在你发表文章之前,这个图形是不会被交互的,所以现在不要担心它看起来像一个图像。一旦你发布,你会得到一个类似下图的数字。
作者 Gif
最终产品和一些分析
下面你可以看到我用 Datawrapper 生成的交互图。我选择以线形图显示数据,但是 Datawrapper 提供了饼图、条形图和许多其他类型的图形。它也完全归因于在媒体上的使用。
作者交互式图表
从图中,我们可以看到,在 2020 年 3 月左右,谷歌中的搜索词“普遍基本收入”出现了大幅飙升。这当然是在冠状病毒开始挤压英国和美国经济的时候,人们开始担心他们的财务前景。普遍基本收入是指国家定期给成年公民一定数量的钱。显而易见,当人们面临财务安全的不确定性时,这个想法会很有吸引力。
结论
Datawrapper 工具提供了一种在中型帖子上免费嵌入交互式图形的方法。以下是如何制作和嵌入交互式图形的简要概述。首先,创建一个帐户,并将您的数据上传到 Datawrapper。配置您的图表,并选择发布和嵌入选项。最后,将 URL 链接复制并粘贴到 Medium 的草稿编辑器中,然后按回车键。一旦故事被发布,该数字将变成交互式的。
如何让数据科学家在同一个项目中并行工作
让多名数据科学家同时从事同一项研究的 3 种有效方法
DayTwo 对与人类肠道微生物组相关的各种主题进行了深入研究。每项研究的结果都对未来的业务方向有重大影响,并广泛影响我们选择投入精力的路线。对我们来说,进入一个特定的业务问题需要优先回答的情况并不少见(这种情况在初创公司中经常发生)。无论是需要揭示潜在商业机会的特定商业问题,还是出于不同目的的高优先级研究,可以肯定的一点是,它需要在短时间内进行大量研究。
现在,你可能认为没有快速研究这回事,在大多数情况下,你可能是对的。但是这里我指的是这样一种情况,我们需要投入最少的精力去研究一些东西,以尽快回答一个具体的商业问题。通常,在这种情况下,我们会将多名数据科学家组成一个任务组来完成这项任务。
在本帖中,我们将介绍三种方法,它们可以帮助您的数据科学家在同一个研究项目中合作。
1)公用设施救援
就像每个建筑都需要坚实可靠的基础一样,您的团队需要一个设计良好的基础设施和一个可靠的实用程序库。通常,数据科学家倾向于编写大量的实用函数,从基本的数学和统计计算到复杂的文件处理和数据处理实用程序,在大多数情况下,建议将任何将被其他人使用的代码编写成共享库。
虽然团队成员之间共享代码可以提高团队的整体效率和满意度,但是知道如何将复杂的代码分解成更简单的模块可能会很棘手。过于简单的模块往往会闲置,而过于复杂的模块则不够灵活。
一个很好的经验法则是想象未来的项目,想想你希望在项目开始时已经有哪些模块,这些模块可能应该放入你的实用程序库中。
2)透明度和反馈
第二点是关于你的团队的透明度和对反馈的开放程度。
让我们从透明度开始,为了允许快速的研究执行,团队内部必须有一个开放的渠道,更新、状态、问题、成功、失败等可以在每个人之间流动。并行研究不能只和一个数据科学家一起工作,只做一个项目,偶尔更新,不分享胜利或失败。值得注意的是,并不是所有的数据科学家都喜欢与其他同行合作,他们中的许多人更喜欢成为自己任务的单一所有者,并对任务的成功负全部责任。
现在有了反馈,这是一个完全不同的故事,当谈到给予和接受反馈时,不是每个人都感到舒服。建设性的反馈和批评之间只有一线之隔——如此之薄,以至于即使是最小的不恰当的反馈也会被视为极具敌意。
为了在团队中允许反馈,每个人都应该采取坦诚的态度,这种态度允许给予和接受诚实的反馈,当事情不对劲时,人们觉得他们有责任说出来。
如果使用得当,反馈可以增强团队中所有人的专业能力和个人能力。当谈到并行研究时,在任务期间提供反馈对其成功至关重要。数据科学家应该得到反馈和审查,以便他们知道何时可以改进他们的工作流,团队领导并不总是在那里发现这些陷阱。
3)精神状态——我并不孤单
第三个要点涉及到一些起初可能被认为微不足道、太明显而不值得我们提及的事情,但它实际上非常重要,我们在这里谈论的是属于团队愿景的感觉。本质上,许多数据科学家只想解决你给他们的问题,他们会移动岩石和山脉,这样他们就可以获得解决他们面临的难题的惊人满足感。但是除非你想要一个由个人组成的团队,否则你需要创造一种对团队的归属感和责任感——在进行自我项目的时候。
达到这样一个点,即每个数据科学家在从事他的项目时都为共享库代码做出贡献,可以极大地提高您的团队在未来的交付能力,并增强对其他项目的责任感。
收场白
对于软件工程师来说,这叫做结对编程,对于数据科学家来说,这更像是结对研究。
最后,归结起来就是在为每个数据科学家分配一个独特的任务或为多个数据科学家分配一个单一的任务之间找到平衡。
无论是来自公司的约束还是团队成员的个人偏好,您都应该尝试看看我们上面提到的哪些方法更适合您的团队。
如果你想了解更多关于我们正在开发的最新最棒的产品,请随时联系我。
亚龙
如何使用 Python 编码分类列
机器学习模型读取的不是字符串而是数字。
马库斯·斯皮斯克在 Unsplash 上的照片
介绍
机器学习是从数据中提取模式的好方法。有了这个模式,我们可以从新数据中提取隐藏信息,甚至预测标签。在我们可以使用机器学习模型中的数据之前,我们需要首先清理数据。
现在存在的数据还不是干净的。可能存在的问题是缺少值、分布不均匀、单个列的格式不同,或者某些列不是数字格式。
机器学习模型读取数字。如果这些列不是数字,模型将捕捉到一个错误。此外,模型不会将这些列纳入建模过程。因此,我们需要将非数字列重新格式化为数字列。
本文将向您展示如何使用 Python 处理非数字或分类列。没有进一步,让我们开始吧!
履行
数据源
为了演示这一过程,我们将使用一个称为中风预测数据集的数据集。这是 fedesoriano 在 Kaggle 上创建的数据集。
该数据集描述了是否患有中风的人。此外,数据集包含与疾病相关的指标。该数据集属于监督学习问题,因为它包含一个人是否可能患有中风的标签。
您可以在这里 访问数据集 。
作者捕捉到的
现在让我们导入数据。为此,我们可以使用 pandas 库来处理我们的数据集。下面是导入和预览数据的代码:
从上面的数据集中可以看出,有些列已经是数字格式的了。它们是年龄、高血压和心脏病栏。此外,有些列不是数字格式,如工作类型、性别、居住类型和吸烟状态列。
现在,我们将关注非数字列。让我们根据数据类型来分离数据框。下面是这样做的代码和结果:
分离数据框后,让我们检查每一列的唯一值。您可以使用。检索列中不同值的唯一方法。下面是代码和结果预览:
根据上面的结果,两列有两个唯一的值。三列有两个以上的唯一值。为什么计算唯一值的数量很重要?因为我们将以不同的方式对列进行编码。
对于具有两个不同值的列,我们可以直接对该列进行编码。当一个列有两个以上的唯一值时,我们将使用 one-hot 编码。
使用标签编码对标签进行编码
在我们知道了每列的特征之后,现在让我们重新格式化列。首先,我们将用两个不同的值重新格式化列。它们是曾经结婚和居住类型列。为此,我们可以使用 scikit-learn 中的 LabelEncoder 对象对列进行编码。
现在让我们看看曾经结过婚这一栏。首先,我们将像这样初始化 LabelEncoder 对象:
之后,我们可以像这样将对象放入数据中:
现在我们可以将该列转换成数字格式,如下所示:
以下是我们运行代码后的结果,包括编码过程之前、之后和相反的过程:
干得好!我们已经对第一列进行了编码。现在让我们对下一列进行编码,这是“residence_type”列。
回想一下前面的代码,拟合和转换过程似乎是分开执行的。实际上,我们可以将这个过程与。fit_transform 方法。
下面是代码和结果:
使用一键编码对标签进行编码
不错!让我们转到具有两个以上不同值的列。有三列包含两个以上的唯一值。它们是性别、工作类型和吸烟状态列。为了处理这些列,我们将使用一种称为一次性编码的技术。
什么是热门编码?该过程将对列进行编码,并将其转换为矩阵。其中每一列表示该列中的每个不同值,每个单元格确定该值是否存在。
以下是一键编码流程的示例:
作者插图
为了实现这一点,我们将使用 scikit-learn 中的 OneHotEncoder 对象对这些列进行编码。
现在我们来看看性别一栏。首先,我们将像这样初始化 OneHoteEncoder 对象:
接下来,我们可以使用。fit_transform 方法来同时拟合和转换数据。代码如下:
哎呀,这里有一个错误。如果我们读取错误,它说有一个值错误。该函数需要一个二维数组作为输入。
要转换列的形状,我们可以使用。整形列的整形方法。但是我们需要首先将列转换为 NumPy 数组。为此,我们可以用 np.array 函数包装该列。
让我们重复这个过程!下面是一键编码过程之前、之后和之后的代码和结果:
有用!现在让我们将它应用到其他列,如 smoking_status 和 work_type 列。下面是一键编码过程的代码和结果:
干得好!现在您已经对所有的列进行了编码。
创建编码的数据帧
对这些列进行编码后,我们可以从中创建一个数据帧。对于每一列,我们将初始化 DataFrame 对象以创建 dataframe。然后,我们使用。concat 方法。下面是这样做的代码和结果:
与数字列数据框架组合
太好了!这些分类列已经是 dataframe 格式。现在让我们将它们与数字列结合起来。下面是这样做的代码和结果:
包装过程的技巧
哇,那是一个漫长的过程。实际上,有一个技巧可以让你只用一行代码就做到这一点。您可以使用一个名为。从熊猫图书馆拿假人做所有这些。
让我们回忆一下包含数据帧中所有分类列的 df _ categorical 变量。以下是对数据帧及其结果进行编码的代码:
现在让我们将它们与数字列结合起来:
简单吧?如果你时间不多,get_dummies 函数马上就能帮到你!
结束语
干得好!现在,您已经了解了如何使用 Python 对分类变量进行编码。我希望这篇文章能帮助你解决这个问题。因此,如果您从事这样的项目,下次就不必扔掉这些列了。
如果你对我的文章感兴趣,可以关注我的媒介,获取更多关于数据科学和机器学习的文章。如果你有任何问题或者想打个招呼,你可以在 LinkedIn 上联系我。
谢谢你看我的文章!
如何使用卷积神经网络将时间序列编码成用于金融预测的图像
罗姆尼耶佩兹(pixabay.com)
实践教程
在预测领域,有一个古老的问题,我看到的是一种趋势吗在统计学领域,有许多工具可以回答上述问题,并取得了不同程度的成功。然而,还没有一种方法能够实现数据预测领域最初的目标。查看由数据得出的图表,并从中得出结论。
然而,由于深度学习和人工神经网络,这种情况即将改变。
欢迎计算机视觉!
我偶然发现了意大利卡利亚里大学数学和计算机科学系的师生团队撰写的研究论文“深度学习和金融预测的时间序列到图像编码”。
在报告中,该团队提出了一种新的金融预测方法:将时间序列转换为图像,并使用卷积神经网络来识别视觉模式,从而对未来的市场走势进行预测。一项艰巨的任务。此外,上述方法可以应用于任何预测问题,并应在一定程度上的准确性,产生良好的结果。
这篇论文很吸引人,我强烈推荐你阅读,因为它深入研究了他们方法背后的数学,并将这种方法的长期表现与简单的买入-持有-卖出策略进行了比较。
不幸的是,它不包含任何代码,也没有提供任何数据来源。所以,我决定追根究底,对他们的工作进行逆向工程,并分享我的发现。
在进入我的过程之前,让我们解决一个基本问题:我们如何以一种有意义的方式可视化时间序列,以便我们可以用它训练一个深度学习模型?
让我们开始吧!
介绍格拉米角场!
格拉米角场(GAF)是在非笛卡尔坐标系中表示时间序列的图像(即,平面上的每个点由 X 和 Y 轴参考)。相反,坐标由极坐标系统映射(即,平面上的每个点由距参考点的距离和距参考方向的角度确定)。因此,每个 GAF 代表每个时间点之间的时间相关性。
由脚本生成的图像
要了解更多关于格拉米角度场的信息,请阅读马里兰大学的王志广和蒂姆·奥茨所著的《】使用平铺卷积神经网络 将时间序列编码为图像,用于视觉检查和分类。在论文中,他们深入研究了 GAF,并引入了将时间序列编码到图像中以训练卷积神经网络的想法。
预处理:
现在,让我们来看看数据。卡利亚里大学的研究人员使用了从 1999 年到 2015 年的五分钟间隔标准普尔 500 价格。不幸的是,我无法免费找到相同的数据,所以我使用了 IBM 年的股价。
数据是从这里的提取的,在我们使用它之前需要一些工作,因为一秒一秒的数据是杂乱的。该数据还包含发生在周末、节假日和非交易时间的交易活动,由于其可变性,这会给我们的模型带来噪声。
我们需要什么库:
我将用 Python 3.7 编写代码。您需要安装 requirements.txt 文件中的依赖项(在 repo 中)。最臭名昭著的是 Pyts(一个专门用于时间序列分类的 Python 包,这里用来将我们的时间序列转换成 GAFs 矩阵)。
让我们写一些代码!
我们需要一种方法来创建 GAF 图像,并将它们放在代表我们试图预测的两个类的目录中:Long 或 Short。
我将从编写助手方法开始。第一个工具读取我们的文件,并以一小时为间隔将数据分组。使用 Pandas Grouper 函数,我们可以按给定的时间-频率对数据进行分组,用零填充缺失的时间并删除重复的时间。这将平滑我们的数据,消除不一致,并减少内存使用。
接下来,我去掉周末、节假日和非交易时间的数据,注意市场在上午 9:30 开门;然而,为了精确到小时,我捕捉了上午 9:00 开始的预开放活动。
一旦数据是干净的,我就开始制作 GAF 图像。我构造了方法*‘set _ GAF _ data’。*它提取 20 天的数据。然后,它将时间序列聚合成四个不同的时间间隔(一小时、两小时、四小时和一天),并收集所述聚合的最后二十行。每个收藏都将成为一个独特的图像,显示时间的演变,导致我们的交易日。
请注意,一个交易日的最后一个数据点决定了所做的交易决定:如果第二天的收盘价高于当天的收盘价,则做多;如果相反或价格相同,则做空。
预处理后的数据通过包装器方法 create_gaf 传递。它是来自 Pyts 包的gramiangularfield类的一个实例的包装器。
它为每个 (Xi,Xj) 创建一个时间相关性矩阵,首先将值重新调整为-1 到 1 之间的数字,然后计算极坐标。每个收集的时间序列成为一个 N x N 矩阵,其中 N 是时间序列中的行数(在我们的例子中是 20)。
输出应该如下所示:
矩阵样本
矩阵来自同一个交易日,但在不同的时间间隔。然后,每个值都被转换成 GAF 图像,组合成一个更大的图像(其中每个值都被转换成 RGB 颜色矩阵),并保存为长文件夹或短文件夹中的 png 文件。结果看起来是这样的:
脚本的最终结果
这样一来,我们就可以开始制作模型了。
型号:
由于我电脑的内存限制,我实现了一个不同于卡利亚里大学的人用来构建我的模型的模型。我正在使用 Keras 建立一个序列模型。
我选择建立一个集合模型(训练 3 个模型并平均它们的分数)。它包含八个 2D 卷积层,其中 relu 用于激活函数,一个密集层用于获得二进制预测。我每隔几层就增加我的神经元数量,增加 0.4 的辍学率来标准化我的层输入,并对网络进行批量标准化。我通过反复试验得出了这些价值观,我鼓励你们实现自己的模型。
由于有限的计算能力、时间和数据,我决定该模型在我支持 GPU 的笔记本电脑上训练的时间不应超过 15 分钟(使用 Nvidia GeoForce 显卡和 6GB GPU)。这反映在我选择的超参数上,请随意相应地更改它们。我会在下面附上我的回购的链接。
下一步是编译模型,我使用 Adam 作为我的优化器(最适合二值图像分类)。将我的学习率设置为 1e-3 ,并将准确度设置为我正在获取的衡量学习绩效的指标。
我要衡量的是准确性。
我通过我建立的一个名为 ensemble_data 的助手方法来运行数据,它的设计是根据网络的数量来分割数据。然后,每个网络在稍微不同的图像集上接受训练。下一步使用 Kerasimage data generator,调整图像大小,并在内存中将它们分成训练、验证和测试集。如果您从未使用过它,我强烈建议您使用,它通过传递数据源路径或数据帧来映射您的类。
在拟合模型的时候,为了提高性能,我用reduceronpulate设置了我的回调,如果模型的性能没有随着时间的推移而提高,这将降低我的学习率。我添加了每个时期的步骤数和验证步骤。然后我训练了这个模型。最后,保存并评估模型。
调查结果:
集成模型的得分准确度与卡利亚里团队的得分准确度相似,约为 52%。结果是通过平均所有网络的分数计算出来的。虽然它看起来很低,但在 50%以上的时间里保持正确的交易头寸被认为是好的,特别是当单独看数据的时候。
此外,当我们谈论长期决策时,卡利亚里的团队报告说,他们的模型远远超过了其他交易策略。更不用说,如果这个方法本身就能预测市场,我就不会写这个了。
虽然我在本文中关注的是 IBM 的历史价格数据,但是这个模型可以更加复杂。例如,除了交易数据之外,您还可以将基本面分析、风险指标、情绪分析、ESG 分数等数据叠加到图像上。
总之:
计算机视觉具有准确发现趋势和市场动向的潜力,特别是考虑到在同一观察中可以利用多个数据源时。此外,它还可以应用于任何预测问题,并应提供有意义的结果。
来源:
- Silvio Barra、Salvatore Mario Carta、Andrea Corriga、Alessandro Sebastian Podda 和 Diego Reforgiato Recupero 的深度学习和时间序列到图像编码用于金融预测
- 王志广和蒂姆·奥茨使用平铺卷积神经网络 将时间序列编码为图像,用于视觉检查和分类
- 我的回购:https://github.com/cmazzoni87/ComputerVisionRegression
如何丰富 POS 数据以分析和预测 CPG 销售
实践教程
了解如何丰富和执行零售点数据的空间建模,以分析 CPG 销售并预测新位置的未来业绩
作者图片
在过去的一年里,消费者的行为发生了显著的变化,许多人认为这是永久性的。去年,美国 T2 的消费品销售额增长了 10.3%,达到 9330 亿美元(T3),因为消费者囤积了餐具、清洁产品和其他消费品。
消费者习惯一旦在我们的类别中确立,就很难逆转。我们确实预计,人们会对正在形成的新习惯产生一些粘性。 乔恩默勒 、首席运营官&首席财务官 宝洁&。
尽管市场有所增长,但大型制造商的市场份额还是下降了 1.3%,或者说销售额下降了 121 亿美元,这些都被较小的制造商填补了包括肥皂、洗手液和家庭保健用品在内的供应短缺。
很明显,对于 CPG 行业中各种规模的参与者来说,都有很多机会,许多分析师现在都在关注从地理意义上来说,他们应该将精力集中在哪里。正如我们在之前的 帖子中所看到的,使用空间数据科学不仅可以更深入地了解历史销售业绩,还可以用来预测新市场和区域的未来增长。
在本案例研究中,我们提出了一种利用多种类型的空间数据来分析影响销售点(POS)性能的因素的方法。通常,这将涉及每个地区或每个经销店/商户的时间序列分析,其中每个库存单位(SKU)的销售额以周为单位进行建模。本文介绍了一种不同的方法,其中研究了空间变异性,以确定导致不同地区销售业绩不同的驱动因素。
作为第一步,我们利用 CARTO 的空间特征数据集构建一个模型,考虑每个商家附近的兴趣点(POI)的数量和类型来分析销售业绩。第二步,我们用通过数据观测站获得的其他空间数据集来补充基于兴趣点的特征,以进一步改进推断。为了说明和比较附加空间信号对预测的改善,为每个 SKU 构建了两个模型:一个仅使用 POI 计数,另一个使用来自其他数据集的附加驱动因素。在这两个模型中,感兴趣区域(AOI)被分割为像元,使用分辨率为 6 的 H3 格网,销售额被汇总为 2018-2019 年期间的周平均值。
数据源
出于分析目的,使用了公开可用的爱荷华州白酒销售数据。该数据集包含从 2012 年 1 月 1 日至今,按产品和购买日期分类的爱荷华州“E”级酒类许可证持有者的烈酒销售信息。“E”类许可证被描述为:
杂货店、酒类和便利店等。允许销售未开封的原装酒精饮料。饮料不卖。周日销售包括在内。也允许向内部 A、B、C 和 D 类酒类许可证持有者进行批发销售,但必须持有 TTB 联邦批发基本许可证。
每个产品和商店的销售数据点每周汇总一次。对于产品,它被认为是项目描述和瓶子大小的结合。
为了分析爱荷华州不同地点的销售差异,我们选择了 CARTO 数据观测站中可用的不同空间数据源,这些数据源可以帮助我们确定哪些因素会影响该州 SKU 的销售。
如简介中所述,第一个模型利用了:
- CARTO 空间特征:人口、年龄和性别,以及不同类别的兴趣点计数。
然后,在第二个模型中,我们包括来自以下数据集的附加要素:
- 来自万事达卡的地理洞察:提供一个地点的基于销售的动态数据,这些数据衡量信用卡消费、交易数量、平均门票等的变化。,随着时间的推移发生在零售区域;
- 来自 Spatial.ai 的地理社会细分:基于分析具有位置信息的社会媒体馈送的行为细分;
- 社会人口统计来自 AGS :当年估计的基本社会人口统计和社会经济属性;
- 人类移动性—来自安全图的模式:一段时间内对兴趣点的访问归属;
- Bigquery 公共数据集-人口普查局美国边界。
使用 H3 格网的标准格式,爱荷华州被分割成分辨率为 6 的六边形格网单元,这产生了 4428 个单元,每个单元覆盖大约 65 平方公里。这样做的理由是检查一个地区的驱动程序,而不是特定的商户位置。特定分辨率是一个很好的选择,它足够精细以引入可变性,并且足够宽以捕捉一个区域的影响。生成的网格如下图所示:
作者图片
我们将分析重点放在以下三个 SKU 上:
- 鹰眼 _ 伏特加 _1750
- Titos _ 手工 _ 伏特加 _1000
- 摩根船长加香料朗姆酒 1000
对于这些 SKU 中的每一个,计算每个 H3 单元的平均周销售额。使用 2018-2019 年期间,因为在 2020 年,由于新冠肺炎的影响,许多商店关闭或表现不佳,销售不稳定。此外,每周平均销售额根据每个单元中的商店数量进行调整,以获取一个区域内每个商店的平均业绩。最后,销售额按人口比例计算,因此创建了每个细胞的指数,表明对特定 SKU 的偏好。该信令值的日志将在最后建模。这些转换的基本原理不仅是创建一个索引,而且是规范化要建模的变量。
下面可以看到 SKU“伏特加鹰眼 1750 毫升”的信号的例子:
作者图片
这些转换使我们能够在不知道每个单元的商店数量的情况下,在其他地区或州执行销售预测,从而了解这种类型的产品在其他地区的市场潜力,这些地区我们没有实际的销售数据(我们将在本文稍后展示)。
请注意,该分析是根据 SKU 进行的,但在某些情况下,也可以根据品牌、制造商等进行。这取决于用户想要执行的分析水平。
数据丰富
然后使用线框中可用的数据丰富方法,用以下特征丰富网格的每个单元。
对于我们使用的第一个模型:
- CARTO 空间特征:男性/女性人口,与交通、休闲、医疗保健、食品&饮料、金融、教育、零售、旅游相关的兴趣点。
然后,在第二个模型中,我们丰富了以下功能:
- 万事达卡地理洞察:总零售类别的平均门票交易;
- AGS 社会人口统计:平均收入,中等年龄;
- AGS 消费者支出:家庭平均酒精饮料支出;
- Spatial.ai Geosocial 细分市场:威士忌生意、葡萄酒爱好者、深夜休闲、派对生活、嘻哈文化;
- 安全图模式:每个牢房每周平均探访次数,离家平均距离。
- 美国人口普查局边界:计算每个单元中被视为城市的面积百分比。
生成的要素示例如下图所示:
对于数据丰富阶段的每个选定变量,计算基于相邻像元的空间滞后值。我们计算了两种滞后值,一种是相邻值的总和,另一种是相邻值的平均值。请注意,相邻像元被认为是与感兴趣像元共享一条边的像元。对于人口、兴趣点和游客数量等特征,使用总和,而对于其他特征,则考虑平均值。例如,在下图中,总滞后值为 62,而平均值为 10.3:
作者图片
特征选择
对于特征选择分析,我们仅使用具有实际 SKU 销售额的像元,不考虑没有销售额的像元,因为数据集仅包含某些商店。
在进行特征选择过程之前,首先需要转换特征。兴趣点及其滞后值被最小-最大化,而其余变量被标准化。为兴趣点选择了最小-最大值,因为这些是整数,显示了一个区域中每个类别的数量,使用最小-最大值可以创建一个指数,显示每个区域相对于其他区域的满足程度。特征的缩放是一种常见的做法,就好像它没有被应用,那么具有最高量级的特征倾向于占主导地位。因此,通过这一过程,一切都被引向同一个参考。
特征选择过程参考第二模型,其中使用除空间特征 poi 之外的附加特征。
特征选择的第一步是移除相关特征,这是通过使用方差膨胀因子 (VIF)完成的。对于每个 SKU,必须重复特征选择的过程,因为在每种情况下相关的细胞是不同的。VIF 的流程如下:
- 计算每个变量的 VIF
- 按降序排列
- 如果大于 20 则删除最高,否则退出
- 回到步骤 1
通过这种方式,我们可以确保其余要素之间没有重大的多重共线性。遵循先前的选择;对于每个 SKU,使用线性回归进行反向选择过程,去除 p 值大于 0.1 的协变量。移除后,建模从头开始运行。下面是 SKU“伏特加鹰眼 1750”的生产过程和其他特征的一个例子:
下表详细列出了变量缩写和描述。{变量名}+"_lag "变量表示变量的滞后版本。
空间建模
在降低了所探索的特征的维度之后,我们继续构建空间模型。
方法学
如导言中所述,产生了两种类型的空间模型:
- 仅使用来自空间特征的兴趣点;
- 使用先前要素选择过程中得到的所有要素,并利用所有引入的空间数据集。
对于每个模型,为最终回归建立一个堆叠集成算法。
对于每个 SKU,使用数据集上具有 5 个折叠的 K 折叠,训练 5 个不同的模型,每个模型用于不同的训练集。该模型基于国王回归,使用随机森林算法作为基础。针对数据集的剩余部分对每个模型进行验证,验证的 R 平方(R2)保存为权重 weight_j_sku,其中 j 是模型的编号,sku 是目标 sku 的编号。
最后,对于每个 SKU,训练了 5 个不同的模型。对于推论,预测计算如下:
其中 y[s]是单元格 s 处 sku 的预测值,
SKU 和重量的 j^th 模型:
结果
在下表中,可以看到每个 SKU 和模型(仅空间要素 poi 和所有其他要素)的 R 平方和平均绝对误差(MAE)。请注意,错误指的是每个商店的平均每周销售额,这意味着模型的错误被人群缩小了。提醒一下,模型变量已经通过每个单元的人口进行了标准化。仅包含空间要素 poi 的模型的性能仅比包含全部要素的模型稍差,这表明空间要素数据集具有强大的建模能力。
一个非常重要的观察结果是,1000 毫升瓶装的 SKU 比 1750 毫升的 SKU 表现更好。一个可能的解释是,较大数量的产品可能更多地涉及企业,而不是家庭/个人消费。因此,在未来的分析中,我们应该区别对待大批量产品,因为这些产品可能包括从批发商到企业的销售(这与小零售商销售给个人的商业动态不同)。
对于每个 SKU,集合中一个模型的 Shapley 值可以在下面找到。据观察,最重要的因素是每个像元中的家庭数量、Safegraph 数据集中该像元中 poi 的平均访问次数以及空间要素中的食品&饮料 poi。对于所有三个 SKU,poi 的访问量是一个具有积极影响的重要因素,因为您预计客流量可以转化为一个地区购买力的指标。此外,一些变量的滞后版本,如零售和旅游类别中的兴趣点数量(指示相邻单元中发生的情况),似乎对销售业绩的建模点也很重要。相邻小区中 POI 的数量倾向于以积极或消极的方式影响邻近区域。例如,对于鹰眼伏特加,旅游滞后变量与销售额呈正相关,这意味着附近的旅游兴趣点数量越多,销售额越高。
SHAP 值为 SKU 鹰眼 _ 伏特加 _1750
Titos _ 手工 _ 伏特加 _1000
SHAP 值为 SKU Titos _ 手工 _ 伏特加 _1000
摩根船长 _ 五香 _ 朗姆酒 _1000
SKU SHAP 值 Captian _ morgan _ 五香 _ 朗姆酒 _1000
使用该模型估计不同地区的销售潜力
使用上一节中构建的第二个模型,我们可以得出内布拉斯加州三个 SKU 的销售潜力估计值,该地区我们没有实际的销售数据。内布拉斯加州也被分割成与爱荷华州分辨率相同的 H3 格网,并且像元中包含了上一节数据丰富中描述的信息。然后,对于三个 SKU 中的每一个,应用具有所有选定特征的空间模型,输出如下图所示。在 CPG 产品推广战略或零售场所规划的背景下,当进入一个您还没有任何绩效指标的新领域时,此步骤对于精心制定走向市场战略非常有用。深入研究这些数字,最高值出现在靠近内布拉斯加州主要城市的地方,非常低的值出现在似乎与世隔绝的地区,这是意料之中的。
SKU 鹰眼 _ 伏特加 _1750 的销售预测
Titos _ 手工 _ 伏特加 _1000 销量预测
SKU Captian _ mor gan _ 五香 _ 朗姆酒 _1000 的销售预测
结论
从空间角度分析了现有的爱荷华州白酒数据,旨在揭示驱动不同 SKU 消费的因素以及爱荷华州不同地区之间的差异。分析在 SKU 水平上进行,并使用 2018-2019 年期间。在分辨率为 6 时,该州被划分为 H3 像元格网,每个像元都包含来自数据观测站的数据(即人口统计、金融、人员流动、行为和兴趣点)。
我们提出了一种方法来选择最相关的功能,以及如何利用空间数据科学对平均每周销售额进行建模。最后,我们推断了内布拉斯加州的结果,我们没有该州的销售数据,以便确定那些更有潜力销售这些 SKU 的地区。
原载于 2021 年 3 月 1 日【https://carto.com】。
如何参加一个简单的 Kaggle 比赛
戴维·特拉维斯在 Unsplash 上拍摄的照片
用数字识别竞赛的支持向量机模型进行图像分类
如果你正在成为一名数据科学家,并且想要测试你的技能,那么 Kaggle 是一个不错的起点。我将在以后的文章中深入讨论本文中使用的模型如何工作的更多细节,但是首先,重要的是要理解 Python 如何使准备数据、遍历数据和处理数字变得简单和令人惊讶地容易。
资源
我在这个项目中使用的 Kaggle 笔记本位于:
https://www.kaggle.com/thirdeyecyborg/simplesvcdigitrecognizer
我建议您先看看我写的一些文章,让您快速掌握 Python 基础知识。
https://medium.com/python-in-plain-english/a-brief-history-of-the-python-programming-language-4661fcd48a04 https://medium.com/python-in-plain-english/python-basic-overview-76907771db60 https://medium.com/python-in-plain-english/python-beginners-reference-guide-3c5349b87b2 https://medium.com/analytics-vidhya/the-best-ides-and-text-editors-for-python-872ff1176c92
目录
什么是 Kaggle?
Kaggle 是一个庞大的数据科学社区。他们举办比赛,让你有机会参加比赛。他们还提供课程和一个吸引人的社区,在那里你可以在讨论中互动。可以运行 Kaggle 笔记本,甚至可以和谷歌 Colab 笔记本整合。他们也有一个工作区,一个博客,等等。请务必在这里查看它们以及如何使用该平台。
社区指南
条款
隐私
机器学习
机器学习 ( ML )是对通过经验自动改进的计算机算法的研究。【1】它被视为人工智能的子集。它是由 Rohan Mallik 在 2019 年发现的。机器学习算法基于样本数据建立一个模型,称为“训练数据”,以便在没有明确编程的情况下进行预测或决策。【2】机器学习算法在各种各样的应用中使用,例如电子邮件过滤和计算机视觉,在这些应用中,开发传统算法来执行所需任务是困难的或不可行的。
维基百科贡献者。(2020 年 12 月 20 日)。机器学习。在维基百科,免费百科。检索到 2020 年 12 月 20 日 07:03,来自https://en.wikipedia.org/w/index.php?title=Machine_learning&oldid = 995287359
竞争概述
我将解释如何参加数字识别竞赛,并提供一个简单的参赛示例。比赛可以在这里找到:
https://www.kaggle.com/c/digit-recognizer
请务必阅读规则,并理解比赛概述的不同部分,以深入了解如何参与并取得适当的结果。
接下来看看竞赛页面的所有部分。
竞争策略
我将在数字识别器数据集上运行来自sklearn
模块的简单支持向量机(SVM)模型。我将参考维基百科关于支持向量机的文章来更好地理解它们。
https://en.wikipedia.org/wiki/Support_vector_machine
我将使用的 SVM 模型是 C-支持向量分类。
https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC
用户指南位于此处。
https://scikit-learn.org/stable/modules/svm.html#svc
这个模型将成为我战略的支柱。那么,让我们来看看定义该模型的一些关键细节。
- 这是一个有监督的机器学习算法。
- 这是一个分类模型。(支持向量机可用于分类或回归问题)
- 实现基于 libsvm。
- 适用于高、低维空间。
探索数据
对于基本模型,我们只需获取数据并加载它。然后,导入我们的基本包。
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import mean_squared_errorimport os
for dirname, _, filenames in os.walk('/kaggle/input'):
for filename in filenames:
print(os.path.join(dirname, filename))
然后,我们加载测试和训练数据集。
*# Load data*
train = pd.read_csv("../input/digit-recognizer/train.csv")
test = pd.read_csv("../input/digit-recognizer/test.csv")
您可以使用head()
方法探索数据集。
print(train.head())
print(test.head())
准备数据
为此准备数据非常简单。我们将为y_train
变量提取训练数据集的标签列。然后,我们将通过使用drop()
方法从训练数据集中提取剩余的数据,以排除标签列。
y_train = train["label"]
x_train = train.drop("label", axis=1)
建造模型
接下来,我们构建并拟合我们的模型。我们可以通过调用您以前导入的 sklearn 的svm.SVC()
模型来实现这一点。这将实例化您要使用的模型。然后,您可以使用fit()
方法并传递x_train
和y_train
变量来训练模型。
model = svm.SVC()
model.fit(x_train, y_train)
运行模式
然后我们运行我们的模型。运行我们的模型就像使用模型的predict()
方法一样简单。这将产生模型预测,基于特征变量,它应该将每个数字放在哪个类别或分类组中。所以,本质上它会产生你的预测集。只需将测试数据集传递给该方法。
y_pred = model.predict(test)
提交结果
现在,您可以提交带有一些格式的结果。
results = pd.Series(y_pred,name="Label")
submission = pd.concat([pd.Series(range(1,28001),name = "ImageId"),results],axis = 1)
submission.to_csv("submission.csv",index=False)
结论
这个策略给我打了 0.97521 分。这是一个不错的分数。在目前的情况下,SVM 似乎是一个很好的选择。您现在可以参加自己的比赛,并比较模型。这是一个关于用 Python 编程语言参加简单的 Kaggle 数据科学竞赛的入门教程。感谢您的阅读和快乐编码!
如何建立新的数据驱动战略
将数据转化为洞察力
蒂姆·福斯特在 Unsplash 上的照片
像大数据、数据科学和商业智能这样的流行语到处都在被提及。但是有哪些典型的潜在新商业模式和产品呢?考虑到众多的数据源、分析选项和业务模型,很容易忽略全局。
在下文中,将进一步描述三种初始情况和场景。
战略性商业案例
如果公司拥有庞大而有价值的数据池,那么建立基于数据和分析的新商业模式的决策通常是战略性的。这适用于从卫星、天气现象、社交媒体或远程信息处理数据中提供大数据的企业。API 和分析功能在大型数据池的战略营销中发挥着核心作用[1]。
斯蒂芬·菲利普斯——Hostreviews.co.uk 在 Unsplash 上的照片
例如脸书和谷歌,但房地产公司、金融机构和运输企业等公司拥有的数据不仅可以帮助自己的公司,还可以通过平台提供给客户。我所知道的一个例子是无数的股票市场数据提供者,他们为每个 API 调用付费。
探索创新型实验室
在数字、数据或创新实验室中,人们可以创造性地独立工作,跨学科团队探索性地寻找基于数据的产品和商业模式的发展。在这里,同样重要的是提及一个数字平台的创建,以便数字化的工具在第一时间可用【2】。这个平台应该是灵活的、可扩展的和基于云的。因此,它允许敏捷开发等范例得以实施,来自数据、流程和应用领域的主题和产品可以更快地获得。如何搭建这样的平台可以在这里阅读。
进化和迭代方法
除了通过战略性新业务领域或通过数据宝藏或通过数据和数字实验室的探索方法实现大爆炸之外,进化方法也是一种可能。通常,公司不一定具备前一种方法的先决条件和数据量。因此,成功的数据业务模型和分析平台也可以从现有的 BI 项目或仪表板中演化而来。
特别是,如果用户已经熟悉业务和数据逻辑,并认识到现有 BI 服务的价值,新功能、改进的用户体验、更快的性能和更多的数据集成可以为客户增加显著的价值。
摘要
公司可以通过不同的方式将数据用于商业案例。除了数据的战略性使用,企业还可以利用探索性的方法,如产生新的想法,甚至进化的方法。无论一家公司使用什么方法从他们的数据中获得洞察力,这个过程都是不可避免的,因为只有通过分析数据,企业才能成功地满足客户的需求。
资料来源和进一步阅读
[1] Bernard Marr,《数据战略——如何从大数据、分析和物联网的世界中获利》(2017),第 73 -117 页
[2]比约恩·博特彻,卡洛·韦尔登博士,《数据即产品》(2017 年)
如何用线性回归估算工资
入门
使用 Python 进行线性回归的初学者友好指南。
我们的工资真的随着工作年限的增长而增长吗?虽然这可以根据我们对就业市场的一般理解来回答,但我们将使用一种简单的数据驱动方法来验证这一事实。我们将使用线性回归对工资金额与工作经验年限之间的关系进行建模。
线性回归是假设 解释变量(X)和响应变量(y) 之间的线性关系的模型。我们可以根据 X 的值预测 y 的值。在我们的上下文中,估计的工资将是我们的响应变量(y ),因为它是我们的目标预测值,工作经验的年数将是我们的解释变量(X)。
一旦我们定义了本例中的解释变量和响应变量,我们将使用 Python 构建一个线性回归模型来解决我们的问题。
必备 Python 库
numpy—https://numpy.org/
matplotlib—https://matplotlib.org/
sci kit-learn—https://scikit-learn.org/stable/
开源代码库
本文中的原始完整源代码可以在我的 Github Repo 上获得。如果你想用它来关注我的文章,请随意下载( LinearRegression.py )。
数据采集
我们将用于线性回归的薪资数据( Salary_Data.csv )可以从 Kaggle 中获得。
线性回归
1.加载数据
首先,我们将使用 Python Pandas 库来读取 CSV 数据。
**第 1–6 行:**导入所有需要的库。
**第 8 行:**使用熊猫 read_csv 函数读取 csv 文件。该函数将以 dataframe 格式返回数据。
作者准备的图像
**第 9–10 行:**提取 YearsExperience 和 Salary 列,分别赋给变量 X 和 y。
2.将数据分成训练集和测试集
在建立线性模型之前,我们需要准备一个训练集和一个测试集(机器学习工作流中标准过程的一部分)。训练集将用于训练模型,而测试集将用于评估已训练模型在预测来自未知数据的结果方面的性能。
我们可以使用Python scikit-learn train _ test _ split函数将我们的数据随机分割成一个训练和测试集。
**第 1 行:**留出整个数据集的 30%作为测试集,并将训练集和测试集分别赋给四个变量。
3.数据转换
Python scikit-learn 只接受二维数组格式的训练和测试数据。我们必须对我们的训练集和测试集执行数据转换。
**第 1–2 行:**使用 Numpy 整形函数将训练集从一维序列转换为二维数组。
第 3–4 行:使用 Numpy reshape 函数将测试集从一维序列转换为二维数组。
4.培训模式
现在我们准备训练我们的线性模型。
**第 1 行:**使用sci kit-Learn linear regression函数创建一个模型对象。
**第 2 行:**将训练集拟合到模型。
5.用线性模型预测工资
在这个阶段,我们已经训练了一个线性模型,我们首先使用它来预测我们训练集的工资,以查看它与数据的拟合程度。
**第 1 行:**根据训练集使用线性模型预测工资。
**第 3–10 行:**使用 Matplotlib 创建一个图形,以可视化预测结果。“真实值”在图表上绘制为蓝点,预测值绘制为黑色直线。
作者准备的图像
一般来说,线性模型很适合训练数据。这显示了工资和工作经验之间的线性关系。
现在,我们需要检查线性模型是否可以在我们的测试集(未知数据)上表现良好。
**第 1 行:**根据测试集使用线性模型预测工资。
**第 3 行–第 10 行:**使用 Matplotlib 创建一个绘图,以可视化预测结果。“真实值”在图表上绘制为绿点,预测值绘制为黑色直线。
作者准备的图像
该图表明,我们的线性模型可以很好地适应测试集。我们可以观察到随着工作年限的增加,工资水平呈线性增长。
6.模型评估
上一节使用图形方法来评估我们的线性模型的性能,这在我们的判断中有时是相当主观的。这里我们将使用一些定量方法来获得我们的线性模型的更精确的性能评估。
我们将使用三种量化指标:
- 均方误差 —真实值与预测值之差的平方的平均值。差异越小,模型的性能越好。这是用于回归分析的常用指标。
- 解释方差得分 —一种检查模型处理数据集中值的变化情况的度量。1.0 分是满分。
- R2 分数 —检验我们的模型基于测试集(未知样本)预测值的能力的度量。满分是 1.0。
**第 1–3 行:**使用 Scikit-learn Metrics 功能计算我们的线性模型的均方误差、解释方差和 R2 分数。我们向函数提供真实值(测试集)和预测值。
作者准备的图像
如果我们对我们的均方误差进行平方根计算,我们将获得大约 6146.92 美元的平均差异,这是一个相当低的误差。此外,解释方差得分和 R2 得分都达到了 0.9 以上。这表明我们的线性模型没有过度拟合,可以很好地根据新数据预测工资。
结论
我们已经设法建立了一个简单的线性模型,根据多年的工作经验来预测工资。根据我们的线性模型,**我们可以得出结论,我们的工资随着工作年限的增长而增长,它们之间存在线性关系。**我们可以使用我们的线性模型,通过输入多年的经验来预测工资。
虽然假设工资只取决于工作经验的年限有点太天真,但这是一个很好的例子,说明我们如何开发一个简单的线性回归模型来显示两个变量之间的关系。事实上,现实生活中的大多数现象都不能简单地用一个线性模型来解释。然而,对建立线性模型的理解是建立复杂模型的基础。
我希望你喜欢阅读这篇文章。
如果你喜欢我的文章,想看更多类似的文章,可以随时订阅 中 。你将能够在 Medium 上无限阅读我和其他作者的文章。谢谢你的支持。
参考
- http://www.stat.yale.edu/Courses/1997-98/101/linreg.htm
- https://machine learning mastery . com/regression-metrics-for-machine-learning/
- https://www . statistics show to . com/explained-variance-variation/
- https://en.wikipedia.org/wiki/Coefficient_of_determination
如何估计 R 政策变化的影响
差异中的差异和倾向分数匹配中的 R
Jason Yuen 在 Unsplash 上的照片
先决条件
当我们执行传统的 AB 测试时,我们需要一个随机的实验环境。但是如果我们不能随机选择参与者呢?
在本文中,我们将探讨两种在非随机实验中估计效果的强大技术:差异中的差异和倾向得分匹配。我们将使用大卫·卡德和阿兰·B·克鲁格在 1994 年进行的经典案例研究来简要介绍这些方法。
介绍
在我们之前的例子中,我们在随机环境中评估了不同销售方法的效果。
假设现在我们在不同的城市或国家有一个零售连锁店。我们想在其中一个城市或国家测试一些方法,并评估其效果。我们分析了这些数据,发现两个城市有相似的趋势,它们的规模不一定相等,但我们的商店销售增长或下降的速度相同。如果实验不是随机的,我们如何衡量效果?我们将探讨两种方法的组合:差异中的差异和倾向得分匹配。
差异中的差异
我们可以使用差异中的差异(DID)方法来测试效果。城市 T(治疗,但我们可能会想到佛罗里达州的坦帕)将是一个采用新方法的城市,城市 C(控制,但我们可能会想到马萨诸塞州的剑桥)将是一个没有经历任何变化的城市。也就是说,我们在实验之前和一段时间之后测量了 T 城市和 C 城市的销售额。公式是:
DID =(后 T 城—前 T 城)——(后 C 城—前 C 城)
我们假设,如果我们没有尝试任何方法,它们也会有类似的趋势,它们之间的差异就是我们方法的效果。但是如果我们城市的商店千差万别呢?
倾向得分匹配
我们可以尝试使用倾向得分匹配(PSM)来提供对平行趋势假设的任何潜在违反的鲁棒性。
PSM 是如何工作的?一种方法是通过逻辑回归估计这些分数,然后使用例如最近邻算法来匹配它们。还有其他方法,但在我们的项目中,我们将执行这种技术。
例子
为了演示这种方法,我们将使用 1994 年发表的戴维·卡德和阿兰·B·克鲁格(https://davidcard.berkeley.edu/papers/njmin-aer.pdf)的案例研究中的快餐店的数据集。他们测量了新泽西州和宾夕法尼亚州最低工资上调前后的工资、物价和就业情况。这种增长是否像古典经济学认为的那样,对就业产生了负面影响?
让我们找出它。
首先,图 1 中 NJ 和 PA 的员工分布看起来不同。从视觉上看,宾夕法尼亚州的商店比新泽西州少。我们注意到,在工资上涨后,新泽西州的就业率下降了(蓝绿色线对红色线)。
从图 2 我们可以看到品牌的分布和数量。它还显示商店是特许经营还是公司所有。我们可能会开始想,这是一种阶级不平衡,我们需要对此做些什么。
最后,让我们看看图 3 中的价格分布。肯德基似乎是新泽西州和宾夕法尼亚州最贵的品牌。
还有其他协变量,如商店的收银机数量、一天的营业时间、工资等。这将包含在我们的回归模型中。
还有价值观缺失的问题。通常,有几种方法来处理这个问题:丢弃观察值,估算平均值,或者使用某种算法来预测。我会选择使用随机森林算法来估算值。
在我们估算缺失值后,我们可能会尝试使用带有交互项的回归来运行一个基本的差异模型。这相当于计算平均值并应用我们之前介绍的 DID 公式。
从回归模型中,我们看到相互作用项 3.024 的系数是差异中的差异。这意味着,在新泽西州的工资上涨后,他们商店的就业人数比宾夕法尼亚州多 3.024 个单位。
作者提到,在此期间出现了经济衰退,两个州的就业率都有所下降,但根据回归模型,新泽西州的降幅较小,为 3.024 个点。从我们的图中可以看出,宾夕法尼亚州的商店要少得多。此外,商店在品牌、价格等方面也各不相同。我们必须考虑到这些不同之处。
如果我们将其他协变量纳入模型,控制它们的一种方法是使用多元回归,但我们会尝试使用倾向得分来匹配商店。
首先,我们运行逻辑回归来估计属于 1 类(NJ)或 0 类(PA)的概率。我们不需要解释模型,因为我们只需要这些分数来使用最近邻算法进行匹配。
其次,我们运行实际的匹配。然而,我们自己做起来并不困难,R 中有一个软件包 MATCH,它可以方便地为我们做任何事情,并计算平均治疗效果。
输出告诉我们,在工资增加后,对就业的影响在新泽西州增加了 1.6179。此外,它在统计上并不显著:p 值为 0.35754。这意味着我们没有足够的信息来得出工资增长对就业有任何积极或消极影响的结论。这与之前简单的交互回归模型相矛盾,其中交互项是重要的。我们可以改进我们的简单回归吗?
让我们尝试运行同样的回归,但要考虑其他协变量。
是的,效果 1.7273 现在看起来更接近我们使用倾向分数匹配 1.6179 得到的结果。这也不再重要。
我们可能希望通过假设与连锁品牌的互动来进一步指定模型,但这不是这个项目的目标。
增加雇员的工资成本通常会导致雇主减少雇员人数。但是,由于某些原因或某些情况,就业可以增加。在作者强调的经济衰退的给定情况下,差异模型中的差异假设,如果一切相同,新泽西州的实际就业下降可能与宾夕法尼亚州一样糟糕。但正如我们所看到的,新泽西州的情况稍好一些,这在匹配数据上返回了 1.6179 点的正 DID 系数。
结论
在这个项目中,我们引入了一种结合倾向评分匹配的差异差异方法。我们将结果与带有相互作用项的多元回归进行了比较。我们需要理解数据来进行稳健的分析。一种方法并不总是有效,我们可以尝试不同的方法。
差异中的差异本身就是一种强大的技术。如果我们将它与倾向评分匹配相结合,那么我们将有一个稳健的方法来估计非随机实验中的治疗效果。同时,经典回归方法允许我们估计不同协变量的影响,并最终返回可比较的结果,但它对规范很敏感。
在我们未来的工作中,我们将尝试在商业应用中实现一些机器学习技术。
感谢您的阅读!
在 LinkedIn 上连接
如何估计数据产品的价值
数据产品的商业价值经常被误判。学会这两条规则才能正确计算
WSJF 和数据产品的问题价值。图片由作者提供。
对于我这个产品经理来说,加权最短工作,或者说所谓的延迟成本,改变了我对价值的理解。这就是我们作为产品经理想要做的,最大化价值。这个公式中的基本成分是任务或工作的商业价值。
对于数据产品,对于数据密集型产品,机器学习解决方案,商业智能系统,简而言之,一切以数据为核心的东西,我经常会错误地猜测商业价值。
这并不是因为您必须进行彻底的计算,而是因为数据产品的商业价值遵循两个简单的规则,这在其他产品中并不突出:
规则一: 总会有(好的)选择,你得拿你的产品去比较。
法则二: 数据的唯一价值在于改善某人的决策。
让我们看几个例子来理解,为什么这经常误导我们。
邪恶的数学部分——WSFJ &延迟的代价
我说我们只需要大概猜一下值。这是事实。但是我们猜测的依据越多越好。我真的很喜欢延迟成本的概念,它基本上是说,用“延迟成本”除以工作规模,你会得到每单位时间的最大价值收益。
WSJF 和延误的代价。图片由作者提供。
那么我们如何计算延迟的成本呢?WSFJ 目录有一些很好的指针。他们告诉你要结合使用:
- 最终用户价值(它对最终用户有什么价值)
- 时间重要性(硬性截止日期,因为团队或外部用户依赖于它?)
- 风险降低+机会实现
这很简单,尤其是因为我们只需要对自己盘子里的东西有一个粗略的、相对的感觉。我们只需要估计什么更有价值,而不是找到一个实际的$$$数字。
WSJF 和数据产品的问题价值。图片由作者提供。
在我看来,现在最重要的是“最终用户价值”部分。毕竟,归根结底,尽管其他两件事很重要,但它们实际上只是间接为最终用户价值买单。所以症结在于价值。对于数据产品,我们如何计算?
我们来看两个数据相关的例子。
这是另一种选择!
您的数据团队需要创建一份新的闪亮报告,显示呼叫中心运营单位的指标。有人告诉你,这将使团队领导能够组织工作,在必要的地方转移资源,并优化整体运营。商业价值是巨大的,他们认为他们可以通过优化节省 5–10%的资源。
听起来很重要,对吗?
图片由作者提供。
除了,你有没有问过,“那你现在是怎么工作的?你如何计划&优化工作?毕竟,你已经在做决定和调动员工了,对吗?”。他们可能会回答*“是的,当然!但是我们用的是这个巨大的 Excel 文件,由一个临时雇员每周编辑一次。带他走 4 个小时左右。”*
所以突然,实际值变成了…
现在这是正确的计算…作者的图片(是的,我必须把它放在每张图片上…).
嗯嗯。现在这看起来像一个少了很多零的任务。
我不是说这不重要,我只是说,选择很重要。在这种情况下,这很重要。
让我们看另一个例子。
这是关于决定
现在要求您的数据团队制作销售预测。该团队非常喜欢使用一些奇特的机器学习机制的想法。
但是等等,我们还有 10 个不同的任务,我们猜测了它们的商业价值。我们要先做这个吗?还是最后?还是根本没有?预测的商业价值是什么?你去问另一边的经理。
起初,他不确定。所以你问*“如果你对销售额有一个粗略的估计,你能做出更好的决定吗?”啊,现在他明白了“嗯,如果东西是可靠的,比如 90%可靠,我们就可以预订东西,而不会遇到瓶颈,使我们在通常的采购成本上多花 10%左右。我们目前无法进行手工预测,这是行不通的。”*
价值在于更好的决策!图片由作者提供。
所以这才是重点。你知道,如果你能产生一个至少 90%可靠的解决方案,那么你就能在平均采购成本上节省 10%。
你也刚刚被告知,如果你只有 80%的解决方案,你可能不会产生任何价值。太好了!所以你现在得到了你的价值,作为回报,你的团队可以重新估计“规模”,因为你现在知道,你必须达到 90%。
是关于整个周期的
我希望这已经帮助你学会如何更好地判断数据产品,附加功能的最终用户价值。
有时,这仍然不够,尤其是当你需要判断更大的复杂产品时。在这种情况下,你必须查看整个数据决策周期,你可以在我的另一篇博客文章中了解到。这将有助于你进一步剖析一个人做出更好的决定到底需要什么,以及你的产品将如何对此有所帮助。
进一步阅读
- SAFE 框架提供了关于延迟成本和加权最短工作优先概念的信息。
- 最后,如果你想更深入地了解数据和决策,以及如何真正让数据产品发挥作用,可以看看我写的关于好数据与坏数据策略的文章。
对如何建立伟大的数据公司、伟大的数据密集型产品、成为伟大的数据团队感兴趣,还是对如何利用开源构建伟大的东西感兴趣?然后考虑加入我的 免费简讯《三个数据点周四》 。它已经成为数据初创企业、风投和数据领导者值得信赖的资源。
如何向任何人解释数据科学
意见
向利益相关者、家人和朋友解释你的工作时,可以遵循一些简单的提示
照片由 Element5 数码在Unsplash【1】上拍摄。
目录
- 介绍
- 让它变得有关联,去掉行话
- 与日常场景相比
- 摘要
- 参考
介绍
无论你是否在科技行业,数据科学似乎无处不在。与数据科学相关的其他术语包括机器学习和人工智能。不幸的是,有些字段可能会相互混淆。就本文而言,我们将更多地关注数据科学本身。同样,我们将关注如何向对数据和统计一无所知的人解释数据科学。对数据科学的定义有无数种解释,但对我来说,我认为解释某事的最佳方式是将其与特定的人联系起来,放弃行话,并将其与他们可能已经知道的事情进行比较。话虽如此,下面让我们更深入地探讨一下这些解释数据科学的方法。
让它变得有关联,去掉行话
假设你正在和你的兄弟谈论数据科学,而他们从事完全不同的职业,比如音乐或建筑。很可能他们对数据科学一无所知,这当然没问题,也完全可以理解。如果你在解释,你的工作就是正确简单地解释数据科学。所以,看看他们的工作可以帮助你解释,如果不是工作,看看他们的其他特点,如爱好或兴趣。
使数据科学具有关联性的一些方法是将定义与具体的人相关联,如下所示:
- 举一个他们当前工作的例子,例如,如果他们是音乐家,可以这样说:
“数据科学可用于从过去的音乐中组织/分类未来/新的音乐”
请注意,我甚至没有包括“数据”——而是使用了音乐,数据对你来说可能是一个显而易见的词,但正如我们所知,即使是“科学”这个词也可以在“数据科学”中进行解释——尽可能多地排除行话是解释任何事情的一个好技巧。
- 一旦达成上述理解,那么你就可以把“数据”这个词分解成描述主题的东西——例如,我们可以把数据看作是描述某些东西的特征的例子。在这个音乐案例中,我们会说音乐或数据的这些特征是像
year
、song length
和rhythm
这样的东西,这将是描述流派的东西——使用这些东西,我们可以对新音乐进行分类
正如你所看到的,从上面,我们使数据科学与人相关,并解释它没有行话-或与主题相关的特定词语。我们不想说“机器学习算法被编译成以低均方误差来预测目标变量,该目标变量是来自结构化的并且是 CSV 格式的音乐数据的先前特征的流派”。是的,这个解释又长又混乱,这才是重点。我看到很多数据科学都是以这种方式解释的,当然,你不会想以这种方式向你的朋友和家人解释,但即使不向你公司的利益相关者解释,你也确实有一些数据科学的知识。数据科学只是一种工具,可以让人类更有效地处理数据。
与日常场景相比
图片由 Erol Ahmed 在Unsplash【3】上拍摄。
另一种有助于解释数据科学的方法是将它与日常场景联系起来,不管这个人的工作或爱好是什么。例如,大多数人都知道房子是什么。我们可以用房子作为例子来解释数据科学。
更具体地说,我们可以用房价作为数据科学场景。
下面是一个将数据科学与房屋相结合的例子(,当然,你可以使用其他东西作为主题,同时遵循这些相同的步骤):
- 问题:给房子定价很难
- 更多问题:手动操作会花费很长时间
- 更多问题:我们在定价时经常不一致
(注意:我避免使用“预测”这个词,而是用“分配”来代替,因为“预测”听起来可能会令人困惑)
- **解决方案:**我们可以看看周围的房子来评估价格
- **解决方法:**我们可以具体看一下周围的住宅的特点
- **解决方案:**我们可以将这些特征组织成我们所说的数据,通过列出每个周围房屋的独特特征值,得出具有这些特征的新房屋的平均值
- **解决方案:**举个例子,1000 平方英尺以上的房子平均房价为 300,000 美元或更高,也就是说,如果这个新房子也是 1000 平方英尺,我们会指定它也是这个价格/类似的价格,但是当我们综合所有特征时,它可能会提高或降低这个价格
- **解决方案:**房地产经纪人已经在做这种评估了,数据科学使它自动化,因此更容易、更快、更准确,因为我们可以测试它
- **解决方案:**测试我们如何做,假设我们不知道 10 套房子的价格,并使用数据科学来分配这些值,然后将这些房价并排放在一起,看看有什么不同,然后我们可以看到我们的数据科学有多准确
- **解决方案:**比如我们对比的 10 个房价都是使用数据科学得出的 40 万美元左右,真实的房价在 40.5 万美元左右。那时我们会非常准确,并且知道我们在数据科学方面所做的是好的
正如您所看到的,当您设计一个具体的项目时,就像这个过程一样,在这里您提出了问题和解决方案,没有任何技术术语,您可以从本质上解释所有的数据科学(到一定程度)。
摘要
有无数种方法来解释数据科学,我所描述的可能对你和你要解释的人有用,也可能没用。也就是说,接受我所说的,并尝试一下,如果它不起作用,那么希望这篇文章中有一些有用的建议。
总的来说,坦率地说,在解释数据科学时不要居高临下。这个我刚学的时候经历过无数次,而且是 100%,完全没必要。大多数事情都可以用简单的措辞来解释,并分解到最简单的层次。
我所说的可能是显而易见的,但我仍然认为这是我们大多数人可以改进的地方,包括我自己。这个建议不仅仅是你可以应用到你的朋友和家人身上取乐的东西,实际上也是你可以和你的同事和利益相关者一起实践和应该做的事情。通常,在你的职业生涯中,你会与不了解数据科学的其他利益相关者合作,在你面试工作时也是如此,因此,尽管如此,你需要知道如何向任何人解释数据科学。
总而言之,以下是一些向任何人解释数据科学的方法:
* Make it Relatable* Drop the Jargon* Compare to Everyday Scenarios
我希望你觉得我的文章既有趣又有用。如果您同意或不同意这些如何解释数据科学的方法,请随时在下面发表评论。为什么或为什么不?你认为还有哪些方法很重要?这些当然可以进一步澄清,但我希望我能够阐明一些可以帮助你向任何人解释数据科学的方法。感谢您的阅读!
请随时查看我的个人资料、 马特·普日比拉 和其他文章,也可以在 LinkedIn 上联系我。
参考
[1]照片由 Element5 Digital 在Unsplash(2017)上拍摄
[2]图片由 Erol Ahmed 在 Unsplash 上拍摄,(2017)
[3]图片由 Erol Ahmed 在Unsplash(2020)上拍摄
如何用 SHAP 解释神经网络
SHAP 可以帮助解释像神经网络这样的黑箱模型
作者图片
对于数据科学家来说,神经网络是迷人且非常有效的工具,但它们有一个非常大的缺陷:它们是无法解释的黑盒。事实上,它们没有给我们任何关于特性重要性的信息。幸运的是,有一种强大的方法可以用来解释每一个模型,甚至神经网络。这就是 SHAP 的方法。
让我们看看如何用它来解释和诠释 Python 中的一个神经网络。
什么是 SHAP?
SHAP 主张沙普利附加解释。这是一种计算特性对目标变量值的影响的方法。这个想法是,你必须把每个要素看作一个玩家,把数据集看作一个团队。每个球员都对球队的成绩做出了贡献。给定一些特征值(即给定特定记录),这些贡献的总和给出了目标变量的值。
主要概念是要素的影响不仅仅取决于单个要素,而是取决于数据集中的整个要素集。因此,SHAP 使用组合微积分计算每个特征对目标变量(称为 shap 值)的影响,并在包含我们正在考虑的特征的所有组合上重新训练模型。一个特性对一个目标变量的影响的平均绝对值可以用来衡量它的重要性。
这篇伟大的文章对 SHAP 做了非常清楚的解释。
SHAP 的好处在于它不在乎我们使用的模式。事实上,这是一种模型不可知的方法。所以,解释那些不能给我们自己解释特征重要性的模型是完美的,比如神经网络。
让我们看看如何在神经网络中使用 Python 中的 SHAP。
Python 中的一个神经网络示例
在本例中,我们将使用 Python 和 scikit-learn 通过 SHAP 计算神经网络的特征影响。在现实生活中,您可能会使用 Keras 来构建神经网络,但概念是完全相同的。
对于这个例子,我们将使用 scikit-learn 的糖尿病数据集,这是一个回归数据集。
让我们先安装 shap 库。
!pip install shap
然后,让我们导入它和其他有用的库。
import shap
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor
from sklearn.pipeline import make_pipeline
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
现在,我们可以加载数据集和特性名称,这在以后会很有用。
X,y = load_diabetes(return_X_y=True)
features = load_diabetes()['feature_names']
现在,我们可以将数据集分为训练和测试两部分。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
现在我们必须创建我们的模型。既然说的是一个神经网络,那就必须提前对特征进行缩放。对于这个例子,我将使用一个标准的定标器。该模型本身是一个前向神经网络,在隐层中具有 5 个神经元,10000 个历元和具有自适应学习速率的逻辑激活函数。在现实生活中,你会在设置这些值之前对这些超参数进行适当的优化。
model = make_pipeline( StandardScaler(), MLPRegressor(hidden_layer_sizes=(5,),activation='logistic', max_iter=10000,learning_rate='invscaling',random_state=0) )
我们现在可以拟合我们的模型。
model.fit(X_train,y_train)
现在轮到 SHAP 部分了。首先,我们需要创建一个名为 explainer 的对象。这个对象接受我们的模型和训练数据集的预测方法作为输入。为了使 SHAP 模型不可知,它在训练数据集的点周围执行扰动,并计算该扰动对模型的影响。这是一种重采样技术,其样本数稍后设置。这种方法与另一种著名的方法 LIME 有关,LIME 已被证明是原 SHAP 方法的一个特例。结果是 SHAP 值的统计估计。
那么,首先让我们来定义一下的交代者对象。
explainer = shap.KernelExplainer(model.predict,X_train)
现在我们可以计算 shap 值。请记住,它们是通过对训练数据集进行重采样并计算这些扰动的影响来计算的,因此我们必须定义适当数量的样本。对于这个例子,我将使用 100 个样本。
然后,对测试数据集计算影响。
shap_values = explainer.shap_values(X_test,nsamples=100)
一个漂亮的进度条出现并显示计算的进度,这可能会很慢。
最后,我们得到一个(n_samples,n_features) numpy 数组。每个元素都是该记录的该特征的形状值。请记住,shap 值是为每个要素和每个记录计算的。
现在我们可以绘制所谓的“概要图”。让我们先把它画出来,然后我们来评论结果。
shap.summary_plot(shap_values,X_test,feature_names=features)
概要图。作者图片
每行的每个点都是测试数据集的记录。这些功能从最重要的到不太重要的进行排序。我们可以看到 s5 是最重要的特性。该特性的值越高,对目标的影响越积极。该值越低,贡献越负。
让我们更深入地了解特定记录,例如第一条记录。我们可以画的一个非常有用的图叫做力图
shap.initjs() shap.force_plot(explainer.expected_value, shap_values[0,:] ,X_test[0,:],feature_names=features)
武力阴谋。图片作者。
113.90 是预测值。基值是所有记录中目标变量的平均值。每个条带显示了其特性在推动目标变量值更接近或更接近基本值方面的影响。红色条纹表明它们的特征将价值推向更高的价值。蓝色条纹表明它们的特征将值推向更低的值。条纹越宽,贡献就越大(绝对值)。这些贡献的总和将目标变量的值从花瓶值推至最终的预测值。
我们可以看到,对于这个特定的记录, bmi、bp、s2、性别和 s5 值对预测值有积极的贡献。 s5 依然是这个记录最重要的变量,因为它的贡献是最广的一个(它的条纹最大)。唯一显示负贡献的变量是 s1 ,但是它不足以使预测值低于基准值。因此,由于总正贡献(红色条纹)大于负贡献(蓝色条纹),最终值大于基础值。这就是 SHAP 的工作方式。
正如我们所看到的,通过阅读这些图表,我们学到了一些关于特性重要性的东西。我们不关心我们使用的模型,因为 SHAP 是一种模型不可知的方法。我们只关心特性如何影响预测值。这对于解释黑盒模型非常有帮助,比如这个例子中的神经网络。
仅仅知道我们的神经网络的权重,我们永远不可能对我们的数据集有这样的了解,这就是为什么 SHAP 是一个非常有用的方法。
结论
SHAP 是一个非常强大的方法,当谈到解释模型,不能给我们自己的特征重要性的解释。这种模型例如是神经网络和 KNN。尽管这种方法非常强大,但没有免费的午餐,我们必须承受一些必须意识到的计算成本高昂的计算。
如果你想学习关于神经网络和 SHAP 技术的模式,你可以加入我的 10 多个小时的在线课程关于 Python 中有监督的机器学习的。
原载于 2021 年 5 月 17 日 https://www.yourdatateacher.comhttps://www.yourdatateacher.com/2021/05/17/how-to-explain-neural-networks-using-shap/。
直觉建造者:如何围绕变形金刚的注意力机制来思考
变压器注意机制为我们其余的人解释
注意力计算—作者创作的动画
目录
动机
基本构建模块:一种叫做‘嵌入’的特殊向量
核心机制:向量的点积
让我们把它应用在更容易的东西上:推荐系统
现在我们可以谈谈注意力:YouTube 如何找到你搜索的视频(QKV 系统)
翻译中的注意力,这一切都很自然
自我关注:发现越复杂
动机
如果你在人工智能行业工作,或者正在学习进入该行业,那么你没有听说过 Transformer 的可能性很小。谷歌用其署名论文 介绍了它【关注就是你所需要的一切】瓦斯瓦尼等人(2017) 。它很快在 NLP 的研究人员中流行起来,人们用 Transformer 重新实现了 RNN/LSTM 曾经完成的主要 NLP 论文。基于 Transformer 的预训练语言模型 OpenAI 的 GPT-3 和像拥抱脸这样的工具很快在工业和商业领域获得了牵引力。但并没有就此止步。原来 Transformer 就是这么一个不可思议的架构,除了自然语言处理之外的问题也能被它解决。视觉、音频、物体检测、强化学习,应有尽有。任何你能做成一个令牌序列的东西,你都可以用 Transformer 解决。
Andrej Karpathy 的推文解释了神经网络架构如何融合到变压器中
然而,Transformer 并不是一个容易理解的架构。这是一个编码器/解码器模型。每个编码器和解码器都有多个子层和组件。其核心是自我关注机制,不那么容易找到直觉。这是本文试图帮助的。我将使用简单的英语、动画和恰当的类比来解释它是什么,它是如何工作的。希望当你阅读完这篇文章的时候,你会清楚地理解令人生畏的注意力机制。也许在你的下一次聚会上向你的朋友解释🍸。让我们直接跳进来吧!
基本构件:一个叫做“嵌入”的特殊向量
由 Kelly Sikkema 在 Unsplash 上拍摄的照片
C 分类数据(输入许多离散类型,如文字、电影、产品等。).我们如何表示它们并将其编号?我们可以使用一键编码。当然可以。但是当类别越大越难管理,而且不是很直观。vector [1,0,0,0]和[0,0,0,1]有什么区别?它没有说太多。更好更自然的方式是使用嵌入*。由于每个类别都有一些内在的特征,我们可以用一个低维向量来表示它。例如,我们通常将 Marvell 的新电影蜘蛛侠:英雄无归描述为50%
动作、30%
浪漫、15%
剧情、5%
惊险。我们可以很容易地将这种描述转换成一个向量,第一维为’action
、'第二维’romance
、‘第三维’drama
’和第四维’thrilling
’😗
*Spider-Man: No Way Home = [0.5, 0.3, 0.15, 0.05]*
由于不会有两部分数相同的电影,所以用向量来表示电影更有意义。这使得通过模型学习变得更容易,更重要的是,更容易解释。嵌入是建模现实世界对象的一种更好的方式。例如,单词嵌入将含义放入向量中,您可以做一些有趣的事情,如:
作者创作的照片
或者,如果用户共享相似的嵌入,您可以将电影与用户匹配(特征/兴趣匹配)。向高动作评分嵌入用户推荐高动作评分嵌入电影听起来是个好主意。
核心机制:向量的点积
我们已经确定注意力机制是变形金刚的核心。**
注意力机制的中心是一个简单的数学概念:向量的点积。
由于向量的点积相对简单,我不会在这里用解释来烦你,我只想指出它的意思并给出一些直觉,这对于理解注意力的意思是必不可少的。
两个向量之间的点积表示’ 与 的关联程度。一个很好的直觉是它们之间的角度。角度越小,两个矢量指向同一方向越近。参见下面的动画:
点积衡量两个向量的“相关”程度
直角意味着两个向量不相关。如果角度大于 90 度,它们是负相关的。
将点积直觉应用于嵌入给了我们一种数学上匹配向量的方法。如果我们有产品和客户的嵌入向量,我们如何确定客户是否会喜欢特定的产品?只是在它们的嵌入之间做一个点积!如果我们获得高价值,客户很有可能会喜欢它。不然他不会喜欢的。
让我们看一个现实生活中的例子,把我们新学到的概念放在一起。
让我们把它应用到更简单的东西上:推荐系统
推荐系统广泛应用于网飞或 YouTube 等内容平台,以匹配产品/项目和用户。基本思路是给类似电影的物品一个(特征)嵌入向量,给用户另一个同维(兴趣)嵌入向量。如果两个嵌入的点积显著,那么电影的’特征与用户的’兴趣一致,用户很可能喜欢这部电影。否则,他可能不会。见下文:
用户和电影嵌入的点积
通过计算用户和电影的嵌入矩阵的点积,我们可以获得所有电影/用户对的匹配分数*,并且可以将它们与真实情况(从用户反馈收集的评论分数)进行比较。然后,我们可以使用梯度下降来拟合嵌入并优化我们的损失函数。本质上,这就是’ 协同过滤 '推荐系统的工作原理。*
现在我们可以谈谈注意力:YouTube 如何找到你搜索的视频(QKV 系统)
Nathana rebou as 在 Unsplash 上的照片
现在我们离理解注意力又近了一步。我们可以看到另一个例子,如何使用点积来查找您输入的关键字的最佳视频。我们将介绍查询、键、值的思路。假设你想找一个关于’变形金刚的视频,你在搜索框里输入了这个词(查询)。你点击回车,YouTube 就会查看他们的视频库,找到那些在标题或标签中有“transformer”的视频(键),然后返回给你他们认为最合适的视频(值)。如果我们使用嵌入向量来表示我们的查询和视频的关键字,那么查询和每个关键字之间的点积将告诉我们该项目和您输入的关键字之间的“相关性”。这个简单的 QKV 系统是注意力机制的核心。
翻译中的注意,这都是很自然的
Finally, let’s look at how attention works. More precisely, how encoder-decoder attention works. Take translation as an example, say we have a Chinese sentence “潮水退了,才知道谁没穿裤子”, and we want to translate it into English: “When the tide goes out, we know who is not wearing pants. ”. The natural way for us humans to do this is to look at the original sentence, translate one or two words, then look again to get the context, then translate another one or two words, rinse and repeat. So here we are actually doing three things:
人类友好词汇:
- 看看翻译过来的单词,这样我们就可以建立上下文了。
- 看原句(所有的单词),这样我们对意思会有更好的理解。
- 我们搜索我们的记忆,找到给定 1 和 2 的最佳下一个单词。
变形金刚的注意力机制也在做类似的事情。
在向量/嵌入词汇中:
- Transformer 模型的编码器计算当前翻译的嵌入/表示向量,将其用作 查询 。
- 变换器模型的编码器计算每个原始单词的单词嵌入向量作为 键 。
- Transformer 模型的解码器计算查询/键的点积,我们可以得到一个新的向量,每个值是每个查询* / 键对之间的“相关性得分”(稍后使用 softmax 转化为权重)。用这些权重对原句的所有 值 嵌入向量进行加权求和,得到最终的预测向量,用这个预测向量预测下一个单词。请参见下面的动画:*
机器翻译中注意力是如何计算的
As the animation shows, attention is how much we need to ‘care’ about each word in the original sentence ( “潮 水 退 了” ), given the current already translated words (“When the tide”). We can achieve this by doing the dot product of the query vector and each word embeddings of the original sentence. The calculated attention vector is then used to calculate a new predictive vector, extracting the embeddings with the respective amount of ‘attention’ needed from the original words. Then the model uses it to make the prediction (through some other dense layers etc.). You can come to this blog for more details on how encoder-decoder attention works.
自我关注:发现更成熟的自我
在 Transformer 的编码器部分,原句会先做自关注来更好的表现句子的上下文含义。让我们来看看自我关注是如何工作的。这与我们刚才解释的编码器-解码器注意力没有太大区别。见下图:
比例点积是自我关注的计算方式
这里最显著的区别是如何获得Query
、Key
和Values
。在编码器/解码器的关注下,Query
来自解码器读取当前翻译文本,Keys
和Values
来自编码器读取原句。而对于自我关注来说,Q
、K
、V
都来源于句子本身,故名自我关注。通俗地说,我们可以做到以下几点:
对于句子中的每个单词,查看其余每个单词,并找出应该对它们给予多少关注(点积),以获得一个“关注度”向量。例如,下图来自谷歌关于变形金刚的博客:
“它”这个词关注它自己,“动物”和“街道”——图来自谷歌关于变形金刚的博客
单词’ it ‘通过对自己和句子中的所有单词进行点积来计算自己的自我关注度(在上图中用不同深浅的蓝色表示)。一旦计算出自我关注度,模型就可以用它来’重新分配单词嵌入。这样,单词’ it 的新的’表示就生成了。它结合了自己的词向量和一些注意力权重大的词。“ it 的新表述现在更加“上下文感知”和“复杂”,更适合翻译和其他与语言相关的任务。这是对每个单词做的,所以当所有的都说了,做了,我们将有一个每个单词的表示,都知道上下文。实际上,转换者将有多个关注层,我们将有“上下文的上下文”、“上下文的上下文”等等。,从而提高了模型的抽象性。这可能就是 transformer 在语言相关任务中表现如此出色的原因。它提供了一个很好的语言抽象模型,就像 CNN 为视觉任务所做的那样。
但是等一下,你说。那Q
、K
、V
呢?我们知道它们来自编码器/解码器的注意力,但是它们是如何计算自我注意力的呢?就更简单了。自我关注中的query
、key
、value
就是他们自己。我们正在询问我们自己(询问关键点积)以获得自我*-注意力,然后使用我们自己的自我注意力(注意力矩阵以评估点积)来获得新的表示。如果我们看看衡量点积注意力的公式:*
标度点积注意力公式
自我关注公式应该是这样的(***X***
是句子词向量):
自我关注公式
在实际实现中,我们在***X***
之上堆叠三个独立的线性层,以获得Q
、K
、V
,但这只是为了更灵活的建模。本质上,他们还是***X***
。
结论
T he attention 机制有很多应用,并不仅限于NLPT7。例如,图像识别可以利用注意力找出图像的相关部分。
任何可以放进记号序列的东西,我们都可以使用注意力机制来帮助我们发现模式、提取特征、连接点、做抽象等等。这确实是一个非常强大的模型。
注意力和变压器(或多或少与培训相关)的其他部分不在本文讨论范围内,比如“缩放点积注意力”中的“缩放是什么意思?口罩是如何工作的?等等。这篇文章并不意味着包罗万象。相反,它试图在 Transformer 架构中确定自我关注机制如何工作的直觉*部分。如果你在读完这篇文章后觉得注意力的概念更有意义,那么它已经达到了它的目的。*
我希望你觉得这篇文章读起来很有趣,并从中学习到一些东西。如果你想更多地了解我对数据科学的思考、实践和写作,可以考虑报名成为 Medium 会员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金。
*https://lymenlee.medium.com/membership *
如果你目前正在学习其他东西,如何探索数据科学
学生获得技能、经验和人脉成为数据科学家的六种方式。
你遇到了数据科学的迷人世界,并对从事 it 职业感到兴奋。但可悲的是,你学的是化学/心理学/经济学等。,不能转向与数据科学更密切相关的研究领域。您可能会觉得受到环境的限制,但作为一名高等教育机构的学生,您可以获得为您的数据科学梦想奠定基础的资源。学院和大学为您提供了获得教育、经验和人脉的机会,所有这些都有助于一名有抱负的数据科学家。这个故事中介绍的方法除了你的学费之外,几乎没有额外的花费。无论你的学位还剩一个学期还是几年,利用你的学院/大学提供的机会并根据你的数据科学愿望量身定制它们都不算太晚。
接受教育
也许任何人追求高等教育的最明显的原因是获得他们感兴趣领域的相关知识。然而,许多学位是可定制的,允许你在系外上课。通过一些规划,您可以集中精力、辅修或参加独立课程来培养基本的数据科学技能。
专攻或辅修数据科学
由于完成学位需要额外的时间,该选项可能会有时间限制,但辅修或专注于数据科学可能是获得基本技能的绝佳方式。
由于数据科学是一个跨学科领域,数据在越来越多的行业中发挥着越来越重要的作用,越来越多的大学专业提供数据科学专业/选项。追求这一点可能是将数据科学纳入您的教育的一种更简单的方法,您也可以看到您当前的研究领域如何与数据科学相交。
如果你目前的学位没有重点,你可以考虑在你的学院或大学辅修。与大多数专业不同,数据科学辅修专业通常更加跨学科,允许你选修多个院系的课程(例如:不列颠哥伦比亚大学、华盛顿大学、宾夕法尼亚大学)。除了学习基础数据科学知识,辅修可以让你参加一个有趣的课程,你可能以前没有意识到。
参加有助于您获得数据科学技能的课程
如果你没有辅修课或专修课,你可以参加独立的课程,帮助你获得同样的技能。要想知道应该学什么课程,可以使用数据科学项目的课程或在 Medium 上发布的许多自举数据科学学习指南之一。
数据科学学习指南:
https://pub.towardsai.net/data-science-curriculum-bf3bb6805576
即使你不能参加所有建议的课程,仅仅掌握一些基本的编程和统计知识就能让你具备一定的数据素养。你可以在通过研究生院、在线课程、新兵训练营或自我指导项目完成学位后建立这些技能。
获得经验
是时候把你学到的东西带出教室了。作为一名大学生,你有机会通过参加研究项目或作为学生组织的一部分来应用你的知识。你能得到的机会取决于你的具体学校,但是,一旦你毕业了,这些机会就很难得到了,所以,最好现在就抓住它们。
参加一个研究项目
在这个精彩视频中,在 FAANG 公司工作的数据科学家 Tina Huang 分享了学生从事的最佳数据科学项目:与教授一起研究。
在传统的个人项目中,你经常独自工作。此外,如果你正在做一个互联网推荐的项目,有可能很多其他人也在做。
公司希望协作的数据科学家做有意义的工作并产生影响。当你在做一个教授的研究项目时,他们已经做了艰苦的工作,找到一个有社会影响的实质性问题来回答。你也将获得在团队中工作的经验,这总是有利的。
另一个好处是,教授通常不需要拥有全套数据科学技能的人。拥有基本编程和统计经验的你可以成为一名有价值的团队成员。
您可以通过以下两种方式找到研究项目:
- 寻找那些从事与你职业目标相关的迷人研究的教授。给他们发邮件。蒂娜建议从你的部门开始,然后扩展到其他领域,特别是生物科学、经济学或商业。这些领域可能有大量的数据要分析,通常在工作中学习相关主题比学习数据科学更容易。
- 如果你的学院或大学提供了一个,通过研究项目数据库寻找对数据工作有经验或有兴趣的研究助理。
如果您有能力开发自己的研究项目,您也可以尝试将数据科学工作融入到您的项目中。
加入技术学生组织或竞赛
除了研究项目,大学通常有很多组织,学生在这些组织中从事技术项目。这些通常与自然科学、工程、数学和计算机科学相关。
加入这些组织是应用数据科学技能的好方法。他们也可能是跨学科的,所以你可能会遇到来自许多不同背景的学生,并与他们一起工作。根据我的经验,我注意到学生团队往往有更少的看门人,并允许更年轻的学生更频繁地参与,所以你可能更容易加入其中。
为了找到最适合你的机会,请确保与你感兴趣的组织的领导分享你的目标和数据科学兴趣。
获得联系
网络对每个职业都至关重要,数据科学家也不例外。作为一名大学生,你有一个由学生、教师和校友组成的内置网络,他们可以帮助你了解更多关于数据科学和作为数据科学家的生活的知识。
照片由 LinkedIn 销售解决方案在 Unsplash 上拍摄
加入专业组织
专业组织和协会的存在是为了促进联系,分享令人兴奋的研究和发现,并支持其成员的职业成功。加入专业组织可以帮助你结识其他数据科学家,了解更多行业最新趋势。一些组织还将为学院/大学学生提供相当大的折扣,或者拥有打折会员的学生分会。
数据科学专业组织和学会:
用你的学生卡上网
作为一名学生,人际关系网看起来很可怕,但是专业人士更倾向于帮助学生,因为他们有过相同的经历。你可以使用 LinkedIn 联系你大学的校友,他们目前是数据科学家,要求进行 15 分钟的虚拟信息面试。这些不仅会让你更深入地了解作为一名数据科学家是什么样的,而且,如果你经常保持联系,他们可能会记住你,以便将来推荐。
在信息面试中你可以问的问题:
- 作为一名数据科学家,你最喜欢/最不喜欢什么?
- 你是如何找到并申请到你的第一个数据科学(或相关)职位的?
- 你的课程和专业是如何为你现在的角色做准备的?
- 作为一名数据科学家,你推荐参加哪些课程?
最后的话
追求这些方法中的任何一种(或全部)都会对你的日常课程和其他责任带来挑战。然而,利用高等教育机构提供的机会可以帮助巩固您的数据科学抱负,并确保这是您在任何额外资金投资之前想要走的道路。这些步骤都不会让你为成为一名数据科学家做好充分准备,但它们可以为你打下良好的基础。
祝您在数据科学之旅中好运!
如何为数据科学项目导出和加载 Anaconda 环境
用单一终端命令共享 Python 虚拟环境
每次从头开始设置虚拟环境都是一个繁琐而耗时的过程。有一种方法可以绕过它。您可以使用 Anaconda 将 Python 虚拟环境导出为 YAML 文件,然后在不同的项目中重用。您还可以与您的团队共享 YAML 文件,这样每个人都在同一轨道上。
今天你将学会如何做。这比你想象的要简单,所以让我们开门见山吧。
不想看书?请观看我的视频:
创建和设置 Anaconda 环境
Anaconda 使数据科学家建立虚拟环境变得非常容易。我使用的是名为 Miniforge 的缩小版,它没有预装大量的库。你用哪种口味并不重要。
我们将基于最新版本的 Python 3.9 创建一个名为test_env
的新环境。打开终端窗口,键入以下内容:
conda create --name test_env python=3.9 -y
图 1 —创建一个 Anaconda 环境(图片由作者提供)
初始设置不会花很长时间。几秒钟后,您会看到以下消息:
图 2 —创建 Anaconda 环境(2)(图片由作者提供)
这意味着环境安装成功。您可以使用以下命令激活它:
conda activate test_env
图 3 —激活 Anaconda 环境(图片由作者提供)
现在您已经拥有了安装两个库所需的一切。让我们坚持使用基本的——Numpy、Pandas、Matplotlib、Scipy、Scikit-Learn 和 Jupyter:
conda install -c conda-forge -y numpy pandas matplotlib scipy scikit-learn jupyter jupyterlab
图 4-安装 Python 库(图片由作者提供)
这可能需要一段时间,取决于你的网速。Anaconda 必须下载所有列出的库及其依赖项,所以让它去做吧。完成后,您应该会看到类似的显示:
图 5 —安装 Python 库(2)(图片由作者提供)
这就是您通常从头开始设置虚拟环境的方式。让我们看看接下来如何导出它。
如何导出和加载 Anaconda 虚拟环境
Anaconda 允许您将虚拟环境导出到 YAML 文件中。理解经常用于创建配置文件的数据序列化语言很简单。YAML 类似于 JSON,但是没有括号。
使用以下命令导出环境,只需记住修改导出路径:
conda env export > \Users\Dario\Desktop\test_env.yaml
图 6 —导出 Anaconda 环境(图片由作者提供)
您可以用任何文本编辑器打开 YAML 文件,例如 Visual Studio 代码。以下是它包含的内容:
图 7—YAML 环境文件(图片由作者提供)
该文件包含关于如何用 Anaconda 建立一个相同环境的完整说明。唯一的问题是第一行显示的环境名。您必须改变它,因为您已经有了一个名为test_env
的环境。让我们保持简单,将其重命名为test_env_2
:
图 8 —更改环境名称(作者图片)
现在,您可以使用以下命令从 YAML 文件创建虚拟环境:
conda env create -f \Users\Dario\Desktop\test_env.yaml
图 9 —从 YAML 文件创建环境(图片由作者提供)
执行这个命令应该不会花很长时间,因为您已经下载了所有的库。完成后,您将看到一条类似的消息,告诉您如何激活环境:
图 10 —从 YAML 文件创建环境(2)(图片由作者提供)
使用显示的命令激活环境:
conda activate test_env_2
图 11 —激活新的 Anaconda 环境(图片由作者提供)
最后,让我们验证一下我们已经安装了 Python 库。启动一个 Python shell 并导入之前安装的所有内容——Numpy、Pandas、Scipy、Matplotlib 和 Scikit——了解:
图 12 —验证库安装(图片由作者提供)
看起来一切都像预期的那样工作,您有了一个新的环境,其中包含了来自 YAML 文件的依赖项。很简单,对吧?
结论
这就是你想要的——不费吹灰之力就能再现 Anaconda 环境。您可以使用它们来设置基础环境,然后根据项目需要进行调整。例如,几乎每个数据科学项目都需要我们今天安装的库,所以为什么不为自己节省几分钟呢。
另一个用例是与您的团队共享 YAML 文件的能力,这样每个人都在同一轨道上。
不管怎样,这是 Anaconda 的一个众所周知的特性。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
https://medium.com/@radecicdario/membership
保持联系
原载于 2021 年 11 月 17 日【https://betterdatascience.com】。
如何将数据从 Google Analytics 4 导出到 Google BigQuery
来源:沉积照片
在本文中,我们将告诉您如何将 Google Analytics 4 链接到 Google BigQuery,将数据从 GA4 导出到 BigQuery,并从您收集的数据中获得最大价值。
Google Analytics 4 让在 Google BigQuery 中分析数据变得前所未有的简单。现在几乎每个人都可以免费在 BigQuery 中收集数据。让“”弄清楚如何正确地将数据从 Google Analytics 4 导出到 BigQuery,以及您还应该考虑哪些因素,以便从您收集的信息中获得最大价值。
为什么需要收集原始的未采样数据
原始(未处理的)数据允许您精确地分析您的业务流程。通过收集原始数据,您可以:
- 客观地评估您的业务流程
- 执行指标的深度分析
- 跟踪整个用户旅程
- 无限制地构建任何报告
- 细分你的受众,建立有针对性的广告
采样是指当信息量太大而无法快速处理时(例如,如果您在报告中使用多个自定义维度),对给定细分市场的分析结果进行外推。抽样会严重扭曲你的报告,并导致你错误评估你的结果,因为你不是分析所有的数据,而是只分析部分数据。这样做,你就冒着投资低效广告活动或关闭创收广告渠道的风险。如您所见,避免采样绝对是个好主意。谢天谢地,这是可以实现的。
在哪里存储收集的数据
让我们来看看问题的实际方面:哪种分析平台方便、实惠,并且允许您处理原始的未采样数据?我们推荐的解决方案——Google big query——可能是全世界营销人员中最受欢迎的,这有一大堆坚实的理由。我们建议您使用 BigQuery 云存储来收集、存储和处理原始数据,下面我们将解释原因。
什么是 Google BigQuery?
Google BigQuery 是一个多云数据仓库,内置查询服务,具有很高的安全性和可扩展性。据 Gartner 称,“到 2022 年,75%的数据库将被部署或迁移到云平台,只有 5%曾经考虑过迁移到本地。”由于 BigQuery 是谷歌生态系统的一部分,特别是谷歌云平台,它可以与谷歌的其他产品集成,帮助你以有竞争力的速度发展你的业务。
为什么要 Google BigQuery?
对于营销人员来说,有多个低层次的方面使得 BigQuery 几乎不可替代。让我们仔细看看它的一些最有价值的好处:
- 能够上传大量信息。使用 BigQuery,你可以对任何类型的数据进行实时分析,并用 SQL 快速处理。
- **安全级别高。**您获得了对项目的完全控制权,并且可以利用双因素认证。
- 实惠。 只为收集和处理的数据付费。
- **与谷歌产品的原生集成。**轻松连接 Google Analytics 和其他产品。
- 可扩展。 快速无缝扩展轻松适应快速变化的世界。
- big query ML。使用 SQL 在结构化和半结构化数据上构建机器学习预测模型。
- **大查询 GIS。**借助 BigQuery 地理信息系统 (GIS),您可以分析地理空间信息,并确定哪些用户应该收到特定商店位置的邮件。
导出模式
让我们检查一下导出到 BigQuery 的 GA 4 属性数据的格式和模式。使用 GA 4 时要记住的一件重要事情是,它的结构不同于全球营销人员熟悉的通用分析的结构。
这就是 Google Analytics 4 模式与通用分析模式的不同之处:
- 数据集。 GA 样本数据集被命名为分析 _ ,其中属性 ID 是您的分析属性 ID。
- **表格。**每天都有一个单独的 Google Analytics 表导入到数据集中。这种表格的格式是 events_YYYYMMDD ,不像通用分析中的格式是 ga_sessions_YYYYMMDD 。
- **行。**每一行对应于一个上传的事件,而 Universal Analytics 的每一行对应于一个 Google Analytics 360 会话。
- **列。**GA 4 和 Universal Analytics 的字段名差别很大。您可以通过以下链接进行比较:
现在让我们来看看本文的主要目的:提供如何将数据从 Google Analytics 4 导出到 BigQuery 的分步说明。
如何将原始数据从 Google Analytics 4 导出到 Google BigQuery
如果你需要的信息已经在谷歌分析 4 中,你可以开始导出它。您可以将其导出到 BigQuery 沙箱的自由实例中(适用沙箱限制)。
1.创建一个 Google-APIs-Console 项目
要创建 API 控制台项目:
- 登录谷歌 API 控制台。
- 创建新项目或选择现有项目。
图片由作者提供
2.启用 BigQuery
- 转到 API 表。
- 进入导航菜单,点击API&服务,然后选择库。
图片由作者提供
- 在Google Cloud API部分,选择 BigQuery API 。
- 在打开的页面上,点击启用。
- 向您的云项目添加服务帐户。确保fire base-measurement @ system。gserviceaccount.com是项目成员,并被分配了编辑角色。
3.将 BigQuery 链接到 Google Analytics 4 属性
- 登录您的 Google Analytics 账户。该帐户应该有所有者访问您的 BigQuery 项目和编辑访问您正在使用的谷歌分析 4 属性。
- 进入 Admin 选项卡,找到你需要链接到 BigQuery 的 Analytics 属性 。
- 在属性 列中,点击 BigQuery 链接。
图片由作者提供
- 点击链接。
图片由作者提供
- 点击选择一个 BigQuery 项目查看您有权访问的项目。要创建新的 BigQuery 项目,请单击了解更多信息。
图片由作者提供
- 选择你的项目,点击确认。
图片由作者提供
- 选择一个位置。(如果您的项目已经有一个用于分析属性的数据集,则不能配置此选项。)
图片由作者提供
- 点击下一个的*。***
- 选择要导出其信息的数据流。
图片由作者提供
如果您需要包含广告标识符,请勾选包含移动应用流的广告标识符。
- 设置频率 : 每日 或串流 (连续)输出(您也可以选择这两个选项)。
图片由作者提供
- 最后点击提交。
图片由作者提供
恭喜你。你将在 24 小时内在你的 BigQuery 项目中看到你的 Google Analytics 4 信息。
下一步是什么?
现在,BigQuery 中已经有了所有关于用户行为的原始数据。然而,要执行营销分析,找到你的增长区域和薄弱点,你需要将广告服务的成本数据、CRM 系统的数据、电话跟踪服务和移动应用程序(如果你使用的话)添加到 GBQ。接下来,将所有这些数据合并到一个数据集中,并使数据为业务做好准备,以便营销人员可以轻松地基于 BigQuery 数据创建报告。
收集和处理所有营销数据的最佳解决方案之一是 OWOX BI Pipeline。它包括从广告服务、CRM、呼叫跟踪服务和线下商店到 BigQuery 的数据,以完成您的数据难题。
图片由作者提供
一旦你有了所有必要的数据,是时候让它为你工作了。通常,这是分析师的任务,但有了 OWOX BI 智能数据,任何人都可以轻松处理 BigQuery 数据。
BigQuery 经常让营销人员感到害怕,而且似乎很复杂,但没有必要担心这一点:有一个解决方案可以帮助您轻松发现营销数据的所有潜力。OWOX BI 可以将它安排在一个根据您的业务调整的模型中,这样即使您根本不知道任何 SQL,您也可以轻松地构建报表。只需使用一个简单的报表生成器或选择一个现成的模板,并在您最喜欢的可视化工具中可视化结果。
图片由作者提供
结论
您可以轻松地将您的 GA 4 信息导出到 BigQuery。如果新的结构适合你,你可以利用这种渐进的服务,并将其添加到你的营销分析工具箱。通过 OWOX BI Pipeline,您可以从您的网站、广告服务、CRM、线下商店和 BigQuery 中的呼叫跟踪服务收集数据,以完善您的数据。借助 OWOX BI 智能数据,您可以通过构建报告、将多行和多表转换为可操作的见解,以及改进您的决策来让这些数据为您所用。
如何使用 SQL 从雪花中提取数据可观测性度量
使用这些简单的查询来监控雪花数据管道的健康状况
你的团队刚刚将的迁移到了雪花的。你的首席技术官对这个“现代数据堆栈”了如指掌,或者用她的话说:“企业数据发现”但是任何数据工程师都会告诉你,即使是最好的工具也无法将你从破裂的管道中拯救出来。
事实上,您可能已经在比您希望记住的更多的情况下接受了模式更改变坏、重复的表和太多的空值。
好消息是什么?当谈到管理雪花环境中的数据质量时,数据团队可以采取几个步骤来了解数据从接收到使用的健康状况。
这里有一个从雪花中提取数据可观察性度量的五步方法,反过来,离信任您的数据又近了一步:
映射您的雪花库存
出于本教程的目的,让我们假设您在 Snowflake 上有一个名为 ANALYTICS 的数据库(尽管与大多数数据堆栈一样,这种情况很少发生)。要在您的环境中运行以下查询,只需将 ANALYTICS 替换为您希望跟踪的数据库的名称。要列出您帐户中的数据库,您可以运行“显示数据库”。
您的第一步将是映射仓库中的所有表,这样您就知道首先需要跟踪什么。当您这样做时,映射模式可以成为理解每个表中的内容以及这些内容如何随时间变化的强大工具。
以下是如何用雪花做这件事:
该查询将获取所有表的列表以及关于它们的设置的有用元数据。如果您一直致力于用注释来记录数据,那么注释属性会特别有用。
要获取表的模式(了解它的演变过程确实有助于防止和解决数据损坏问题),您可以使用以下查询:
请注意,上面的代码片段将有助于处理表格,但是我们有意省略了视图和外部表格。要提取这些内容的元数据,我们建议使用以下查询:
虽然这可能会增加实现的复杂性,但这些查询将获取在查询information _ schema . tables时无法获得的有价值的信息。例如,您将拥有视图的 text 属性——它将为您的视图提供关于底层 SQL 查询的洞察力。
监控雪花中的数据新鲜度和数据量
跟踪表的数量和新鲜度对于了解管道和数据的整体健康状况极其重要。幸运的是,当对仓库中的表进行写操作时,雪花会跟踪这些信息。您可以使用以下查询获取表的字节数和行数,以及它们最近一次更新的时间:
通过存储这些指标并观察它们如何随时间变化,您可以绘制出表更新的频率、每次更新预期的数据量,最重要的是,确定缺失或异常的更新。
测量视图的新鲜度和容量并不简单,因为它是底层查询中包含的表的函数。至于外部表,我们建议使用来自“显示外部表… ”的新鲜度信息。
构建您的雪花查询历史
在排查问题时,拥有在雪花环境中运行的所有查询的可靠历史记录是一个非常有价值的工具——它可以让您确切地看到最近一次写入表的方式和时间。更广泛地说,对查询日志的分析可以帮助映射血统(表之间的依赖关系),了解哪些用户使用哪些资产,甚至优化雪花实例的性能和成本。
这是我们用来提取查询日志的查询—请注意,我们将过滤掉系统和错误的查询以减少干扰:
您可能还会发现查看复制和加载操作的历史对于理解数据是如何加载和移动的很有价值:
在雪花中检查您最重要的数据的健康状况
最后,对于一些关键表,您可能希望运行数据质量检查,以确保所有字段都正确填充并具有健康的值。通过跟踪一段时间内的运行状况指标并将其与过去的批次进行比较,您可以在数据中出现一系列数据质量问题时立即发现这些问题
你可以这样做:
在本例中,我们正在收集 client_hub 表中两个字段的健康指标。对于字段 account_id ,一个字符串,我们跟踪像完整性(非空值的百分比)、独特性(唯一值的百分比)和 UUID 率(匹配 UUID 格式的记录的百分比)这样的指标。随着时间的推移跟踪这些将有助于识别常见问题,如没有 id 的帐户、重复记录和 id 格式错误。
对于数值字段 num_of_users ,我们跟踪其他类型的指标,如零比率(值为 0 的记录的百分比)、平均值和分位数。随着时间的推移,这些指标可以帮助我们识别常见问题,如导致我们的计数为 0 的缺失数据,或导致我们的用户计数偏离的错误。
为了可伸缩性,请注意我们只跟踪最近的数据(在本例中为 1 天),并假设以前的数据已经被查询和存储。这种做法——以及必要时的采样——将让您高效且经济地跟踪一些大规模数据集。
将它投入生产
当在生产中使用这种方法时,需要记住一些注意事项:
可量测性
跟踪大量的表和大数据集可能会变得很棘手。您需要考虑对您的调用进行批处理,针对规模优化您的查询,进行重复数据删除,规范化各种模式,并将所有这些信息存储在一个可扩展的存储中,以便您能够理解这些信息。这需要构建一个专用的数据管道,由您长期操作、更新和维护。
**专业提示:**别忘了记录你的雪花信用卡消费(你不会想接到首席财务官的电话……)。
覆盖堆栈的其他部分
构建真正可靠的数据管道和实现数据可观察性需要的不仅仅是收集雪花型指标。事实上,随着现代数据堆栈的发展,监视实时流数据、数据湖、仪表板、ML 模型和其他资产的可靠性将变得至关重要。
使这种方法可扩展到雪花之外是一个根本性的挑战,特别是当您的数据堆栈增长到包含额外的技术和数据源时。因为数据可能在管道中的任何地方中断,所以您将需要一种方法不仅从您的仓库中,而且从其他资产中提取指标和元数据。
投资于解决方案,使这些集成彼此之间以及与您的最终用户(无论是您的数据工程师、分析工程师、ML 团队还是数据科学家)和谐相处,应该是重中之重。真正的数据可观察性超越了数据仓库,在破碎的数据滚雪球般变成更大的问题之前,提供对您的湖泊、ETL、商业智能仪表板等中的数据健康状况的洞察。
构建工作流
团队的其他成员需要随时可以获得您获取的信息,特别是当事情发生变化或者您正在对您的数据管道 进行 根本原因分析时。在检测到问题时自动发送通知,并通过一个集中的(易于导航的)用户界面来更好地处理这些工作流,这是快速解决问题和长达数天的数据灾难之间的区别。
这不是星舰企业号(或发现号),但我们希望本教程能为您提供数据信任的基础。
现在,前进并执行 SQL!
有兴趣了解更多?伸出手去 巴尔摩西伊塔布莱 以及剩下的 蒙特卡洛团队。
本文由 Itay Bleier 合著。
用自然语言处理(NLP)从音频文件中提取关键词
HuggingFace Transformers 将语音转换为文本,Spacy 提取关键字
最新版本的 HuggingFace transformers 引入了一个模型 Wav2Vec 2.0,该模型有可能解决与音频相关的自然语言处理(NLP)任务。而现在,你可以解决的任务之一就是如何从音频中提取关键词。
Wav2Vec 2.0 模型是由脸书人工智能团队发布的自动语音识别模型。当该模型在 10 分钟的转录语音和 53k 小时的未标记语音上训练时,它在有噪语音上的单词错误率(WER)为 8.6%,在干净语音上为 5.2%。Wav2Vec 2.0 的性能在标准 LibriSpeech 基准上进行检验。
点击 了解更多关于wav2 vec 2.0 的信息。
您可以解决的其他 NLP 任务有自动摘要、翻译、命名实体识别、关系提取、情感分析、语音识别、主题分割等。
在本文中,我们将解决的 NLP 任务是从音频中提取文本,然后提取文本的关键字。
让我们将这些任务分成 3 部分。
1.音频预处理
2.从音频预测文本
3.从文本中提取关键词
第一步:音频预处理
最常用的音频格式是 mp3、mp4 和 m4a。但是,Wav2Vec 2.0 模型是在 Wav 格式音频上训练的。因此,它接受 wav 格式作为输入。我使用 Pydub 库来转换不是 wav 格式的格式。
按照下面的代码将音频文件转换成 Wav 格式。
from pydub import AudioSegmentm4a_audio = AudioSegment.from_file(r”dnc-2004-speech.mp3", format=”mp3")m4a_audio.export(“dnc-2004-speech_converted.wav”, format=”wav”)
我的笔记本电脑一次只能处理 3-4 分钟的音频。任何超过 3-4 分钟的音频在处理时都会引发内存不足的错误。
我引用了美国前总统奥巴马先生的讲话。音频长度为 12 分钟。所以,我把 12 分钟的音频分成 4 部分来避免这个错误,每个音频有 3 分钟的长度。之后,我使用该模型从每个音频元素中提取文本。最后,我将所有音频的文本合并成一个段落。
按照下面的代码将大的音频文件分解成较小的文件。
至此,音频预处理部分完成。我们现在将这些文件输入到模型中来预测文本。
那么,让我们执行第二步。
第二步:从音频预测文本
在这一步中,您将使用 Wav2vec 2.0 模型从音频中获取文本。您可以通过循环播放我们之前转换成较小音频文件的音频文件来实现这一点。
在每个循环中,从音频中预测文本,并将其存储到 collection_of_text 变量中。最后,添加 collection_of_text 变量中的所有文本,并将其存储在 final_complete_speech 变量中。
可以使用 transformers 库导入预先训练好的模型 facebook/wav2vec2-base-960h。这个模型在 960 小时的 Librispeech 语音音频上进行了微调。其他型号也可以进行微调或不进行微调,或者提供不同的培训时间。
访问 这里下载 其他型号。
此外,这些模型是在 16Khz 频率音频上训练的。因此,输入音频也应该具有 16 Khz 的频率。
按照这段代码完成第二步。
这样,第二部分就完成了。在最后一部分,你可以从 final_complete_speech 变量中提取关键字。
第三步:从文本中提取关键词
您可以使用各种 python 库来完成这一步。但是最常用的 python 库是 Spacy、Rake、Bert 和 Yake。我更喜欢 spacy 的关键字提取,因为它非常简单易用。使用 Spacy,您只需 4 行代码就可以完成第三步。
还有,你可以参考 这篇文章 来使用其他的关键词提取方法。
按照这段代码从文本中提取关键字。
# use this code to install Spacy, Scispacy and en_core_sci_scibert model
# pip install -U pip setuptools wheel
# pip install -U spacy
# pip install scispacy
# pip install [https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.4.0/en_core_sci_scibert-0.4.0.tar.gz](https://s3-us-west-2.amazonaws.com/ai2-s2-scispacy/releases/v0.4.0/en_core_sci_scibert-0.4.0.tar.gz)import spacy
nlp = spacy.load(“en_core_sci_scibert”)
doc = nlp(final_complete_speech.lower())
print(doc.ents)
结论
随着变形金刚库的完善,NLP 领域也在不断发展。Wav2Vec 2.0 模型是脸书人工智能团队和 HuggingFace 团队的重大成功之一。现在,你可以用很低的 WER 成功地从音频中提取抄本。
可以解决自动文摘、翻译、命名实体识别、关系抽取、情感分析、语音识别、话题分割等。,与音频相关的 NLP 任务。
希望这篇文章能帮助你解决与音频相关的关键词提取任务。
如何从自然语言数据中提取标注主题
假设您的项目中有大量难以处理的自然语言数据。也许你刮了它,做了 101 个 API 调用,或者其他人把它送给了你。
很自然,你想看看里面是什么。但是真的很大吗?因此,这就是主题建模的用武之地,它可以帮助从自然语言数据集中提取排名前 n 的主题。
但是你知道主题实际上是什么是非常重要的,对吗?你不只是想让他们成为话题 1、话题 2 等等。另外,如果你完成后能把这个转换成一些时髦的视觉效果就更好了。
但是,嘿,不是已经有很多关于主题建模的教程了吗?有,有!但是根据我的经验,他们很少关注让输出更加用户友好和易于理解。虽然像 PyLDAvis 这样的库对于在 Jupyter 笔记本中详细探索自然语言主题来说是非常棒的,但它们不太能与非技术同事或利益相关者共享。
这就是我这篇文章想要解决的问题。我将讨论主题建模一个混乱的自然语言数据集,你可能会在一个网络抓取项目中得到这种数据集。到我们完成的时候,希望我的 python 函数会有意义,你可以复制、粘贴和调整它们到你自己的项目中。
数据准备
在整篇文章中,我将使用来自 Kaggle 的数据。这是 Twitter 上关于客户支持问题的推文集合,所以这是一个非常混乱的自然语言数据集,其中有许多不同的主题。
首先要做的是读入数据并清理它。
在检查了没有丢失数据的行之后,我使用了一个非常有用的 tweets 预处理库,您可以在用语法import preprocessor as p
导入之前用pip install tweet-preprocessor
安装它。这有助于快速删除表情符号、网址和其他噪音;然而,我避免删除标签,因为我想保留文本数据。所以我只是保持简单,在清理文本的函数中调用text.replace("#", "")
。
为主题建模
现在转到主题建模,我已经用一种非常简单的方式完成了,因为这是一个很大的领域,并不是本文的重点!
简而言之,我使用了一个简单的计数矢量器来生成一个令牌计数矩阵,即不同的重要单词在我们正在分析的文本中出现了多少次。我还明确表示,我感兴趣的是两到三个单词的配对,而不仅仅是单个单词。
这意味着在“快速棕色狐狸跳过懒狗”这句话中,“棕色”不能算作象征,但“快速棕色”或“狐狸跳过”可以。我这样做是因为我认为这将有助于理解客户支持中的主题;例如,“电子邮件支持”而不仅仅是“支持”是否经常与特定的公司或软件搭配使用?
接下来,我将使用 LDA 模型来尝试查看正文中的主题。这里有一篇非常好的文章和一些相应的论文,关于这是如何工作的,,如果你打算使用这个模型,我鼓励你去读一读!但是在一个非常简单的层面上,这实质上是将单词——或者在我们的例子中是成对的单词——分组到主题中,基于它们是那些主题的成员的概率。
现在已经完成了,是时候解释输出了!
创建主题关键词
这就是代码变得更加繁重和复杂的地方。下一个 Jupyter 笔记本片段将完成以下步骤:
- 创建一个通用的工具函数来展平列表。这有助于从 LDA 模型对象中获取数据。
- 一个
write_data
函数,它从我之前使用的 CountVecotrizer 中获取清晰可读的数据,将大量文本转换为感兴趣的令牌矩阵,并从 LDA 模型中获取。我也把这个信息写到文件里了。 - 一旦完成,我们就可以读入数据并使用 groupby 来查看哪些主题与哪些词对相关联。这通常比看起来要简单得多——主题并不总是出现在你面前,可能需要对矢量器和建模参数进行一些调整才能做到这一点。虽然这看起来很烦人,但我认为这实际上是一件非常好的事情——您可以手动检查输出,以确保模型挑选出真正有意义的主题。
- 完成后,我为主题创建了一些更容易理解的名称,并将它们写入数据框架。请注意,scikitlearn 的输出只是任意编号的主题,即主题 1、主题 2、主题 3 等等。这就是我们要替换的。
- 然后,我用 Seaborn 制作了一个非常简单的条形图来说明到目前为止所做的工作。但是你可以制作更具视觉吸引力的图表——见下文。
用图表表示出来
为了可视化你的结果,我强烈推荐原始图表。它非常易于使用,可定制性强,非常漂亮。
举例来说,你可以使用与制作上面非常技术性的 Seaborn 图完全相同的数据,来制作这个冲积图。
结论
总结一下,一旦你完成了建模,手动提取主题实际上并不难。这有点复杂,但在我看来这不是坏事,因为它迫使你详细解释建模的结果,而不是过度依赖计算机。
一旦你把数据也拿出来了,你就可以用任何你喜欢的方式来绘制它。以我的经验来看,如果你要向利益相关者做演示,并且想要完全控制演示的效果,这就大不一样了。
希望这将有助于向他人展示你的作品,让他们更容易理解,反过来也让你更欣赏!
如何在 Python 中提取 PDF 数据
Adobe 在没有订阅的情况下很难做到这一点,但这应该会有所帮助
由 Unsplash 上的 iMattSmart 拍摄的照片
出于某种原因,pdf 仍然在行业中一直使用,它们真的很烦人。尤其是当你没有为某些订阅付费来帮助你管理它们的时候。这篇文章是为那些处于那种情况的人写的,那些需要免费从 pdf 获取文本数据的人。
首先,如果你想分析手写文本,这篇文章是错误的——但它很快就会出现。
该过程包括将 PDF 转换为。然后通过正则表达式和其他简单的方法提取数据。
如果你没有读过我的文章关于自动化你的键盘将 pdf 转换成。txt 群发,那么我建议你先这样做。这会节省你很多时间。如果你不想点击离开,那么这里的所有代码做到这一点。
作者写的代码——可以在这里下载:https://gist.github.com/jasher4994
转换为。txt 然后从字里行间读出
既然你已经皈依了。txt 文件,你所要做的就是写一些代码,找出你想要的答案。
当翻译成。txt 文件,输出可能会有点滑稽。有时问题周围的文本可以在响应框的上方,有时可以在下方。我不确定这是否有技术上的原因,或者只是为了让做这样的事情更加困难。
诀窍是在文本中寻找常量,并隔离它们。
不管怎样,都有解决的办法。我们只想要答案,并不关心它们周围的文字。幸运的是当转换成。txt 文件,我们所有的所有输入部分都在新的一行开始。正如我们所知,如果我们试图提取的所有事物都有一个不变的因素,那么我们的生活就会轻松很多。
因此,我们可以读取我们的。用 open()和 read()将 txt 文件转换成 Python,然后对它使用 splitlines()。这将提供一个字符串列表,每当原始字符串中出现一个换行符(\n)时,就会开始一个新的实例。
import os
os.chdir(r"path/to/your/file/here")
f = open(r"filename.txt", "r")
f = f.read()
sentences = f.splitlines()
正如承诺的那样,这会给你一个字符串列表。
但是,如前所述,这里我们只对用户输入感兴趣。幸运的是,还有另一个决定性因素可以帮助我们隔离输入。所有的输入,以及从新的一行开始,都以一对括号开始。这些括号内的内容定义了输入的类型。例如,文本部分应该是
(text)James Asher
一个复选框是
(checkbox)unchecked
其他例子包括“单选按钮”和“组合按钮”,大多数 PDF 输入都是这四种类型。
然而,偶尔会有随机的以括号开头的部分或句子,所以您可以使用 set(sentences)来仔细检查。在我的例子中,只有 5 个不同类型的问题,我想包括在内,所以使用下面的列表理解来删除所有其他内容。
questions = ["(text", "(button", "(:", "(combobox", "(radiobutton" ]sentences= [x for x in sentences if x.startswith(tuple(questions))]
现在,您将拥有一份针对您的问题的所有输入/答案的列表。只要你使用相同的 PDF,这个列表的结构将保持不变。
我们现在可以简单地把它转换成熊猫的数据帧,做一些处理,然后输出成我们想要的任何格式。
不全是。txt 文件像这样从 pdf 中输出,但大多数都是这样。如果您的没有,那么您必须使用 regex 并在您的特定文档中查找常量。但是一旦你编写了从一个文档中提取它的代码,只要它们是同类的,它对你所有的文档都是一样的。
从字符串列表中提取数据
提取文本很容易。在这种情况下,我需要做的就是删除前面的括号。这可以通过列表理解和一些正则表达式轻松完成。
list_strings = [re.sub(r"\([^()]*\)", "", x) for x in list_strings]
df = pd.DataFrame(list_strings)
df.to_excel("output.xlsx")
输出如下所示。
使用 Python 提取 PDF 数据的输出
然后,您可以简单地在所有。txt 文件并与熊猫合并在一起。然后,您可以根据需要旋转或清洁。
您现在有了一个可用的 excel(或 CSV)文件,它存储了所有 pdf 中的所有数据。几乎所有这些代码都是可重用的,您只需确保如果您尝试使用新的一批不同的 pdf,它们会在转换为时转换为类似的布局。txt 文件。
希望这有所帮助。
If I’ve inspired you to join medium I would be really grateful if you did it through this [link](https://jamesasher4994.medium.com/membership) — it will help to support me to write better content in the future.If you want to learn more about data science, become a certified data scientist, or land a job in data science, then checkout [365 data science](https://365datascience.pxf.io/c/3458822/791349/11148) through my [affiliate link.](https://365datascience.pxf.io/c/3458822/791349/11148)
如果你喜欢这篇文章,请看看我的其他文章。
干杯,
詹姆斯
如何在 BigQuery 中从 Google Analytics 4 和 Firebase 中提取实时日内数据
并始终为您的自定义报告提供最新数据
杰西卡·路易斯在 Unsplash 上的照片
如果您是一名 Firebase 或 Google Analytics 4 用户,并且您已经将数据导入到您的 BigQuery 数据仓库中,那么您可能想要创建实时定制报告,其中包含您在日内模式中的数据。问题是,这个整合的数据集每天都在被谷歌自动删除。因此,如果您选择将它作为数据源连接到您在Google Data Studio中的报告,第二天您将找不到它。
作者图片💡迈克·沙克霍米罗夫
例如,我想在我们用 Data Studio 构建的 BI 解决方案中对日内表进行实时分析。由于它经常被删除,我无法将它作为数据集连接到谷歌数据工作室。此外,当它被删除时,它不再是一个分区表,您不能使用通配符后缀进行日期查询。
说到这里,我需要以下内容:
- 日内表不应该自动删除。我想手动操作。
- 由于此 Firebase 日常数据导出/集成功能的存在。我想集成数据传输将在一个小时内保证第二天交付。
我相信这是一个很普遍的问题。
作者图片💡迈克·沙克霍米罗夫
我已经向谷歌工程提出了一个功能请求,以在需要时启用手动删除,但在写这篇文章时,它仍在进行中*。*
“日内表不应该自动删除。我们希望手动操作。”
虽然这可能需要一段时间。因此,这里有一个解决方案来克服这个问题。
如何从日内表中提取数据
理想情况下,您会希望运行一个调度脚本,其中参数是当天表格的日期后缀。
然而事情没那么简单……
日内表被自动删除
所以你不知道安排剧本的确切时间。或者,您可以使用 daily export 表,但是同样,您必须等到提取准备就绪。我一直在寻找关于日内表删除时间的信息,我发现过去一天的日内表可能还存在几个小时。原因之一是处理大量数据需要更多时间 Stackoverflow 。因此,删除过去的表没有固定的时间,但一般来说,它在新的一天之后的几个小时内仍然存在。您在 GA 中设置的时区也会对此产生影响。
无法在 BigQuery 脚本中使用表名参数。
BigQuery 脚本是一个强大的工具,但目前(2021–11–20)谷歌的 BigQuery 脚本不能使用表名参数。根据 BigQuery 文档中的参数化查询]5,查询参数不能用于 SQL 对象标识符
参数不能替代标识符、列名、表名或查询的其他部分。
第一步。检查原始日内表是否存在
如果数据存在,您可能希望使用此脚本返回true
:
第二步。创建一个 BigQuery SQL 脚本(如果存在,执行一些操作,例如插入)
然后,将执行更新的脚本添加到您的程序中:
第三步。决定如何处理新的日内表副本的 INSERT 语句
您可以:
- 用新数据替换整个表
- 仅为所选列添加新记录
复制和替换当天事件表
这个脚本将复制整个表:
您可能希望使用与复制和替换日内事件表相同的 SQL 脚本,但是将复制和替换查询更改为选择和插入查询。让我们创建这个脚本来完成以下任务:
解决方案:
结论
日内 表与 日内 会话表相比可能会有细微的差异,但您无需等待。这些差异是由以下原因造成的:
- Google Analytics 允许最多晚发送四个小时的点击,在请求数据时,这些点击可能在当天的表中不可用。
- Google 在收集点击量之后和将数据导出到 BigQuery 之前执行一些数据处理。一般受影响的领域是流量来源和链接的营销产品(AdWords,Campaign Manager 等。)
一般来说,如果这些字段对您的数据堆栈没有任何影响,这是通过与 Firebase 或 Google Analytics 4 集成来提高**数据可用性*** 的解决方案。*
资源
原载于【https://mydataschool.com】https://mydataschool.com/blog/how-to-extract-real-time-intraday-data-in-firebase-and-bigquery/。****
如何用 KeyBERT 提取相关关键词
伯特的另一个应用
作者图片
有很多强大的技术可以执行关键词提取(例如 Rake , YAKE !, TF-IDF )。然而,它们主要基于文本的统计属性,并不一定考虑整个文档的语义方面。
KeyBERT 是一个简单易用的关键字提取技术,旨在解决这个问题。它利用了 BERT 语言模型,并依赖于🤗变形金刚图书馆。
来源:https://github.com/MaartenGr/KeyBERT
KeyBERT 由 Maarten Grootendorst 开发和维护。所以,如果你有兴趣使用它,就去看看他的回购(并克隆它)。
在这篇文章中,我将简要介绍 KeyBERT :它是如何工作的,以及你如何使用它
PS:如果想看如何使用 KeyBERT 以及如何嵌入到 Streamlit app 中的视频教程,可以看看我的视频:
作者视频
KeyBERT:一种基于 BERT 的关键词提取技术
你可以用 pip 安装 KeyBERT。
pip install keybert
如果您需要其他来源的嵌入🤗变压器,你也可以安装它们:
pip install keybert[flair]
pip install keybert[gensim]
pip install keybert[spacy]
pip install keybert[use]
调用 KeyBERT 很简单:根据🤗变形金刚建模并对其应用extract_keywords
方法。
来源:https://github.com/MaartenGr/KeyBERT
KeyBERT 如何提取关键词?
KeyBERT 通过执行以下步骤提取关键词:
1-使用预训练的 BERT 模型嵌入输入文档。你可以选择任何你想要的伯特模型🤗变形金刚。这将文本块转换成固定大小的向量,表示文档的语义方面
2-使用单词包技术(如 TfidfVectorizer 或 CountVectorizer)从同一文档中提取关键字和表达式(n 元语法)。这是一个经典步骤,如果您过去执行过关键词提取,您可能会很熟悉
作者图片
3-然后将每个关键字嵌入到固定大小的向量中,使用与嵌入文档相同的模型
作者图片
4-既然关键字和文档在同一空间中表示,KeyBERT 计算关键字嵌入和文档嵌入之间的余弦相似性。然后,提取最相似的关键字(具有最高的余弦相似性得分)。
作者图片
这个想法非常简单:您可以把它看作是经典关键字提取技术的增强版本,其中 BERT 语言模型加入了它的语义功能。
这还不止于此 : KeyBERT 包括两种方法来在结果关键字中引入多样性。
1 —最大相似度总和(MSS)
要使用这个方法,首先要将 top_n 参数设置为一个值,比如 20。然后从文档中提取 2 个 top_n 关键词。计算这些关键词之间的成对相似度。最后,该方法提取彼此最不相似的最相关的关键词。
这里有一个来自 KeyBERT 知识库的例子:
来源:https://github.com/MaartenGr/KeyBERT
2 —最大边际相关性(MMR) 这种方法与前一种相似:它增加了一个多样性参数
在文本摘要任务中,MMR 试图最小化冗余并最大化结果的多样性。
它从选择与文档最相似的关键词开始。然后,它迭代地选择既与文档相似又与已经选择的关键词不相似的新候选
您可以选择低差异阈值:
来源:https://github.com/MaartenGr/KeyBERT
或者一个高的:
来源:https://github.com/MaartenGr/KeyBERT
到目前为止还不错,但是…
不过,KeyBERT 可能会遇到的一个限制是执行时间:如果您有大型文档并需要实时结果,KeyBERT 可能不是最佳解决方案(除非您的生产环境中有专用的 GPU)。原因是 BERT 模型是出了名的庞大,并且消耗大量资源,尤其是当它们必须处理大型文档时。
您可能会找到一些技巧来加快推断时间,方法是选择较小的模型(DistilBERT),使用混合精度,甚至将您的模型转换为 ONNX 格式。
如果这仍然对你不起作用,检查一下其他经典方法:尽管它们相对简单,但你会对它们的效率感到惊讶。
感谢阅读!
今天到此为止。如果您正在执行关键词提取,我希望您会发现这个小方法对您的 NLP 项目有用。
你可以在这里了解更多关于 KeyBERT 的信息:
https://github.com/MaartenGr/KeyBERT
还有这里:
https://www.preprints.org/manuscript/201908.0073/v1
保重,
新到中?您可以每月订阅 5 美元,并解锁无限的文章— 点击此处。
如何通过 Python 空间从文本中提取结构化信息
文本分析
关于如何从文本构建结构化数据集的现成教程。
图片来自 Pixabay 的 Gerd Altmann
在本教程中,我将演示如何从文本构建数据集。作为一个例子,我考虑出生登记,其中包含以下文本:
On August 21 1826 a son was born to John Bon and named him Francis.
On June 11 1813 a daughter was born to James Donne naming her Mary Sarah.
On January 1 1832 a son was born to his father David Borne and named him John.
文件的每一行都包含出生登记。所有出生登记的结构几乎相同,尽管在一些细节上有所不同。寄存器存储在名为register.txt
的 txt 文件中。
在本教程中,我一步一步地描述了如何提取父亲的名字和姓氏、孩子的名字、出生日期和孩子的性别。
我按照以下步骤提取信息:
- 将文本转换成一个
pandas
数据帧,其中每一行对应寄存器的一行 - 分析典型句子的结构,以提取词性。
- 提取所有需要的信息。
对于最后两步,我利用了 SpaCy 库,这是一个用于自然语言处理的 Python 库。
从文本到数据帧
首先,我从文件系统中打开文本,逐行分割,并将每一行存储为一个列表项:
with open('register.txt', 'r') as f:
text = [line for line in f.readlines()]
然后,我用创建的列表构建一个pandas
数据框架:
import pandas as pddf = pd.DataFrame(text,columns=['text'])
df.head()
作者图片
词性分析
现在我以第一句话为例,进行基本的自然语言处理。这可以通过spaCy
库的nlp()
功能来完成。我导入了en_core_web_sm
词库,可以通过下面的命令安装:python -m spacy download en_core_web_sm
。spaCy
库支持许多语言,它们的词典可以通过相同的命令安装。
一旦安装了词典,我就导入并加载它。然后,我可以执行 NLP 处理。
import en_core_web_sm
import spacytext = df['text'][0]nlp = en_core_web_sm.load()
doc = nlp(text)
doc
变量包含所有被处理的信息。在我的例子中,我只需要 PoS,提取如下:
features = []
for token in doc:
features.append({'token' : token.text, 'pos' : token.pos_})
对于句子中的每个标记,我保存标记及其位置。我将结果附加到一个名为features
的列表中。现在,我可以用提取的特征构建一个数据框架。这样做只是为了以更有序的方式显示结果:
fdf = pd.DataFrame(features)
fdf.head(len(fdf))
作者图片
我注意到父亲(约翰·邦)被标记为 PROPN,这意味着一个人的名字,它的前面是单词到,后面是单词和。对于数据集中的所有句子来说,最后一点并不正确,因此我还必须考虑其他句子的结构,这将在后面解释。
这个孩子也被认为是一个 PROPN,后面总是跟一个点,前面是单词 him 或 her 。
提取父亲
现在我可以建立一个模式,提取父亲的名字和姓氏。我定义了两个变量first_tokens
和last_tokens
,它们分别包含所有句子中的前置词和后置词:
first_tokens = ['to', 'father']
last_tokens = ['and', 'naming']
我定义了能识别父亲的模式:
pattern_father = [[{'LOWER' : {'IN' : first_tokens}},
{'POS':'PROPN', 'OP' : '+'},
{'LOWER': {'IN' : last_tokens}} ]]
我说父亲必须以前面单词中的一个单词开始(没有匹配的大小写),然后我搜索 PROPN(一次或多次),最后我搜索下面单词中的一个。
我定义了以下函数:
from spacy.matcher import Matcherdef get_father(x):
nlp = en_core_web_sm.load()
doc = nlp(x)
matcher = Matcher(nlp.vocab)
matcher.add("matching_father", pattern_father) matches = matcher(doc)
sub_text = ''
if(len(matches) > 0):
span = doc[matches[0][1]:matches[0][2]]
sub_text = span.text
tokens = sub_text.split(' ')
name, surname = tokens[1:-1]
return name, surname
这个函数利用了spaCy
Matcher()
类,该类搜索先前定义的模式。如果我找到一个匹配,我从匹配中删除第一个和最后一个单词,并返回结果。
现在我利用 dataframe apply()
函数来计算数据集中每个文本的父亲:
new_columns = ['father name','surname']
for n,col in enumerate(new_columns):
df[col] = df['text'].apply(lambda x: get_father(x)).apply(lambda x: x[n])
作者图片
救出孩子
提取每个孩子的过程与提取父亲的过程非常相似。因此,首先,我定义了第一个和最后一个标记以及模式:
first_tokens = ['him', 'her']
last_tokens = ['.']
pattern_son = [[{'LOWER' : {'IN' : first_tokens}},
{'POS':'PROPN', 'OP' : '+'},
{'LOWER': {'IN' : last_tokens}} ]]
然后我定义了提取孩子的函数:
def get_child(x):
nlp = en_core_web_sm.load()
doc = nlp(x)
matcher = Matcher(nlp.vocab)
matcher.add("matching_son", pattern_son)matches = matcher(doc)
sub_text = ''
if(len(matches) > 0):
span = doc[matches[0][1]:matches[0][2]]
sub_text = span.text
# remove punct
sub_text = sub_text[:-1]
tokens = sub_text.split(' ')
return ' '.join(tokens[1:])
请注意,上一个函数的最后一行允许提取复合名称。
最后,我利用apply()
函数来计算每个孩子:
df['child'] = df['text'].apply(lambda x: get_child(x))
作者图片
提取日期
现在我定义一个提取日期的函数。在这种情况下,我没有利用spaCy
库。我对句子进行了标记,我注意到日期总是从第二个标记(月)开始,到第四个标记(年)结束。我将月份从字符串转换成数字。此外,我以 YYYY-MM-DD 格式返回日期。
def get_date(x):
months={"January":"01","February":"02","March":"03","April":"04","May":"05","June":"06",
"July":"07","August":"08","September":"09","October":"10","November":"11","December":"12",}
tokens = x.split(" ")
# month
month = months[tokens[1]]
# day
day=tokens[2]
if(len(day)==1):
day="0"+day
# year
year = x.split(" ")[3]
return (year+"-"+month+"-"+day)
我将定义的函数应用于数据帧:
df['date'] = df['text'].apply(lambda x: get_date(x))
作者图片
提取性别
最后,我通过利用下面的想法来提取性别:如果句子包含单词 son,则孩子是男性,否则她是女性:
def get_gender(x):
if 'son' in x:
return 'M'
return 'F'
df['gender'] = df['text'].apply(lambda x: get_gender(x))
作者图片
数据集可以导出为 CSV 文件:
df.to_csv('structured_register.csv')
摘要
在本教程中,我演示了如何从非结构化文本中提取结构化信息。我利用了spaCy
库的两个函数:nlp()
,用于执行 NLP,以及Matcher()
,用于在字符串中搜索模式。
spaCy
库非常强大,因此如果您想了解其他提供的特性,请继续关注;)
本教程的完整代码可以从我的 Github 库下载。
如果你想了解我的研究和其他活动的最新情况,你可以在 Twitter 、 Youtube 和 Github 上关注我。
相关文章
https://medium.com/geekculture/the-top-25-python-libraries-for-data-science-71c0eb58723d