大数据:优势、挑战和未来
约翰·霍普斯金 DS 专业化系列
简单看一下大数据和未来
由 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 个部分。关于这个系列的注释还可以在这里找到。
介绍
在互联网出现之前,信息在某些方面受到限制,而且更加集中。唯一的信息媒介是书籍、报纸和口头传播等。但现在,随着互联网的出现和计算机技术的进步(摩尔定律),信息和数据激增,它已经成为一个开放系统,信息可以不受任何限制地传播给人们。随着互联网变得越来越容易访问和全球化,社交移动应用和网站逐渐成为共享数据的平台。数据和许多其他东西一样,随着大小的增加而价值增长,这种价值在许多方面都有应用,但主要用于分析和决策。这里有更多关于大数据的内容。
什么是大数据?
B ig 数据可以定义为大量的结构化和非结构化数据,通常存储在云中或数据中心,然后被公司、组织、创业公司甚至政府用于不同的目的。
利用数据意味着清理数据,然后分析数据,形成模式和联系、趋势和相关性,以产生洞察力。这就是所谓的大数据分析。
大数据也通常通过其质量来描述,也称为 4v
大数据的质量—4v
1.卷
- 由于技术和数据存储的改进(云存储、更好的流程等),数据量不可逾越
2.速度
- 数据以惊人的速度生成,这与计算机的速度和能力增长有关(摩尔定律)
3.多样化
- 在社交媒体和互联网时代,可以轻松收集各种不同格式和类型的数据。
4.诚实
- 数据的不一致性和不确定性(非结构化数据—图像、社交媒体、视频等。)
两类数据
结构化和非结构化数据的简要说明
1.结构化的
- 传统数据—表格、电子表格、包含列和行的数据库、CSV 和 Excel 等
- 如今的数据很少如此混乱
- 工作是提取信息,并把它整理成整洁有序的东西
2.无社会组织的
- 来自数字交互的数据激增——电子邮件、社交媒体、文本、客户习惯、智能手机、GPS、网站、活动、视频、面部识别、
- 大数据—利用新数据的新工具和方法&清理和分析非结构化数据
大数据工具/语言
有一些流行的工具通常与大数据分析相关联,
工具
- Hadoop
- 阿帕奇火花
- 阿帕奇蜂房
- 斯堪的纳维亚航空公司
这些工具中的大部分只是用于高效处理大量数据的开源框架和有用的功能。
语言
- 稀有
- 计算机编程语言
- 斯卡拉
这些语言在数据科学领域非常流行,可以用于通过特定的库和包处理大量数据。
大数据在行动
今天很多地方都可以看到大数据。一个普遍的例子是在线零售商。像亚马逊这样的公司专注于建立精确的推荐系统,为他们的客户量身定制,系统越好,他们的客户就会对越多的产品感兴趣,从而转化为更多的销售。
要做到这一点,亚马逊需要大量的数据,如购买行为、浏览和购物车历史、人口统计等信息。建立用户档案的推荐系统也出现在社交媒体、流媒体服务等等。
大数据还应用于许多领域,如医疗保健、制造、公共部门、媒体和娱乐等。
利益
量 —一些问题受益于大量的数据,凭借庞大的数据量,它否定了微小的混乱或不准确。
速度 —实时信息→根据最新的、有根据的预测做出快速决策
多样性——提出新问题和建立新联系的能力,这些问题是以前无法触及的
准确性——杂乱和非结构化的数据可能会导致隐藏的相关性。
也许更多数据最有希望的好处是识别隐藏的相关性。
示例:
GPT-3
- 使用深度学习的流行语言模型。它有 1750 亿个参数,它是通过从互联网上吞噬数据来发现模式和相关性而建立的。它能够编写代码片段,
新冠肺炎(新型冠状病毒肺炎)
- 大数据的概念也可以应用于疫情的情况,通过接触追踪收集人们的行踪(互动和访问位置)数据,可以进行分析来预测病毒的传播,并帮助遏制病毒。
拥有大量数据有它的好处,但它不会没有任何挑战。
挑战
1。大
- 大量原始数据需要存储和分析
- 昂贵且需要良好的计算投资
2。不断变化和更新
- 数据不断变化和波动,为处理这些数据而构建的系统必须具有适应性
3。种类繁多
- 很难确定哪个数据源有用
4。凌乱
- 要快速分析的名人
- 需要先清理数据
大数据的未来
大数据通常与机器学习、数据科学、人工智能、深度学习等其他热门词汇联系在一起。由于这些领域需要数据,大数据将继续在改善我们现有的模型方面发挥巨大作用,并推动研究的进步。以特斯拉为例,每辆具有自动驾驶功能的特斯拉汽车同时也在训练特斯拉的人工智能模型,并随着每次错误不断改进它。这种巨大的数据虹吸,加上一个才华横溢的工程师团队,使特斯拉成为无人驾驶游戏中的佼佼者。
随着数据的不断扩大和增长,AWS、微软 Azure 和谷歌云等云存储提供商将在存储大数据方面占据统治地位。这为公司的可扩展性和效率提供了空间。这也意味着将会有越来越多的人被雇佣来处理这些数据,这意味着更多的工作机会给“数据官员”来管理公司的数据库
大数据的未来也有其黑暗的一面,如你所知,由于隐私和数据问题,许多科技公司正面临来自政府和公众的压力。管理人们对其数据的权利的法律将使数据收集更加受限,尽管是诚实的。同样,网上数据的激增也让我们面临网络攻击,数据安全将变得极其重要。
摘要
如今,许多大型科技公司都在接收来自用户的海量数据,当涉及到利润、权力或社会的更大利益时,选择前者是人的本性,尤其是在你可以选择的情况下。我们生活在一个注意力不断被资本化的时代。我们必须更聪明地生活,理性地行动,以防止我们的生活屈服于这些短暂的多巴胺爆发以及权宜之计和琐碎的行为。
我们只能希望,随着我们进入未来几十年,控制这些公司决策的人将会为整个社会和文明做出更好的贡献。我们的数据将用于构建服务于我们的系统,使我们更具生产力,而不是寻找吸引我们注意力的方法,构建能够为我们的生活提供价值和意义的产品。
到目前为止所有事情的快速总结
- 大数据 —快速生成的各种类型的大型数据集。数据从结构化向非结构化转变。
- 非结构化数据 —定义不明确且需要更多工作来处理的数据(图像、音频、社交媒体等)
- 结构化数据——被称为传统数据,因为它在现实生活中很少见,基本上是定义明确且易于处理的数据。它的数据科学家的工作是清理它,形成整齐的数据
4v 的优缺点
音量
- 稍微杂乱的数据抵消了小错误
- 很多东西需要存储和分析
品种
- 回答非常规问题
- 选择类型的负担
速度
- 实时分析和决策
- 不断更新
准确性
- 隐藏的相关性
- 分析杂乱的数据
你应该吸取的一个重要教训是,即使有大量的数据,你仍然需要正确的数据和正确的变量来正确地回答你的问题。
美国著名数学家约翰·图尔基的一句话很好地说明了这一点:
一些数据和对答案的渴望并不能保证从给定的数据中提取出合理的答案——John Turkey,1986
斯坦福大学的 Atul Butte 引用了另一段关于数据隐藏能力的话
“隐藏在这些成堆的数据中的知识可能会改变病人的生活,或者改变世界。”
感谢阅读,本系列到此结束。我希望你从这些文章中学到了一些东西,并留下关于我如何改进的评论,如果你对我接下来应该写什么有任何建议。保持安全,上帝保佑。
如果您对学习数据科学感兴趣,请查看“超学习”数据科学系列!
这是一个简短的指南,基于《超学习》一书,应用于数据科学
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) [## 机器学习和数据科学的 20 大网站
这里是我列出的最好的 ML 和数据科学网站,可以提供有价值的资源和新闻。
medium.com](https://medium.com/swlh/top-20-websites-for-machine-learning-and-data-science-d0b113130068) [## 开始数据科学之旅的最佳书籍
这是你从头开始学习数据科学应该读的书。
towardsdatascience.com](/the-best-book-to-start-your-data-science-journey-f457b0994160)
联系人
如果你想了解我的最新文章,请通过媒体关注我。
也关注我的其他社交资料!
请关注我的下一篇文章,记得保持安全!*
基于 Spark 的 Apriori 算法的大数据购物篮分析
在 PySpark 上从头开始应用 Apriori 算法
客户购买特定产品的概率可能基于几个因素。客户的交易历史、人口统计特征和兴趣等因素都是这方面的例子。如果我们没有这些因素。这意味着顾客以前没有来过我们的商店,我们没有他/她的数据(甚至没有性别)。在这种情况下,我们有办法找到客户可能购买的产品。通常,这些方法中使用的数据属于之前在商店中购物的其他顾客。这些方法获取所有交易,控制交易中的每个项目(产品),并找到显示客户在同一个篮子中购买最多的产品的模式。发现这些模式的方法称为频繁模式挖掘或关联规则挖掘[1]。
Apriori 算法是用于频繁模式挖掘的算法之一。在本文中,我将解释如何在 Python 中用 Spark 应用 Apriori 算法。在开始应用下面的代码之前,了解“Apriori 算法”是如何工作的是很重要的。我还将解释 Apriori 的基础知识,但如果你想详细了解它,请阅读我以前的文章什么是“Apriori 算法”及其工作原理。在这篇文章中,将会看到以下几个部分,
- 应用先验知识的一个实例
- 什么是火花,为什么我们应该使用它
- 如何准备交易数据
- 先验术语和基础
- 使用 PySpark 从头开始应用 Apriori
**快捷方式:**您可以在我的 GitHub 仓库中找到 python PySpark 上 Apriori 算法实现的源代码,并且可以使用为 Spark 创建的模块。
该模块被开发用于在基于 RDD 的 pyspark 上运行 apriori 算法。在功能更新之前,应该显示数据…
github.com](https://github.com/sergencansiz/apriori-pyspark)
示例案例
假设纽约市有一个蔬菜水果商。这家蔬菜水果商是纽约市最大的蔬菜水果商,一个月有数百万顾客。蔬菜水果商的老板仅在一天内就购买了大量的产品。然而,有些日子她卖不完所有的产品,就把它们扔掉,因为产品的寿命到期了。因此,扔掉产品会造成大量损失。因此,蔬菜水果店的老板决定创新他们的营销策略。她想为她的蔬菜水果商雇佣一名数据科学家。这位数据科学家的职责是创建一种算法,可以找到客户将产品放入购物篮后可能会购买的产品。她将为算法为每个特定客户找到的产品提供折扣。由于这种算法,她计划及时销售她的产品。好主意!
现在,假设她雇佣的数据科学家是你,你会如何开始?
环境
Apache Spark [2]是一个开源分析引擎,专注于速度、易用性和分布式系统。它运行机器学习算法的速度比非分布式系统快 100 倍[3]。如果有大量数据集,Spark 将是分析该数据集的最佳选择。好的,让我们回到我们的例子:考虑到蔬菜水果商一个月有数百万的顾客,你将不得不处理数百万的交易数据。为了提供更快的数据分析,最好的选择之一可能是 Spark。
你如何准备你的数据?
首先,你应该做的是准备一个客户交易的数据集。但是,你不应该忘记,一个顾客可能会从蔬菜水果店里购买一件或多件商品,这意味着我们的数据集不能每行都有一定数量的列。因此,我决定逐行编写事务,并用逗号分隔事务中的每一项,并保存为“txt 或 CSV”文件。每一行都用逗号分隔的项目表示每个交易。例如,在第一次交易中,客户购买了苹果、芒果和香蕉,在第二次交易中,客户购买了香蕉和芒果。如果您有 CSV 格式的数据集,您也可以使用它(它已经用逗号分隔,但不要忘记删除标题行)。
算法—先验
在 Spark 上实现 Apriori 之前,我们需要理解它的主要术语和概念。Apriori 算法依赖于项目集的频率。它创建包含项目组合的不同表格。它扫描显示所有交易的主数据集,并通过考虑这些组合在主数据集内出现的次数来查找频率[4]。在 Apriori 算法中,这些频率被称为支持值。此外,表格的数量根据最大项目集长度而变化。如果最大项目集长度为 5,则意味着将有 5 个支持值表。但是,有一个最小支持值,用于决定哪个项目集应该留在表中。假设最小支持值已经被决定为 2。因此,如果任何项目集在主数据集中出现的次数少于 2 次,我们应该从表中删除该项目集。
让我们检查下图,以便理解先验是如何工作的。为了简单易懂,我在下图中取了一些交易记录。
先验-支持表(图片由作者提供)
“数据集”代表我们的交易数据,“数据集”中的每一行都显示了客户同时购买的每个交易项目集。表 a 中有单项频率。这是我们需要为 Apriori 算法创建的第一个表。在表 A 之后是表 B,它包括单个项目的二进制组合。最重要的部分是这里的项目顺序没有意义。所以,“苹果,芒果”和“芒果,苹果”是一回事。因此,在生成项目组合时,必须移除项目集的副本。从表 B 中可以看出,支持值小于 2 的“香蕉-椰子”和“芒果-椰子”的项目集已经被删除。然而,在表 C 中有单个项目的三重组合,并且支持显示在主数据集中出现多少次的值。支持值小于 2 的项目集也从此表中删除。如果您看到表 D,则只有一个支持值为 0 的项目集,它有四个单项。应用算法时不应考虑该表。因为在主数据集中没有这样的交易。
那么,如果一个客户买了苹果,利用上图中的这些支持表,我们怎么计算他买芒果的概率呢?为了计算该概率,我们需要将“芒果”和“芒果,苹果”的支持值放在一起。“芒果”的支持值为 4,“芒果,苹果”的支持值为 3。我们可以计算概率;(3 / 4) * 100 = %75.这个概率被称为先验的置信值。对该值的解释是,购买芒果的客户可能会购买置信度为%75 的苹果产品。
现在,我们知道如何计算支持度和置信度值。我们可以用 PySpark 来研究 Apriori 算法。在下面一节中我们将看到;
- 使用 PySpark 读取数据
- 解析数据以激发 RDD 对象
- 使用“MapReduce”查找项目的第一个支持值
- 决定最小支持值
- 使用“MapReduce”创建以下支持表
- 计算置信度值
- 决定客户购买哪种产品时信心十足
用 PySpark 读取数据集
PySpark 在 rdd 上工作,这意味着我们需要将所有事务记录转换成多个 rdd。在此之前,我们需要确保 SparkContext 已创建,以便定义 rdd 的每个记录并读取 CSV 文件。
在开始本节之前,请确保您的系统上安装了 Spark 和 PySpark 。
首先,在你的工作目录中创建一个名为“apprioriSpark.py”(或者任何你想要的名字)的 python 文件,然后你可以通过下面的命令轻松地创建一个 SparkContext(你还应该从 P ySpark 导入 SparkContext )。
代码 1:用 PySpark 创建 spark 上下文
创建 SparkContext 后,我们可以使用 SparkContext 中的 textFile()方法读取数据。请确保您的数据文件与 python 文件位于同一目录中。
代码 2:用 Spark 读取文本文件
将交易项目解析到 RDD
默认的 textFile()方法逐行读取文件,这意味着 CSV 文件中的每一行都将是一个 RDD 值。这些 rdd 包括 CSV 行作为单个字符串值(结果在第 6 行)。这就是为什么我们需要映射到每个 RDD,并用逗号分割这些单个值,以便获得行中的每个项目,并将它们分割到一个 RDD 数组中。为了跑那段路。
代码 3:将项目解析到数组中
现在,您可以清楚地看到,事务数据集中的每一行都由逗号分隔。在我们的 RDD 中,每个数组都代表客户交易的项目列表。我们通过考虑属于客户的每一笔交易,成功地将文件转换为 Spark RDD 对象。
为先验获取项目的第一支持值
Apriori 算法依赖于项目的频率。因为第一,我们需要获得每一个项目的频率。这些频率将是我们在表 1 中的第一个支持值(如前一节所述)。为了做到这一点,我们需要将 rdd 中的每一项提取到数组的所有项中。我们可以通过使用“平面图”方法做到这一点。
代码 4:文件中项目的平面映射
从结果可以看出;我们所有的交易项目都在一个数组中。现在我们可以计算每个独特的项目的频率。不要忘记,这些频率将是我们的第一支持值。如果我们将致力于“NumPy”阵列,找到频率将是容易的。但是,我们在 rdd 上工作,这就是为什么我们需要通过考虑“MapReduce”方法来找到获得频率的方法。解决方案;首先,我们可以将每个项目转换为一个“元组”对象,并添加“1”作为“元组”的第二个项目。我们可以通过使用“reduceByKey”(类似于 SQL 中的 groupby 方法)方法对这些值求和。通过对元组的第二个数字求和,我们可以获得每个唯一项目的频率(客户交易发生的次数)。我们还需要在功能部分列出独特的项目。因此,我们也可以通过使用“distinct”方法来获得独特的项目。
代码 5:生成第一个支持值
如果在上面的代码片段之后运行“supportRdd.collect()”,就会得到第一个 item -support 元组(假设为表 A)。从支持值可以看出,“苹果”比其他品牌出现的频率更高。这意味着购买“苹果”产品的可能性比其他产品更大。这些支持值是通过分别考虑每个项目获得的。我们还需要考虑它们如何在事务中一起出现。得益于此,我们可以通过 Apriori 算法计算置信度值。我们将在接下来的课程中看到这些步骤。
最小支持值
为了决定哪些项目集将留在支持表中,我们需要定义一个最小支持值。我们可以选择最小支持值作为第一个支持值数组(表)中的最小频率。如果项目集数组中的任何支持值小于最小支持值,我们应该从该数组中删除该项目集。如果我们的数据没有很多记录,最小支持度可能是 1。在这种情况下,我们可以将最小支持度定义为 2 或任何大于 1 的值。
代码 6:支持 RDD 对象和最小支持
在本例中,我们发现最小支持值为 1。为了获得更一致的结果,我们可以将最小支持度设置为 2。这意味着,如果任何项目或项目集在交易中出现少于 2 次,我们不会考虑它。从第 8 行可以看出,我们根据最小支持值过滤了第一个项目集表(这是单个项目支持值)。我们还创建了一个“baseRdd”对象。“baseRdd”代表我们对每一项的第一支持值。此对象将使用即将到来的组合支持值进行更新。我们还需要定义“supportRdd ”,它只显示没有支持值的项目。我们将在下一节中使用它来创建项目的组合。
进入 Apriori 算法
在本节之前,我们只找到了每个项目的支持值(频率)。现在,我们将创建一个在 while 循环中生成项目组合的算法。在每个循环中都将创建不同的支持表。当不存在任何支持值大于最小支持值的组合时,该 while 循环将结束。该算法将控制这些项目组合在每个循环的事务数据集中一起出现和的次数,并将其保存在 RDD 中。
我们已经创建了一个“supportRdd”对象,它只包含第一个表的项目集,没有支持值(每行只有一个项目)。现在,我们将在 while 循环中使用这个 RDD,将它与唯一的项目组合起来,以便创建其他支持表。然而,这个 RDD 将在每次循环之后被更新。比如说;
# Fitst supportRDD
([Apple] , [Mango] , [Banana] , [Grapes])# After first loop = supportRDD
([Apple,Mango],[Mango,Banana],[Apple,Banana],[Apple,Grapes] ......)# After second loop = supportRDD
([Apple,Mango,Grapes] , [Apple,Banana,Grapes] ........ )
该算法将根据最小支持值过滤每个组合表。当没有项目设置时,while 循环将结束。此外,我们还需要定义一个函数,它可以在组合的项目集中找到副本。如前所述;(苹果,芒果)和(芒果,苹果)的集合对于 Apriori 算法来说是一样的。正因为如此,我们需要找到这样的模式,并删除其中的**。从下面的代码片段可以看到,有一个函数叫做“removeReplica”。该函数在组合后删除这些重复项,并只返回其中一项。**
耶!我们准备创建 while 循环。首先,我们需要定义一个变量,我们可以在每个循环中控制项目集长度。它在上面的代码片段中表示为“c”。这个“c”变量从 2 开始。为什么?请记住,我们已经创建了第一个支持表“supportRdd”。所以,在 while 循环中支持表将从 c=2 开始。这意味着将在 while 循环中创建的第一个支持表将具有包含 2 个项目的项目集。为了创建项目的组合,我们可以使用 PySpark 附带的“笛卡尔”函数(第 6 行)。它被创建,我们将删除重复的项目(在第 7 行)。我们将使用“c”变量,以便比“c”变量更多地过滤组合项目(在第 9 行)。然而,我们也使用“distinct”方法来获得一个惟一的项目集,以防万一。
正如你所看到的,在每个循环中创建了两个对象“组合”和“组合 _2”。上面已经解释过了。“Combined_2”则是“Combined”变量和整个数据集(每笔交易)的每一行的组合。从第 14 行可以看出,有一个过滤过程控制每个项目集,不管“组合”的项目集是否在数据集中。如果数据集中没有任何这样的项目集,则它移除该项目集。毕竟我们也是用“reduceByKey”的方法得到频率,按照最小支持值过滤。在第 21 行,我们将最终的支持表添加到“baseRDD”中,它包含我们所有的项目集支持值(理论上它被称为 table)。但是,我们还需要用不带支持值的“combined_2”更新“supportRdd”变量。这个过程将继续下去,直到“supportRdd”中没有任何项目集。
最后,我们可以计算置信度值。您可以使用以下代码来计算 baseRdd(整个项目集组合)的每个组合的置信值。有一个“Filter”类,可以根据置信度计算过滤数据。它还包括计算置信度的“计算置信度”方法。
如果运行 baseRddConfidence.collect()可以获得所有置信度值。您还可以过滤大于特定置信度的结果。结果中的几个例子如下所示:
[[['Apple'], ['Mango'], 58.333333333333336],
[['Mango'], ['Apple'], 70.0],
[['Apple'], ['Banana'], 41.66666666666667],
[['Apple'], ['Mango', 'Banana'], 33.33333333333333],
[['Mango', 'Apple'], ['Banana'], 57.14285714285714],
[['Apple', 'Banana'], ['Mango'], 80.0],
[['Mango', 'Banana'], ['Apple'], 66.66666666666666],
[['Mango', 'Apple'], ['Raspberry'], 28.57142857142857
[['Raspberry', 'Apple'], ['Mango'], 50.0],
[['Mango', 'Raspberry'], ['Apple'], 50.0],
[['Mango', 'Banana'], ['Raspberry'], 33.33333333333333],
[['Mango', 'Raspberry'], ['Banana'], 50.0],
[['Raspberry', 'Banana'], ['Mango'], 50.0]]
数组中的第一个项目集显示客户购买的产品,第二个项目集显示如果客户购买了第一个项目集中的产品,他们可能会购买的产品。数组的最后一个元素显示了该模式的置信度值。例如,购买芒果的客户可能会以%58 的信心购买苹果。再比如;购买芒果和香蕉的顾客可能会以 66.6%的信心购买苹果。如果仔细看前两个数组[“Mango “,” Apple” ]和[“Apple “,” Mango”]的置信度值不同。我们来写一下对“芒果”= >“苹果”的支持公式
( support(["Mango" , "Apple"]) / support(["Mango"]) ) * 100 = 70
和公式[“苹果”= >“芒果”]
( support(["Mango" , "Apple"]) / support(["Apple"]) ) * 100 = 58
[“芒果”]“苹果”]的支持度是 7,[“芒果”]的支持度是 10,[“苹果”]的支持度是 12。虽然在两种计算中[“苹果”“芒果”]的出现频率(支持度)相同,但由于“苹果”的出现频率和“芒果”的出现频率不同,所以它们的置信度值也不同。
您也可以通过使用以下代码来转换结果 pandas 数据框;
结论
在本文中,我们学习了什么是频繁模式挖掘,以及如何将其应用于 Apriori 算法。我们以一个数据集为例,从头开始在 PySpark 上应用 Apriori 算法。您还可以查看其他 FPM 方法,如 FPGrowth、Eclat 等。理解了先验知识之后,你就可以很容易地理解其他方法是如何工作的。如果你有任何问题,请随时提问。
希望对你有帮助…
参考
**【1】**频繁模式挖掘
【https://en.wikipedia.org/wiki/Frequent_pattern_discovery】T4
****【2】阿帕奇火花
https://spark.apache.org/
****【3】什么是火花
https://databricks.com/spark/about
【https://en.wikipedia.org/wiki/Apriori_algorithm 先验算法
大数据显示每个人都会撒谎
为什么大数据如此重要,为什么您也应该关注它
詹·西奥多在 Unsplash 上的照片
你的直觉在骗你
在我们的日常生活中,除了高科技,绝大多数人都是凭直觉做决定和给出建议。在他们的一生中,他们吸收了大量的数据,这些数据安全地保存在他们的大脑中,使他们能够对问题做出结论。
然而,这带来了几个问题:
- 你所有的观察(数据点)都是从你的角度出发的。这意味着你会看到一个有限的画面。
- 随着时间的推移,你的大脑会改变记忆,你能记住的就这么多
以篮球为例。你可能听说过贫穷的成长会帮助你成为一名优秀的 NBA 球星。有很多成功的故事证明,看到勒布朗·詹姆斯,所以这一定是真的。但你听到的故事只是成功的故事(生存偏差);你没听到剩下的。
“下一个弗洛伊德将是数据科学家。下一个马克思将是数据科学家。下一个索尔克很可能会成为一名数据科学家。”
这就是为什么大数据非常有益,可以帮助回答有趣的问题。大数据可以从全国范围内获取数据,看看成长为穷人或中产阶级对你的 NBA 梦想是否有任何影响。事实证明确实如此。如果你不是出身贫寒,你更有可能进入 NBA。
这个博客是关于什么的?
除非你过去十年一直躲在石头下面,否则你肯定听说过大数据。这是一个越来越受欢迎的话题。这种现象如此普遍,以至于一本关于大数据的书登上了纽约畅销书排行榜!
谷歌大数据趋势
这本书名为《每个人都在撒谎:网络能告诉我们的真实身份》,作者塞思·斯蒂芬斯-达维多夫茨。
纽约时报畅销书。年度经济学家书籍
books.google.co.uk](https://books.google.co.uk/books/about/Everybody_Lies.html?id=8dEkDwAAQBAJ&printsec=frontcover&source=kp_read_button&redir_esc=y#v=onepage&q&f=false)
嗯,我读了这本书,总共 300 页左右,我觉得它很吸引人。为了不让你也不得不去读它,我试图在这篇博客中提炼出这本书的信息。我希望你会觉得有趣。
图书概述
总的来说,这本书描绘了什么是大数据,以及如何使用它来识别某些以前未知的真相。它举例说明了它是多么有用,如果你不给予应有的关注,它会被有意或无意地误解。
在整本书中,赛斯给出了大数据的例子和它揭示的真理,同时给你提供了令人兴奋的轶事,很像史蒂芬·都伯纳和史蒂芬·列维特的《魔鬼经济学》(另一本畅销书)。
“数据科学采用自然、直观的人类流程——发现模式并理解它们——并为其注入类固醇”
更具体地说,这本书探索了许多数据集,包括来自 Google Trends 和 PornHub 的数据。在这样做的过程中,它引起了人们对政治(选举、演讲以及对种族主义的影响等)等话题的关注。),在金融或赛马中寻找优势,以及人类的性。
如果你决定要读这本书,不要过多关注细节,以免毁了它,以下是关键要点!
大小不如拥有正确的数据重要
大数据革命不是收集越来越多的数据。这是关于收集正确的数据。
自本世纪初以来,我们目睹了数据生成和可用性的大幅增长。你想要什么样的数据并不重要;它很可能存在!
据认为,在未来五年内,我们每天将产生大约 500 的数据!为了扩大规模,1 EB 等于 1,000,000 TB。
人们正在做各种疯狂的实验,在海量数据中寻找能让他们在行业或工作中获得优势的东西。
这方面的例子包括:
- 对冲基金正在使用推特和谷歌数据来计算哪些股票会涨跌。在某些情况下,他们甚至通过低轨道卫星监控停车场。没错——他们去太空给停车场拍照是为了获得优势!
- 研究人员在全国各地对赛马进行医疗程序,以找出是什么让赛马禁食。这样,他们就可以预测并确定下一个大赢家。这样做,他们既能知道如何赌钱,又能为拥有和比赛这些马的人充当马匹侦察员。
可能性真的是无穷无尽!
每个人都会撒谎,除了对谷歌
人们一次又一次地发现,当人们认为自己被监视时,他们往往会撒谎。根据赛斯的说法,说谎是很普遍的。
“一切都是数据!有了这些新数据,我们终于可以看穿人们的谎言了。”
人们对朋友、社交媒体和调查撒谎。在某种程度上,他们也可能对自己撒谎。只有当你放大人们的行为,并在他们认为没人看的时候关注他们真正的问题(见谷歌搜索),你才能开始从谎言中看到真相。
网飞在其生命周期的早期也得到了类似的教训:不要相信别人告诉你的;相信他们所做的。
利用公共调查的数据,人们可以很快了解美国人有多少安全性行为。然而,将这一数据与避孕套销售进行比较,似乎存在相当大的差距。通过查看谷歌趋势数据,我们可以发现大量关于“无性婚姻/关系”的搜索
同样的逻辑也适用于回顾特朗普大选。当美国正在庆祝后种族时代的成功时,特朗普当选了。塞思的谷歌趋势分析再次揭示了一些非常令人担忧的结果。
大数据,小范围
研究人员和机构一直在收集大量的数据集。拥有大型数据集并不是什么新鲜事。大数据背后的理念是这种数据的深度和广度。您可以收集前所未有的详细数据。人家居然会免费递过来!
“大数据允许我们有意义地放大数据集的小部分,以获得关于我们是谁的新见解。”
有了新级别的数据,数据科学家可以在微观和宏观级别上放大和缩小,以了解更多信息。他们可以从国家一级的分析开始,然后向下移动到州、城市、城镇、村庄,甚至社区。
照片由 Aki Tolentino 在 Unsplash 上拍摄
公司如何利用大数据影响你
鉴于每个人都在撒谎,人们不禁要问调查的价值何在。公司一直使用焦点小组来确定人们喜欢或不喜欢某个产品,但对使用 A/B 测试更有选择性,因为它往往更昂贵。
A/B 测试是应用随机实验来理解变量变化的影响的过程。正如你所想象的,由于变量和可变值的数量无限,公司需要在这个过程中分配大量的资源。
然而,在互联网和软件时代,游戏完全变了。公司可以推出不同的内容,在不同的人群中稍加修改,然后观察他们如何与之互动。这可能包括一些文本的颜色、措辞、字体、位置;什么都有可能。
“2011 年,谷歌工程师进行了 7000 次 A/B 测试。而且这个数字还在不断上升。”
这个过程被政客、软件公司和几乎所有想要获得优势的人所使用。他们不关心为什么你的潜意识喜欢那种措辞,或者当你看到它时,为什么你的大脑会活跃起来并与之互动——只关心你会这样做。
“2009 年,谷歌在 A/B 测试中测试了 41 种略微不同的蓝色后,一名沮丧的设计师辞职了。但这位设计师支持艺术胜过痴迷的市场研究的立场,并没有阻止这种方法的传播。
由 Unsplash 上的信托“Tru”kat sande拍摄的照片
你最好再检查一下那些结果
与任何事情一样,在处理大数据和统计数据时,需要注意一些陷阱。有一些你可能会屈服的常见错误,所以值得仔细检查你的结果。
同样不言而喻的是,你无疑应该仔细检查别人对具体结果的说法。
维度的诅咒
用随机变量重复一个实验足够多次,果然,你会发现一些相关性。然而,仅仅因为你找到了一段关系,并不意味着它就在那里。
换句话说,随着数据维度级别的提高,您需要更多的观察数据来支持您的分析。没错;您的大数据可能不够大!
相关性并不意味着因果关系
仅仅因为你能够在你的数据集中找到两个变量之间的关系,并不意味着一个导致另一个。举个例子,你的研究让你认识到“所有喝水的人都会死”这个事实。这是一个事实上正确的说法,但如果你说死亡是由饮水引起的,那你就错了。
这种现象被称为“反向因果关系”,需要注意的是,相关性并不意味着因果关系。
奥比·奥尼耶德在 Unsplash 上拍摄的照片
大数据的伦理
大数据非常强大,可以应用到生活的各个方面。这就提出了使用这种做法的道德问题。
举个例子,一个特定的行为是你下一步要做什么的一个重要的统计预测。公司或政府是否应该提前采取措施?会做第一个动作而不是预测的第二个动作的人的百分比是多少?
或者考虑回答某些类型的问题的含义,这些问题可能不需要回答。
结论
总的来说,我觉得这本书很有趣。从这本书里可以获得很多好的观点和一种思维方式。总之,作者说他希望这本书与《魔鬼经济学》不相上下或者超越它。我会说,这是一个很好的尝试,但不完全在同一水平上。
如果你喜欢这本书的概述,也许你也会喜欢我对“我们为什么睡觉”的评论:
我从阅读《我们为什么睡觉》中学到了什么
medium.com](https://medium.com/swlh/5-important-facts-about-sleep-76b92d23f3d8)
大数据,小盒子
使用 VirtualBox: Spark、ElasticSearch & Kibana 构建和浏览大数据开发环境。
TL;博士:看看我们如何使用 Vagrant 来构建和配置一个大数据开发环境,它小到可以装进你的笔记本电脑。用一行代码启动这个环境。掌握 ElasticSearch、Kibana 和 Spark 的基础知识:将 Spark 数据帧索引到 Elasticsearch,然后了解如何使用 Python、Kibana 或 good ol’ cURL 查询索引。享受使用虚拟机的乐趣,提高您对大数据堆栈中一些关键技术的熟练程度。
我已经尽可能地让这篇文章易于理解,你应该能够在不了解我们将使用的任何技术的情况下理解这篇文章。
1.介绍
在本文中,我们将把大数据堆栈中的关键技术联系在一起,探索数据如何在这些组件之间流动,以及每个组件发挥什么功能。我们将能够通过使用一种让我们构建和配置虚拟机,并为它们提供软件的技术,非常容易地做到这一点。事实上,如果你已经做到了这一步,你离拥有一个功能性的“大数据”开发环境只有几步之遥,尽管没有处理 TB 级数据集的资源。
您将能够使用此设置来学习如何在自己的时间内高效使用大数据技术堆栈(并且在没有人看到的情况下犯错误),以便在真正使用这些技术时,您将拥有坚实的基础和一些实践经验!
内容
2.入门指南
是时候开始运行了…travel 允许我们根据写在 travel 文件中的指令初始化、供应和配置虚拟机。一个浮动文件包含虚拟机供应器的指令,以及(可能)在虚拟机上下载、安装和配置软件所需的所有其他内容(尽管指令块可以重构为在供应过程中执行的单独脚本)。这意味着,如果你幸运的话,有人已经创建了一个描述虚拟机的流浪文件,它有能力做你想做的事情,你可以直接进入有趣的部分。要开始使用我为本文创建的 VM,请遵循下面的步骤。
- 下载并安装 vagger(以及类似VirtualBox)https://www.vagrantup.com/intro/getting-started这样的 VM 提供者),检查你是否可以创建一个基本的裸机 VM。
- 从这里克隆我的 GitHub 库,这包含一个将被用来创建一个特定 VM 的流浪文件,以及一些安装脚本来为它提供我们想要使用的软件。
- *进入克隆的 git repo,打开命令控制台并键入
vagrant up
。
*作为设置虚拟机过程的一部分,Spark 从这里下载并安装。实际上,在下载 Spark 之前,我已经包含了一个步骤,让安装脚本检查spark-2.4.6-bin-hadoop2.7.tgz
文件是否已经存在于与流浪者文件相同的目录中,如果是,那么下载步骤被跳过。我建议手动下载这个文件,放在流浪汉文件目录下,因为下载这个.tgz
的默认镜像站点会超级慢。
一旦你输入了vagrant up
,就是这样!喝杯茶犒劳一下自己,因为安装和配置不会在瞬间完成。
这个简单的小命令只是触发了一系列事件的连锁反应,最终将创造一个完全成熟的大数据虚拟机供我们使用和探索。事情是这样的:
- 创建了一个虚拟机。
- Python、Spark、ElasticSearch 和 Kibana 都被安装在虚拟机上。
- 一个 Python 虚拟环境(虚拟机中的虚拟环境?矩阵多?)时,PySpark 是根据 Spark 附带的源代码构建的,并安装到该虚拟环境中。
在了解如何使用我们的虚拟机探索这些技术之前,让我们简要了解一下它们各自扮演的角色,以及它们通常如何在生产大数据环境中一起使用。
- 火花。Spark 是我们的分布式计算引擎,接受使用 Python 或 Scala API 等指定的指令,并在我们的集群中优化和并行化所需的数据转换。Spark 用于在内存中快速处理大型分布式数据集。
- 弹性搜索。ElasticSearch (ES)是一个搜索引擎,它允许我们对事物(文档)进行索引,这样我们可以非常快速地搜索和检索特定的信息。在本文的后面,我们将介绍如何直接从 Spark 数据帧中索引文档。可以使用一组由 es 服务器作为端点公开的 API 来搜索、更新和删除索引。这为我们提供了在非常大的数据集上构建面向用户的应用程序所必需的响应能力。
- **基巴纳。**基巴纳有多种用途。它可以作为一种工具,以一种用户友好的方式探索经济服务指数。我们还可以使用 Kibana 构建仪表板,并使用其开发工具来学习如何与 ElasticSearch 交互。
尽管 ElasticSearch 和 Kibana 是数据可能流向的“目的地”,但我们将通过查看这两个工具来开始探索我们闪亮的新虚拟机,因为服务器进程应该已经在运行了!
启动、停止和重新启动虚拟机
您可以在方便的时候轻松地停止和启动 VM。要停止 VM,在游民文件所在目录的 shell 中键入vagrant halt
(如果您已经通过 ssh 进入 VM,请确保在执行该命令之前关闭 ssh 连接)。当您想重启 VM,并从您离开的地方开始,只需运行vagrant up
。谢天谢地,这将比我们第一次运行虚拟机时快得多!
我们的虚拟机由 vagger 和 VirtualBox 构建,托管了多项大数据技术。
3.弹性搜索和 Kibana
虚拟机启动并运行后,让我们执行一些基本的检查,以确保一切正常。您应该已经克隆了 git 存储库,并运行命令vagrant up
来启动、配置和供应虚拟机。现在运行命令vagrant ssh
将 ssh 导入正在运行的机器。使用以下命令检查 ElasticSearch 和 Kibana 是否已成功启动:
systemctl status elasticsearch
(2.a)
systemctl status kibana
(2.b)
这两个命令应该向我们显示一些看起来令人放心的输出,告诉我们我们的服务正在运行。如果一切正常,运行以下代码应该没有问题:
curl -XGET http://127.0.0.1:9200/_cat/health?v
(3)
我们刚刚向 ElasticSearch REST API 提交了一个 HTTP GET 请求,我们应该会收到一个响应,给出一些关于弹性集群状态的诊断信息。从 ES 索引中查询和检索信息同样简单!我们可以尝试的下一件事是切换到我们主机上的浏览器并导航到127.0.0.1:5602
(注意,在Vagrantfile
中,我们已经配置了来宾虚拟机的端口5601
,这是 Kibana 正在侦听的端口,用于将流量转发到主机上的端口5602
)。在我们的浏览器中,我们应该能够看到一个闪屏,告诉我们 Kibana UI 正在启动。加载后,导航至“开发工具”(左侧导航面板底部的扳手图标)。这使我们能够访问一个控制台,该控制台允许我们向 es 服务器发送请求,并帮助我们处理语法、自动完成以及探索可用的选项。响应显示在相邻的窗口中。尝试输入GET /_cat/health?v
并将查询发送到 ES 服务器。在引擎盖下,发生了与我们执行(3)时非常相似的事情。
很高兴知道我们的 ES 集群正在运行——但是更好的做法是完成文档的索引和搜索过程。导航到一个工作目录—可能是/home/vagrant
,然后使用下面的命令下载并解压缩一些示例数据。
wget https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip
(4.a)
unzip accounts.zip
(4.b)
现在我们将使用 ElasticSearch 批量上传 API 来索引accounts.json
中的文档。为此,我们需要向 ES 服务器发出一个POST
请求。完整的命令是:
curl -H "Content-Type: application/x-ndjson" -XPOST 127.0.0.1:9200/financial/_bulk?pretty --data-binary @accounts.json
(5)
注意accounts.json
是根据 API 文档中概述的要求方便地格式化的。这就在financial
索引中创建了 1000 个新文档。一个成功的请求将会得到一个由类似下面的单元组成的长响应:
"index" : {
"_index" : "financial",
"_type" : "_doc",
"_id" : "990",
"_version" : 4,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3998,
"_primary_term" : 1,
"status" : 200
}
现在让我们从索引中检索一些文档。为了增加多样性,切换回浏览器中打开的 Kibana 应用程序。转到控制台,键入GET /financial/_doc/1
,然后“点击发送请求”。在相邻的窗口中,我们将看到响应,应该是成功的,以及带有_id = 1
的文档的内容。将使用文档的内容填充_source
属性。注意,我们可以通过使用不同的工具,比如curl
,来发出请求,从而获得相同的结果。
如果你已经做到了这一步,祝贺你。您已经拥有了使用 ElasticSearch 和 Kibana 进行探索和实验所需的一切。请记住,稍后您可以轻松地停止并重新启动您的虚拟机,以继续接下来的步骤。
4.火花
我们要使用的下一项技术是 Spark。Spark 实际上是高性能大数据处理的同义词。我想在这里介绍它的原因是,可以直接将 Spark 数据帧的行索引到一个弹性簇中。这使得直接从数据处理管道向 Elastic 写出步骤(我们的输出)变得非常容易,在 Elastic 中,可以通过 API 搜索索引和检索单个文档,或者使用 Kibana 仪表板浏览和可视化。在我更详细地介绍如何做到这一点之前,让我们先了解一下如何在我们的流浪者虚拟机中使用 Spark。Spark 有用多种语言编写的 API,我们将使用 Python API,也就是 PySpark。
从连接到虚拟机的 shell 中,导航到/vagrant/examples
,并运行
pipenv shell
,(6)
这将激活已经使用pipenv
设置好的 Python 虚拟环境。通过使用 pip 构建和安装 Spark 发行版中包含的 PySpark 源代码,PySpark 已经被安装到这个虚拟环境中。如果您有兴趣更详细地理解这些步骤,您可以查看 GitHub 资源库中的bootstrap/install/spark_install.sh
和bootstrap/install/setup_demo_project.sh
脚本。
此时,你有两个选择:一组捷径,或者绕远路。要查看可用的快捷方式,请查看快捷方式部分。
请继续阅读,寻找一种更为基础的方法,我们将一个接一个地分解中间步骤。
我们应该做的第一件事是启动 Python 解释器并运行以下命令,以检查我们是否可以正确启动 Spark 会话:
(examples) vagrant@vagrant:/vagrant/examples$ python
Python 3.5.2 (default, Jul 17 2020, 14:04:10)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyspark
>>> from pyspark.sql import SparkSession
>>> ss=SparkSession.builder.getOrCreate()
这将为您提供一个 SparkSession 对象,它是底层 Spark 魔法的主要入口点,接下来我们应该使用它将一些数据加载到 DataFrame 中。为此,我们将重复使用上一节中获得的accounts.json
。我们需要通过删除包含索引/id 信息的行来快速转换这些数据,这样我们就可以将数据读入 Spark 数据帧。我们可以使用sed
(流编辑器)来完成,您可以在单独的 shell 中使用它:
cat accounts.json | sed -n 's/\({"a.*}\)/\1/\p' > accounts_edited.json
用head -n 5 accounts_edited.json
检查结果,你会注意到我们用索引信息去掉了断续的行。你还会注意到我的正则表达式非常懒惰,在更一般的情况下会很快失效。我不找借口。
切换回我们的 Python 解释器,将 json 文件加载到 Spark 数据帧中(注意,如果您将数据下载到不同的位置,则必须在代码片段中设置适当的路径):
>>> import json
>>> import os
>>> data_file = os.path.join(os.environ['HOME'], 'accounts_edited.json')
>>> with open(data_file, 'r') as f:
... data = [Row(**json.loads(l)) for l in f]
...
>>> df = ss.createDataFrame(data)
>>> df.printSchema()
root
|-- account_number: long (nullable = true)
|-- address: string (nullable = true)
|-- age: long (nullable = true)
|-- balance: long (nullable = true)
|-- city: string (nullable = true)
|-- email: string (nullable = true)
|-- employer: string (nullable = true)
|-- firstname: string (nullable = true)
|-- gender: string (nullable = true)
|-- lastname: string (nullable = true)
|-- state: string (nullable = true)
这个 Spark 数据帧与您可能在使用 Spark 的任何类型的数据处理管道的末端(或中间(或开始…))使用的对象完全相同。我们接下来要做的是看看如何将这个对象中包含的数据直接索引到 ElasticSearch 中。
5.ElasticSearch Hadoop
现在,为了能够将 Spark 数据框架直接索引到 ElasticSearch 中,我们需要付出一些努力来进行设置——即 ElasticSearch 和 Spark 之间的接口,该接口由 ElasticSearch Hadoop 提供。同样,一些工作已经完成了:所需的归档文件已经在 VM 的供应期间下载并解压缩,相关的代码片段可以在这里找到。您还会注意到,我在.bashrc
文件中添加了一个export
语句,定义了一个名为ES_HDP_JAR
的环境变量。将该变量的值回显到控制台,以查看实例化会话时需要传递给 Spark 的 jar 文件的路径。正是因为包含了这个 jar 文件,我们才可以直接使用 PySpark DataFrameWriter 对象中的索引数据。我们可以利用 Python 中的环境变量来轻松配置新的 SparkSession:
(examples) vagrant@vagrant:/vagrant/examples$ python
Python 3.5.2 (default, Jul 17 2020, 14:04:10)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> from pyspark import SparkConf
>>> from pyspark.sql import SparkSession
>>> sconf = SparkConf().set('spark.jars', os.environ['ES_HDP_JAR'])
>>> ss = SparkSession.builder.config(conf=sconf).getOrCreate()
我们将索引使用前面步骤中的accounts_edited.json
数据创建的数据帧。我们需要运行的命令是:
>>> df.write\
... .format('org.elasticsearch.spark.sql')\
... .option('es.nodes', 'localhost')\
... .option('es.port', 9200)\
... .option('es.resource', 'sparkindex')\
... .save()
上面的命令使用数据帧df
的内容创建一个新的索引sparkindex
。要查看这个新索引的内容,请切换回 Kibana 控制台(或使用等效的命令行),并使用带有空“match_all”子句的搜索 API:
GET /sparkindex/_search
{
"query": {
"match_all": {}
}
}
请注意,ElasticSearch 文档包含了与上面类似的示例,带有“复制为 cURL”选项,因此您可以看到如何使用 cURL 实现相同的结果。
响应的正文将包含一些匹配的文档:
"hits" : [
{
"_index" : "sparkindex",
"_type" : "_doc",
"_id" : "PFapu3MB4cJ_QglfiKLK",
"_score" : 1.0,
"_source" : {
"account_number" : 1,
"address" : "880 Holmes Lane",
"age" : 32,
"balance" : 39225,
"city" : "Brogan",
"email" : "[amberduke@pyrami.com](mailto:amberduke@pyrami.com)",
"employer" : "Pyrami",
"firstname" : "Amber",
"gender" : "M",
"lastname" : "Duke",
"state" : "IL"
}
}
]
注意,因为我们没有指定一个列作为惟一的文档标识符,所以已经代表我们生成了_id
字段。
6.捷径
在/vagrant/examples
中输入pipenv shell
,然后输入spark-es-demo --help
,您会看到有几个命令可以运行:
spark-es-demo make-spark-dataframe
(7.a .)
spark-es-demo spark-to-es
(7.b)
spark-es-demo search-es-index
(7。c)
运行这些并检查各自的代码(在/vagrant/examples/examples/spark_demo.py
中可以找到)应该会给你一些有用的、有文档记录的例子来参考。
(7.a)将下载一些演示数据,并将其放入 Spark 数据帧中。
(7.b)将带您了解通过 Spark DataFrame 将数据放入弹性集群的整个过程。
(7.c)将允许您编写一个基本的匹配查询并提交给一个 ES 集群。默认情况下,它会寻找一个名为sparkindex
的索引,运行(7。b)将创建它,并将一些数据放入其中,以便该命令可以成功运行。运行带有--match-all
选项的命令将提交一个匹配所有查询并返回一些结果,这样您就可以看到一些从 es 索引返回的文档示例。系统会提示您选择要搜索的字段,然后要求您输入要搜索的值。将返回实际结果的一些组合有:
0\. firstname
接着是Nanette
(感谢 Nanette)
3\. employer
接着是Anocha
(感谢 Anocha)
试着找出一些其他的。
7.进一步练习
在前面的章节中,我们简要介绍了如何使用一些关键的大数据技术。我们已经通过示例逐步了解了如何:
- 使用 ElasticSearch REST API 索引和查询数据。
- 使用 Kibana 及其开发工具和控制台与 ElasticSearch 集群进行交互。
- 使用 Python 配置 SparkSession,并使用 ElasticSearch Hadoop 接口将数据直接从 Spark 数据帧索引到 ElasticSearch 索引。
- 通过使用 Python 的 urllib 编写请求来搜索 ES 索引。
从这里开始,您可以使用我们的 vagger 开发环境来磨练您的大数据技能:熟练使用 Lucene,这是 ElasticSearch 用来编写搜索并返回与我们的查询匹配的文档的库,使用 Kibana 来构建仪表板以可视化和探索您最喜欢的数据集,构建 ETL 管道以将转换的数据集写入 ElasticSearch 索引,等等。
具有复杂和嵌套数据类型的大数据转换
Apache Spark 编程技巧和诀窍
劳拉·奥克尔在 Unsplash 上的照片
介绍
Apache Spark 是一个分布式计算大数据分析框架,旨在跨机器集群转换、设计和处理海量数据(想想万亿字节和千兆字节)。经常使用不同的数据集,您会遇到复杂的数据类型和格式,需要昂贵的计算和转换(想想物联网设备)。极其复杂和专业,在扩展大数据工程工作方面, Apache Spark 是其工艺的大师。在这篇博客中,我将使用原生的 Scala API 向你展示 1。)如何用嵌套 schema ( array 和 struct )对半结构化 JSON 数据进行扁平化和规范化,2。)如何透视数据,以及 3 .)如何将数据作为拼花模式保存到存储中,以便进行下游分析。注意,同样的练习可以使用 Python API 和 Spark SQL 来完成。
步骤 1:规范化半结构化嵌套模式
1a。)让我们来看看我们漂亮的多行 JSON schema(来自我最喜欢的视频游戏的虚拟数据)。
1b。)接下来,为了提高性能,我将把我们的模式映射并构造为新的StructType()
,以避免在读取 JSON 数据时触发不必要的 Spark 作业。
1c。)现在,我们可以打印我们的模式并检查数据,您可以看到,由于涉及到的数据类型,这是一件令人欣喜的事情。该数据集中总共有 12 行 5 列,但是我们在本机模式中看到 2 行 2 列。
1d。)是时候使用内置的Sparkdata frameAPI 函数(包括explode
)将array
数据类型中的元素转换为单独的行和点*
,这些函数解包struct
数据类型中的子字段。由于子类和超级列具有一对一的元素对映射,slick arrays_zip
函数也将与点选择一起使用,以避免在分解期间创建额外的行组合。
1e。)是时候检查转换后的数据集及其模式了。正如所料,它返回 12 行 5 列。
第 2 步:转换和重塑数据
2a。)下一个练习将采用我们的展平数据集并应用pivot
函数,这将触发大范围转换,将特定列的不同值转置到各个列中。可以在聚合或不聚合的情况下执行透视。对于使用许多列也称为功能作为学习算法输入的数据科学用例,无聚合通常是必需的模式。一个有效的性能提示是在pivot
函数输入中指定您的唯一值,这样 Spark 就不必触发额外的作业。
第三步:写入拼花格式
3a。)最后一个练习将简单地把我们的数据写到存储器中。将使用 Parquet 格式,因为它是一种可拆分的文件格式,经过高度压缩以提高空间效率,并针对列存储进行了优化,因此非常适合下游大数据分析。
结论
这些练习只是触及了 Apache Spark 对于大数据工程和高级分析用例的皮毛。感谢你阅读这篇博客。
大数据;纽约优步天气预报
维克多·拉兹洛拍摄于的照片
将 450 万条记录转化为见解和预测
在这个故事中,我描述了我作为一名经济学学生在特拉维夫大学学习大数据课程时开发的预测方法。
我收到了纽约市 450 万份优步骑行订单的数据集,它将司机和那些对骑行感兴趣的人联系起来。
该数据集包含 2014 年 4 月至 7 月的观测数据,包括订购地点和时间。
根据数据集,我被要求每隔 15 分钟预测未来一个月(2014 年 9 月)的订单数量。
首先,我将描述对数据的研究,以发现模式和联系,然后基于研究见解,将交叉检查额外的数据。
最后,将阐述预测游乐设施未来趋势的模型。
数据研究
首先,我已经根据项目规范清理了数据;缩小了从纽约证券交易所到午夜的 1 公里半径范围,确保没有丢失的数据单元。
然后,订单被分成 15 分钟的时间段窗口。
我创建了下面的图,它描述了在 15 分钟的时间段内,给定数量的订单出现的次数。
(即已经有 20 个订单的次数【x 轴】,在 15 分钟时段窗口中是在【y 轴】)。
乘坐次数分布
正如你所看到的,这个分布峰值接近它的平均值,然后急剧下降。
分布尾部主要由异常时间段窗口组成,在这些时间段内,乘车需求激增。
这种模式在其他月份也保持一致。
这种订单数量惊人的现象引发了我的好奇心,因此我整理了下表,其中描述了主要事件和天气状况。
该表按乘坐次数降序排列,旨在发现重大事件和多雨天气与接送次数之间是否存在关联。
如您所见,在 52%的 40 次以上游乐设施时段窗口和 48%的 30-40 次游乐设施时段窗口中,确实出现了重大活动的寒冷天气,这可能描述了游乐设施需求的飙升。
虽然这可以解释时隙窗口中的一些异常,但这些原因(如未来天气或重大事件)是无法预测的,因此在设计模型时要特别注意处理它们。
继续进行数据研究,创建“热图”,描述一周中每一天每一个小时的订单数量。
每天每小时的乘车次数热图
正如你所看到的,工作日下午 17 点至 19 点的需求有所上升(可能是因为下班通勤),工作日深夜时段的需求有所下降。
这种模式在其他月份也保持一致。
此外,不同月份的订单总量趋势显示优步在 4-7 月份增长,在 5 月份有所倾斜。
2014 年 4 月至 7 月优步订单数量的增长
此外,我还研究了需求领域及其模式。
下面的热图用暖色描述了一周不同日子里订单数量最高的区域。
每天的动态热图;暖色是订单数量较多的区域
正如你所看到的,需求在一周的不同日子里会发生变化,尤其是工作日和周末之间。
然而,“温暖”区域在不同月份之间保持不变,与每日热图相比,表现出较低的熵。
不同月份的动态热图;暖色是订单数量较多的区域
这些温暖的区域与曼哈顿提到的吸引点和兴趣点相关联。
另一个有趣的观察是,温暖的地区不靠近火车站,火车站在那些时间经常经过。有理由相信,在某些情况下,火车是优步乘车的替代品。
最后,建立了一个相关矩阵。
建立模型
开发的模型是一个聚类模型。
每一个订单都被分配到一个聚类,而聚类中心就在最温暖地区的中心。
这样的划分是为了独立地了解每个区域的模式,因为不同的区域在不同的日子和时间变暖——然而星团的中心又被称为“质心”几乎是静止的。
为了选择正确的聚类数量,我在聚类平方和图中创建了一个总数。
该图用于确定合理的集群数量(用 K 表示),使用“肘法”启发式;收益递减不再值得额外成本的分界点(当解释的数据量微不足道时,停止添加新的聚类或提高 K)。
所选择的群集数量(可在代码中配置)是 K=8,其质心与上述较温暖的区域相匹配。
为了构建模型,在将订单划分为聚类之后,使用由 Hadley Wickham 为聚类开发的 dplyr 库构建了一个指定的表。
主表中的每一行都匹配一个聚类的数据,并且对其应用了线性回归。
以这种方式,模型被训练以独立地学习每个聚类的模式,并且回归将基于每个聚类的独特特征为每个聚类产生不同的系数。
未来 15 分钟时隙窗口的期望预测是所有聚类预测的总和。
线性回归模型为:
pick_num ~ minute + hour + day_in_week + hour*day_in_week
增加了一周中的小时和天之间的相互作用,以掌握它们的不同组合的效果。
此外,如上所述,每个月都有异常时段窗口,订单量非常大;
为了解决这一问题,并消除天气或不可预测事件的负面影响,为每个集群引入了订单量阈值,阈值=9,可通过代码进行配置。
以基于集群的方式削减阈值有利于禁用一个集群中的异常,而不会对另一个集群产生副作用,并且与设置全局阈值相比更加灵活。
摘要和其他模型
总而言之,我已经从数据研究和识别不同日期和时间的模式开始,并继续研究不同月份和温暖地区的模式。
我发现在不同的月份之间,温暖的地区几乎保持不变。
然而,在一周的不同日子里,尤其是当比较工作日和周末时,温暖的区域发生了变化。
然后,研究了时间段窗口中的异常情况,其中订单数量激增。
寒冷天气、重大事件和那些异常现象之间的关联已经得到证实。
有了这些见解,我开发了一个与温暖地区相匹配的聚类模型,并独立地学习了每个聚类的模式。
除了开发的模型之外,简单的线性模型(尽管很明显它们不能掌握全局)以及随机森林模型也已经过测试(以及与聚类模型的组合)——然而这些模型都没有超过上述模型所达到的 R 。
最后,提出了一种模型,该模型将城市划分为感兴趣的区域,并为每个区域学习唯一的系数,从而最小化异常的不良影响。
喜欢这篇文章吗?随意长按👏下面的按钮😀
大数据将在 5 年内消亡
意见
一切都将是大数据,因此不需要特殊的名称
马库斯·斯皮斯克在 Unsplash 上的照片
大数据是一个很棒的营销术语,但实际上,它仅此而已。这是一个用来激励企业高管的术语,让他们觉得自己像谷歌或亚马逊。现实是,大数据并不代表任何东西,它的意义只会越来越小。
随着公司越来越熟悉数据处理,服务提供商越来越抽象出更多的复杂性,大数据将成为数据。大数据工程师将成为数据工程师,任何称职的数据工程师都将处理我们现在所说的“大数据处理”。
不过不用担心,这并不意味着您的大数据知识过时了,只是它的名称可能没有以前那么重要了。
大数据真的死了吗?
号码
它根本没有死。事实上,它只会变得更加突出。据预测,到 2025 年,全球“数据球”将从今天的 50ZB 增长到 175 zb(T7)。
所有这些数据都需要以某种方式进行处理,那么大数据怎么会消亡呢?
答案是“大数据处理”本身不会有任何发展,它只会成为一种规范。因此,我们将不再称之为大数据,而需要专业的“大数据工程师”。大数据应用背后的复杂性和可扩展性将被亚马逊这样的云提供商抽象化,这样所有的数据工程实际上都是“大数据工程”。
这也不是一个新现象,它开始于 Hadoop 的早期。当脸书开始使用 Hadoop 来管理其庞大的数据集时,他们发现编写 MapReduce 任务耗时、费力且昂贵。这是因为当时 MapReduce 的工作需要编程,所以他们建立了 Hive。
Hive 是 Hadoop 上的 SQL。脸书从编写 MapReduce 作业中抽象出复杂性,它们变成了简单的 SQL 查询。这意味着任何懂 SQL 的人都有能力构建大数据应用程序,而不仅仅是大数据工程师。
快进到今天,你有按需扩展数据的解决方案,如亚马逊红移或谷歌大表。大多数现代服务迎合小数据,但可以很容易地扩展到大数据。
关键仓储技术变得简单
lewisdgavin.medium.com](https://lewisdgavin.medium.com/how-to-architect-the-perfect-data-warehouse-b3af2e01342e)
你可以使用亚马逊 S3 作为“小数据”应用程序的数据存储,但是如果你的数据量增长,你仍然可以使用 S3 作为数据湖,因为它实际上是一个无限的数据存储。现在,甚至有像雅典娜这样的数据处理工具位于 S3 之上,使得它更加引人注目。
什么将取代大数据?
我们没有人真正知道下一个大的营销术语会是什么。数据科学已经走上了类似的道路。目前,它是数据世界的典型代表,但同样,随着其复杂性被抽象化,对专业数据科学家的需求将会减少,其影响力也会减弱。
重要的是,不是大数据处理正在消亡,而是“大数据”这个术语本身正在消亡。在所有的抽象背后,大数据处理技术仍将存在。我们仍将使用水平扩展的集群,我们仍将减少数据接收延迟并处理数 Pb 的数据。所有这些都不会消失,这些技术只是被隐藏起来,这样每个人都可以更容易地接触到它们。
我们仍然需要擅长数据提取和处理的数据工程师。我们仍然需要能够建立预测和提供报告的数据科学家和分析师。
缺少的是工程师从头开始构建一个健壮的、可扩展的数据湖的能力,因为只需按一下按钮就可以部署。数据科学家也不需要理解太多的“本质”数学。相反,他们只需要知道需要哪些模型,需要提供哪些数据。训练和部署模型的复杂性将被抽象出来,并作为云服务提供。
我的观点是,数据领域的任何工作对未来都是一个安全的赌注。然而,你需要保持警觉,开始思考如何更快、更便宜地为企业提供服务,即使这意味着使用现成的解决方案。
随着复杂的大数据和数据科学服务的云抽象的增长,您使用这些服务并将它们结合在一起的能力将是最重要的,即使您可以自己从头开始构建它。
寻找更多伟大的数据工程内容?然后 注册我的简讯 学习现实世界的数据工程技术,并接收个人策划的内容。我还经常在时事通讯中刊登订阅者的文章,以增加你的影响力。
大数据:昨天、今天和明天
美国陆军照片,n.d .公共领域
什么是“大数据”——了解历史
由詹姆斯·怀恩加 — 18 分钟阅读
一次历史之旅,我们是如何走到这一步的,我们释放了哪些能力,以及我们下一步要去哪里?
Guillermo Ferla 在 Unsplash 上拍摄的照片
重新审视聚类算法
通过 Dmitry Selemir — 14 分钟读取
这个项目根本没有到最后阶段。分享当前的想法,详细检查代码,获得一些反馈,看看是否值得进一步开发。
多臂强盗实验的视觉探索
保罗·斯图布利 — 9 分钟阅读
在营销数据科学部门工作有一个不变的事实:在实验和开发之间做出选择从来都不容易。当你想推出限时优惠时,尤其如此,因为你事先对不同版本的优惠效果知之甚少。
田宽在 Unsplash 上的照片
使用 DVC 构建可维护机器学习流水线的终极指南
由德博拉·梅斯基塔 — 10 分钟阅读
当我的 ML 项目开始发展时,我通常会感到焦虑,因为:一切都开始变得混乱,我知道它变得一团糟,但我不知道如何改善它。我喜欢使用开源工具和框架,因为随着项目的发展,贡献者的知识会“嵌入”其中。
使用 twitter-nlp-toolkit 进行简单的 Twitter 分析
埃里克·希布利(Eric Schibli)—4 分钟阅读
Twitter 是商业分析和学术或教学自然语言处理最丰富的数据源之一;Kaggle 上的许多顶级数据集都是在 Twitter 上收集的,最受欢迎的文本嵌入之一是使用 Twitter 训练的,几乎每个公司都在积极监控 Twitter。
我们的每日精选将于周一回归!如果你想在周五收到我们的 每周文摘 ,很简单!跟随 我们的出版物 ,然后进入你的设置,打开“接收信件”您可以在此 了解有关如何充分利用数据科学 的更多信息。
大型科技公司正向我们走来。但是我们可以阻止它。
监控数据化世界中的隐私。
来源:可信评论
早上闹钟响的时候,你做的第一件事是什么?就在你睡觉前?你周围有多少人正在使用他们的手机或电脑?
过去的十年改变了我们人类的日常生活。几乎不可能用几种不同的方式来衡量我们使用了多少技术。订购比萨饼、跟踪您的心跳、与朋友分享片刻、关注新闻——我们在任何事情上都使用技术。它的可负担性和可访问性使它更加有趣和成功,因为它已经嵌入到我们所做的一切事情中,无论是专业的还是个人的。然而,所有这些进步和便利都是有代价的。在过去的十年中,像“数字 DNA”和“数据阴影”这样的术语已经成为现实,并突显了我们不断从我们使用的各种技术服务中收集的大量信息。对消费者来说,技术带来了一种奇妙的满足感。然而,在后台,技术开始要求通过监视、控制和行为影响来扩大关于我们在线活动的数据集。随着这些系统逐渐走向全知,是时候我们考虑承认问题,设置限制并大声说出来了。
那么,这项技术是如何工作的呢?
算法。算法是告诉计算机如何执行任务的一段代码——计算机在解决问题的操作中必须遵循的一组规则,以产生特定的结果。对于普通大众来说,算法本质上是一个塑造我们周围世界的黑匣子。然而,我们不知道它们是什么,也不知道我们如何受到它们的影响。我们当前的数字环境要求我们在过去的偏见影响我们的未来之前打开这些算法黑匣子。是时候让我们的声音和需求被听到了。
弗兰克·帕斯奎尔推广了“算法自我”的概念,“T1”是在网上战略自我推销中得到很好实践的自我。虽然算法仍然不透明,但社会规范正在迅速变化。他提到,“一种网络眩晕由此产生,因为我们被迫推销我们的算法自我,但却对这样做的最佳方式感到困惑。”这提出了一个重要的问题——谁在为我们推动这个决策过程?谁负责激发我们尝试自我推销的不同方式?Pasquale 探讨了监控在公众日常使用的技术中的存在,以及从所有数据收集中提取的指标如何允许“大规模行为调节”
如果我们跳入热门电视节目《黑镜》的反乌托邦宇宙,剧集《俯冲》就是一个被监控的世界修改我们行为的完美例子,它根据我们过去的所作所为“建议”我们该做什么和如何表现。在这个世界上,在由社会等级奖励的善意和善良的表面下,个人被剥夺了情感和身体上的个人主义和自由意志。被困住和控制,他们在努力自我优化和自我提升时成为指令的追随者。
有点担心吧?事实上,这是不太遥远的未来。大约 13 小时后,中国将最早于 2020 年推出反乌托邦记分卡系统。虽然中国已经实行了大量的审查制度,但这一制度将赋予当权者对其公民几乎完全的控制权。公民的行为将在各个方面进行排名,任何不符合“规则”的行为都将受到惩罚更高的分数意味着更高的生活质量,这完全取决于有效地成为中国政府的奴隶,失去一个人作为一个人的所有权利。
现在,你可能会觉得这很惊人,但是我们在美国也有类似的系统。
在中国,公民现在和将来都是政府审查和行为修正的受害者。虽然美国是建立在自由的价值观上的,但我们这里有私人实体,主要是在硅谷,他们也在类似的轨道上进行他们自己版本的监控和修改。Twitter 最近禁止了政治广告,这凸显了由消费者数据收集驱动的在线广告的力量。这是关于你和我的数据。目标是保护普通人免受虚假政治广告、被篡改的视频和误导信息的传播。Twitter 的首席执行官杰克·多西提到,政治信息的传播“应该是挣来的,而不是买来的”在过去的选举中,社交媒体上的这类广告被认为不公正地影响了选民,导致一些人可能认为不具代表性的选举结果。然而,我们认为这一禁令是对用户可以接触的内容的控制行为,还是一种保护形式?
技术变得既具有创新性又具有破坏性,并正在慢慢接管政府过去的工作。我们必须将权力交还给人民。算法推动技术流程的成功。这些流程不透明,存在歧视和偏见影响我们决策的风险。但是,我们应该责怪算法决定了我们在做什么,还是应该责怪构建这些算法的人?有关数据权利的问题始于脸书-剑桥分析公司数据丑闻的公开。在一次关于脸书在数字世界中的角色的对话中,Kickstarter 的前数据主管弗雷德·贝纳森(Fred Benenson)描述了一种被称为“数学清洗”的趋势:我们倾向于崇拜像脸书这样的程序,认为它们完全是客观的,因为它们的核心是数学。他说,“算法和数据驱动的产品将永远反映建造它们的人类的设计选择。”我们没有被机器控制;我们正被极少数强大的人所控制。这就是我们如何变得相同并失去我们的个人主义。我们能阻止它吗?
技术革命不仅仅发生在网上,也发生在个人层面和整个社会结构中。随着我们继续依赖技术,我们正在放弃越来越多的关于我们自己的信息作为交换。公众越早集体理解技术的根深蒂固的影响,我们就能越早让剥削我们的跨国科技公司承担责任。我们从导致其余部分的问题开始——透明度。作为用户,权力在我们手里。
BigQuery +云函数:如何在新的谷歌分析表可用时立即运行查询
如何确保您的表格、仪表板和数据传输始终保持最新的分步指南
如果你的谷歌分析视图链接到 BigQuery,你可能正在享受它带来的好处。您的数据中没有抽样,您可以引入第三方数据,您对您的数据有更多的控制权等等。
但是,有一件事困扰着我。也许这也困扰着你。每天从 Google Analytics 导出到 BigQuery 表(ga_sessions_YYYYMMDD)的确切时间可能有些不可预测。这使得在这个数据集上运行计划查询而不冒一点风险是不可能的。
- 您可能过早设置了计划查询。如果由于某种原因,Google Analytics 的导出被延迟,您可能会错过一天的数据。每次发生这种情况时,您都必须手动更正。或者你可以考虑使用日内表。但这可能也不理想,因为谷歌声明:“在每日导入完成之前,当天的数据不是最终数据。你可能会注意到日内和每日数据之间的差异”(见文档这里)。
- 您可能会将计划查询设置得太晚。在这种情况下,如果出口延迟,你可能是安全的。但是,您的仪表板的基础表和/或向其他数据系统的可能转移可能不像决策者需要的那样是最新的。
当然,在这个不确定的日冕时代,你可以称之为第一世界的问题。但因为这是一个我可以帮助解决的问题,我将带您一步步地了解如何在 Google Analytics 新的每日导出准备就绪时运行您的预定查询。结果是一个更加可靠的设置,其中您的表和仪表板总是尽可能地保持最新。
我们将采取的步骤是:
- 在云日志中创建一个过滤器,隔离确认新的 Google Analytics 表准备就绪的每日日志。
- 设置一个收集这些每日日志的云发布/订阅主题。
- 部署一个云函数,一旦用新日志更新了发布/订阅主题,它就在 BigQuery 中运行您的计划查询。
第一步。云日志记录
- 好的。首先要做的是打开云日志。
- 单击搜索字段右侧的小下拉箭头,选择“转换为高级过滤器”。至少,在我写这篇文章的时候,它还在那里😉。
- 您可以复制/粘贴下面的代码来创建一个过滤器,该过滤器将隔离确认新的 Google Analytics 表(ga_sessions_YYYYMMDD)已创建的日志。不要忘记在前两行填写您自己的数据集 ID 和项目 ID。
protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.load.destinationTable.datasetId="[REPLACE_WITH_YOUR_DATASET_ID]"protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.load.destinationTable.projectId="REPLACE_WITH_YOUR_PROJECT_ID"protoPayload.authenticationInfo.principalEmail="[analytics-processing-dev@system.gserviceaccount.com](mailto:analytics-processing-dev@system.gserviceaccount.com)"protoPayload.methodName="jobservice.jobcompleted"protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.load.destinationTable.tableId:"ga_sessions"NOT protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.load.destinationTable.tableId:"ga_sessions_intraday"
- 如果您将时间范围调整为过去 7 天,您现在应该每天都会看到一条消息。在下面的截图中,您可以看到导出的确切时间的不可预测性。在这个例子中,有时候桌子在下午 2 点之前就准备好了,有时候在下午 3 点之后。如果你的屏幕是这样的,你就准备好进入下一步了!
谷歌日志中的截图
第二步。云发布/订阅
Pub/Sub 代表发布-订阅,可以看作是系统之间的消息传递系统。在这种情况下,我们希望创建一个新的发布/订阅主题,收集我们在上一步中隔离的日志。这样,每次有新的 Google Analyicts 表可用时,都会收集一条消息。
- 点击上面截图中的“创建汇”。
- 输入接收器名称时,您可以随心所欲地发挥创造力。
- 选择“发布/订阅”作为接收服务。
- 选择创建一个新的云发布/订阅主题,并为其命名,以便在下一步中记住。
- 点击“创建接收器”,您就可以开始下一步了。
Google 日志中的屏幕截图:创建发布/订阅接收器和主题
第三步。云函数
在最后一步中,我们将创建一个云函数(用 Python 编写),它在每次发布/订阅主题被触发时运行。然后,该函数向 BigQuery DataTransfer API 发送一个请求,在一个预定的(按需)SQL 查询上开始手动传输运行。
- 开启云功能
- 选择创建新功能。
- 选择“云发布/订阅”作为触发器,并选择您在上一步中创建的发布/订阅主题。
- 选择“Python 3.7”(或者更高版本,如果你将来读到这篇文章的话🚀)作为运行时。
如何设置谷歌云功能的屏幕截图
-
复制/粘贴下面的代码,并将其放在“Main.py”文件中。
-
用要运行的计划查询的详细信息替换项目 ID 和转移 ID。
-
您可以在您的计划查询的配置选项卡中找到这些 ID。资源名称显示了一个 URL,您可以在其中找到这两个 ID:“projects/[THIS _ IS _ YOUR _ PROJECT _ ID)/locations/us/TRANSFER configs/[THIS IS YOUR TRANSFER _ ID]”。
-
在这种情况下,我假设您已经创建了想要运行的计划查询。如果您还没有,现在是时候在 BigQuery 中用创建您的预定查询了。最好将查询设置为“按需”运行,否则它可能会运行得太频繁。
-
将下面的一小段代码添加到“Requirements.txt”中,这样它就有了运行 Python 代码所需的所有包。
google-cloud-bigquery-datatransfer==1
- 将“runQuery”设置为要执行的函数。
- 点击部署!
现在:享受自动化👍
如果您已经正确地设置了所有内容,那么一旦新的每日表被导出到 BigQuery,您的预定查询就会立即开始运行!这意味着你可以高枕无忧,享受你的谷歌分析数据总是新鲜的。
如果你有任何建议、意见或问题,请不要犹豫,在下面的评论中问我。
BigQuery:使用 SQL 创建嵌套数据
正如我在我的另一篇文章 BigQuery:嵌套数据上的 SQL中所阐述的,在嵌套数据上使用 SQL 是非常高效的——只要任务在后端是可并行化的。但是,如果您的数据来自平面表,例如 CSV,则必须首先转换数据。
作者照片
嵌套单个值
通常——在平面表场景中——您只需要使用JOIN
来组合两个表:
上面查询的结果表——试试吧!
但是当然,我们永远不会保存这样的表,因为有些字段只是一遍又一遍地重复,占用存储空间,这反过来会产生可避免的成本。
但是如果我们使用表authors
和将书籍放入数组中,我们就不会重复作者字段。在 BigQuery 中,我们可以使用[ARRAY_AGG()](https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#array_agg)
轻松做到这一点,这是一个聚合函数,可以与GROUP BY
结合使用,将值放入数组中:
嵌套在“works”数组中的标题——自己试试吧!
如果我们保存这个结果表,我们将通过有效地存储信息来避免成本,并且我们可以去掉一些 id,因为我们不再需要加入。
它还降低了查询的复杂性,因为信息位于同一个表中。您不必想象表 A 和表 B 以及它们加入后的样子,然后才考虑如何选择和分组,您可以直接选择和分组。
看看这里的最后一个SELECT
语句——想象我们将结果表存储在某个地方,而不是放入WITH
。
使用 UNNEST()编写子查询(第 24 行)在 BigQuery:嵌套数据上的 SQL中有介绍
上面查询的结果表——试试看!
在这里,我们可以轻松地对数组应用各种聚合技术,或者简单地将数组与其父数组交叉连接以获得一个平面表。为了进一步分析,我们预先连接了表,但保持了存储效率。我们甚至引入了两个字段 qtyTitles 和 qtyCharacters ,它们已经告诉了我们关于数组的事情——这对数组聚合中的常见用例很有帮助。
嵌套多个值
让我们引入另一个字段,看看如何在一个数组中存储多个字段。让我们快速思考一下:我们在一个数组中一次只能存储一种元素类型——这是一个简单的列表:[1,1,2,3,5,8]
。所以我们需要把多个值变成一个复数值的东西。对此的解决方案是STRUCT
,它基本上是一个带有要求的键-值对列表:键必须保持不变,值不允许改变它们的数据类型:[{a:1,b:x},{a:2,b:y},{a:3,b:z}]
。这也是 BigQuery 被称为“半结构化”的原因。
有几种方法可以构建结构,但是与ARRAY_AGG()
结合使用最方便的是函数[STRUCT()](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#constructing_a_struct)
。只需选择要嵌入到数组中的字段,并将它们放入一个结构中:
第 15–17 行显示了每个组(array_agg + group by)中被放入数组的结构
带点的列标题表示结构
为此,我们准备了一个预连接表:
我们甚至可以使用ARRAY()
和SELECT AS STRUCT
从现有的数组创建新的复杂数组。此外,窗口函数的作用域是由数组的边界自动确定的!
上面查询的结果表
创建新数组或扩展旧数组——在这里,扩展更有意义。为此,我们只需在子查询中选择现有的列,例如ARRAY(SELECT AS STRUCT *****, UPPER(title) AS title ...
嵌套更复杂的值
虽然我们可以使用 struct 函数简单地将结构嵌套在结构中,但是如果我们想将数组嵌套在数组中,我们需要提前做一些计划。
让我们介绍第三个表,它包含与一本书相关的标题。该表只有三个条目,只是为了让它暂时易于管理。
我们必须首先创建最内层的数组,以便以后可以将它们嵌套在其他数组中:
第 22 行的“忽略空值”有助于避免空数组错误
结果表—尝试为其他标题添加更多信息!
将最后一个SELECT
语句作为 round1 放入WITH
中,我们可以从SELECT * FROM authors LEFT JOIN round1 USING(id)
开始第 2 轮,并得到我们的作者…
为 array_agg() round 2 准备好的表!
从这里,我们可以使用相同的方法在更高的范围内再次聚合:
我们需要为我们想要创建的每个深度级别的阵列进行一轮聚合:
阵列中的阵列——多么美妙的世界
为了在分析中达到这些值,相同的规则始终适用:
- 为了将数组聚合为一个值*,使用子查询*
- 对数组中的值进行分组使用交叉/左连接
交叉连接消除空行,而左连接保留空行。
relatedTitles 从一个数组中抓取另一个数组中的信息,而 relatedBooks 使用子查询交叉连接将两个数组中的信息合并为一个。
我希望这能让您对使用 SQL 在 BigQuery 中构造表的可能性有一点了解。我应该注意到,创建性能良好的表还有更多的方面。一定要看看分区和聚类表的主题!使用 DDL 可以非常方便地做到这一点。如果你想用 SQL 语句插入数据,看看插入结合WITH
语句准备数据。
如果你有任何问题或意见,请告诉我。我很想知道您是如何在 BigQuery 中准备和优化表的!
Google 中的 BigQuery 数据结构:云存储入门
来源:沉积照片
了解如何开始使用云存储:创建数据集和表,设置与 Google BigQuery 之间的数据导入和导出
Google BigQuery 是一项云存储服务,允许您在一个系统中收集所有数据,并使用 SQL 查询轻松分析这些数据。为了便于处理数据,应该正确地组织数据。在本文中,我们将解释如何创建上传到 Google BigQuery 的表和数据集。
数据集:什么是数据集以及如何创建数据集
要使用 Google BigQuery,需要在 Google 云平台(GCP) 中创建一个项目。注册后,您将在免费试用期内获得所有云平台产品,并在接下来的 12 个月内获得 300 美元用于购买这些产品。
在 Google 云平台中创建项目后,需要向 Google BigQuery 添加至少一个数据集。
数据集是用于组织和控制数据访问的顶级容器。简单地说,它是一种文件夹,你的信息以表格和视图的形式存储在其中。
在 GCP 打开您的项目,转到 BigQuery 选项卡,并点击创建数据集:
在打开的窗口中,指定数据集的名称和表的保存期限。如果希望自动删除包含数据的表,请指定具体的删除时间。或者保留默认的永久选项,以便只能手动删除表。
加工地点字段是可选的。默认情况下,它设置为 US multiregion。您可以在帮助部分找到更多关于存储数据区域的信息。
如何添加表以将数据加载到 Google BigQuery 中
创建数据集后,您需要添加一个将收集数据的表。表格是一组行。每一行都由列组成,这些列也称为字段。根据数据源的不同,有几种方法可以在 BigQuery 中创建表:
- 手动创建一个空表,并为其设置一个数据模式
- 使用以前计算的 SQL 查询的结果创建一个表
- 从您的计算机上传文件(CSV、AVRO、JSON、Parquet、ORC 或 Google Sheets 格式)
- 你可以创建一个引用外部数据源的表,而不是下载或流式传输数据: Cloud Bigtable 、云存储或 Google Drive 。
在本文中,我们将仔细研究第一种方法:手动创建一个表。
第一步。选择要添加表格的数据集,然后单击创建表格:
第二步。在源字段中选择空表,在表类型字段中选择目标对象原生格式的**表。**想出一个表名。
重要信息:数据集、表格和字段的名称必须是拉丁字符,并且只包含字母、数字和下划线。
第三步。指定表模式。该模式由四个部分组成:两个是强制性的(列名和数据类型),两个是可选的(列模式和描述)。正确选择的类型和字段模式将有助于处理数据。
BigQuery 中的模式示例:
列名
在列名中,您需要指定每列负责的参数:日期、用户标识、产品等。标题只能包含拉丁字母、数字和下划线(最多 128 个字符)。不允许相同的字段名称,即使它们的大小写不同。
数据类型
在 BigQuery 中创建表时,可以使用以下字段类型:
模式
BigQuery 支持以下表列模式:
注意:不需要填写模式字段。如果没有指定模式,默认列可为空。
列描述
如果您愿意,您可以为表格中的每一列添加一个简短的描述(不超过 1024 个字符),以便解释特定参数的含义。
在 BigQuery 中创建空表时,需要手动设置模式。这可以通过两种方式来实现:
1。点击添加字段按钮,填写每一列的名称、类型和模式。
2.使用编辑为文本开关,以 JSON 数组的形式输入表格模式。
此外,Google BigQuery 在从 CSV 和 JSON 文件加载数据时可以使用自动模式检测。
该选项的工作原理如下:BigQuery 从您指定的源中选择一个随机文件,扫描其中多达 100 行的数据,并将结果用作代表性样本。然后,它检查上传文件中的每个字段,并尝试根据示例中的值为其分配数据类型。
加载 Google 文件时,BigQuery 可以更改列名,使其与自己的 SQL 语法兼容。因此,我们建议您上传带有英文字段名的表格;例如,如果名称是俄语,系统会自动对其进行重命名。例如:
如果在加载数据时输入的列名不正确,或者您希望更改现有表中列的名称和类型,您可以手动执行此操作。我们会告诉你怎么做。
如何对表模式进行更改
将数据加载到 Google BigQuery 后,表的布局可能会与原来略有不同。例如,字段名可能因为 BigQuery 中不支持的字符而更改,或者字段类型可能是整数而不是字符串。在这种情况下,您可以手动调整模式。
如何更改列名
使用 SQL 查询,选择表中的所有列,并为要重命名的列指定一个新名称。在这种情况下,您可以覆盖现有的表或创建一个新表。请求示例:
#legacySQL
**Select**
date,
order_id,
order___________ **as** order_type, -- new field name
product_id
**from** [project_name:dataset_name.owoxbi_sessions_20190314]#standardSQL
**Select**
* **EXCEPT** (orotp, ddat),
orotp **as** order_id,
ddat **as** date
**from** `project_name.dataset_name.owoxbi_sessions_20190314`
如何更改模式中的数据类型
使用 SQL 查询,从一个表中选择所有数据,然后将相应的列转换为不同的数据类型。您可以使用查询结果来覆盖现有的表或者创建一个新的表。请求示例:
#standardSQL
**Select**
**CAST** (order_id **as** **STRING**) **as** order_id,
**CAST** (date **as** **TIMESTAMP**) **as** date
**from** `project_name.dataset_name.owoxbi_sessions_20190314`
如何更改列模式
如帮助文档所述,您可以将列模式从必需更改为可空。第二个选项是将数据导出到云存储,并从那里以正确的模式将数据返回给 BigQuery。
如何从数据架构中删除列
使用 SELECT * EXCEPT 查询排除一列(或多列),然后将查询结果写入旧表或创建一个新表。请求示例:
#standardSQL
**Select**
* **EXCEPT** (order_id)
**from** `project_name.dataset_name.owoxbi_sessions_20190314`
此外,还有第二种方法来更改模式,这种方法适用于上述所有任务:导出数据并将其加载到新表中。要重命名列,可以将数据从 BigQuery 上传到云存储,然后将其从云存储导出到新表中的 BigQuery,或者使用高级参数覆盖旧表中的数据:
你可以在谷歌云平台帮助文档中了解改变表格结构的其他方法。
从/向 Google BigQuery 导出和导入数据
您可以通过界面或 OWOX BI 的特殊插件从 BigQuery 下载数据或向 big query 上传数据,而无需开发人员的帮助。让我们详细考虑每种方法。
通过 Google BigQuery 接口导入数据
要将必要的信息上传到存储,例如,关于用户和离线订单的数据,请打开数据集,单击创建表,然后选择数据源:云存储、您的计算机、Google Drive 或云 Bigtable。指定文件的路径、格式以及将加载数据的表的名称:
单击“创建表”后,数据集中会出现一个表。
通过 Google BigQuery 接口导出数据
还可以从 BigQuery 上传处理过的数据——例如,通过系统界面创建报告。为此,请打开包含数据的所需表格,然后单击导出按钮:
该系统将提供两种选择:在谷歌数据工作室查看数据或上传到谷歌云存储。如果您选择第一个选项,您将立即转到 Data Studio,在那里您可以保存报告。
选择导出到 Google 云存储会打开一个新窗口。在其中,您需要指定数据的保存位置和格式。
使用 OWOX BI 的插件导出和导入数据
免费的 OWOX BI BigQuery Reports 插件允许你快速方便地将数据从 Google BigQuery 直接传输到 Google Sheets,反之亦然。因此,您不需要准备 CSV 文件或使用付费的第三方服务。
例如,假设您想要将离线订单数据上传到 BigQuery 来构建一个 ROPO 报告。为此,您需要:
- 在浏览器中安装 BigQuery Reports 插件。
- 在 Google Sheets 中打开您的数据文件,在标签 Add-ons 中,选择 OWOX BI BigQuery Reports →将数据上传到 BigQuery。
- 在打开的窗口中,在 BigQuery 中选择项目和数据集,并为表输入所需的名称。此外,选择要加载其值的字段。默认情况下,所有字段的类型都是 STRING,但是我们建议根据上下文选择数据类型(例如,对于带有数字标识符的字段,选择 INTEGER 对于价格,浮动):
- 点击开始上传按钮,你的数据将被加载到谷歌大查询
您还可以使用这个插件将数据从 BigQuery 导出到 Google Sheets——例如,可视化数据或与无权访问 BigQuery 的同事共享数据。为此:
- 打开谷歌工作表。在插件选项卡中,选择 OWOX BI BigQuery 报表→添加新报表:
- 然后在 Google BigQuery 中输入您的项目,并选择 Add new query。
- 在新窗口中,插入 SQL 查询。这可能是一个将数据从表上传到 BigQuery 的查询,也可能是一个提取并计算必要数据的查询。
- 通过单击“保存并运行”按钮,重命名查询,使其易于查找和启动。
要定期将数据从 BigQuery 上传到 Google Sheets,您可以启用计划的数据更新:
- 在插件选项卡中,选择OWOX BI big query Reports→Schedule report:
- 在打开的窗口中,设置报告更新的时间和频率,并点击保存:
为什么要在 Google BigQuery 中收集数据?
如果您还没有意识到 Google BigQuery 云存储的好处,我们建议您尝试一下。在 OWOX BI 的帮助下,您可以将来自您的网站、广告源和内部 CRM 系统的数据整合到 BigQuery 中,以便:
- 建立端到端分析并找出您营销的实际回报,考虑线下订单、退货和购买过程中的所有用户步骤;
- 创建带有任何参数和指标的完整未采样数据的报告;
- 使用群组分析评估客户获取渠道;
- 找出你的在线广告如何影响线下销售;
- 降低广告费用的份额,延长客户的生命周期,从整体上增加你的客户群的 LTV;
- 根据顾客的活动对其进行细分,并与他们进行个性化交流。
BigQuery、PII 和云数据丢失防护(DLP):通过数据目录将其提升到新的水平
如何通过使用云数据丢失防护检查所有 BigQuery 数据来创建数据目录标记。
背景由 Kelli Tungay 上 Unsplash
你知道你的组织掌握着什么样的敏感数据吗?您是否跟踪应用于所有表和列的每个更改?你有信心回答审计员可能提出的关于数据法规的问题吗?
背景由 Sandra Grünewald 在 Unsplash
让一个审计员来敲你的门并不是最可怕的事情,数据泄露才是最可怕的!从罚款到客户流失和法律后果,后果可能是残酷而持久的。
对您的敏感数据进行分类和管理是着手处理这一问题的好方法,但用手动方式来做不是办法。
有一点值得思考,谁想检查数千、数百万的数据资产,然后给每一个都贴上标签,说它们是敏感的还是不敏感的?如果表有令人困惑的列名怎么办?我不会开始讨论这有多容易出错,但你会明白…
我们需要以某种方式自动完成这项工作。
在本文中,我们将看到一个全自动的解决方案,通过使用 DLP 和数据目录来发现所有大型查询资产中的敏感数据(每当我提到 DLP 时,它都会支持数据丢失预防】)。如果您不熟悉 DLP 和数据目录,您会对第一部分和第二部分感兴趣。
否则,如果您想了解 DLP 和数据目录的神奇之处,请直接跳到第三部分。
本文涵盖的主题有:
- 云数据防丢失概述
- 数据目录概述
- DLP 到数据目录标签概述
- 脚本执行演练
事不宜迟,我们走吧!
我们将提供一个带有工作示例的 GitHub 存储库。
云数据丢失防护概述
DLP 是一项托管的 Google 云服务,旨在帮助您发现、分类和保护您最敏感的数据。
特征
来自官方文件的 DLP 特性
在本文中,我们将利用流媒体内容 API 和DLP 检查模板。
数据目录概述
数据目录是一种可管理和可扩展的元数据管理服务,使组织能够快速发现、了解和管理其所有数据。
特征
正式文档中的数据目录特性
在本文中,我们将利用标签模板**、标签、、**和进行数据目录搜索。
快速查看数据目录标签结构:
从GCP-数据目录-图表中标记心智模型
我们将在后面介绍更多细节,但是请记住,由于我们关注的是大型查询资产,每个大型查询表都代表数据目录中的一个条目,我们将创建标记来对敏感数据进行分类,标记模板将代表 DLP 信息类型。
DLP 到数据目录标记概述
现在,您已经熟悉了 DLP 和数据目录,让我们继续了解体系结构概述:
从 dlp 到数据目录标签的参考架构
该脚本使用Java
工作负载,用户能够在他们的本地机器、云外壳或计算引擎虚拟机上执行它。
如果您对脚本执行的快速视频演示感兴趣,请查看:
来自 dlp 到数据目录标签的演示视频
阅读大查询资源
工作负载从读取来自 Google Cloud 项目的大查询资源开始,然后我们将大查询行分成许多块。我们需要这一点,因为 DLP 内容 API 有一个使用限制,这也是奇迹发生的地方。
呼叫 DLP
对于 DLP 使用限制,我们可以将其分为两类:
- 请求大小
首先,我们需要确保请求大小不超过使用限制,在撰写本文时,我们得到了以下值:
显示来自DlpDataCatalogTagsTutorial.java的请求大小限制的代码
- 每分钟请求数
第二,每分钟有一个请求强制限制,所以我们添加了简单的睡眠和重试逻辑:
显示来自DlpDataCatalogTagsTutorial.java的睡眠逻辑的代码
DLP 检查模板
接下来,为了调用 DLP,我们将使用 DLP Inspect 模板,它们对于解耦配置信息非常有用。在这个用例中,我们使用它来存储我们的infoTypes
:
DLP 检查来自DLP-to-data catalog-tags的模板
云数据丢失防护(DLP)使用信息类型或
infoTypes
来定义它扫描的内容。infoType
是一种敏感数据,如姓名、电子邮件地址、电话号码、身份证号或信用卡号。
最后,我们创建检查请求:
显示来自 DlpDataCatalogTagsTutorial.java的检查内容逻辑的代码
写入数据目录列标记
一旦我们从 DLP 获得检查结果,我们需要将它们转换成数据目录标记,我们从检索列名开始:
显示从 DlpDataCatalogTagsTutorial.java检索列逻辑的代码
接下来,我们设置数据目录标签模板:
显示从DlpDataCatalogTagsTutorial.java创建模板逻辑的代码
还记得我们在标签心智模型中看到的大查询条目吗?我们需要构建条目linkedResource
:
显示来自DlpDataCatalogTagsTutorial.java的链接资源逻辑的代码
最后,我们创建标签请求:
显示来自DlpDataCatalogTagsTutorial.java的标签创建逻辑的代码
等一下!datacatalogBatchClient
?请注意,以编程方式访问 Google Cloud APIs 的推荐方式是使用客户端库,在我们的例子中,我们要处理大量的标签,因此为了提高性能,我们正在批处理这些 API 调用。
关于其工作的更多细节,请看一下 DataCatalogBatchClient 。
脚本执行演练
如果你已经到了这一步并且喜欢冒险,你可以执行运行云壳教程的脚本,我已经自动完成了它的每一步,如果你想试试的话:
[## mesma Costa/DLP-to-data catalog-tags-教程
它将指导您使用 DLP 结果创建数据目录标记。它比…的内容更广泛
github.com](https://github.com/mesmacosta/dlp-to-datacatalog-tags-tutorial)
我将跳过启用必需的 API和设置您的服务帐户步骤,因为它们是常见的用例——完整的演练,请查看上面的 GitHub 库。
创建大型查询表
首先,我们用假的 PII 创建一些大的查询资源,以便稍后运行脚本。
# Install bq-fake-pii-table-creator using PIP
pip3 install bq-fake-pii-table-creator --user# Create the first table
bq-fake-pii-table-creator --project-id $PROJECT_ID --bq-dataset-name dlp_to_datacatalog_tutorial --num-rows 5000# Create a second table
bq-fake-pii-table-creator --project-id $PROJECT_ID --bq-dataset-name dlp_to_datacatalog_tutorial --num-rows 5000# Create a third table with obfuscated column names
bq-fake-pii-table-creator --project-id $PROJECT_ID --bq-dataset-name dlp_to_datacatalog_tutorial --num-rows 5000 --obfuscate-col-names true
创建检查模板
其次,我们创建检查模板:
# Generate your OAUTH 2.0 token with gcloud
TOKEN=$(gcloud auth activate-service-account --key-file=$HOME/credentials/dlp-to-datacatalog-tags-sa.json && gcloud auth print-access-token)# Call API using Curl
curl -X POST \ [https://dlp.googleapis.com/v2/projects/$PROJECT_ID/inspectTemplates](https://dlp.googleapis.com/v2/projects/$PROJECT_ID/inspectTemplates) \
-H "Authorization: Bearer ${TOKEN}" \
-H 'Content-Type: application/json' \
-d '{
"inspectTemplate":{
"displayName":"DLP 2 Datacatalog inspection Template",
"description":"Scans Sensitive Data on Data Sources",
"inspectConfig":{
"infoTypes":[
{
"name":"CREDIT_CARD_NUMBER"
},
{
"name":"EMAIL_ADDRESS"
},
{
"name":"FIRST_NAME"
},
{
"name":"IP_ADDRESS"
},
{
"name":"MAC_ADDRESS"
},
{
"name":"PHONE_NUMBER"
},
{
"name":"PASSPORT"
}
],
"minLikelihood":"POSSIBLE",
"includeQuote":false
}
},
"templateId": "dlp-to-datacatalog-template"
}'
在撰写本文时, gcloud 不支持 create inspect template API 调用,所以我们使用的是 Curl 。
我们在 API 调用中设置了一个 DLP 信息类型的预定义列表,您可以使用作为参考:内置信息类型或通过创建自定义类型来更改它或添加新类型。
执行脚本
关于 CLI 参数的完整细节,以及如何构建下面的脚本,请查看社区教程。
java -cp target/dlp-to-datacatalog-tags-0.1-jar-with-dependencies.jar com.example.dlp.DlpDataCatalogTagsTutorial \
-dbType "bigquery" \
-limitMax 1000 \
-dbName dlp_to_datacatalog_tutorial \
-projectId $PROJECT_ID \
-threadPoolSize 5 \
-inspectTemplate "projects/$PROJECT_ID/inspectTemplates/dlp-to-datacatalog-template" \
-minThreshold 100
在这次执行中,我们只扫描了dlp_to_datacatalog_tutorial
数据集,用 5 个threads
运行,并使用我们之前创建的dlp-to-datacatalog-template
。
让我们运行它并检查结果:
脚本执行
脚本完成后,我们可以去数据目录验证敏感数据:
数据目录条目—模式和列标记
在第一个表中,通过查看列名,可以清楚地看到我们拥有哪种敏感数据。无论如何,通过标记这些列,我们能够轻松地搜索我们的敏感数据。
你还记得那个愤怒的审计员敲你的门吗?
现在,如果他来问我们,如果你存储任何 PII,如信用卡号码…我们只是在数据目录中做一个简单的查询!我们甚至可以使用 IAM 并给他Data Catalog Viewer
角色,这样他就可以自己看,省去了我们的拜访。
寻找信用卡号码的数据目录搜索
玩笑归玩笑,数据目录搜索语法真的很强大,由支持 Gmail 和 Drive 的谷歌搜索技术驱动。所以检查他们的文档,看看所有的可能性。
您还记得那个带有混乱的列名的表格吗:
数据目录条目—模式和列标记
DLP 来救援了!我们可以看到,我们标记了一些列,通过展开标记详细信息:
数据目录标签详细信息
我的天啊。DLP 在那个列上找到 303 CREDIT_CARD_NUMBERS
,有 1000 行样本,感谢 DLP !
结束语
在本文中,我们看到了如何结合数据目录和 DLP 来发现 Google Cloud 项目中的敏感数据。
随着 GPDR、CCPA 和其他监管法案成为现实,现在拥有一个结构化数据治理流程比以往任何时候都更加重要,该流程允许您了解您的公司存储了哪些数据、数据位于何处以及业务如何受到这些数据的影响。
在这个领域,总是有改进的空间,如果我们可以扩展这个脚本,在发现敏感数据时自动阻止对敏感数据的访问,会怎么样?这当然是可能的,通过使用数据目录策略标签,所以请继续关注新的帖子,讨论这个问题!干杯!
参考
- DLP 文件:https://cloud.google.com/dlp
- 数据目录文档:https://cloud.google.com/data-catalog
- DLP 转数据目录标签演练教程:https://github . com/mes macosta/DLP 转数据目录标签教程
- 社区博客教程:https://cloud . Google . com/Community/tutorials/DLP-to-data catalog-tags
BigQuery:云巨头的意外诞生
10 名工程师如何转变云数据分析
T 何 BigQuery 团队最近以一段趣味纪念视频来纪念其推出十周年。作为 BigQuery 的创始产品经理,参加庆祝活动让我对团队的成就感到无比自豪。BigQuery 被大大小小数千家公司使用,已经成为世界上使用最广泛的云数据仓库之一。此外,由于管理着数 Pb 的数据,可以说 it 在将大数据分析纳入主流方面做得最多。
因此,当了解到 BigQuery 在谷歌内部的卑微出身时可能会感到惊讶——最初几年不到 10 名工程师。为了让 BigQuery 走到今天,这个小团队依靠对客户的专注,克服了多个潜在的陷阱,并迅速将一款突破性的产品推向市场。我想我应该分享一下早期的内幕——与一个伟大团队的不可思议的旅程,以及是什么让我最终创办了 Switchboard。
云分析的愿景
2010 年,谷歌西雅图办公室的一群具有前瞻性思维的工程师评估了谷歌开创性的内部存储、计算和分析能力——这些技术也曾用于抓取和索引整个互联网。他们想象这些技术可以为走向数字化的公司带来变革性的好处,并开始开发一个外部服务层,最终成为谷歌云平台(GCP)。该战略的一个关键支柱是释放常规公司的网络规模分析能力,而无需构建或管理自己的大规模数据中心。项目代号…BigQuery。
分析核心工程团队 Jordan Tigani、Siddartha Naidu、Jeremy Condit、Michael Sheldon 和 Craig Citro 创建了早期的概念验证(REST API ),外部用户可以使用它来利用谷歌巨大的分析能力。我以项目经理的身份加入,利用我在谷歌之前的企业软件背景,帮助团队定义产品路线图和市场路径。
早期的“科学实验”
BigQuery 的 DNA 源自 Dremel,这是一项突破性的谷歌内部服务,在 2010 年的白皮书中有所描述,被全公司的工程师和项目经理用于对网络规模的产品进行临时日志分析。想想谷歌搜索或 Gmail,数十亿用户账户的交互被记录并存储在大量存储服务器上,用于调试或分析使用模式。传统上,这样的活动通常需要几个小时的 MapReduce 作业执行来将原始日志压缩成更易于管理的集合。Dremel 完全颠覆了这种观念,它能够使用 SQL 实时查询数万亿行数据,并在几秒钟内返回结果。
值得记住的是当时更广泛的行业背景:企业商业智能和分析由 Teradata、IBM 和 Oracle 等公司主导,需要一家公司拥有和操作一机架又一机架的服务器和硬盘,每 TB 存储高达 100,000 美元!“云”对许多企业来说仍然是一个非常新的概念,就像存储所有数据供以后分析的概念一样。当时,许多首席信息官声明,“我们绝不会将公司的敏感数据存储在别人的电脑上!”
2010 年 5 月,我和 Amit Aggarwal 在 Google 的 I/O 大会上发布了 BigQuery 的 Alpha 版本。这项服务太新了,以至于在那个时候,BigQuery 甚至还没有一个摄取 API!处理外部数据需要我们的一名工程师手动将数据输入系统。但是,这种向前推进并与外部早期采用者密切合作的意愿是团队的关键优势之一,这将使我们能够快速进入市场。
照片由 Gerold Hinzen 在 Unsplash 上拍摄
那个小小的引擎可以
接下来的一年,BigQuery 团队面临着严峻的资源挑战。有太多东西需要建造。Dremel 引擎是在考虑内部专家的情况下创建的——拥有 CS 学位的内部人员可以在命令行中来回跳转,调试错误堆栈跟踪或与内部团队交流以寻求帮助。您甚至不得不提供自己的数据服务器来使用这项服务。当然,作为内部用户,没有“成本”,因此没有定价或账单。因此,云服务的其余部分必须从头开始构建:编程和安全模型、访问控制、计量和计费、前端用户界面、可靠的错误处理,等等。
在只有 10 名工程师的情况下,我们必须专注于 MVP(最小可行产品)。吉姆·卡普托作为工程经理加入后,团队得到了极大的推动。他的务实方法有助于让事情快速发展,同时保持一致。Jim 很快成为了我的思想领袖和重要的合作伙伴——在 BigQuery 的大部分开发过程中,我们都被绑在了一起。
闪避和迂回发射
随着快速的进展和积极的客户反馈,BigQuery 团队开始在 Google 内部出名。但规模小意味着,在谷歌有点达尔文主义的内部环境中,BigQuery 团队必须不断寻找其他更大的、任务重叠的谷歌产品团队。
Ads 产品领域的几个资金雄厚的团队也怀有类似的野心,要为他们的客户构建查询、可视化和数据目录功能。有一次,一个拥有五倍工程师的团队试图将 BigQuery 纳入他们的计划。其他人声称他们将简单地在他们的产品路线图中复制 BigQuery 的功能。
我们通过坚定地关注我们的(外部)客户来应对这一点。通过了解他们的具体需求和痛点,我们可以向利益相关者清楚地说明为什么这对谷歌的公共云工作至关重要。这使我们能够专注于早期产品,并稳步走向发布。
反击反对者
不能保证 BigQuery 会启动,因为事情进展得很快。该项目面临一些强大的内部怀疑论者,他们反对这个概念。反对意见以多种形式出现——一位高管坚持认为,BigQuery(旨在通过按查询收费来颠覆数据分析的经济学)应该向一小部分公司收取巨额费用。其他人则认为云 API 和 web 用户界面永远不会起作用。
最令人难忘的是,发射审查委员会的一位高级工程师轻蔑地(非常公开地)告诉我们,“这个项目毫无意义。没有人会使用这样的服务。”
我们坚持下来,分享早期客户告诉我们的事情——有一个重要的需求需要得到满足。
早期采用者
到 2011 年 10 月,BigQuery 被批准进行有限的预览,我们能够获得谷歌开发倡导团队的帮助。把这些人想象成构建开发者社区的核心工程师。领导这项工作的是迈克尔·马诺奇里(后来成为 Switchboard 的联合创始人)。在开发者大会上发表演讲,编写参考应用和 API 代码样本,寻找有吸引力的合作伙伴和应用,Michael 与队友 Ryan Boyd 和 Felipe Hoffa 一起,做了大量工作来启动围绕 BigQuery 的早期开发者社区。
我们还有幸与一些有远见的公司合作,包括 Gamesys、Claritics 以及早期的 Tableau 和 Looker 团队。这些团队都需要快速处理和理解大量数据,其速度是他们自己构建的 Vertica 或 Hadoop 集群无法比拟的。
企业势头
我们还与 Eric Morse 和 Matt McNeil 领导的谷歌早期云企业销售团队密切合作。我们发现无畏的销售工程师布莱恩·斯奎布和汤姆·格雷是犯罪同伙。他们已经注意到客户的数据呈指数级增长,并演变成嵌套 JSON 这样的新格式——像 State Farm、Booking.com 和宏盟这样的大型企业。
2011 年,我们与 Omnicomm 和 DoubleClick 客户工程团队合作,对 BigQuery 独特的商业适用性进行了早期展示。我们将 25 个大型 DCM(双击活动管理器)广告客户网络整合到 BigQuery 中——许多万亿字节的细粒度广告服务器日志。这些日志在单个事件层面上丰富了人口统计数据,实现了实时活动受众和频率/覆盖范围分析。这是突破性的,因为替代方案将是数月的工程设计,以构建和调整数百万美元的并行处理 Vertica 集群,或者与 Hadoop MapReduce 技术搏斗。有了 BigQuery,Omnicomm 只需为存储和必要时的查询付费,成本仅为传统系统的百分之一。宏盟最终围绕这一新的战略数据资产开发了几款产品。
正式上市和开发商采用
BigQuery 于 2012 年 5 月 1 日正式发布。自从它作为一个“科学项目”开始,我们就不断迭代并倾听客户的意见,在这个过程中,我们构建了一个早期客户因其强大和简单而喜爱的系统。现在我们必须向世界讲述他们的故事。
我还记得与我们的营销主管 Raj Sarkar 和我们的公关专家 Liz Markman 一起撰写发布博文时的兴奋。他们组织了一场发布活动,包括一场会议路演和几天的记者和分析师简报会。大数据的概念在当时是新的和闪亮的,充满了各种数据上线等待被解锁的前景。各行各业的专业人士都对 BigQuery 非常感兴趣,认为它是一种加速获取数据洞察力的方法。《连线》、、GigaOm 和 Gartner 都是报道这一趋势的科技媒体。
到 2013 年,BigQuery 迅速成为基于云的分析的标准,特别是在技术初创公司和数字原生公司中。Jordan 和 Siddartha 编写了权威的 BigQuery reference ,迅速提升了这个社区的专业知识。这些团队拥有利用 API 的编码能力,并且知道如何在 BigQuery 中处理数据。
我们会议路演的演讲者徽章(作者拍摄)
企业中尚未解决的需求
尽管采用速度很快,但企业方面仍然存在挑战。当技术组织采用 BigQuery 时,这些团队和他们的业务线同行之间的差距开始扩大。我们与收入运营和营销分析负责人进行了交谈,他们抱怨外部数据源的数量越来越多。他们的业务团队在采用 Salesforce、Marketo 或 NetSuite 等 SaaS 服务来运营业务时,一直在努力应对各种不同且通常很复杂的数据源。这使得很难将数据组合成获得洞察力所需的正确“形状”,通常需要(并加重)宝贵的开发或 BI 资源。
越来越多的传统、非技术企业,如航空公司、保险公司和零售商,开始接触我们的团队。有趣的是,站出来的不是首席信息官或首席技术官,而是首席营销官和业务部门主管。他们的信息始终如一:“我有所有这些新数据,这些数据庞大而复杂,我的技术团队没有带宽和/或领域专业知识来帮助我的团队管理这些数据……您能帮助我们吗?”
迈克尔和我努力寻找系统集成商(SI)合作伙伴来帮助这些利益相关者。但是这些系统集成商总是以构建定制的应用程序或者拼凑遗留的 BI 和 ETL 系统而告终。这些首席营销官和业务部门仍然无法控制他们的数据。他们仍然不得不依赖 IT 层,而在许多情况下,IT 层根本不理解这种新的第三方数据。我们最终会离开谷歌,成立 Switchboard 来帮助企业解决已经成为许多组织的一个决定性问题。但那是以后的事了。
Javier Allegue Barros 在 Unsplash 上拍摄的照片
云中数据的未来
自推出以来,BigQuery 一直在不断推进基于云的分析。该团队增加了强大的新功能,如流摄取、对标准 SQL 的支持和机器学习功能。新的预订价格使利用所有这些优势变得更加经济高效。也许是因为 BigQuery 团队的创新 DNA 保持不变。例如,该团队最近宣布了 BigQuery Omni 的测试版,这使得使用 BigQuery 分析生活在 AWS 或 Azure 等其他云系统中的数据成为可能。
回想这个过程,我了解到伟大的创新是如何从科技巨头内部产生的。从外部来看,这些公司似乎拥有几乎无限的资源,雇佣大量的工程师在流水线上不断产生数以千计的想法。相反,它需要难以置信的专注、专注的团队和非凡的技术,才能从内部竞争、功能蔓延、资源限制和唱反调者的严峻考验中脱颖而出。光有一个好主意是不够的。要诞生一款科技产品,你需要满足客户的迫切问题,并有毅力为他们解决问题。但是,成功推出一款产品并看到它成为行业标准的回报是无法估量的,我个人也很高兴成为其中的一员。这无疑塑造了我在离开谷歌后的职业生活。
10 年是一段很长的时间,尤其是在科技行业。承认这一里程碑并回顾这段不可思议的旅程真是太棒了。祝贺 BigQuery 团队及其不断壮大的社区,感谢他们的持续创新和发展。我迫不及待地想看看未来 10 年会发生什么!
双语数据科学家:Python 到 R(第 1 部分)
与 Python 中的代码相比,使用 R 中的代码基础的简要总结和指南。
在学院和大学,Python 被广泛教授和应用于许多学科;数学、物理、工程等。因此,更多的编码初学者最初有 Python 背景,而不是 R 背景。我就是这些人中的一员。我在大学期间有使用 Python 的经验,我在熨斗学校再次使用 Python;我把它应用于数据科学。
2019 年数据科学最需要的工具/语言来源:https://www . kdnugges . com/2020/02/getting-started-r-programming . html
关于最佳编程语言的争论一直存在,但当涉及到数据科学时,有两种语言肯定会登上领奖台,Python 和 R。了解到 R 作为一种编程语言是 2019 年数据科学第二大最受欢迎的工具/语言,占 59.2%,我想我还不如通过学习用 Python 和 R 编码来获得额外的优势。
我们开始吧!首先让我们回顾一下 Python。
来源:https://www.python.org/community/logos/
Python 自 20 世纪 80 年代末就出现了,由荷兰的古杜·范·罗森实现,作为另一种语言 ABC 的继承者。Python 是以电视节目《巨蟒剧团的飞行马戏团》命名的。
作为一种编程语言,Python 拥有哪些特性:
- 解释
- 面向对象
- 高级/动态
优势:
- 相对简单的语法(易于初学者学习编码)
- 百事通(用于 web 开发、科学/数字计算、游戏开发等。)
- 总体良好的社区支持(邮件列表、文档和堆栈流)
- 受深度学习的欢迎(广泛的库和框架选择)
- 对人工智能来说很棒
R 有什么不同?
来源:https://rveryday.wordpress.com/resources/
r 是 S 编程语言的现代实现,由统计学家 Ross Ihaka 和 Robert Gentlemen 在 90 年代创建。这个名字来自于两个创造者的名字的首字母,并发挥了 S 语言的名字。
作为一种编程语言,R 有什么特点:
- 统计计算环境
- 强大的图形功能
优势:
- 用于统计的内置数据分析(代码更少)
- 包含数据编辑器、调试支持和图形窗口的环境
- 总体良好的社区支持(邮件列表、文档和堆栈流)
- 非常适合图形绘图
r 是一种由统计学家和数据挖掘者开发的编程语言,通常用于分析数据、统计分析和图形。用于统计计算。
Python 和 R 在不同方面都很棒。所以,我们开始用 R 吧!
安装
安装 R 和 RStudio。RStudio 是一个很好的使用 r 的 IDE,以下是两者的链接:
https://www.r-project.org/
https://rstudio.com/products/rstudio/download/
RStudio 接口
- R 控制台:这个空间显示可以用来编写可执行代码的输出。
- R Script: 这个空间是你写代码的地方,然后你选择你想要执行的代码,按 Control + Enter(或者 Mac 上的 Command + Enter)或者点击“运行”按钮。
- R 环境:这个空间显示用名称、类型、长度、大小和值创建的变量。
- **图形输出:**该空间显示图形/图表,可用于选择包装。
下面是 R 中使用的一些基本语法和操作:
算术运算:
算术与 python 几乎相同,除了寻找除法的余数,因为我们使用%%而不是%,并且必须在 Python 中为平方根导入“math”或“numpy”库。
**Addition/Subtraction/Multiplication/Division:****#Python**
1 + 2
2 - 1
2 * 3
6 / 2**#R**
1 + 2
2 - 1
2 * 3
6 / 2**Square/SquareRoot/Remainder From Division:****#Python**
3**2
math.sqrt(9)
10%3**#R**
3**2 or 3^2
sqrt(9)
10%%3
数据类型:
同样,R 的数据输入与 Python 非常相似,只是在数字后添加了一个“L”来区分 R 中的数值和整数值,并且 R 中的 TRUE/FALSE 也是大写的。
**String/Float/Integer/Boolean:****#Python**
"Hello" or 'Hi'
26.56 or 1/3
30 or -2
True or False**Character/Numeric/Integer/Logical:****#R**
"Hello" or 'Hi'
26.56 or 1/3
30L or -2L
TRUE or FALSE **Type of Data:****#Python**
#gives you the type of data of chosen objecttype('this is a string')
type(True)**Type of Class:****#R**
#gives you the class type of chosen objectclass("Goodbye")
class(1.23)
赋值运算符:
R 语法中最独特的是赋值操作符的选择。Python 使用传统的’ = '将右边的值赋给左边的变量,而 R 有几种不同的方法来处理赋值。
**#Python**
x = 1**#R**
#Leftwards Assignment
x <- 1
y <<- "i am a string"
z = True
#Rightwards Assignment3 -> a
"Hi" ->> welcome
条件运算符:
对于条件运算符,Python 和 R 是相同的。
**Greater/Less Than or Equal To and Equal to/Not Equal to:****#Python**
a > b
b < c
a >= b
b <= c
a == b
b != c**#R**
a > b
b < c
a >= b
b <= c
a == b
b != c
If/Else 语句:
当看更多的函数代码时,Python 和 R 之间的逻辑是相同的,但是区别在于语法和缩进。Python 缩进是关键,因为它标记了要执行的代码块。r 在缩进方面更加宽容,但是需要花括号来区分代码块。
**#Python**i = 6
if i > 8:
print("larger than 8")
else:
print("smaller than 8")**#R**i = 6
if (i>8){
print("larger than 8")
} else {
print ("smaller than 8")
}
对于循环和 While 循环:
for 和 while 循环都采用类似的方法,就像两种语言之间的 if/else 语句一样。缩进和花括号是两种语言语法的定义特征。另外,for 和 while 条件都包含在 R 的括号中,不像 Python 使用冒号来结束条件。
**#For Loops****#Python**for i in range(1,6):
print(i)**#R**for (i in 1:5){
print(i)
}**#While Loops****#Python**i = 1
while i < 5:
print(i)
i += 1**#R**i = 1
while(i < 5){
print(i)
i <- i + 1
}
数据结构:
在 Python 中,数据集合有不同的数据结构,比如列表和字典。r 也有数据结构,但是有一些不同的类型和相当不同的语法来表示它们。
**#Python****#Dictionary**
my_dict = {key:value}**#List** my_list = [a,b,c]
my_other_list = list(z,y,z)**#Array** from numpy import array
my_array = ([2,4,6])**#Tuple** my_tuple = (1,2,3)**#R****#Vector** my_vector <- c(1,2,3)**#List** my_list <- list(1,2,3)**#Array**
my_array <- array(c(vector_1,vector_2),dim = c(2,2,2)**#Matrix** my_matrix <- matrix(1:6, nrow=3, ncol=2)**#Dataframe** my_df <- data.frame(column_1 = c("a","b"), column_2 = c(1,2))
向量包含同一类的对象。如果您混合不同类的对象,这些对象会变成一个特定的类,这称为强制。
**#Python**input:
my_list[1]
output:
2**#R**input:
my_list[1]output:
1
与 Python 不同,R 的索引不是从列表中的第 0 个元素开始,而是从第 1 个元素开始,因此数据在列表中的位置与用于从列表中调用它的索引号相同。
r 脚本
r 控制台
r 环境
分析学
R 的一些好处来自图形功能,所以我将详细介绍数据科学家如何使用 R 来创建一些数据可视化。
导入和操作数据帧:
在 R 中导入 csv 文件类似于 Python,但是您添加了另外两个参数:
- 判断正误:取决于 csv 的第一行是否是列名(如果是,则使用 TRUE)
- 文件中的数据使用什么类型的分隔?(在本例中为“,”逗号)
我在下面列出了几个 dataframe 函数。还有很多,但是我想用一些常见的例子来展示这些函数的语法的方法和简单性。
**#Python** name_of_df = pd.read_csv("name_of_csv_dataset.csv")name_of_df.head()
name_of_df["columns_name"]**#R
#import**
name_of_dataframe <- read.csv("name_of_csv_dataset.csv",TRUE,",")**#show head of dataframe**
head(name_of_df)**#shows variables and their observations (structure)** str(name_of_df) shows variables and their observations**#show shape of dataframe** dim(name_of_df)**#locate value for specific datapoint in dataframe** name_of_df[row_index,"column_name"**#show entire row as a dataframe**
name_of_df[row_index,]**#show entire column as a dataframe**
name_of_df[,"column_name"]**#show specific rows and columns as a dataframe**
name_of_df[c(row_a,row_b),c("column_name_1","column_name_2]**#sort values by a column as a dataframe**
name_of_df[order(name_of_df$column_to_sortby,decreasing=TRUE),]
剧情:
r 已经内置了绘图功能,而不需要使用做得很好的外部库,如果需要,还有更专业的图形软件包。我不会比较 Python 和 R 的直接代码,因为这两种语言都有各种各样的库和包可以用于绘图,也有各种各样的图形类型。
我将使用内置的 Iris 数据集来显示一个简单的箱线图和直方图。
plot(iris$Species,iris$Sepal.Length)
hist(iris$Sepal.Length)
当您在控制台中执行上述代码时,这些图形将出现在 RStudio 的图形环境块中。
植物分类和萼片长度的基本箱线图
植物萼片长度的基本直方图
在 RStudio 的图形环境模块中,您可以检查您想要使用的包。我将在这里使用 ggplot2 包进行一些更高级的绘图。
我将使用 ggplot2 包的内置数据集。
qplot(displ,hwy,data=mpg,facets=.~drv)
qplot(hwy,data=mpg,fill=drv)
按车辆车轮驱动类型的发动机尺寸划分的公路里程散点图
公路里程直方图,根据车辆的车轮驱动类型进行着色
我会把 R 指南分成多部分的系列,这样更容易消化…
下一集双语数据科学家:
- 数据操作:我将介绍 R 中使用的技术和方法,类似于您可能在 Python 中对 Pandas 使用的函数
- 统计:我将在 R 中探索各种各样的统计测试
十亿美元的数据科学
如何防止高风险数据科学应用中代价高昂的失败
预测智能手机计划的客户流失的内在风险与为一万亿美元的抵押贷款支持证券定价或为自动驾驶汽车检测人行横道上的行人是不同的。在第一种情况下,一个错误的决定有机会成本,在第二种情况下,它会导致金融危机,在第三种情况下,有人可能会受伤或死亡。作为数据科学家,我们经常谈论模型选择、超参数优化和性能指标,但很少谈论应用的严肃性会如何影响我们的工作。从事金融行业十年后,我发现有 5 个问题是模型失败的最常见根源。了解它们是什么以及如何处理它们可能会帮助你避免在数据科学中犯下十亿美元的错误。
照片由佩皮·斯托扬诺夫斯基在 Unsplash 拍摄
风险和可逆性
有两个概念对于很好地评估一个模型将如何用于决策是至关重要的:风险和可逆性。第一个概念,风险,更直观。衡量风险的最佳方式因每个决策而异,但它总是关于理解正确决策的回报和错误决策的代价。第二个概念,可逆性,是关于一个不正确的决定在事实发生后是否可以被改变。决策几乎永远不会完全可逆,因为通常会产生一些成本,即使是损失的时间或受损的声誉等非金钱成本,但错误可以逆转或减轻的程度会改变糟糕选择的实际成本。
当我在《纽约时报》从事评论审核工作时,机器学习模型的错误成本是明确而有限的。一个读者会发布算法漏掉的淫秽评论,其他读者会向我们的评论审核专家团队报告,评论会被删除。即使在系统故障的情况下,也需要不到 24 小时来检测故障,并修复机器学习系统或暂时使整个系统离线。错误决策造成的风险很低,因为出现淫秽评论的可能性和显示淫秽评论的成本都很低。模型决策也是可逆的,因为版主可以在评论显示后将其删除。在这种情况下,数据科学家应该自由地快速行动,打破常规。通过模型的快速迭代进行学习和实验的好处超过了部署前的仔细验证和检查。
在为信用卡建立风险模型时,人们面临的情况是完全不同的。今天部署的模型出现严重问题的第一个明显迹象可能不会在 6 个月内出现。某些类型的模型故障可能需要 2 到 3 年才能显现出来。当问题变得明显时——为时已晚,损害已经造成。在这里,每个错误的决策都是低风险的,因为与投资组合的规模相比,损失是很小的。但是每个决定都是不可逆的,在反馈回路闭合之前,总成本变得很高。如果失败足够严重,剩下要做的就是看着亏损滚滚而来,直到你慢慢地(或者可能很快地)倒闭。投资者失去了他们的钱,数据科学团队让每个人都失业,公司变成了一个恐怖的故事,就像长期资本管理一样,讲述了当你在公司给书呆子太多权力时会发生什么。
决策中风险的一般概念在用于假设检验的科学哲学中早已得到认可。虽然应用 0.95 的显著性水平被灌输给每个 Stats 101 学生,但要求对网站上按钮的颜色进行 A/B 测试的信心水平也是同样荒谬的,因为只要求医生给有风险的药物注射这样的信心水平是可怕的。尽管如此,在某些时候,科学家必须对什么样的显著性水平是合适的做出判断。
类似地,当我们构建一个模型时,我们必须对如何平衡方法的便利性和严谨性做出判断。当一个模型是高风险决策的主要输入时,我们应该如何加强我们的方法以最小化模型失败的机会?
没有通用的方法来保证模型的性能,但是在模型可能失败的无数方式中——这里是我在构建或审查模型时试图意识到的 5 种失败模式。
模型失败的五大原因
1.选择偏差
micha Parzuchowski 在 Unsplash 上的照片
建模中最常见,也是最容易被忽视的问题之一是选择偏差。选择偏差的定义因领域而异,但大致上我指的是以非随机方式收集训练数据并偏离预期应用的任何过程。大多数实际问题在某种程度上都存在选择偏差。
假设我们想要预测某人的汽车售价。选择偏差的一个温和的例子是,大部分数据是关于轿车的,只有一些数据是关于卡车和 SUV 的。基于该数据集建立的模型可能对轿车比对 SUV 更准确,但价值、里程和年龄之间的基本关系应该成立,并给出良好的预测。一种更严重的选择偏差是,只根据美国汽车的数据建立一个模型,并将其应用于日本制造商的汽车。这种差异很容易被忽略,但日本汽车有更好的记录和可靠性的声誉,所以价格不会随着年龄或里程快速下降。
为了避免被选择偏差绊倒,在建立模型之前,最好养成问两个问题的习惯:
- 数据收集的选择过程是怎样的?
- 模型是否会有与训练集在重要方面不同的操作条件?
问题#1 是最重要的,因为如果我们不理解选择过程,我们就不能对我们的模型或数据进行调整。理想的情况是只研究像物理科学中的问题,其中每个观察单位都是相同的(例如电子或细菌),所有感兴趣的变量都是独立操纵的,以使因果推断变得容易,并确保模型将完美地推广到整个群体。但是对于行业应用,数据收集很少归数据科学家所有,它可能不符合模型的操作条件,并且数据收集很少仅用于科学研究的目的。由于来自物理科学的数据往往是例外,而不是数据科学从业者的规则,所以可以问的好问题包括:
- 什么过程将数据从更广泛的人群中提取到样本中?
- 选择过程如何影响样本数据?(例如,用于分类的标签比率的变化,或者特征分布的支持)
- 时间的流逝是否带来了潜在的影响?
对于我们关于选择偏差的第二个问题,如果训练数据的选择过程与应用有意义的不同,第一步是尝试量化这种差异。在无监督学习或迁移学习问题的情况下,我们仍然可以以单变量方式(这更容易)或联合分布(这更难)来评估特征分布的差异。对于监督学习问题,我们还可以比较样本数据和应用之间的目标差异或预测器和目标之间的关系。
当我们想要对 P(Y | X)建模并且 X 的分布有变化时,在协变量移位的大标题下有许多技术,并且,利用相对灵活的模型,对协变量移位进行调整是容易处理的。当 P(Y)变化时(先验概率变化),校准通常是一个简单的解决方法。当一个数据选择过程(无论该过程是已知的、潜在的还是由于不稳定的环境)改变了我们所了解的 X 和 Y 之间的关系(概念转变)时,通常没有聪明的算法方法来逃避只有可用数据的问题。在这种情况下,有 5 种明智的方法:
- 使用护栏:约束模型允许操作的空间。这可能很简单,比如对单个要素的值进行硬切割,也可能更复杂,比如在样本数据的联合分布密度较低的地方不做决策。这种技术的一个例子是当市场在不到 10 分钟内下跌超过 10%时,停止模型交易。
- 收集更多数据:改变选择过程,最好是通过实验,直接解决选择偏差。
- 渐进式探索:使用分层抽样或主动学习等技术(通常受预算限制)来更新模型,并在“实时”环境中高效学习。
- 使用预测区间:对于监督学习,当有可能生成准确的预测区间时,有时调整决策过程以使用预测区间而不是点估计就足够了。
- 建立一个因果模型:这是最难也是最不实用的方法,但是识别因果关系解决了许多选择偏差产生的问题,当有可能识别它们的时候。
大多数实际应用都存在某种程度的选择偏差。最重要的是理解它,以便有意识地决定偏差带来的风险,以及如何在模型的构建或应用中减轻风险。
2.操作化
照片由 Tachina Lee 在 Unsplash 上拍摄
可操作化的概念是如何将一个模糊的、真实的目标变成一个可量化的问题。一个简单的例子就是“吸烟致癌”的假设。即使有了这样一个直观的想法,我们仍然需要决定如何量化假设。例如,我们是否应该将“吸烟”的定义局限于烟草?如果是,一个人要抽多少或多长时间才有资格成为“烟民”?我们对癌症的定义是否仅限于肺癌?诸如此类。
让数据科学的可操作性变得棘手的是,错误往往不在于数据或算法,而在于我们自己。我们从技术训练中获得的素质经常引导我们去熟悉和舒适的方法,即使它们可能不是解决问题的正确选择。有时候最重要的问题也是最不明显的。要设置一个新问题,有两个背景问题需要仔细考虑:
把这个问题框定为数据科学问题到底合适不合适?
在工业界,非科学的、昂贵的或不可行的问题总是被提出来。在试图回答迈克尔·乔丹或勒布朗·詹姆斯是否是有史以来最伟大的篮球运动员之前,问问这个问题是否值得回答,如果值得,数据科学是获得答案的正确途径吗?
可以用什么方法学来设计这个问题?
我们都倾向于默认使用我们最熟悉的工具和技术,这可能是一个错误。身份盗窃问题就是一个很好的例子。将问题设计成分类问题和异常检测问题可以得到更好的结果。当数据是相关的,或者我们需要进行因果推断时,我们必须处理这些问题,即使大多数技术不能保证这一点。问题应该决定方法,而不是相反。
一旦解决了背景问题,我们就可以评估更明显的技术主题:
分解 —问题是否应该分解成零件?尽管端到端学习对于复杂的问题来说可能很有吸引力,正如吴恩达在“机器学习的渴望”一章中就端到端学习的利弊指出的那样它可能需要更多的数据,并且更难分析和改进。
特性 —基于对领域的了解,是否存在所有相关的度量?潜在特征在多大程度上可能产生影响?无关数据被排除了吗?如果与人打交道,这些数据会导致不公平或歧视性的待遇吗?
目标 —目标是否最接近预期结果?无论是多臂强盗还是分类器,选择对看起来接近人的概念建模,如收入和利润,可以对模型产生巨大的影响。
目标函数 —目标函数是否用正确的约束优化了正确的权衡?尽管最小化 RMSE 或对数损失的想法在监督学习中普遍存在,但可能有更合适的方法(例如,不同的损失函数、成本敏感的机器学习、结构化预测、多目标优化)。
性能评估 —即使在对监督学习问题的损失函数进行了大量考虑的理想情况下,优化的函数也很少是手边的实际问题。这仍然是一种简化,对于高风险模型更是如此,在高风险模型中,问题的某些方面可能存在难以量化的限制,如可解释性、计算复杂性或与其他系统的交互。高风险模型的最终评估必须超越简单的汇总统计,并尽可能根据预期用途进行评估。
操作化是任何数据科学问题中最具挑战性的部分之一,因为它将该领域中一些最巧妙和技术性的方面联系在一起。即使有领域知识,也很难对一个问题提出一个好的概念表示。为这一概念提出实证测量和数学表述,如果不是更难的话,至少也是同样困难的。好消息是,当一个问题被正确操作时——其他一切都变得容易多了。
3.黑箱滥用
阿里·沙阿·拉哈尼在 Unsplash 上拍摄的照片
高风险问题不同于低风险问题的一个方面是,我们几乎总是想要一些证据,证明模型使用信息的方式与我们对现实的理解一致。虽然“白盒”模型经常被提议作为“黑盒”模型的替代方案,如神经网络或集成方法来提供证据,但现实是线性或逻辑回归模型不容易解释大多数现实世界的问题,并且需要更多的工作来实现类似水平的预测准确性。当复杂模型失败时,问题几乎从来都不是模型的灵活性,而是将输入数据、算法或模型对输入数据的使用视为黑盒的某种滥用。
对于一个高风险的决策来说,忠实——一个模型的概括能力——甚至比准确性更重要。对于任何高风险模型,谨慎的做法是:
理解算法 —这看似显而易见,但却是许多失败的根源。每个算法都有优点、缺点和假设。无论是特征的规模还是数据的维度,对算法局限性的实际工作知识与合理的理论理解一样重要。
了解特征-即使在学习特征表示是建模任务的一部分的情况下,了解输入数据是什么以及如何使用它也是至关重要的。两个很好的例子说明了这一点的重要性:
- 泄漏 —除了在某个特征与目标有着滑稽的强关联的情况下,泄漏需要人为干预来防止。
- 歧视 —导致不公平待遇的数据(如种族主义、性别歧视等。)对人来说可能是显而易见的,但在模型优化中却不明显。甚至像一份好的清单这样简单的事情也可以成为从数据或模型中承认歧视的起点。
理解模型如何使用特性:有各种各样的方法来评估一个模型,甚至是一个“黑盒”模型,如何使用数据。对于稀疏数据,手动检查每个特征是不可行的,但利用特征重要性的指数衰减或问题中的特殊结构(如生物信息学中的双聚类)仍然可以证明模型中的原则驱动因素在概念上是正确的,即使在具有大量竞争因素的高维空间中的行为难以理解。
尊重数据集偏差的影响-对超参数优化的短视关注可能会使我们相信模型性能已经得到改善,即使跨数据集泛化或对超时维持的泛化很差。对运行条件变化具有鲁棒性的模型可能更适合高风险应用。
当然,有时不理解一个模型是如何工作的,理解一个模型是如何崩溃的就足够了——我们将在关于错误分析的第 5 章中讨论。
4.部署
凯文·杰瑞特在 Unsplash 上拍摄的照片
即使是在正确的数据上以正确的方式构建的模型仍然面临着部署的障碍。为了使模型有用,模型的输出必须走出实验室,回到现实世界。机器学习:技术债务的高息信用卡是关于机器学习系统的软件工程最佳实践的权威参考,我强烈推荐它,因此我将特别关注部署高风险应用程序的一些实际考虑
匹配环境
开发环境和预期应用程序的硬件差异往往是最难处理的,尤其是在浮点运算存在差异的情况下。幸运的是,我们大多数人只需要关心软件层,虚拟机和容器让生活变得更加轻松。无论采用哪种方法,环境细节都需要匹配:操作系统、语言和软件包版本等。都需要排队。模型的单元测试和集成测试经常会错过边缘情况,这些情况可能是由在两个独特的环境中执行的具有细微差别的相同的全功能代码行引入的。
序列化
为了存储、共享或复制一个模型,需要将它序列化到持久存储中。不幸的是,对于许多实际应用来说,模型序列化仍然具有挑战性。原生序列化格式,如 Python 中的 pickle 或 R 中的 rds ,以及工具特定的序列化格式,如 TensorFlow 或 mllib 中的格式,都很方便,但几乎总是会产生问题。安全性可能是一个问题,随着模型的老化,重新创建正确的执行环境可能是困难的或不可取的,并且可能没有简单的方法将模型分发到不同的平台。虽然 PMML 是行业标准的序列化格式,因为它是独立于语言和平台的,但它也有缺点。PMML 强调的是便携性,而不是性能;此外,只有有限数量的模型类型可用,并且将格式扩展到新类型的模型或转换是一项不小的工作量。 ONNX 和on XML已经开始弥合深度学习模型和标准机器学习模型的序列化格式之间的差距,但仍在积极开发中。因为序列化很少有一个显而易见的答案,所以最终,存储模型及其训练参数的数据总是一个好习惯,以便在必要时可以从头重新创建它。
特征
根据我的经验,特性导致的失败比模型部署的任何其他方面都要多。
翻译错误
特性工程经常发生在与生产环境不完全匹配的开发环境中。有时,开发中编写的特性甚至必须翻译成不同的编程语言才能用于生产。将功能转换到生产环境中可能会出现错误。尽管编写所有特性的生产实现并通过生产系统提取它们用于开发,但由于时间和现有系统的限制,这通常是不可行的。通常,我们所能做的最好的事情是在共享数据集上测试生产实现和开发实现,并要求匹配达到浮点精度。
所有权
不管数据是来自传感器还是 ORM,建模者很少拥有或维护数据的创建。除了我们在“黑盒滥用”一节中讨论的泄漏概念之外,这一挑战还会以几种不同的方式出现:
- 漂移:即使当一个特性的计算和一个模型之间有一个明确的依赖关系时,由于大多数软件系统中存在的耦合程度,特性的分布也会随时间漂移。即使计算本身不变,它也依赖于输入,而输入又具有依赖性。一个很好的默认假设是,代码库的正常开发和与之交互的真实世界过程最终会导致不可接受的偏差。
- 修复“损坏的”功能:虽然漂移会导致模型慢慢退化,但有一个棘手的维护问题会导致功能立即损坏。有时,模型具有被精确实现的特性,但是具有明显的计算错误——例如,将整数视为字符串或除以零。然后,作为正常维护的一部分,特征计算被某个人改变,该人认为他们正在修复一个 bug——但是无意中破坏了模型。即使基于改进的计算来重新训练模型可能是理想的,但模型的性能保证是基于原始特征计算的,并且会有所不同(可能更差),因为其参数是基于该计算的。
复杂性
复杂性带来的挑战是邪恶的,因为它很难定义,也很难衡量。随着模型复杂性的增加,即参数、功能和依赖性越多,或者透明度越低,或者对硬件(无论是 CPU、GPU、RAM 还是内存)的要求越高,部署和维护就越困难。
正如 Leon Bottou 在他关于的演讲中解释的,机器学习的两大挑战,管理复杂性的另一个方面是不能孤立地考虑模型。一个模型在一个动态的生态系统中运行,特别是对于现代企业,一个模型可能会受到其他模型的决策或输出的影响。
如果我们追溯到开始这一切的竞赛,100 万美元的网飞奖,获胜的算法从未实现过,因为性能优势与复杂性不相称。在部署新的 champion 模型之前,应始终将性能优势与更简单的替代方案进行权衡,尤其是在下行风险可能远远超过性能提升的高风险应用中。
与“选择偏差”、“可操作化”或“黑盒滥用”等主要与设计和创建有关的章节不同,关于部署的好消息是,只要我们在编写测试和创建监控时牢记这些问题,我们就可以开发出避免这些问题的明确方法。
5.误差分析
斯蒂芬·道森在 Unsplash 上拍摄的照片
所有模型都失败了。所有的模型都是现实的一个脆弱的简化版本。无论一个模型有多聪明或多精确,它都有缺陷。但是,如果我们能够预测一个模型将如何执行,并了解一个模型将如何失败,我们就可以安全地使用它。
即使我们为正确的决策做了很好的优化工作,我们对它的评估仍然是一种简化。构建 champion 模型后,我们可以执行错误分析,以几种不同的方式审核模型的性能,这在培训阶段可能会不方便。
“所有的模型都是错误的,但有些是有用的”——乔治·博克斯
基准
如果可能的话,最好用已知性能良好的“黄金标准”模型来评估新模型。虽然每个人都习惯于在培训/测试中对照“冠军”来评估新的“挑战者”模型,但值得注意的是,因为我们在错误分析中的目标是寻找重要的缺陷,所以有时最好是对照最健壮、最稳定的模型来评估挑战者模型,而不是最佳表现的冠军。
更经常被忽视的是,在没有明显的冠军或黄金标准可供比较的情况下该怎么做。在这种情况下,仍然有几个选择。一种是纯粹为了比较而创建一个更简单的模型。例如,如果你已经建立了一个 GAM,把它与相同数据上的逻辑回归模型进行比较。如果有足够的数据,并且关系是非线性的,那么 GAM 应该在任何地方都优于逻辑回归。同样的类比适用于任何问题——如果你将伯特应用于你的 NLP 问题,而它并没有表现出一袋单词的方法,那就有问题了。
当时间或其他约束阻止一个简单的模型成为一个现实的选择时,我们可以退回到随机数生成——这可能是一个令人惊讶的有效的现实检查。众所周知,人类不善于识别“随机”是什么样子,数据科学家也不例外。将随机的统一特征注入到数据集中,或者通过从参数与目标匹配的分布中抽取随机数来模拟“模型”,至少可以显示出纯粹由于偶然而可能发生的情况。
残差
称残差分析是一门失传的艺术是不正确的,因为统计学家还没有忘记它。也就是说,没有受过正规统计学培训的从业者往往没有充分利用它,我得到的印象是,大多数人认为残差分析只对线性模型有用。虽然 PDP、ICE 和 SHAP 图都是解释模型和检查模型如何使用特性的好方法,但要了解模型哪里出错了——没有什么比查看残差的更好的了。不是所有的残差都是相等的,尤其是当时间是一个问题的相关维度时。幸运的话,检查残差可以建议改变特征表示、模型类型或集成模型的机会。在最坏的情况下,残差分析可以证明模型的整体指标没有隐藏残差上的恶劣行为,其中一小部分大残差被小的平均残差抵消。
成分
有时候,将机器学习系统分解成组件来分析性能,这在事后才显而易见。回到我们最初的例子,自动驾驶汽车的行人检测可能会在许多方面出错。模型可能擅长检测图像中的人,但不擅长检测场景中的位置。或者它可能对接近任何一种“条纹”图案的人来说太合适了,不管是条纹人行横道还是条纹衬衫。预测信用卡违约风险也是如此。预测 2 年期的违约概率包含许多因素。一个模型可能只是非常擅长预测前 6 个月或 12 个月的短期风险,之后也不会比随机风险更好。将一个系统分解成几个组成部分来测量哪里出现了错误,这有助于我们理解它是如何工作的,哪里出了故障。
与残差一样,成分分析的主题是检测意外错误。如果我们在构建模型的一开始就预料到某些组件将更难建模,我们可能会以不同的方式塑造我们的训练集,添加功能以避免矛盾的关系,或者创建子模型。事实是,我们最初的假设是,我们可以测量或优化的许多东西根本不重要。即使对于我们非常关心准确性和可靠性的模型或机器学习系统,对每个假设进行建模和测试也是不现实的。通常,事后检查性能是否符合预期以及错误是否是随机的要比事先为所有可能性做好准备容易得多。
结论
大多数模型不需要三级审问。有些是。在准备构建任何模型时,考虑模型将用于的决策的风险和可逆性总是谨慎的。如果一个模型将被用于做出高风险、不可逆转的决策——作为科学家,我们应该增强我们的怀疑精神和方法的严谨性。不幸的是,这 5 个模型失败的常见原因并没有涵盖所有可能的失败模式。但它们确实是一个健康的提醒,帮助任何从业者避免可预防的错误…甚至可能是十亿美元的错误。
基于 FAISS+SBERT 的亿级语义相似性搜索
构建智能搜索引擎的原型
作者图片
介绍
语义搜索是一种信息检索系统,它关注句子的含义,而不是传统的关键字匹配。尽管有许多文本嵌入可以用于此目的,但是很少有人讨论如何扩展它来构建可以从大量数据中获取数据的低延迟 API。在这篇文章中,我将讨论我们如何使用 SOTA 句子嵌入(句子转换器和 FAISS )来实现一个最小语义搜索引擎。
句子变形金刚
它是一个框架或一组模型,给出句子或段落的密集向量表示。这些模型是变压器网络(BERT、RoBERTa 等。)进行了微调,特别是针对语义文本相似性的任务,因为 BERT 对于这些任务的开箱即用表现不佳。下面给出了不同型号在 STS 基准测试中的性能
图片来源:句子变形金刚
我们可以看到,句子转换模型远远优于其他模型。
但是如果你看一下排行榜上有代码为和胶水的论文,你会看到很多 90 以上的模型。那么我们为什么需要句子变形金刚呢?。
在这些模型中,语义文本相似度被认为是一项回归任务。这意味着每当我们需要计算两个句子之间的相似性得分时,我们需要将它们一起传递到模型中,模型输出它们之间的数值得分。虽然这对于基准测试很有效,但是对于现实生活中的用例来说,它的伸缩性很差,原因如下。
- 当您需要搜索 10 k 个文档时,您将需要执行 10k 个独立的推理计算,这是不可能单独计算嵌入和仅计算余弦相似性的。见作者解释。
- 最大序列长度(模型在一次传递中可以采用的单词/标记的总数)在两个文档之间共享,这导致表示由于分块而被稀释
费斯
Faiss 是一个基于 C++的库,由脸书·艾创建,带有一个完整的 python 包装器,用于索引矢量化数据并对其进行有效搜索。Faiss 根据以下因素提供不同的指数
- 搜索时间
- 搜索质量
- 每个索引向量使用的内存
- 训练时间
- 无监督训练需要外部数据
因此,选择正确的指数将是这些因素之间的权衡。
加载模型并对数据集执行推理
首先,让我们安装并加载所需的库
!pip install faiss-cpu
!pip install -U sentence-transformersimport numpy as np
import torch
import os
import pandas as pd
import faiss
import time
from sentence_transformers import SentenceTransformer
加载带有百万个数据点的数据集
我使用了一个来自 Kaggle 的数据集,其中包含了 17 年间发布的新闻标题。
df=pd.read_csv("abcnews-date-text.csv")
data=df.headline_text.to_list()
加载预训练模型并执行推理
model = SentenceTransformer('distilbert-base-nli-mean-tokens')encoded_data = model.encode(data)
索引数据集
通过参考指南,我们可以根据我们的用例选择不同的索引选项。
让我们定义索引并向其中添加数据
index = faiss.IndexIDMap(faiss.IndexFlatIP(768))index.add_with_ids(encoded_data, np.array(range(0, len(data))))
序列化索引
faiss.write_index(index, 'abc_news')
串行化的索引然后可以被导出到用于托管搜索引擎的任何机器中
反序列化索引
index = faiss.read_index('abc_news')
执行语义相似性搜索
让我们首先为搜索构建一个包装器函数
def search(query):
t=time.time()
query_vector = model.encode([query])
k = 5
top_k = index.search(query_vector, k)
print('totaltime: {}'.format(time.time()-t))
return [data[_id] for _id in top_k[1].tolist()[0]]
执行搜索
query=str(input())
results=search(query)
print('results :')
for result in results:
print('\t',result)
CPU 上的结果
现在让我们看看搜索结果和响应时间
作者 GIF
仅用 CPU 后端对一个包含百万文本文档的数据集执行智能的基于含义的搜索只需要 1.5 秒。
GPU 上的结果
首先,我们卸载 Faiss 的 CPU 版本,重装 GPU 版本
!pip uninstall faiss-cpu
!pip install faiss-gpu
然后按照相同的过程,但在最后将索引移动到 GPU。
res = faiss.StandardGpuResources()
gpu_index = faiss.index_cpu_to_gpu(res, 0, index)
现在让我们把它放在搜索函数中,用 GPU 执行搜索。
作者 GIF
没错,使用比 CPU 后端快 75 倍的 GPU (本实验中使用的是特斯拉 T4)可以在 0.02 秒内得到结果
但是,如果我可以等待几秒钟,为什么我不能序列化编码数据的 NumPy 数组而不是索引它们并使用余弦相似性呢?
因为 NumPy 没有自带的序列化函数,所以唯一的方法是将其转换成 JSON,然后保存 JSON 对象,但是这样一来,大小会增加五倍。例如,用普通索引编码成 768 维向量空间的 100 万个数据点大约是 3GB,将其转换成 JSON 将是 15GB,这是普通机器的 RAM 所不能容纳的。因此,每次执行搜索时,我们都必须运行一百万次计算推断,这是不实际的。
最后的想法
这是一个基本的实现,在语言模型部分和索引部分还有很多工作要做。有不同的索引选项,应根据使用情形、数据大小和可用的计算能力选择正确的选项。此外,这里使用的句子嵌入只是在一些公共数据集上进行微调,在特定领域的数据集上进行微调将改善嵌入,从而改善搜索结果。
参考
[1]尼尔斯·雷默斯和伊琳娜·古雷维奇。 制作单语句子嵌入多语使用知识蒸馏 。”arXiv (2020): 2004.09813。
[2]约翰逊,杰夫和杜泽,马特希斯和 J{'e}gou,赫夫{'e} 。 用 GPU 进行亿级相似性搜索arXiv 预印本 arXiv:1702.08734 。