数据科学变得简单:使用 Orange 进行数据处理
利用开源工具以正确的方式处理数据集,而无需接触任何代码!
Image taken from the official Orange website
这是 Data Science Made Easy 系列的第二部分,您将了解处理数据集的必要步骤。数据处理是数据科学家最基本的任务之一,因为你会意识到我们花了大部分时间清理和调整数据集。在我们开始之前,请确保您已经安装了 Orange。请阅读第一部分进行设置和安装,如果您错过了,底部会有链接供您浏览整个 Data Science Made Easy 系列。让我们从简单的列和行过滤开始。
选择列
假设您已经成功地从数据集中识别出一些重要的要素,并且想要创建一个仅包含这些要素的新数据集。您可以使用选择列小部件轻松做到这一点。假设您已经通过浏览自定义文档将虹膜数据集加载到文件小部件中。
Gif by Author
- 将一个选择列小部件拖到画布上。
- 连接文件小部件和选择列小部件。
- 双击选择列小部件打开界面。
Gif by Author
打开选择列界面后,可以左右移动变量。左侧表示不需要的要素,而右侧表示选定的要素。一旦下定决心,关闭界面,双击数据表小部件。您应该能够看到您选择的功能。
选择行
除了能够选择特性之外,您还可以将数据过滤成您想要的东西。让我们在选择行小部件上探索更多。
Gif by Author
- 将一个选择行小部件拖到画布上。
- 连接文件小部件和选择行小部件。
- 双击选择行控件打开界面。
Gif by Author
您可以使用选择行界面设置您的条件以过滤出所需的数据。假设您正在使用 Iris 数据集,我们可以过滤出特定类别的数据。同样,我们可以过滤掉不属于特定类的数据。此外,我们还可以为萼片长度必须大于某个数字等特征设置条件。您可以添加任意多个条件。双击数据表小部件,应该可以看到过滤后的数据。
特征构造器
有时需要从现有特征创建新特征。例如,您可以使用人的身高和体重要素创建身体质量指数要素。这通常被称为特征工程。Orange 附带了一个名为特征构造器的内置小部件,允许我们使用现有特征创建一个新特征。如果你有好的记忆力,你会记得我说过“数据处理不涉及任何代码”。嗯,你猜对了。我骗了你!😈特征工程需要一些 Python 的基本编码知识。不用担心,因为我在这里指导你。
Image by Author
- 右键单击画布以显示小部件选项。搜索特征构造器小部件,并将其添加到画布中。
- 添加一个数据表小部件。
- 如上图所示,将它们全部连接起来。
- 双击它打开界面
Image by Author
- 点击“新按钮,您将看到一个下拉列表,显示数字、分类和文本。
- 选择 Numerical,将创建一个新项目(很可能命名为 X1)。
- 将名称更改为 sepal_length_square(根据您的偏好进行相应修改,因为这是您的新功能的名称)。
- 关注右边的文本框。这是你需要输入一些代码的部分。点击“选择特征”按钮,您将看到数据集中的所有特征。选择 sepal length,您将看到“sepal_length”被添加到文本框中。您可以自己输入,但要记住在功能名称的每个空格处添加一个下划线。
- “选择函数”提供了一个数学函数列表,如果您不熟悉脚本,可以使用它。你应该不会有问题,因为提供的函数类似于任何 Excel 电子表格中的函数。键入** 2,你应该有 sepal_length ** 2,就像上面的图片一样。
- 使用上述步骤添加一个新的分类项目。分类用于标注特征。例如,你可以根据萼片长度将鸢尾分为小、中、大三类。该代码基于以下内容:“if(值)(特征名 ) < ( 值),else ( 值 ) if ( 特征名 ) < ( 值),else ( 值)”
- 将名称改为 small_iris 并键入下面的" 0 if sepal_length < 5 else 1 if sepal_length < 6 else 2”
- At the values text box, type in “S, M, L”. This represents the label of the label based on the conditions at step 7. 0 will map to S, 1 will map to M and 2 will map to L.
You should be able to see the following output once you closed the 特征构造器接口并打开数据表接口
Image by Author
基于官方文档,这里有一些对 Python 新手的快速提示:
- +,-相加、相减
- *相乘
- /来划分
- %相除并返回余数
- **代表指数(代表平方根乘以 0.5)
- //用于楼层划分
- 、<=, > =小于、大于、小于或等于、大于或等于
- ==表示相等
- !=不等于
数据采样器
数据采样器小部件是数据科学家最重要的小部件之一。将数据集划分为训练集和测试集是最基本的任务之一。还记得 sklearn 提供的 train_test_split 函数吗?这个小部件的功能与 train_test_split 的功能相同。让我们在画布上测试一下。
Gif by Author
- 将一个文件小部件拖到画布中。
- 将一个数据采样器小部件拖到画布上。
- 将文件微件与数据采样器微件连接。
- 将两个数据表小部件拖到画布中。第一个小部件用于训练数据,第二个小部件用于测试数据。
- 如上图所示,将数据采样器微件与数据表微件连接。
- 双击数据采样器微件和第二个数据表微件之间的链接,打开编辑链接界面。
- 将剩余数据连接到数据上,双击数据样本和数据之间的链接。这允许第二个数据表根据数据采样器中的设置接收剩余数据。
- 双击数据采样器打开界面。
Image by Author
根据官方文件,
- 数据的固定比例:返回整个数据的选定百分比(例如,所有数据的 70%)。在这种情况下,70%到的数据样本和 30%到的剩余数据。
- **固定样本大小:**返回选定数量的数据实例,有机会设置样本替换,它总是从整个数据集中采样(不减去子集中已经存在的实例)。通过替换,您可以生成比输入数据集中可用实例更多的实例。
- **交叉验证:**将数据实例划分为互补的子集,在这里您可以选择折叠(子集)的数量以及您想要使用哪个折叠作为样本。
- Bootstrap: 从总体统计推断样本。
保存数据
到目前为止进行的所有数据处理都只适用于 Orange。这些更改不会反映在原始数据集中。如果您想保存处理过的数据,您应该使用保存数据小部件。
Image by Author
您可以将其放置在数据表之后,如上图所示独立保存列车数据。
Image by Author
同样,您可以在任何可视化小部件中选择一些数据,并仅保存所选数据。
Image by Author
您可以确定文件类型并检查是否使用压缩。有两种保存方式:
- 保存:覆盖现有文件
- 另存为:新建一个文件
结论
就这样,伙计们!您已经学习了如何使用选择列小部件和选择行小部件过滤数据集。此外,您可以利用您的 Python 编程技能,通过特性构造器小部件进行特性工程。您也可以通过图形用户界面这样做。接下来,数据采样器小部件允许我们将数据分成训练集和测试集。完成数据处理后,您可以使用保存数据小部件将其保存到文件中。还有很多小部件可以用来处理数据。请随意查看官方文件。感谢阅读数据科学变得简单教程的第 2 部分。在下一部分,我将使用 Orange 进行测试和评估。❤️
数据科学变得简单
参考
数据科学变得简单:使用 Orange 进行图像分析
使用开源机器学习工具简化您的图像分析任务,无需编写任何代码!
Image taken from the official Orange website
您已经进入了数据科学简化系列的第五部分。在这篇文章中,我将教你一些使用 Orange 进行图像分析的基本步骤。供您参考,除了正常的分类和回归任务之外,Orange 还可用于图像分析任务。到目前为止,您应该已经熟悉了 Orange 的用户界面。在我们开始之前,请确保您已经安装了 Orange。请阅读第一部分进行设置和安装,如果您错过了,底部会有链接供您浏览整个 Data Science Made Easy 系列。我们开始吧!
安装图像分析插件
Orange 附带了很多非常有用的附件。在本文中,我们将只关注其中一个叫做的图像分析。
Gif by Author
- 单击选项菜单,将出现一个下拉列表。
- 选择附加组件并点击按钮打开附加组件界面。
Image by Author
勾选图像分析,点击右下角的“确定”按钮。等待安装完成,您就可以开始工作了。你可能需要重新启动 Orange 才能工作。您应该能够看到如下图所示的图像分析小部件。
Image by Author
小工具
导入图像
首先要做的是通过导入图像小部件导入图像。您可以将这个小部件视为图像的文件小部件。然而,导入图像小部件接受目录而不是文件。
Gif by Author
- 将导入图像小部件添加到画布。
- 双击它打开界面。
Image by Author
下拉列表显示过去的目录,而中间的按钮是打开任何新的目录。如果您在目录中添加或删除了任何图像,您可以使用“重新加载”按钮来刷新内容。还有一个显示目录中图像数量的信息文本。对于本教程,我将使用 Orange 的官方博客帖子提供的一些样本图像。你可以从下面的链接中获取数据集。它应该包含 19 个家养动物的图像。提取它,你应该有一个家畜文件夹。
图像浏览器
接下来,我们将依靠图像查看器小部件来检查目录的内容。这个小部件将显示所有加载的图像。这很有用,因为整个工作流程可以通过 Orange 完成,而不需要打开浏览器。让我们继续上一节课。
Gif by Author
- 向画布添加一个图像查看器小部件。
- 将导入图像小工具与图像查看器小工具连接。
- 双击图像查看器小工具打开界面。
Image by Author
您应该会看到如上图所示的界面。
图像嵌入
这个小部件对于整个图像分析包来说是最重要的,因为这是魔法发生的地方。供您参考,分类和回归任务需要数字形式的数据,除非我们以数字形式表示,否则没有一种好的方法来使用图像执行此类任务。这就是图像嵌入小部件的工作原理,它将图像嵌入转换成一个数字向量。图像嵌入小工具读取图像并上传到远程服务器或在本地进行评估。
Gif by Author
- 向画布添加一个嵌入小部件的图像。
- 将导入图像控件与图像嵌入控件连接。
- 双击图像嵌入控件打开界面。
Image by Author
图像嵌入界面最重要的参数是嵌入器。你可以使用很多嵌入器。除了 SqueezeNet,大多数都需要互联网连接来进行转换。根据官方文档,列表如下:
- SqueezeNet : 在 ImageNet 上训练的用于图像识别的小型快速模型。
- Inception v3 : 谷歌在 ImageNet 上训练的 Inception v3 模型。
- VGG-16 : 在 ImageNet 上训练的 16 层图像识别模型。
- VGG-19 : 在 ImageNet 上训练的 19 层图像识别模型。
- 画家:一个被训练成从艺术品图像中预测画家的模型。
- DeepLoc :一个被训练分析酵母细胞图像的模型。
最安全的选择是选择挤压网,如果你没有任何互联网连接。您可以随意使用它,因为每个嵌入器都会产生不同的输出。请注意,官方文档声明发送到服务器的图像不会存储在任何地方。
Image by Author
你可以用一个数据表小部件连接它来查看输出。您应该获得类似下图的内容。
Image by Author
距离和层次聚类
您可以通过将来自图像嵌入小部件的输出传递到距离小部件和层次聚类小部件来进一步分析它。您将能够看到一个树形图,这是一个树形图,常用于说明由层次聚类产生的聚类的排列。
Image by Author
- 向画布添加一个距离小部件。
- 将图像嵌入控件与距离控件连接。
- 向画布添加一个分层聚类小部件。
- 将距离控件与层次聚类连接。
- 双击层次聚类控件打开界面。
Image by Author
您应该能够看到如上图所示的界面。
图像网格
如果你更喜欢视觉,你可以试试图像网格部件。根据官方文档,图像网格小部件可以在相似网格中显示数据集的图像。这意味着具有相似内容的图像彼此放置得更近。它可用于图像比较,同时查找所选数据实例之间的相似性或差异。
Image by Author
- 将图像网格小部件添加到画布。
- 将图像嵌入小部件与图像网格小部件连接。
- 双击图像网格小部件打开界面。
Image by Author
您应该能够获得类似于上图的东西。你可以看到这些图像根据形状和颜色被很好地分成不同的组。
试验
让我们通过使用不同类型的图像来尝试一下聚类是如何工作的。官方博客为我们提供了面对前置摄像头的 Milka。这与我们现有的任何图像都有很大不同。它能和小牛或母牛聚集在一起吗?
Image by Author
保存图像并放入家畜文件夹中。刷新导入图像小部件,双击层次聚类小部件。
Image by Author
你应该可以看到 Milka 就放在小牛和母牛的正上方。但是,它不在同一个群集中。你可以从网上选择一些图片来试试。
结论
恭喜你走到这一步!让我们回顾一下今天所学的内容。我们从安装图像分析插件开始,它为我们提供了一些新的小部件。然后,我们通过 Import Images 小部件加载图像。你可以把它指向你选择的目录。您可以通过图像查看器小部件检查图像。此外,我们还学习了使用图像嵌入小部件将图像转换为数字向量。可以使用不同种类的嵌入器。接下来,我们尝试了距离小部件和层次聚类小部件来显示聚类的树形图。最后,我们用一个样本图像进行测试。感谢阅读数据科学变得简单教程的第 5 部分。下节课再见。❤️
数据科学变得简单
参考
- https://orange.biolab.si/
- https://github.com/biolab/orange3
- https://orange.biolab.si/docs/
- https://orange 3-image analytics . readthedocs . io/en/latest/index . html
- https://blog.biolab.si/tag/image-analytics/
- https://github . com/ajdapretnar/datasets/blob/master/images/家养动物. zip
数据科学变得简单:使用 Orange 的交互式数据可视化
一个开源的机器学习和数据可视化工具,可以加速你的数据分析,而无需编写任何代码!
Image taken from the official Orange website
今天的主题是关于使用开源软件 Orange 执行简单的数据可视化。如果您正在寻找一种不用代码就能可视化数据集的替代方案,Orange 是您的正确选择!官方的 Github 页面声明
“Orange 是一款基于组件的数据挖掘软件。它包括一系列数据可视化、探索、预处理和建模技术。它可以通过一个漂亮而直观的用户界面来使用,或者对于更高级的用户来说,可以作为 Python 编程语言的一个模块来使用。”
换句话说,在处理数据科学任务时,Orange 既适合新手,也适合专家。本教程有 3 个部分:
- 设置和安装
- 小工具
- 结论
[第 1 节]设置和安装
首先,安装 Orange 的方法有很多。最常见的方式是通过独立的安装程序,Anaconda 或 Pip。让我们逐一看看。
独立安装程序(Windows、macOS)
转到下面的链接,选择所需的操作系统。
Image by Author
点击“下载橙色按钮开始下载。完成后,双击安装程序进行安装。
Linux/Source
没有为 Linux/Source 提供安装程序。你必须从 GitHub 中克隆官方库或者下载源代码 tarball 。之后,你就可以按照 README.md 中的说明去做了。完成后,您可以通过以下命令开始运行 Orange Canvas:
python -m Orange.canvas
蟒蛇
如果您已经有了 Anaconda,那么您可以通过下面的命令将 conda-forge 添加到您的频道中:
conda config --add channels conda-forge
然后,运行以下命令安装 orange:
conda install orange3
GUI 需要一些 conda-forge 没有包含或提供的依赖项。让我们通过在终端中键入并运行以下命令来添加它们:
conda install -c defaults pyqt=5 qt
还可以安装其他附加组件:
conda install orange3-<addon name>
或者,您可以在选项菜单中找到附加管理器。
点
如果您决定使用 Python 包索引,您可能需要您的发行版提供的附加系统包。在安装 Orange 之前,您可能需要创建自己的虚拟环境。完成所有设置后,运行以下命令:
pip install orange3
同样,您需要包括 GUI 的附加依赖项:
pip install PyQt5 PyQtWebEngine
让我们进入下一部分,了解更多关于 Orange 的信息。
[第 2 部分]部件
打开 Orange,您应该能够看到以下用户界面:
Main user interface of Orange. Image by Author
你可以注意到工具箱在你的左边,白色的工作区是画布。工具箱包含所有可以移动到画布上的小部件。
Example of widgets. Image by Author
有 3 种方法可以将 widget 添加到画布:
- 双击小部件。
- 将 widget 拖到画布上。
- 右键单击小部件菜单的画布。
Widget menu. Image by Author
文件和数据表
如果两个部件兼容,您可以将它们连接在一起。让我们来试试:
Gif by Author
- 将文件小部件拖到画布上。
- 将数据表小部件拖到画布上。
- 在文件控件的右侧,有一个半圆形。将鼠标放在它上面,并将其拖动到数据表小部件。
- 请注意,两个小部件之间有一个链接,顶部有单词 Data 。
- 不要担心文件小部件顶部的错误标记,因为我们还没有加载数据。
在画布中,双击文件小部件将其打开。然后,您可以加载自己的数据集或从自定义文档数据集中浏览它。让我们通过自定义文档数据集用 iris.tab 来尝试一下。Orange 接受以下任何格式:
- 制表符分隔的值
- 逗号分隔值
- 篮子文件
- Microsoft Excel 电子表格
- 腌橙数据
您应该能够看到下面的屏幕。
Image by Author
完成后,使用右上角的 X 标记关闭弹出窗口。如果您注意到应用按钮呈灰色,请不要惊慌。这意味着在您修改或编辑了数据的类型或角色后应用更改。接下来,双击数据表小部件。您应该能够看到数据集。你可以检查左边的变量来直观显示数字。检查完所有选项后,您应该能够看到以下屏幕。
Image by Author
分配
您可以通过一些可视化小部件轻松地可视化数据。分布是识别数据集重要要素的最佳微件之一。您可以很容易地看到数据集是否被很好地分离。让我们从上一步继续。
Gif by Author
- 将一个分发小部件拖到画布上。
- 将文件小部件连接到分发小部件。
- 双击分发小部件查看可视化效果。
- 在左上角,选择不同的变量并检查分布结果。
Image by Author
散点图
散点图是另一个可视化微件,它将两个要素绘制在一起,以确定它们之间的投影。让我们来测试一下!
Gif by Author
- 将散点图小部件拖到画布中。
- 将文件小部件连接到散点图小部件。这一步类似于发行版小部件。
- 双击散点图小部件查看可视化效果。
- 您可以根据可用的功能更改 x 轴和 y 轴。
Image by Author
如果您不确定要选择哪些功能,请单击“查找信息性投影”,您将看到以下界面。
Image by Author
点击“开始”并从列表中选择任何项目。散点图将根据您的选择进行修改。
Image by Author
FreeViz
FreeViz widget 使用了从粒子物理学借来的范例。虽然点不能移动,但是锚点是可以移动的。这使我们能够看到相互吸引的特征和相互排斥的特征。它带有一个优化按钮,可以执行爬山优化,使其达到平衡。在您继续之前,让我们清除一些小部件以保持整洁。有两种方法可以删除小组件:
- 右击它,一个菜单就会出现。选择移除选项。您也可以通过这种方式或 F2 快捷键来重命名小部件。
- 左键选中它,点击键盘上的删除按钮。可以多选小部件并一起删除它们。
Gif by Author
完成后,请按照下面的说明继续操作:
Gif by Author
- 将一个 FreeViz 小部件放到画布上。
- 将文件小部件连接到 FreeViz 小部件。
- 将一个数据表小部件放到画布上。
- 将 FreeViz 微件连接到数据表微件。
如果你想知道为什么我们将数据表小部件与 FreeViz 小部件连接,而不是文件小部件。原因是您可以在可视化微件界面中选择数据点,选择的点将输出到数据表微件中。让我们看看下面的 gif,了解更多关于如何为 FreeViz 接口移动锚点和选择数据点的信息。
Gif by Author
或者,您可以继续按优化按钮,直到它达到平衡。您可以使用这个小部件来了解更多关于功能之间关系的信息。让我们看一下官方文档中的以下示例。
Image by Author
只要看一眼,我们就能发现:
- 产卵的生物更容易长羽毛。
- 水生生物更有可能有鳍。
- 产奶的生物更容易有毛。
- 产卵的生物不产奶
FreeViz 是一个非常强大的小工具,可以帮助你从数据集中提取重要的信息。有更多的微件可用于可视化数据集。请随意尝试。
[第三节]结论
让我们回顾一下今天所学的内容。我们首先学习了在我们的计算机中设置和安装 orange 的三种方法。然后,我们探讨了 Orange 中的用户界面和小部件的概念。此外,我们还测试了三种向画布添加小部件的方法。如果兼容,这些小部件可以相互连接。例如,文件小部件可以连接到数据表小部件。最重要的部分是可视化我们已经加载的数据集。我们使用定制的 Iris 数据集尝试了分布、散点图和 FreeViz 小部件。感谢阅读数据科学变得简单教程的第 1 部分。在下一部分中,我将介绍使用 Orange 的数据处理。❤️
数据科学变得简单
参考
数据科学变得简单:使用 Orange 进行测试和评估
测试和评估模型的最简单的方法之一,无需接触任何代码!
Image taken from the official Orange website
欢迎回到数据科学简易系列的第三部分。本教程将涵盖使用开源机器学习软件 Orange 测试和评估不同类型模型所需的基本步骤。在我们开始之前,请确保您已经安装了 Orange。请阅读第一部分进行设置和安装,如果您错过了,底部会有链接供您浏览整个 Data Science Made Easy 系列。我将从评估过程的一些基本解释开始。请注意,类型模型和预测将只在下一篇文章中讨论。本文主要关注测试和评估模型的步骤。
测试和评分
Test & Score 小部件可用于在数据集上测试您想要的学习算法。您应该使用此微件来确定所选的的性能,从而大致了解数据集的质量以及要使用的模型。这一步至关重要,因为从长远来看,这将为你节省大量时间。我不建议你直接跳到数据建模和预测,除非你知道你在做什么。我们来试试吧!
Image by Author
- 向画布添加一个文件小部件,并加载来自浏览定制文档的虹膜数据。
- 向画布添加一个测试&分数小部件,并将文件小部件连接到它。
- 转到建模选项卡,选择几个您喜欢的模型,并将其添加到画布中。将每个模型连接到测试&评分小部件。您可以连接任意多个模型。
- 双击测试&分数控件打开界面。
Image by Author
可以看到上图所示的各个型号的评测结果。请注意,分类任务和回归任务会有不同的结果。
对于分类任务,您应该得到以下结果:
- **ROC 下面积:**为受试者操作曲线下面积。
- **分类:**准确率是正确分类的例子的比例。
- F-1: 是精度和召回率的加权调和平均值(见下文)。
- 精度:分类为阳性的实例中真阳性的比例,例如北美鸢尾被正确识别为北美鸢尾的比例。
- **回忆:**是数据中所有阳性实例中真阳性的比例,例如所有诊断为患病的人中患病的人数。
如果您对回归任务执行了测试,结果将包括以下内容:
- MSE: 测量误差或偏差的平方平均值(估计值和被估计值之间的差值)。
- RMSE: 是一组数的平方的算术平均值的平方根(估计量对数据拟合的不完美性的度量)
- MAE: 用于衡量预测或预言与最终结果的接近程度。
- R2: 解释为可从自变量预测的因变量中方差的比例。
您可以修改左边的设置,如折叠的数量,以获得更平衡的结果。
混淆矩阵
有时候 Test & Score widget 提供的评测结果对我们来说根本不够好。例如,您将无法知道哪个类具有最佳预测。在这种情况下,我们将依赖另一个名为混淆矩阵的小部件。让我们试一试。
Image by Author
- 只需在画布上添加一个混淆矩阵小部件。
- 将测试&分数控件连接到混淆矩阵控件。
- 双击混淆矩阵控件打开界面。
Image by Author
对于那些不熟悉混淆矩阵的人来说,它给出了预测类和实际类之间的实例比例。在这种情况下,您将知道如上图所示,所有 Iris-setosa 都已被正确预测。这些信息对我们来说更有意义。
ROC 分析
除了混淆矩阵,您还可以根据需要尝试其他种类的小部件来显示重要信息。只需将小部件添加到画布上,并将测试&分数小部件连接到画布上。下图显示了连接到所有其他小部件的正确方式。
Image by Author
ROC 分析 widget 绘制了测试的真阳性率和假阳性率。双击 ROC 分析小部件,您应该能够看到以下内容。
Image by Author
x 轴代表假阳性率,而 Y 轴代表真阳性率。换句话说,一个准确的分类器将会把大部分的点放在左上角,就像我们在上面的图中看到的那样。
校准图
与 ROC 分析小部件不同的是,校准图小部件根据分类器预测的概率绘制分类概率。请注意,在撰写本文时,校准图小部件仅与测试&分数小部件兼容。因此,它只能与测试&分数小工具一起使用。
Image by Author
此微件提供了图中类别概率的预测精度。根据官方文件,在图的底部,左边的点是那些被(正确地)分配了低概率目标类的点,而右边的点被错误地分配了高概率。在图的顶部,右边的实例被正确地分配了高概率,反之亦然。这个小部件可以确定一个分类器是过于乐观(主要给出正面结果)还是悲观(主要给出负面结果)。如果你理解起来有困难,一个精确的分类器将会有一个 s 形曲线的形状,就像我们上面的那个一样。
升力曲线
Lift Curve widgets 测量所选分类器相对于随机分类器的性能。提升曲线常用于人口细分。x 轴代表总体(P-比率),而 Y 轴代表真阳性(TP-比率)。请注意,在撰写本文时,升力曲线小部件仅与测试&分数小部件兼容。因此,它只能与测试&分数控件一起使用。
Image by Author
检查“显示提升凸包”以显示每个所需 TP/P 速率的最佳分类器。根据官方文档,完美的分类器应该有一个朝向 1 的陡坡,直到所有的类都猜对了,然后沿着 y 轴上的 1 直线运行到(1,1)。下图是这种分类器的一个很好的例子。
Image by Author
结论
让我们复习一下今天所学的内容。我们从学习测试&分数小部件的功能开始。它可用于粗略评估模型的性能。您可以简单地将其与其他类型的模型连接,并检查结果。根据任务是分类还是回归,输出结果是不同的。为了获得更多的信息,我们必须依赖一些其他的小部件。其中之一就是混淆矩阵小部件。它为我们提供了预测类和实际类之间的实例比例。此外,还有一些小工具,如 ROC 分析、校准图和升力曲线,可用于从结果中获得更多信息。感谢阅读数据科学变得简单教程的第 3 部分。在下一部分中,我将介绍使用 Orange 进行数据建模。❤️
数据科学变得简单
参考
数据科学方法论 101
一个数据科学家如何组织他的工作?
每个数据科学家都需要一种方法来解决数据科学的问题。例如,假设你是一名数据科学家,你的第一份工作是增加一家公司的销售额,他们想知道他们应该在什么时间段销售什么产品。你需要正确的方法来组织你的工作,分析不同类型的数据,并解决他们的问题。你的客户不关心你如何工作;他们只关心你是否能及时完成。
什么是数据科学中的方法论?
数据科学中的方法论是组织你的工作的最佳方式,可以做得更好,并且不浪费时间。数据科学方法由 10 个部分组成:
Source: https://www.ibmbigdatahub.com/blog/why-we-need-methodology-data-science
在本文中,有五个部分,每个部分包含更多的步骤:
- 从问题到方法
- 从需求到收集
- 从理解到准备
- 从建模到评估
- 从部署到反馈
如果我们看最后一张图中的图表,我们会看到它是高度迭代的,永远不会结束;这是因为在真实的案例研究中,我们必须重复一些步骤来改进模型。
从问题到方法
每个客户的请求都始于一个问题,数据科学家的工作首先是理解它,并用统计和机器学习技术来解决这个问题。
- 业务 了解阶段至关重要,因为它有助于明确客户的目标。在这个阶段,我们必须就问题的每一个方面向客户提出许多问题;通过这种方式,我们确信我们将研究相关的数据,并且在这一阶段结束时,我们将有一个业务需求的列表。
- 下一步是分析方法,在这里,一旦清楚地陈述了业务问题,数据科学家就可以定义解决问题的分析方法。这一步需要在统计和机器学习技术的背景下表达问题,这是必不可少的,因为它有助于确定需要什么类型的模式来最有效地解决问题。如果问题是确定某事的概率,那么可以使用预测模型;如果问题是显示关系,可能需要一个描述性的方法,如果我们的问题需要计数,那么统计分析是解决它的最好方法。对于每种方法,我们可以使用不同的算法。
Source: https://www.displayr.com/what-is-a-decision-tree/
从需求到收集
一旦我们找到了解决问题的方法,我们将需要为我们的模型发现正确的数据。
- 数据要求是我们为初始数据收集确定必要的数据内容、格式和来源的阶段,我们在所选方法的算法中使用这些数据。
- 在数据收集阶段,数据科学家确定与问题领域相关的可用数据资源。为了检索数据,我们可以在相关网站上进行网络搜集,或者使用带有现成数据集的存储库。通常,预制数据集是 CSV 文件或 Excel 无论如何,如果我们想从任何网站或存储库中收集数据,我们应该使用 Pandas,这是一个下载、转换和修改数据集的有用工具。这里有一个熊猫数据收集阶段的例子。
import pandas as pd # download library to read data into dataframepd.set_option('display.max_column', None)
dataframe = pd.read_csv("csv_file_url")
print("Data read into dataframe!")dataframe.head() # show the first few rows
dataframe.shape # get the dimensions of the dataframe
从理解到准备
现在数据收集阶段已经完成,数据科学家使用描述性统计和可视化技术来更好地理解数据。数据科学家探索数据集以了解其内容,确定是否需要额外的数据来填补任何空白,以及验证数据的质量。
- 在数据理解阶段,数据科学家试图更多地理解之前收集的数据。我们必须检查每个数据的类型,并了解更多关于属性及其名称的信息。
# get all columns from a dataframe and put them into a list
attributes = list(dataframe.columns.values)# then we check if a column exist and what is its name.
print([match.group(0) for attributes in attributes for match in [(re.compile(".*(column_name_keyword).*")).search(attributes)] if match])
- 在数据准备阶段,数据科学家为建模准备数据,这是最关键的步骤之一,因为模型必须清晰无误。在这一阶段,我们必须确保数据的格式对于我们在分析方法阶段选择的机器学习算法是正确的。数据帧必须有适当的列名、统一的布尔值(是、否或 1,0)。我们必须注意每个数据的名称,因为有时它们可能用不同的字符书写,但它们是同一件事;例如(water,WaTeR),我们可以将一列中的所有值都变成小写。另一个改进是从数据帧中删除数据异常,因为它们是不相关的。
# replacing all 'yes' values with '1' and 'no' with '0'
dataframe = dataframe.replace(to_replace="Yes", value=1)
dataframe = dataframe.replace(to_replace="No", value=0)# making all the value of a column lowercase
dataframe["column"] = dataframe["column"].str.lower()
从建模到评估
一旦为选择的机器学习算法准备好数据,我们就准备好建模了。
- 在建模阶段,数据科学家有机会了解他的工作是否准备就绪,或者是否需要评审。建模侧重于开发描述性或预测性的模型,这些模型基于统计或通过机器学习采取的分析方法。描述性建模是一个数学过程,描述现实世界的事件以及造成这些事件的因素之间的关系,例如,描述性模型可能会检查这样的事情:如果一个人这样做,那么他们可能会更喜欢那样。预测建模是使用数据挖掘和概率来预测结果的过程;例如,可以使用预测模型来确定电子邮件是否是垃圾邮件。对于预测建模,数据科学家使用一个训练集,这是一组结果已知的历史数据。这个步骤可以重复更多次,直到模型理解了问题和答案。
- 在模型评估阶段,数据科学家可以用两种方式评估模型:坚持和交叉验证。在 Hold-Out 方法中,数据集被分为三个子集:一个训练集如我们在建模阶段所说;一个验证集,它是一个子集,用于评估在训练阶段建立的模型的性能;测试集是一个子集,用于评估模型未来可能的性能。
下面是一个建模和评估的例子:
# select dataset and training field
data = pd.read_csv("student-mat.csv", sep=";")
data = data[["G1", "G2", "G3", "studytime", "failures", "absences"]]
predict = "G3" # select field to predictx = np.array(data.drop([predict], 1))
y = np.array(data[predict])# split the dataset into training and test subsets
x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x, y, test_size = 0.1)linear = linear_model.LinearRegression() # create linear regression modellinear.fit(x_train, y_train) # perform the training of the model
acc = linear.score(x_test, y_test) # calculate the accuracy
print("Accuracy: ", acc) # print the accuracy of the model
从部署到反馈
数据科学家必须让利益相关者熟悉在不同场景中产生的工具,因此一旦模型被评估并且数据科学家确信它将工作,它就被部署并进行最终测试。
- 部署阶段取决于模型的目的,它可能会向有限的一组用户或在测试环境中推广。一个真实的案例研究例子可以是为医疗保健系统设计的模型;该模型可用于一些低风险患者,之后也可用于高风险患者。
- 顾客通常会充分利用反馈阶段。部署阶段后的客户可以说模型是否符合他们的目的。数据科学家接受这些反馈,并决定他们是否应该改进模型;这是因为从建模到反馈的过程是高度迭代的。
当模型满足客户的所有要求时,我们的数据科学项目就完成了。
要了解更多,你可以访问我的 GitHub 库,在那里你可以找到一个真实的用例例子等等。
来源: IBM 数据科学方法论,来自 Coursera
书籍来源:预测未来范例的模型:第 1 卷
农齐奥·洛加洛
关于可混搭文章的在线新闻流行度的数据科学小型项目
我们有一个由 mashable 发布的文章数据集,我们希望预测给定文章的受欢迎程度。这是一个分类问题。一些特征属于各种类别,例如关于文章的定量信息——例如图像数量、视频数量等。—以及关于文章的定性信息—例如文章是哪一天发表的以及文章属于哪个主题。
将图像数量与份额数量进行比较,我们会得到以下条形图:
正如你所看到的,只有一张图片的文章总体上做得更好。然后,没有图像的文章是次优的;有两张图片的文章排在第三位。拥有 2 张以上图片的文章的分享数量可以忽略不计。有鉴于此,在一篇文章中包含 0 或 1 张图片将是明智的。
将视频数量与分享数量进行比较,我们得到了下图:
注意,没有视频的文章往往做得最好,有 1 个视频的文章做得第二好,有 2 个视频的文章做得第三好。拥有 2 个以上视频的文章相比之下可以忽略不计。
我们还可以看到一周中哪一天的份额最高。这是一周中各天的条形图:
如你所见,工作日的份额最高。周三、周一、周二和周四的股票数量最高,周五的股票数量大幅下降。
我们还可以看到哪个类别或主题做得最好。这是一个饼状图,分为科技、娱乐、世界、商业、社交媒体和生活方式六个类别:
表现最好的类别是科技,其次是娱乐、世界和商业。最不受欢迎的类别是社交媒体和生活方式。
使用 Tableau,我们可以创建上述可视化效果,并进行一些基本的数据挖掘。我们得到的见解可以告诉我们一篇文章中要包含多少图片和视频,在哪天发表这篇文章,以及这篇文章应该属于哪个类别。
接下来,使用 Python,我对数据集应用了一些机器学习。先公式化一个分类问题,我用 1400 股的门槛创建了两个类:如果分享数大于 1400,那么文章被分类为热门;如果分享数量小于或等于 1400,则该文章被分类为不受欢迎。
为了准备 csv 文件,我使用 IF 函数在 shares 列之后创建了一个新列——popularity 列;如果份额数大于 1400,则该类别为 4(受欢迎),否则该类别为 2(不受欢迎)。
我们的目标是创建一个机器学习模型,将文章分类为流行或不受欢迎。为此,我使用了梯度推进分类器。
首先,我将数据集分为训练集和测试集——将数据集的 80%作为训练集,20%作为测试集。
我们将梯度提升分类器与我们的训练集相匹配。然后,我们将拟合的梯度推进分类器应用于我们的测试集。
根据通过比较预测类和测试类得到的混淆矩阵,我们的模型从 7929 个测试分类中得到 5277 个正确的分类。这给出了 67%的准确度。
以下是 python 代码:
#Classification for Online News Popularity#Importing the Librariesimport pandas as pd#Importing the datasetdataset = pd.read_csv('OnlineNewsPopularity(classification with nominal).csv')X = dataset.iloc[:,2:-2].valuesY = dataset.iloc[:, -1].values#Splitting the dataset into the Training set and Test setfrom sklearn.model_selection import train_test_splitX_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 0)#Fitting Gradient Boosting to Training setfrom sklearn.ensemble import GradientBoostingClassifierclassifier = GradientBoostingClassifier()classifier.fit(X_train, Y_train)#Predicting the Test set resultsY_pred = classifier.predict(X_test)#Making the Confusion Matrixfrom sklearn.metrics import confusion_matrixcm = confusion_matrix(Y_test, Y_pred)
数据集可以在这里找到:http://archive . ics . UCI . edu/ml/datasets/Online+News+population
K.费尔南德斯 p .维纳格雷和 p .科尔特斯。预测在线新闻流行度的主动智能决策支持系统。第 17 届 EPIA 2015-葡萄牙人工智能会议记录,9 月,葡萄牙科英布拉。
数据科学最低要求:开始从事数据科学时你需要知道的 10 项基本技能
数据科学是一个广阔的领域,包括几个细分领域,如数据准备和探索;数据表示和转换;数据可视化和显示;预测分析;机器学习等。对于初学者来说,提出以下问题是很自然的:我需要什么技能才能成为一名数据科学家?
本文将讨论实践数据科学家必备的 10 项基本技能。这些技能可以分为两类,即技术技能(数学&统计、编码技能、数据争论&预处理技能、数据可视化技能、机器学习技能和真实世界项目技能)和软技能(沟通技能、终身学习技能、团队合作技能和道德技能)。
数据科学是一个不断发展的领域,但是掌握数据科学的基础将为您提供必要的背景,您需要这些背景来追求高级概念,如深度学习、人工智能等。本文将讨论实践数据科学家的 10 项基本技能。
开始从事数据科学时需要知道的 10 项基本技能
1.数学和统计技能
(一)统计和概率
统计和概率用于特征的可视化、数据预处理、特征转换、数据插补、降维、特征工程、模型评估等。以下是您需要熟悉的主题:
a)平均值
b)中间值
c)模式
d)标准偏差/方差
e)相关系数和协方差矩阵
f)概率分布(二项式、泊松、正态)
g) p 值
h) MSE(均方差)
i) R2 分数
j) Baye 定理(精确度、召回率、阳性预测值、阴性预测值、混淆矩阵、ROC 曲线)
k) A/B 测试
l)蒙特卡罗模拟
㈡多变量微积分
大多数机器学习模型是用具有几个特征或预测器的数据集构建的。因此,熟悉多变量微积分对于建立机器学习模型极其重要。以下是您需要熟悉的主题:
a)几个变量的函数
b)导数和梯度
c)阶跃函数、Sigmoid 函数、Logit 函数、ReLU(校正线性单位)函数
d)成本函数
e)绘制功能图
f)函数的最小值和最大值
㈢线性代数
线性代数是机器学习中最重要的数学技能。数据集被表示为矩阵。线性代数用于数据预处理、数据转换和模型评估。以下是您需要熟悉的主题:
a)矢量
b)矩阵
c)矩阵的转置
d)矩阵的逆矩阵
e)矩阵的行列式
f)点积
g)特征值
h)特征向量
㈣优化方法
大多数机器学习算法通过最小化目标函数来执行预测建模,从而学习为了获得预测标签而必须应用于测试数据的权重。以下是您需要熟悉的主题:
a)成本函数/目标函数
b)可能性函数
c)误差函数
d)梯度下降算法及其变体(例如随机梯度下降算法)
在这里了解更多关于梯度下降算法的信息: 机器学习:梯度下降算法如何工作 。
2.基本编程技能
编程技能在数据科学中至关重要。因为 Python 和 R 被认为是数据科学中最流行的两种编程语言,所以掌握这两种语言的基本知识至关重要。一些组织可能只需要 R 或 Python 中的一种技能,而不是两者都需要。
(一)Python 中的技能
熟悉 python 的基本编程技能。以下是您应该掌握如何使用的最重要的软件包:
a)数字
b)熊猫
c) Matplotlib
d) Seaborn
e) Scikit-learn
PyTorch
㈡研发技能
a)潮汐
b) Dplyr
c) Ggplot2
d)插入符号
e)字符串
㈢其他编程语言技能
一些组织或行业可能需要以下编程语言技能:
a) Excel
b)画面
c) Hadoop
d) SQL
e)火花
3.数据争论和预处理技巧
数据是数据科学中任何分析的关键,无论是推理分析、预测分析还是规定分析。模型的预测能力取决于构建模型时所用数据的质量。数据以不同的形式出现,如文本、表格、图像、声音或视频。最常见的情况是,用于分析的数据必须经过挖掘、处理和转换,才能呈现为适合进一步分析的形式。
i) 数据争论:数据争论的过程对于任何数据科学家来说都是至关重要的一步。在数据科学项目中,很少能够轻松访问数据进行分析。数据更有可能在文件、数据库中,或者从网页、tweets 或 pdf 等文档中提取。知道如何争论和清理数据将使您能够从数据中获得关键的洞察力,否则这些洞察力将被隐藏。
ii) 数据预处理:关于数据预处理的知识非常重要,包括以下主题:
a)处理缺失数据
b)数据插补
c)处理分类数据
d)为分类问题编码类别标签
e)特征变换和降维技术,例如主成分分析(PCA)和线性判别分析(LDA)。
4.数据可视化技能
理解良好的数据可视化的基本组件。
a) 数据成分:决定如何可视化数据的第一个重要步骤是了解数据的类型,例如分类数据、离散数据、连续数据、时间序列数据等。
b) **几何组件:**在这里您可以决定哪种可视化适合您的数据,例如散点图、线形图、条形图、直方图、QQ 图、平滑密度、箱线图、对线图、热图等。
c) **映射组件:**这里你需要决定用什么变量作为你的 x 变量,用什么变量作为你的 y 变量。这一点非常重要,尤其是当数据集是包含多个要素的多维数据集时。
d) **秤组件:**在这里您可以决定使用哪种秤,例如线性秤、对数秤等。
e) **标签组件:**这包括轴标签、标题、图例、使用的字体大小等。
f) 伦理成分:在这里,你要确保你的可视化讲述真实的故事。在清理、总结、操作和制作数据可视化时,你需要意识到你的行为,并确保你没有利用你的可视化来误导或操纵你的观众。
5.基本的机器学习技能
机器学习是数据科学的一个非常重要的分支。理解机器学习框架很重要:问题框架;数据分析;建模、测试&Evaluation;和模型应用。从这里了解更多机器学习框架: 机器学习流程 。
以下是需要熟悉的重要机器学习算法。
I)监督学习(连续变量预测)
a)基本回归
b)多元回归分析
c)正则化回归
ii)监督学习(离散变量预测)
a)逻辑回归分类器
b)支持向量机分类器
c)K-最近邻(KNN)分类器
d)决策树分类器
e)随机森林分类器
iii)无监督学习
a)k 均值聚类算法
6.来自真实世界顶点数据科学项目的技能
仅仅从课程工作中获得的技能不会让你成为数据科学家。合格的数据科学家必须能够证明成功完成了真实世界的数据科学项目,该项目包括数据科学和机器学习过程中的每个阶段,如问题框架、数据采集和分析、模型构建、模型测试、模型评估和部署模型。现实世界的数据科学项目可以在以下项目中找到:
a) Kaggle 项目
b)实习
c)来自访谈
7.通讯技能
数据科学家需要能够与团队的其他成员或组织中的业务管理员交流他们的想法。良好的沟通技巧将在这里发挥关键作用,能够向很少或根本不了解数据科学技术概念的人传达和展示非常技术性的信息。良好的沟通技巧将有助于培养与其他团队成员(如数据分析师、数据工程师、现场工程师等)团结一致的氛围。
8.做一个终身学习者
数据科学是一个不断发展的领域,所以要做好接受和学习新技术的准备。与该领域的发展保持联系的一种方式是与其他数据科学家建立联系。一些促进网络化的平台有 LinkedIn、github 和 medium ( 向数据科学 和 向 AI 出版物)。这些平台对于获取该领域最新发展的最新信息非常有用。
9.团队合作技能
作为一名数据科学家,你将在一个由数据分析师、工程师和管理员组成的团队中工作,因此你需要良好的沟通技巧。您还需要成为一名优秀的倾听者,尤其是在早期项目开发阶段,您需要依靠工程师或其他人员来设计和构建一个优秀的数据科学项目。成为一名优秀的团队成员有助于你在商业环境中茁壮成长,并与团队中的其他成员以及组织的管理人员或主管保持良好的关系。
10.数据科学中的伦理技能
理解你的项目的含义。对自己诚实。避免操纵数据或使用有意造成结果偏差的方法。从数据收集到分析,再到模型构建、分析、测试和应用的所有阶段都要符合道德规范。避免为了误导或操纵你的观众而捏造结果。在解释你的数据科学项目的发现时要合乎道德。
总之,我们已经讨论了实践数据科学家所需的 10 项基本技能。数据科学是一个不断发展的领域,但是掌握数据科学的基础将为您提供必要的背景,您需要这些背景来追求高级概念,如深度学习、人工智能等。
数据科学 MOOC 验证证书—值得吗?
大部分辅助开放在线课程都是免费的在线课程,任何人都可以注册。MOOCs 提供了一种负担得起、灵活的方式来学习新技能,推进你的职业发展,并提供大规模的优质教育体验。MOOCs 涵盖了领导力、分析、数据科学、机器学习、专业技能、工程、商业管理、人文科学、计算机科学等广泛的在线课程。这些课程通常由世界各地的顶尖大学提供,如麻省理工学院、哈佛大学、加州大学伯克利分校、密西根大学、EPFL 大学、香港理工大学、昆士兰大学等等。一些课程也由大公司提供,如 IBM、google 和微软。MOOCs 最大的优势是有机会向领导和专家学习,有特权选修世界顶尖大学的课程。最受欢迎的 MOOCs 提供商包括:
a)EDX:https://www.edx.org/T5
b)Coursera:https://www.coursera.org/
c) 数据营:https://www.datacamp.com/
丁)乌代米:https://www.udemy.com/
e) 乌达城:https://www.udacity.com/
这些 MOOCs 提供商中,有些会让你免费旁听他们的课程,而有些则要求你获得认证证书(每门课程可能要花费 50 至 100 美元,甚至更多)。因此,自然的问题是:我应该为 MOOC 申请认证证书吗?
在回答这个问题之前,我先在这里提一下,我的大部分数据科学知识都是从 MOOCs 获得的。以下是我列出的 3 个最佳数据科学 MOOC 专业:
1。数据科学专业证书(哈佛,通过 edX)
包括以下课程,全部使用 R 教授(您可以免费旁听课程或购买认证证书):
- 数据科学:R 基础;
- 数据科学:可视化;
- 数据科学:概率;
- 数据科学:推理和建模;
- 数据科学:生产力工具;
- 数据科学:扯皮;
- 数据科学:线性回归;
- 数据科学:机器学习;
- 数据科学:顶点
2。分析:基本工具和方法(Georgia TechX,通过 edX)
包括以下课程,全部使用 R、Python 和 SQL 讲授(您可以免费审计或购买经过验证的证书):
- 分析建模导论;
- 数据分析计算导论:
- 商业数据分析。
3。应用数据科学与 Python 专业化(密执安大学,通过 Coursera)
包括以下课程,全部使用 python 教授(您可以免费旁听大多数课程,有些课程需要购买认证证书):
- Python 中的数据科学导论;
- 应用 Python 绘图、制图和数据表示;
- Python 中的应用机器学习;
- Python 中文本挖掘的应用:
- Python 中的应用社会网络分析。
为一个 MOOC 支付一个验证过的证书值得吗?
让我提供我的看法。
追求认证证书可以激励你保持专注。大多数情况下,审计学习者不会完成整个课程,也不会认真对待家庭作业。我认为你花钱买的东西是有价值的。然而,如果旁听课程可以让你接触到包括家庭作业在内的所有课程材料,并且如果你有足够的动力去完成这些作业,那么我认为旁听课程是更好的选择。在一些学科,如数据科学和其他一些专业领域,学习只能通过实践来实现,例如,你不能仅仅通过听讲座来学习编程。你必须参加家庭作业和讨论论坛,这些将帮助你发展实践技能。
如果你是某个领域的新手,你需要一些东西来展示你的知识,那么追求一个经过验证的课程可能是好的。如果你已经有了坚实的背景,而你只是对增长知识或推进职业生涯感兴趣,那么你真的不需要追求一个经过验证的证书。例如,在计算机科学、软件工程、数据科学和分析等领域,人们更关注的是你能做什么,而不是你有什么证书。因此,如果你已经有一些定量学科的背景,如物理、数学、统计和计算机科学,那么你可以旁听数据科学和分析课程,以便探索和学习该领域。展示你的工作还有其他重要的方式,比如你可以在 LinkedIn、Github、Medium 和 Kaggle 等其他平台上展示你的项目和成就。
有太多好的数据科学课程了。对于像我这样终身学习的人来说,有很多选择。如果你每次参加 MOOC 课程都想获得认证证书,你可能会花很多钱。大约 3 年前,当我开始参加数据科学 MOOCs 时,我对追求认证证书感到兴奋。今天,我更关心我能用知识做什么,而不是到处积累经过验证的证书。我总是搜索我可以旁听的课程,但这也让我可以完成家庭作业。因此,在课程结束时,我与追求认证证书的人没有任何不同,唯一的区别是一张名为认证证书的纸,每门课程的费用从 50 美元到 100 美元不等。
总之,MOOCs 为学习新技能、拓展知识和职业发展提供了独一无二的机会。在某些情况下,追求认证证书作为展示你技能的一种方式可能是值得的,但在大多数情况下,审计学习者可以获得同样的技能和经验。始终搜索你可以免费完成的课程,只有在特殊情况下,你才应该学习经过认证的课程。
有效内容策略的数据科学和 NLP
利用流程优化、分析和 NLP 的力量来设计数据科学知识门户的内容策略
背景
过去几年,对数据科学和人工智能技能的需求呈指数级增长。然而,熟练数据科学家的供应并没有以同样的速度增长,从而导致需求和供应之间的巨大差距。
除了针对数据科学各个学科的结构化培训之外,由数据科学知识门户推动的全方位知识共享和增强将在很大程度上帮助弥补数据科学家的供需缺口。
知识门户的成功和有效性取决于能够在尽可能短的时间内以最佳内容质量交付的内容范围。这又取决于确定合适的内容贡献者和自动化整个内容监管过程。
内容战略的总体方法
设计内容策略的总体方法基于利用流程优化、分析和 NLP 的力量,通过以下方式确保内容和贡献者的质量:
Overarching approach to content strategy
内容战略的组成部分
以下是内容战略的组成部分:
Building blocks of content strategy
使用建议的内容类型构建内容矩阵
该门户将有各种内容类型的均匀组合,并将开发一个多维内容矩阵。达到内容类型的标准将对应于多维内容矩阵的每个维度。提议的标准是:
Content matrix and content types
内容层次&内容链中的观众流
内容层次结构是为了使观众从需要相对较少注意力的最简单的内容形式到需要更多注意力和兴趣的最复杂的内容类型无缝流动。
Content hierarchy
- 内容层次的第一层将包括内容片段,如分析中概念的每日剂量、conecpts 上的 youtube 短视频等,这些内容片段需要读者很少的阅读时间。这将有助于吸引门户网站的初始受众,并可以引导读者选择需要更长阅读时间和更长注意力的更密集的内容类型。
- 层次结构中的下一层是博客,它可以基于第一层,可以是上面提出的任何标准——针对各种层次的受众,基于各种数据科学和 ML 的概念。这些内容将被认为比第一级内容更受关注,并且通常来自第一级内容类型之一。
- 然后,可以将关于特定主题的选定博客集合合并到一本电子书中——为该集合选择文章的标准可以是关于类似主题的博客,也可以是已经被读者接受且具有高阅读率和收视率的博客。
- 下一级或最高级别的内容类型可以是关于数据科学广泛领域的广泛参考著作,其中包含关于该领域的大量文章、播客和行业发展,可以重新用作该领域的培训内容。
这样,内容层次将创建一个观众链,一个层次将读者引向下一个层次,以此类推,从而创建一个无缝的观众漏斗。
基于内容层次结构的内容链
内容链的灵感来自于生态系统中的食物链,它显示了从一个层次的内容到另一个层次的理想流量。
The content chain
内容链上的建议流量
创建内容层次结构背后的深谋远虑是从需要最少关注范围的内容开始,逐步构建需要更高关注范围的更复杂内容类型的轨迹。
下面的流程图用代表内容层次结构级别的颜色说明了跨几个级别的内容类型的建议流量。
Flow of traffic across the content chain
设置内容指标
设计内容指标的目的是从内容质量和受众偏好两方面评估内容的有效性。这将为编辑团队提供一种方向感,指导他们如何选择内容和投稿人。
- 重复查看次数与查看次数 —这表明有多少用户不止一次阅读过该内容,这意味着该内容片段被频繁引用,此处较高的比率可能意味着该内容片段可以作为参考资料。
- 点击数&点击率 —这是对内容质量的直接衡量,因为它表明有多少点击内容的观众阅读了完整的内容。
- 点赞数——这是对内容收视率的衡量。
- 亮点数量&引用数量 —与第一个指标类似,这是对内容被其他作者引用的频率的衡量。它也给出了将流量导向内容片段的其他来源的度量。
- 跳出率 —这是来自 web analytics 的一个典型指标,表示一进入内容就离开的观众的百分比。这表明读者参与度较低。
- 来自读者评论的情感分析的情感分数将提供关于内容最喜欢和最不喜欢的方面的见解。
- 影响因素 —最后,可以基于上面提到的几个指标的组合,为内容块开发一个综合评分,这是对内容质量和它吸引读者的程度的测量。
在职贡献者
能够吸引观众的高质量内容的关键是拥有一群充满激情、知识渊博的贡献者,他们能够创作出内容大师作品。雇用贡献者的核心原则是确定对写作和数据科学有着同等热情的候选人。在寻找潜在贡献者时,招聘流程应考虑以下方面:
- 适合写作的动机
- 将贡献者的热情与知识门户的愿景结合起来
- 领域专业知识
- 预计保留倾向
- 具有不同人口统计和领域专业知识的贡献者的良好组合
基于自动和手动相结合的搜索来寻找贡献者,通常包括:
- 数据科学各个领域的行业专家/名人
- 拥有自己的博客或为其他出版物写作的当前作家
- 想要开始写作的数据科学爱好者
- 学生作家
贡献者选择和加入的半自动方法(行业专家/名人除外)
下图所示的方法将有助于创建一个同步且有记录的流程,用于创建贡献者管道,并在选择流程的每个里程碑获取贡献者信息。
半自动方法还将确保整个选择过程随着投稿人数量和出版物规模的增加而可伸缩,而不会引入对人的依赖性的瓶颈。
Selecting & On-boarding contributors
贡献者的工作分配
一旦基于上述选择过程选择了贡献者,重要的是要确保贡献者有一个持续的工作流,而不是工作不足或工作过度。随着出版物规模的增长,结构化和自动化的工作分配方法对于维护可伸缩性再次变得至关重要。
工作分配的过程应基于以下因素:
- 将要创建的内容与贡献者的域和能力相匹配
- 建立基于配置文件匹配的自动分配系统,以便内容自动分配给贡献者,而无需等待时间
- 根据贡献者的可用性和发布截止日期,为贡献者创建一个工作渠道。
- 使分配过程透明且可衡量
Work allotment to contributors
内容质量
贡献者创建的内容应该使用多层次的方法进行动态评估。这将是一个基于规则的算法,自然语言处理和人工编辑层的组合,具有对基于规则的算法的反馈机制,以保持一致的内容质量。这将确保保持内容质量不会成为阻碍出版周期的瓶颈。
最上面的三层是基于自动 NLP 的层,用于保持内容质量,这将在内容被传递到手动过滤器之前对其进行相当程度的过滤,从而减少手动工作,进而减少对人的依赖。此外,来自人工层的反馈将用于增强 NLP 层的学习,从而日益加强自动化质量层。
Multi-layer content quality filtering
处理读者评论
任何商业冒险只有在能够倾听客户意见并根据客户反馈勤奋工作时才是成功的。这有利于门户发展成为由客户声音驱动的以受众为中心的门户。阅读读者评论和回答读者问题对维持这方面很重要。这可以通过 NLP 层和手动层的组合来实现,以确保其可扩展性。
1.读者评论的文本挖掘标记高度批评的评论或不满意的读者,以及自动升级机制,以便此类评论引起相关利益相关方的注意
2.一个聊天机器人或 Q &一个基于 RNN 设置的层,用来回答读者的问题。聊天机器人无法回答的问题可以转发给人类代理,答案可以反馈给聊天机器人进行学习。
提议的高级流程
考虑到整体内容策略中讨论的所有方面,建议采用以下包含内容策略所有方面的高级流程:
End-to-end workflow of knowledge portal
结束语
基于流程优化、NLP 和数据科学概念的各个方面发展的内容策略将为知识门户带来优化且可靠的内容流。最后,这样的策略也加强了知识门户在“ 实践所宣扬的 ”方面的理想。
高管的数据科学可观察性
为什么管理层需要观察与数据科学相关的 KPI?
Binoculars Man, Pixabay.
数据科学的可观测性(DS)是一个新兴的领域,它有时与 MLOps 或 AIOps 一起被提及。年轻的初创公司正在开发新的产品,以解决一切数据科学缺乏监控和警报的问题。然而,他们主要面向数据科学家或工程师,当然,他们是最先感受到管理多个模型的痛苦的角色。然而,我将试图证明数据科学可观察性的影响应该针对决策者,如高层和中层经理,这些人负责支出、资金、管理,最重要的是对数据科学运营对公司客户、业务、产品、销售的影响负责,我们不要忘记公司的底线。
在我之前的文章中,我已经写了许多用例以及监控&警报的巨大重要性,特别是从数据科学研究者的角度。然而,在本帖中,我们将涵盖几个受 DS 流程影响的角色,最重要的是高层管理人员,如投资者&CEO,他们在 DS 基础架构、团队、开发和 DevOps 上投入了大量资金,但并不完全了解 DS 对其业务的各种影响点。我认为,高级管理层需要像关注业务、财务、销售、营销和产品管理指标一样关注与 ds 相关的指标,如生命周期价值(LTV)、客户获取成本(CAC)、客户保持成本(CRC)、日均用户(DAU)、月均用户(MAU)、月经常性收入(MRR)、年经常性收入(ARR)等指标。
让我们从几个对与 DS 相关的任何事情都负有共同或全部责任的角色开始,并讨论它的范围。
人物角色
- SRE /德沃普斯
- 数据工程师
- 数据科学家
- 数据科学经理
- 产品经理
- 首席执行官
- 投资者
我们可以将这个列表分为两部分。第一部分是技术人员,如 SRE、DevOps、数据工程师和数据科学家。第二类是 DS 经理、产品经理、首席执行官和投资者。技术角色分担端到端的责任,从提供数据、处理、创建算法和部署它们开始。许多公司已经开始为这部分人提供解决方案,以数据科学家为主要焦点。
第二组包括首席执行官和投资者等决策者,应该密切观察与数据科学生产的核心直接或间接相关的 KPI,类似于今天的 APM 指标。由于 New Relic 等公司的新技术,一场可观测性的革命已经兴起。
就成本而言,维持 core-DS 的生产相当昂贵。我们谈论的是高薪专业技术人员、可能需要自动扩展的昂贵基础设施,以及受算法质量影响的直接业务影响。在一个算法投入生产之前,计算它的成本可能很容易,通常是在它和过程中使用的基础设施上花费的时间。
然而,在 DS 项目投产后,观察预计成本和衡量 DS 对业务和产品的影响要困难得多。
例子
- 观察自动扩展发生时的基础架构成本,及时停止,使用策略来控制这种情况。
例如,让我们以脸书为例,他们为数十亿人提供服务,拥有复杂的系统,可以根据需求进行扩展,以支持点击他们的流量和他们显示的广告。与基础设施变化相关的预测成本应该而且能够计算出来,这可能是因为交通的时效性。它们对企业的健康发展至关重要,高层管理人员应该遵守。 - 观察模型训练或预测停机时间的成本,即客户间接没有获得他们注册的高级服务。
例如,让我们以 Spotify 为例,想象一下 Spotify 的你的歌曲推荐引擎已经关闭,或者由于某种原因使用旧型号进行了错误预测,你的用户要么没有得到歌曲推荐,要么得到了糟糕的推荐。停机时间实际上影响了客户保持率。新用户感到困惑,并对系统失去信任,而老用户则因为功能和体验不是他们所习惯的而离开,转向另一种服务。 - 当预测质量下降或数据不再可信时,观察成本。这应该包括支持成本和对客户的影响。
出于与上述 2 中相同的原因,您的用户感觉到情况变得更糟,并对系统失去了信任,他们不再相信系统能够正确预测。在这种情况下,成本可以归因于发现问题、解决问题和防止流失的工作量。 - 观察成本与算法的重新设计有关,这甚至意味着一个新的研究项目。让我们来看看 Waze ,想象一下他们发布了一种新的算法,试图将城市中的交通堵塞降至最低。但是,由于某种原因,算法在几个城市无法正常工作,正在被撤出。需要创建一个新的项目,这意味着分配新的预算,并争取时间和资源来再次解决这个问题。
- 观察对业务 KPI 的负面影响的成本,例如,当算法的质量开始恶化时。
由于概念漂移和许多其他因素,恶化可能会发生,并且应该加以考虑。此外,对这些因素的监控和处理也应添加到预计成本中。
例如,您的业务 KPI 是与系统交互的用户数量,而 DS KPI 是预测准确性。模型退化直接影响预测精度,预测精度直接影响用户体验。
让我们以优步为例,假设他们的系统不再能够高精度地预测到达目的地的最短最安全路径。用户为这项服务支付了更多的费用,司机浪费了更多的时间来驾驶更少的人。车手和用户现在都在考虑转向比赛。
这些例子只是冰山一角,但是它们显示了 DS 流对业务和产品 KPI 的重要性、隐藏成本和影响,并且它们应该在您组织的日常议程、报告和仪表板中占据重要位置。最后,高层管理人员应该意识到这些潜在的影响,并要求了解 DS 流程对其运营的全面影响。
我要感谢我的同事 Dor Sasson 进行了富有成效的讨论。
Ori Cohen 博士拥有计算机科学博士学位,主要研究机器学习。他是 TLV 新遗迹公司的首席数据科学家,从事 AIOps 领域的机器和深度学习研究。
评估驱逐以了解美国
Dramatic visualization of 2016 eviction filings by state at the National Building Museum
注: 点击此处阅读更多关于 DC 华盛顿州通过其分区豁免条例 鼓励公平发展的尝试。
当你在画廊的走廊中穿行,在高耸的包装家具堆中穿行,在令人望而生畏的胶合板结构中进进出出,很容易用你自己的记忆来填充一般的实物收藏——你自己的物品,你童年的家。
从 2018 年 4 月到 2019 年 5 月,华盛顿国家建筑博物馆的一个画廊侧厅被改造成了一个引人注目的视觉展示迷宫,展示了exhibited:the American City(2016)中揭示的统计数据和故事。普林斯顿社会学教授马修·德斯蒙德的这项强有力的探索性工作,以及它所激发的博物馆展览,引起了全国对这个问题的关注,这个问题以前从未被大规模地关注过。
为了证实关于被驱逐的长篇报道,德斯蒙德和他的研究团队通过梳理 8000 万份与房东-房客纠纷相关的美国法庭记录,收集了一个全国性数据集。驱逐实验室数据集于 2018 年 5 月向公众发布。尽管对收集方法和潜在的统计不足有一些批评,但这些数据为进一步研究和政策工作提供了肥沃的土壤,以应对这一全国性问题。
在这一努力之前,驱逐的话题只是少数大城市的领域,如旧金山、洛杉矶、纽约、波士顿和波特兰。在这些城市,基层组织东拼西凑地收集当地数据。
在阐述项目背后的基本原理时,Desmond 问道:
想象一下,如果我们不知道每年有多少美国人被监禁……或者有多少人从高中辍学、离婚或失业。如果我们不知道问题有多大,在哪里发生,或者有多少家庭受到影响,那么我们如何开始寻找解决方案的关键工作?
驱逐实验室的方法、结果和评论为公共政策团体和数据科学家提供了丰富的见解,这些团体和科学家希望在大范围内争取对数据收集的支持。
背景
德斯蒙德和他的团队将驱逐定义为通过正式的法律程序,房东将房客从他或她拥有的房产中驱逐出去的事件。该数据集没有考虑到非正式的驱逐,这种驱逐发生在房东采取行动时,比如(胡萝卜)付钱给房客让他们搬走,或者(棍子)移开他们的门迫使他们离开。根据驱逐实验室的说法,“有证据表明‘非正式驱逐’比‘正式的’法院命令驱逐更常见。”需要做进一步的工作,将驱逐实验室收集的国家数据集与当地做法联系起来,以便得出反映现实世界条件的驱逐率。
方法学
驱逐实验室开始了数据收集过程,直接从法院索取所有与驱逐有关的记录。他们通过网络搜集门户网站来补充这些信息。在进行数据清理时,该小组将记录格式化,以便每个观察代表一个家庭,删除重复的病例。为了进行验证,该小组对照了在县一级收集的记录,并采用统计模型来评估从一年到下一年收集的可接受差异。由此产生的数据集被加入到 2000 年和 2010 年的美国人口普查和 2016 年的 ESRI 商业分析中,为其他人口统计方法提供信息。总的来说,该小组评估了 48 个州(除北达科他州和南达科他州之外)以及 DC 的 8000 万份驱逐记录。
结果
德斯蒙德和他的团队揭示了全国的驱逐率为 2.34%,东南部各州的驱逐率明显更高,如弗吉尼亚、南卡罗来纳、北卡罗来纳和佐治亚。2016 年驱逐率最高的五个城市中有四个位于弗吉尼亚州(排名第一的城市是南卡罗来纳州的查尔斯顿)。在排名第二的弗吉尼亚州里士满市,多达九分之一的家庭在 2016 年面临被驱逐。根据弗吉尼亚联邦大学的一份报告:
在全州范围内,大约 60%的非裔美国人社区的年驱逐率高于 10%的家庭——大约是全国平均水平的四倍——即使在控制了贫困和收入率之后。
通过驱逐实验室的时尚在线门户,你可以通过交互式地图和排名条形图查看州、市和地方的调查结果。您还可以下载底层数据集进行进一步分析。
讨论
Source: Evicted exhibition at the National Building Museum
许多因素导致了威胁 1100 万美国人的住房不稳定。这些问题包括停滞不前的工资、快速变化的城市劳动力市场、不断上涨的住房成本以及经济适用房的极度短缺。只有五分之一的合格低收入家庭从国家资金严重不足的住房援助计划中获得援助。向低收入租房者提供代金券的第 8 部分,获得了联邦政府用于抵押贷款利息扣除的大约一半金额,这有利于高收入家庭。驱逐不仅仅是因为贫穷,还因为机会的不平等和基本经济支持结构的不稳定。
批评
草根组织如反驱逐绘图项目和租户联盟已经呼吁驱逐实验室未能考虑当地背景,并拒绝与非营利和政策领域的现有参与者合作。例如,在加利福尼亚州,驱逐实验室向一家专注于房地产的分析公司支付研究数据。这些组织声称,这些信息不仅少算了 200%的实际驱逐,而且出售的收益很可能被用来促进剥削性的租赁做法,德斯蒙德在他的书中谴责了这种做法。
更深的潜水
为了更好地理解驱逐实验室工作的成功和局限性,以放大的比例探索他们数据的一个小子集是有用的。让我们放大华盛顿 DC 国家建筑博物馆驱逐实验室最近展览的环境。
德斯蒙德的团队对华盛顿的统计数据提出警告,他们低估了实际的驱逐情况。据称,2006 年至 2012 年的驱逐率明显低于 2016 年——用于全国范围比较的旗帜年。据推测,这种差异的出现是因为该团队将他们的努力分配到了 2016 年的数据收集上。
抛开对统计不足的担忧不谈,德斯蒙德及其团队的工作仍然是一项重大成就。非政府组织或政策制定者正在积极收集驱逐统计数据的城市为数不多,北京不在其列。有点令人难以置信的是,在驱逐实验室成立之前,该市没有正式统计驱逐案例的数量或成功驱逐的人数。
Size of red circle indicates 2016 eviction rate within a block group. Lighter blocks groups indicate higher non-white percentage based on the 2010 Census. Source: The Eviction Lab.
探究这些记录很重要,因为它阐明了驱逐是如何按照令人不安的模式分解的。快速浏览一下华盛顿驱逐实验室的图像就足以看出住房危机的这一因素明显受到种族的影响。这一发现在全国范围内都适用,但在曾经被称为“巧克力城”的华盛顿州更加严重,那里的中产阶级化迫使许多黑人家庭不断远离市中心。
进一步研究的领域
中产阶级化,即翻新和改善一个地区以吸引中产阶级居民的过程,是流离失所的一个原因,但也可能是释放经济机会的一个关键。进步的策略,如 DC 规划的单元开发,可以通过提供经济适用房、改善的公共交通等便利设施,以及换取分区豁免,广泛地重新分配城市重建的利益。
283 个规划单元开发(pud)与哥伦比亚特区社区之间的互动…
public.tableau.com](https://public.tableau.com/views/PUDYears/PUDs?:language=en&:display_count=y&:origin=viz_share_link)
这是一个脆弱的妥协,值得仔细研究。例如,有计划的单元开发,甚至那些提供负担得起的住房作为其社区福利一揽子计划的一部分的开发,可能会由于预期土地价值的升值而导致更高的驱逐率。在旧金山和奥克兰,反驱逐绘图项目通过中产阶级化的镜头探索了房东和房客的关系,衡量标准是最近公司赞助的班车激增,所谓的“科技宿舍”兴起,以及 Airbnb 价格飙升。驱逐实验室通过将地方组织发起的对话提升到全国范围,作为评估流离失所问题规模的初步努力。
Source: Evicted exhibition at the National Building Museum
死星上的数据科学
改善帝国的生活,一次一个 DS 项目
Photo by Agnieszka Kowalczyk on Unsplash
数据科学不是魔法(就此而言的力量)。作为一个对该领域真正感兴趣的人,我经常被其他人警告,并读到关于在组织中采用数据科学的复杂世界。有很多这样的故事:一个地方雇用了一名数据科学家,因为他们被告知这是一件很酷的事情,失望随之而来,因为缺乏理解,数据科学家需要重新工作。很明显,有时角色会出现脱节。
我对这个角色的简单定义是:数据科学家在那里分析和解释数据,以构建业务解决方案。这是一项需要情境化、问题框架化、实验设计和数据收集的工作,以制定使事情变得更好的解决方案。你可以自由地搜索无数的维恩图,这些图可能会更深入地挖掘所需的技能和知识,但本质上是业务理解、统计数据和编程知识放在一个高高的搅拌机中。
我经常收到朋友关于数据科学可以做什么的问题,这有时很有挑战性,因为它可以根据组织的工作环境而有很大的不同。如果你在网飞,你可能会用大数据来测试推荐算法。如果你在易贝,你可能正在开发上市欺诈监控工具。如果你在苹果公司工作,你可能会对用户拍摄的照片进行物体识别。正如每个企业都有不同的需求一样,他们对数据科学的使用和需求也是如此。
我绝不是专家,但让我们通过一个例子来思考,看看想到了什么类型的解决方案:
恭喜你,你现在是帝国雇佣的第一个数据科学家!
他们有很好的福利,很高的薪水,旅行也很棒。皇帝已经派你到总部,死星,来帮助建设,看看是否有你能帮忙的任务。为了帮助构建问题,你需要从 CRISP-DM 开始,并从员工那里获得一些业务理解。你以前从未在多泪星系的统治机构工作过,所以和其他人交流一下,看看你能在哪些地方帮上忙是很好的。
死星枪手
“也许我们可以找到一种方法来更好地在一个星球上自动点火,这样我就不必承受我对这样做感到的难以置信的内疚和厌恶”
哇哦。那是粗糙的。有没有办法进一步自动化发射摧毁一颗巨大星球的超级激光?有可能,但由于启动指令来自简单的人工指令,我认为增加人工监督可能是有意的。仅仅因为一些事情可以自动化并不意味着它们需要自动化,确保星球毁灭命令的正确执行可以使用个人方法。对计算过程的任何改变更可能是纯粹的工程改进。也许换了部门?
莫提上将
“我想我们可能有一个叛军间谍正在发送我们的计划。你能怎么办?”
那听起来是一个相当严重的问题!我们可能还有一个现有的数据源可以使用:通信日志。因为我们是帝国,这里没有秘密,我们可以收集尽可能多的基地对外通讯的数据。我们首先需要对这些通信数据有所了解,也许看看我们是否发现了任何不正常的情况,比如员工在预定的值班时间发送信息,在非正常时间发送信息,任何包含图表附件的信息,或者任何发送给已知敌人的信息(rebelalliance.org 的电子邮件是一种常见的密报)。如果我们仍然没有找到足够的内容,我们可以对实际文本进行更多的评估,或者只是通过搜索特定的关键词或短语,甚至是情绪来寻找气馁的员工。如果我们想要监控未来的消息,我们可以建立一个模型来搜索特定的标准(基于我们在研究中发现的),并在潜在的违规者出现时提醒我们!
皮特上将
“我需要确保我们不会让持有旧密码的人穿过我们的防护罩。我的脖子在危险中,哈哈哈,但是说真的。我见过。”
是的,我听说这可能是个问题。我会假设,因为你轻率地允许旧代码,除了一些手写的便利贴之外,没有管理它们的正式系统。这可能不是我们可以做好分析的地方,但是我们可以考虑为代码管理创建一些组织,也许通过组织一个新的数据库。我们可以作为一个团队,与工程一起工作,来理解代码应该如何组织,并提出一个适当的系统。我们可以创建代码使用报告,让每个人都知道什么是可接受的。如果我们对代码的使用有了足够的了解,我们可以研究一些其他的解决方案来自动化这个过程,但是听起来我们还有很长的路要走。
大总督塔金
“我担心绝地登船会严重危及我们的安全系统.”
你可以拥有所有你想要的帝国冲锋队,但是如果他们落入绝地的心灵诡计,那还有什么意义!?维护基地安全肯定是一个关键的优先事项,我认为我们可能有一些选择。或许用一些摄像头,我们可以利用面部识别来提防讨厌的绝地。如果我们收集任何已知绝地的一些图像,我们可以训练一个模型来寻找确切的人,并警告我们他们是否在空间站上。举个例子,让我们以欧比万·克诺比这个角色为例,对他进行训练,因为我很确定他是唯一的幸存者。下面是一个例子,如果他出现了,我们可能会发现什么:
这将花费我们一些时间和计算能力,但我认为这是可能的。
奥泽尔上将
“我希望有一个系统能够自动向高层管理人员提供关键更新,而不会被扼杀”
对不起,奥兹尔。与他人打交道,尤其是那些有超自然窒息能力的人,是工作的一部分。沟通,尤其是团队内部的沟通,不是可以自动消除的。我们可以更多地讨论你的团队如何沟通,看看是否有系统可以设置到位,使更新更加透明,但你必须处理与其他人的工作。如果你感到害怕,我建议和人力资源部谈谈,但我觉得他们也帮不了你。
达斯·维达
“我想系统地消灭所有反抗帝国的人,这样我就可以停止杀戮五分钟,坐在那里感受我生活中发生的事情带来的情感冲击。”
这是可以理解的令人沮丧的是,这种反叛的事情是如此经常。我不认为有找到所有叛军联盟的灵丹妙药,但我们可以在信息中寻找趋势,看看我们是否能帮助缩小找到他们的范围。我们可以查看过去叛军基地的数据,找出尽可能多的位置细节(气候、太阳系、与以前基地的距离等。)和资源(有多少叛军,火力类型等。),看看我们是否能找到任何有帮助的趋势。如果看起来我们能找到一个足够清晰的模式,我们也许能进一步研究创造一个模型,根据最近发现的基地,可以估计他们下一步可能去哪里。
如您所见,数据科学解决方案并非万能,但如果可能,您可以做一些惊人的工作来改善组织的运营方式。
数据科学解释为什么阅读新闻会让你紧张
Visualization of individual articles published by each news source over roughly one day (Aug 20th–21st 2019 because timezones). Code for generation below.
最近在准备一篇关于新闻媒体语言模式的论文时,我发现自己通读了我的神经网络处理过的许多文章,试图通过具体故事的镜头来理解它的发现。看过许多不同来源的文章,消化了来自不同政治派别的观点,我可以第一手证实,阅读新闻是令人疲惫的,因为每时每刻都感觉它表达了一种持续的紧迫感。
从数据开始,“情绪”大致指的是一段文本中单词的积极或消极程度。在这篇文章的上下文中,文本是新闻机构的 RSS 源中看到的文章“描述”(通常是文章本身的片段或出版商网站上看到的简短预览/摘要文本)。通过 TextBlob 的自然语言处理情感模型赋值,值-1 表示能得到多负面,1 表示能得到多正面,0 表示中性。值得注意的是,情绪可能是上下文相关的(且有细微差别),因此在这种情况下,极性的大小可能比方向更重要,而且,由于情绪模型不是特定于新闻媒体的,因此计算并不完美。尽管如此,如上面的可视化所示,一些机构在文章情感上看到了不同的分布,有些像 Vox 或《华尔街日报》非常狭窄(更中性的情感),而其他像《每日邮报》或 CNN 则探索语言光谱中更“两极”的部分。这不是对任何机构的批评,也不是对更多极性词汇选择的必要性的评论,但它强调了,鉴于当天的新闻,不仅不同机构对世界的报道比其他机构更“激烈”(就词汇选择而言),而且,在随机的一天里,人们可以在整个媒体领域经历许多极端的情绪极性。事实上,对一个随机月份(六月)的快速分析表明,在每一天,范围往往很广,许多天至少看到一篇平均句子极性为 1 或-1 的文章。
Most days of June 2019 saw a wide sentiment polarity range across the 10 news agencies examined (listed in the visualization above).
也许我们确实生活在一个大加速的时代,关键时刻总是发生,但另一方面,持续的极端极性可能会带来麻烦,因为,正如乔恩·斯图尔特观察到的,“如果一切都被放大,我们什么也听不到。”话虽如此,这一分析将新闻中的两极分化引起的焦虑置于的背景中:数据证实,至少部分媒体确实沉浸在情绪高涨的长期状态中,因为它看到了尖锐的语言,所以可以理解新闻如何引起担忧。我还不确定该怎么办,尽管通过你的媒体消费习惯来批判性地审视你所接触到的语言的“极性”是值得的。然而,就像我看到勾勒出这一景观的趋势的经历一样,我希望你看到这些数据时能有一种洞察力,甚至是冷静。
【https://github.com/sampottinger/news_flower】的代码和数据。文章经过编辑,以帮助读者更好地理解使用现有情感模型的局限性。
数据科学还是统计学?
我们经常伸手去拿闪亮的工具,而不是正确的工具。
Photo by Philip Swinburn on Unsplash
「数据科学」和「统计学」有什么区别?
更重要的是,这重要吗?当我涉入这场辩论时,我不禁感到有点愚蠢,因为我把注意力放在了所有事情的语义和标题上,而不是看起来更有实质内容的东西上。
然而,我很清楚,在许多工作场所,甚至在学术界,这种模糊性已经导致了相当多的困惑和误解。
最终,我认为除了清楚我们的定义是什么,这样我们就不会越过对方说话之外,无论出于什么原因,“把事情做对”都是不重要的。本文是我尝试遵循“定义我的术语”的最佳实践,希望也能为组织和领导者提供有用的路标。
需要避免的最常见的陷阱之一是,要理解数据科学并不总是意味着机器学习或人工智能解决方案。
像其他科学领域一样,数据科学应该精确地识别和应用正确的工具来解决问题。有时候,用例最好的工具是统计,或者探索性的数据分析,或者简单但可理解的描述性统计可视化。
在多诺霍(2015)的论文 50 年的数据科学 中,他以一种有意义的方式解决了定义术语“数据科学”的问题,以便更好地理解它是什么,以及它与其他学科(即统计学)有何不同。
他以统计学领域和其他领域如计算机科学和社会科学开始他的比较,这些领域似乎都有技术和方法的权利。
多诺霍认为,约翰·图基所开创的,以及威廉·克里夫兰和约翰·钱伯斯等其他人所倡导的,实际上是统计学的扩展,包括了我们今天所知的数据科学。
从这个角度来看,他们认为统计学主要关注统计学理论,当你有数据来了解你感兴趣的人群时,它允许某人建立一个推理模型。
这些“数据科学”的早期支持者认为,当代统计学忽略了数据处理中收集和清理的重要性。
此外,我们还看到,除了为了从数据中做出推断而建模之外,我们还关注将模型应用于数据的预测能力,而不是使用数据来测试理论构建的模型。
多诺霍指出,这在数据科学的机器学习领域非常明显,但在许多其他用例中也是如此。不再依赖统计理论——这需要数据中存在一个真实模型——现在出现了一种范式转变,专注于从数据本身寻找模式和多个潜在模型。
多诺霍断言,这种扩展是由过去 40 年来实现的计算能力和可视化变化的到来而成为可能的。
从统计到数据分析
从 SPSS、SAS 和 R 等统计软件在 20 世纪 90 年代开始主导该领域的流行可以看出,对这些程序的依赖和突出已经成为“数据分析”的同义词,这些方法也扩展到许多学术和商业用途。
从某种意义上来说,这些项目通过培训帮助统计民主化并扩展到正式的“统计学家”之外。此外,几乎所有环境中的从业者都开始处理“大数据”和“数据挖掘”,而不是以前使用的经典统计技术。
共同任务框架(CTF)
下一个最重要的发展是共同任务框架(CTF),这是一种竞争方法。CFT 要求:
- (1)公开可用的数据集,
- (2)具有从数据推断预测规则的共同目标的竞争者/合作者,以及
- (3)客观评分裁判/仲裁者,可对参赛者提交的作品进行评分。
CFT 允许数据科学竞赛,但也建立了一种用数据开源科学问题的文化,因为有清晰可衡量的答案和一致同意的目标。
CFT 和向开源数据科学技术(R,Python,Github 等)的转变。)一直是数据科学范式的必要推动力。
一个新的科学分支
很明显,数据科学已经超越了统计学,现在几乎在所有应用中都包含了编程、工程、数学、设计和科学方法论知识。
此外,我们还关注解决方案的实施,包括产品和服务的接口,或者简单地提供数据可视化,以展示数据科学工作的结果。
这显然比以前任何一个领域所关注的都要多,但它也是普遍的,因为许多领域都可以采用这些技术和知识并从中受益,以解决它们的具体问题。
正如 John Tukey 在 20 世纪 60 年代所宣称的那样,数据科学在我们的世界中变得越来越重要,并迅速渗透到我们生活的几乎每个方面。
实际结论
我个人不喜欢“数据科学”这个术语,仅仅是因为它更容易混淆而不是澄清。然而,数据科学的实际应用不仅仅是统计。
在某些方面(理想情况下)实践的数据科学是统计学,但它也包括对数据源和数据质量的严格探索。
在此之上是编程方法和开源技术,它们放大了数据源的科学严谨性。
然后,根据使用案例,这些与简单和复杂的统计理论和方法一起被利用来进行探索、推断和预测。
最后,讲述数据故事也同样受到重视。作为一种实践,数据科学重视可视化和主题专业知识,这使得过程和结果的故事易于被不同的利益相关者理解。
这并不是说统计或统计学家以前从未结合过这些观点。然而,数据科学的文化已经超越了统计部门,并来自受过正式培训的统计人员,这种文化已经在其他学科和背景中扎根于数据科学,引导我们寻求数据驱动的决策和循证知情的政策。
或者至少,把我们推向一种心态,我们希望看到我们的假设和信念背后的数据。希望如此。
使用 Spark、Scala 和一些 SQL 对电影数据集进行数据科学分析。和一些蟒蛇。(第一部分)。
Spark SQL 是一个用于结构化数据处理的 Spark 模块。它提供了一个名为 DataFrames 的编程抽象,也可以作为一个分布式的SQL查询引擎。让我们在数据块上使用它来对电影数据集执行查询。
Photo by Jake Hills on Unsplash
一天,我的一位 SQL 开发人员朋友告诉我,她对大数据处理引擎感兴趣,但除了 SQL 之外,她没有任何其他编程语言的经验。我想向她展示,了解 SQL 是学习大数据的良好起点,因为借助 Spark,可以对表执行平面 SQL 查询,而且其代码 sintax 与 SQL 类似。我希望你喜欢这个故事。
为了证明这一点,我执行了一些查询和描述性统计,以从一个奇特的数据集电影镜头数据集中提取洞察力,该数据集可在【https://grouplens.org/datasets/movielens/】的上获得,包含了超过近 3 万部电影的不同用户的大量评分。该报告可能有助于了解如何进行聚合和执行基本的 spark 查询。我既不是 Spark 专家,也不是 Scala 专家,所以代码可能不会以最有效的方式实现,但我不会停止学习,我非常欢迎建议和评论。
当我们想要学习大数据并在 Hadoop 生态系统上使用 Scala 的 Spark 时,我们面临的最大问题之一总是安装和集成来自这些框架的所有工具。然而, Databricks 社区版将把我们从那个问题中解救出来。实际上,它拥有我们需要使用的一切:它自己的文件系统,以及我们将要使用的所有已安装(并正常工作)的 API(Hive 与 Spark 和 Scala 以及其余的 Spark 库如 MLlib 或 Graphx 很好地集成)。为了不让这篇文章写得太长,我将不涉及那些技术,但是关于的好文档可以在他们的网站上找到:https://databricks.com/spark/about。
本文的主题不是数据块的使用,而是电影数据集(统计、查询、聚合…)** 上的 scala-Spark 编码。一些查询将在 SQL 中显示它们的等价物。Databricks 还将允许我们管理这个巨大的数据集,它可能适合我们本地机器的内存。Spark 将为我们提供处理数据的有效方法。**
1)导入数据
第一步也是必要的一步是下载两个长格式数据集**,它们在新研究的推荐部分。之后,我们必须将它们导入 databricks 文件系统,然后将它们加载到 Hive 表。现在我们可以对两个数据集/表执行一些基本的查询,一个是关于电影的信息,另一个是关于电影的价格。描述和打印模式方法总是一个很好的切入点:**
**val movies = table("movies")
val ratings = sql("select userId, movieId, rating from ratingsB")
ratings.describe().show
movies.printSchema
ratings.printSchema**
2)执行一些查询和知识提取。
为了改进我们的 spark 编码,我们可以执行任何我们能想到的带有学习目的的查询。首先,让我们检查对电影评分最多和最少的用户:
import org.apache.spark.sql.functions.count
import org.apache.spark.sql.functions.{desc,asc} **ratings.groupBy("userId").agg(count("*").alias("number_cnt"))
.orderBy(desc("number_cnt"))** **ratings.groupBy("userId").agg(count("*").alias("number_cnt"))
.orderBy(asc("number_cnt"))**
等价的 sql 查询(重要的是要注意,只要我们可以,我们应该用 spark 编写这个查询,因为它会像纯 SQL 查询一样在编译时给我们带来错误和运行时带来错误,以避免将来浪费时间,特别是在大型进程上)😗***
**sql("select userId, count(*) from ratingsB group by userId order by count(*) desc")**
有一些用户评价了超过 5000 部电影!!这太疯狂了。
这让我想知道他们看电影花了多长时间考虑到电影 100 分钟的平均时间。这个结果值得展示!!一些查询将被打包到函数中,以便在我们想要/需要它们时使用,甚至在笔记本的不同单元或部分代码中使用:
**ratings.groupBy("userId").agg(count("*").alias("number_cnt")).withColumn("years_Watching", round($"number_cnt" * 100/ 60 / 24 / 365,3)).orderBy(desc("years_Watching")).show(10)**
我们可以看到,用户数 123100 花了超过 4.5 年的时间看电影和看了超过 20000 部电影**。真是个电影迷!!关于代码,它有一些有用的方法,比如一个适当的 gropuBy agregation 和一个 count,这个 count 和 round 函数一起应用于用。带列(因为我们不需要那么多小数火花显示)。现在,我们将连接两个数据帧,将所有信息放在一个 df 中进行处理:**
**val df_full = ratings.join(movies, $"ratingsb.movieId" === $"movies.movieId").drop($"ratingsb.movieId")**
你有兴趣知道哪些电影被影迷评为 3 星或 5 星吗?我们可以知道,这个函数接收一个 scala 整数序列作为输入,以及我们想要查询的星星数和我们要查询的用户数。如果 seq 为空,将显示该用户评价的所有电影(使用 scala 检查)。isEmpty 方法):
import org.apache.spark.sql.functions.{asc, desc}**def movie_query (df: org.apache.spark.sql.DataFrame, stars: Seq[Double], user: Int ) : Unit =
{
if (stars.isEmpty)
{
println(s"All movies rated by user $user")
df.filter(df("userId") ===user).orderBy(desc("rating")).show(20, false)
}
else
stars.foreach(starsNum =>{
println(s"All movies rated by user $user with $starsNum stars:")
df.filter(df("userId") === user).filter(df("rating") === starsNum).orderBy(asc("movieId")).show(7, false)})
}** movie_query(df_full, Seq((3.0, 4.5), 21)
通常,我们都会从朋友和家人那里得到很多电影推荐,我们会把这些电影列一个清单。在那之后,当我犹豫应该先看哪部电影时,我总是去 filmaffinity 或 imdb 查看我列表中评价最好的电影。原来我们也可以做类似的事情。要做到这一点,我们需要获得电影的平均评级,并按照从最好到最差的评级对它们进行检索。值得注意的是,一个优秀的电影搜索者可能不会收到电影的确切名称,这可以用 scala contains 方法解决:
import org.apache.spark.sql.functions._**def movie_grade (df: org.apache.spark.sql.DataFrame, movie: String ) : Unit = df.filter((df("title").contains(movie))).groupBy("title").agg((round(avg($"rating"),3)).as("averageStars")).orderBy(desc("averageStars")).show(false)**
我们将在两个著名的传奇故事上测试我们的功能:
movie_grade(df_full, "Wild Bunch")
movie_grade(df_full, "Lord of the Rings")
****
Photo by Thomas Schweighofer on Unsplash
耶!我们爱魔戒!评分最低的电影对应的是我还没看过的动画版。
阿拉贡和两个哈比人在指环王动画电影中。
我相信也有很多星战迷,所以让我们用类似的 SQL 查询得到所有电影的分数:
**sql("Select title, avg(rating) as averageRate from full_movies where title like '%Star Wars%' group by title order by averageRate desc").show(false)**
****
Photo by Daniel Cheung on Unsplash
正如我们所看到的,老电影是最好的评级,但在我看来,前 3 集并没有那么糟糕,得分低于 3.5 星。但那只是观点!!我们还获得了一些衍生产品和平行电影,对《星球大战》迷来说也很有趣。
我想知道的下一件事是哪些是收视率最高和最低的电影。由于这是一个相当大的数据集,它包含了大量可视化效果差的电影,其中一些电影的评分低于 5 分。当然,如果我们想做一个连贯的研究,我们应该忽略那些电影。我只会关注那些收视率超过 600 的电影,这代表了总收视率的 1%(完全不是主流电影)。为此,我们将创建一个新的数据框架,其中包含每部电影的总评分和平均评分。之后,我们将筛选出超过 600 个评分的电影,并按其平均评分以升序和降序的方式显示,以检查最差和最好的电影。
**val df_count = df_full.groupBy("title").agg(avg("rating").as("averageRating"),
count("title").as("RatesCount"))** **df_count.withColumn("roundedAverageRating", round(df_count("averageRating"),2)).filter(df_count("RatesCount") > 600).orderBy(asc("averageRating")).drop("averageRating").show(20, false)** **df_count.withColumn("roundedAverageRating", round(df_count("averageRating"),2)).filter(df_count("RatesCount") > 600).orderBy(desc("averageRating")).drop("averageRating").show(20, false)**
收视率超过 600 的排名最低的电影。
如你所见,《闪光》是最差的电影。我在 imbd 上搜索过,确实看起来很恐怖:
现在好的部分来了,注意列表的头:
这也是其在 imdb 上评级的结果:
3)推荐系统(一)
这个数据集对于改进和理解推荐系统是如何工作的是完美的。我正在使用 spark 机器学习库 MLlib 研究推荐系统的机器学习模型,它们将在下一篇文章中展示。我刚刚提出了一个简单的解决方案,只需要执行一个大的查询。这是一个简单的模型,可以作为虚拟解决方案。解决方案是关于检索用户观看最多的类别,并从用户尚未观看的类别中输出评价最高的电影。这是一个打包到 easy_recommender 函数中的更复杂的查询,该函数将接收我们想要推荐的用户数量、我们将对一部电影使用的作为最小阈值的数量或比率(请记住,从统计的角度来看不是检索只有一点比率的电影的好做法**)以及我们想要显示的电影数量。这些是我们将要遵循的步骤:**
- 获取用户 X 看到最多的类别。要做到这一点,我们需要根据用户进行过滤,根据类型进行分组,进行计数,然后根据计数进行排序。一旦有了这些,我们只需选择“流派”列并用 map 映射该列,然后执行一个收集操作,然后使用:。map(r =>r . getstring(0)). collect . to list .
- 之后,我们将使用一个新列“ToDelete”来标记用户 X 看过的电影,该列包含一个简单的字符串,例如“Delete ”,一旦我们执行连接,就可以很容易地找到它。这样我们就可以很好地识别用户 X 看过的电影。
- 我们将把那个数据帧和大数据帧连接起来。我们想忽略的电影标有“删除”(所以我们会用过滤掉那一栏为空的。过滤器(" ToDelete 为空"))。
- 最后,我们将使用 foreach scala 方法遍历我们想要过滤的类别,现在我们已经选择了用户 X 没有看过的电影。现在,我们只需按标题分组,获得平均评分,再一次按电影筛选出 Y 个以上的评分(记住,出于统计原因),并按平均评分降序排列。
这是一个有点复杂的过程,我相信有更好的方法来做这件事。在这里你可以看到代码:
**def easy_recommender(nUser: Int, nRates: Int, nMovies: Int) : Unit = {
val mostSeenGenresList = df_full.filter(df_full("userId") === nUser).groupBy("genres").agg(count("*").alias("cuenta")).orderBy(desc("cuenta")).limit(3).select("genres").map(r => r.getString(0)).collect.toList
println(s"List of genres user $nUser has seen the most : $mostSeenGenresList")** ** val movies_watched_by_userX = df_full.filter($"userId" === nUser).withColumn("ToDelete", lit("DELETE")).select($"ToDelete", $"title".as("title2"))** **var df_filt = df_full.join(movies_watched_by_userX, $"title" === $"title2", "left_outer")** **df_filt = df_filt.filter("ToDelete is null").select($"title", $"rating", $"genres")** **mostSeenGenresList.foreach(e => {
println(s"Top $nMovies movies user number $nUser has not seen from category $e with more than $nRates rates: ")** **df_filt.filter($"genres" === e).groupBy("title").agg(avg("rating").as("avgByRating"), count("*").alias("nRates")).filter($"nRates" > nRates).orderBy(desc("avgByRating")).show(nMovies, false)
})
}** easy_recommender(134596, 1000, 5)
**我们从“推荐系统”获得的结果用 scala **字符串插值:打印出来
你可以看到,首先我们打印出用户 X 看到最多的类别。我们可以通过控制要推荐的类别数量。极限③法。正如你所看到的,我们可以通过函数的输入来控制我们想要包含在模型中的大多数参数。
4)可视化时刻
总之,如果没有适当的可视化/绘图,这就不是一部好的数据科学作品。为了实现这一点,Python 总是一个很好的选择,我将向你展示 databricks 的另一个精彩特性,它允许我们在同一个笔记本上运行 Python 和 Scala 代码。****
第一步是将我们的 df_full 保存到一个临时配置单元表**(它只在当前会话期间持续存在)😗*
**val ratesDF = df_full.select("rating").groupBy("rating").agg(count("rating").as("NumberOfRates")).orderBy(asc("rating"))
**
**ratesDF.createOrReplaceTempView("ratedDF")
spark.sql("select * from ratedDF").show**
现在是魔法降临的时刻了。只需在单元格顶部键入 %python ,我们就可以执行具有所有 Spark (pyspark)优势和特性的 python 代码。我们将表加载到 pyspark 数据帧中,并使用这些 Python 命令行程序将两列转换成 Python 列表**😗*
%python**df = table("ratedDF")
rating_list = df.select("rating").collect()
number_rates = df.select("NumberOfRates").collect()
rate_category = [float(row.rating) for row in rating_list]
n_rates = [int(row.NumberOfRates) for row in number_rates]**
最后,我们将使我们的视觉化。这是一个完全自由式的过程,一些情节会比其他的更漂亮。记住分类变量应该用条形图表示:
%python
import matplotlib.pyplot as plt
import numpy as np**fig, ax = plt.subplots()
ax.bar(rate_category, n_rates, align='center', width=0.4, facecolor='b', edgecolor='b', linewidth=3, alpha=.3)
plt.title('Number of Rates vs Stars')
plt.xlabel('Stars (*)')
plt.xlim(0,5.5)
plt.ylim(0,8000000)
ax.set_xticks(rate_category)
display(fig)**
除了没有 0 星的电影以及看起来不像人们预期的那样是正态分布之外,没有太多评论。
5)总结
这就是所有的人。我希望你和我一样喜欢这篇文章,了解 scala、spark 和 Databricks,思考关于电影数据集的见解。现在我正在使用 spark 的机器学习库 Spark MLlib 在这个数据集上实现和改进推荐系统的性能。在未来的文章中,这些模型可能会与数据集上更复杂的查询和描述性统计一起显示。我玩了一会儿流派专栏,获得了更深入的统计数据,但我不希望这篇文章过于密集。
由于这是我的第一篇文章,再次感谢任何反馈和评论。
原载于 2019 年 7 月 23 日https://medium.com。**
使用 Scrapy 构建自己的数据集
了解如何构建自己的数据集,并将其用于数据科学和分析
Photo by Markus Spiske on Unsplash
数据科学管道
- 获取数据(在本文中讨论)
- 数据清理
- 探索/可视化数据
- 数据建模
- 解释结果
几乎每个数据科学家都面临的一个常见问题是收集数据。虽然有很多网站可以找到这篇文章中提到的数据集,但这总是不够。有时,构建自己的数据集是一条可行之路。另一方面,尽管 web 是一个巨大的数据源,我们只需要知道如何有效地挖掘它。在本文中,我将带您了解使用 Scrapy 从 web 抓取数据的过程,这是一个用 Python 编写的强大的 web 爬行框架。
如果你想直接进入代码,就去看看这个 github repo 。
数据源
国际足联 20 名球员的排名出来了,作为一个狂热的足球爱好者,我发现这样的数据很吸引人。你可以在 sofifa 上找到这些数据。我们将抓取数据,并使用 Scrapy 将它们保存在 csv 文件中。
安装和设置
在这篇文章中,我将使用 Python 3 和 Scrapy 1.7。对于 Linux 和 Mac,使用以下命令通过 pip 安装 scrapy 相当简单:
pip install Scrapy # or pip3 install Scrapy
Windows 用户需要安装 Anaconda。你可以在这里找到安装说明。安装 Anaconda 后,打开 Anaconda 提示符并键入以下命令来安装 Scrapy:
conda install -c conda-forge scrapy
创建项目
一旦我们的系统中有了 Scrapy,下一步就是创建一个项目。打开终端/anaconda 提示符并键入
scrapy startproject fifa20
starting scrapy project
默认情况下,Scrapy 会在fifa20.
中创建一堆文件和目录
inside fifa20 project
在fifa20
里面,你会发现另一个fifa20
文件夹,里面包含了我们所有的代码。spiders
目录包含负责从网络中提取数据的 Scrapy spiders。一般来说,每个蜘蛛负责抓取一个特定的网站。一个 scrapy 项目可以有多个蜘蛛。例如,如果你正在创建一个价格监控系统,你可能想要抓取多个网站,如亚马逊、沃尔玛、新蛋等。每个网站都有一个专门的蜘蛛来处理抓取逻辑。
包含项目的设置,例如运行多少个并发线程,两个请求之间的延迟,使用哪个中间件或管道。
对于这个项目,我们将设置一个真实的用户代理。继续在settings.py
中更改这些变量。
您的settings.py
文件看起来会像这样
BOT_NAME = 'fifa20'SPIDER_MODULES = ['fifa20.spiders']
NEWSPIDER_MODULE = 'fifa20.spiders'# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'# Obey robots.txt rules
ROBOTSTXT_OBEY = True
查看 Scrapy architecture 探索更多关于中间件、物品、管道和其他设置的信息。
创建蜘蛛
要创建一个蜘蛛,导航到外部的fifa20
项目目录并键入
scrapy genspider sofifa sofifa.com
这将在spiders
目录中创建一个名为 sofifa 的蜘蛛。这是文件的样子
# -*- coding: utf-8 -*-
import scrapyclass SofifaSpider(scrapy.Spider):
name = 'sofifa'
allowed_domains = ['sofifa.com']
start_urls = ['[http://sofifa.com/'](http://sofifa.com/')] def parse(self, response):
pass
让我们试着理解这是怎么回事。
SofifaSpider
是 spider 类,它继承了包含我们所有抓取代码的scrapy.Spider
。- 命令中使用的蜘蛛名称是
sofifa
。我们稍后将使用它从命令行运行蜘蛛。 allowed_domains
包含蜘蛛爬行的域列表。在这种情况下,蜘蛛只抓取 sofifa.com 域名的网址,而忽略其他网址。这有助于我们限制爬虫仅爬行期望的域。start_urls
包含一个 url 列表,蜘蛛使用它作为初始 URL。parse
方法是一个回调函数,默认情况下在爬取start_urls
中的 URL 后调用。parse
(或任何回调)方法接收包含下载网页的响应对象。
我们将使用以下网址作为我们的起始网址
start_urls = ['[https://sofifa.com/?col=oa&sort=desc&showCol%5B%5D=ae&showCol%5B%5D=hi&showCol%5B%5D=wi&showCol%5B%5D=pf&showCol%5B%5D=oa&showCol%5B%5D=pt&showCol%5B%5D=bo&showCol%5B%5D=bp&showCol%5B%5D=jt&showCol%5B%5D=vl&showCol%5B%5D=wg&showCol%5B%5D=rc&showCol%5B%5D=wk&showCol%5B%5D=sk&showCol%5B%5D=aw&showCol%5B%5D=dw&showCol%5B%5D=ir](https://sofifa.com/?col=oa&sort=desc&showCol%5B%5D=ae&showCol%5B%5D=hi&showCol%5B%5D=wi&showCol%5B%5D=pf&showCol%5B%5D=oa&showCol%5B%5D=pt&showCol%5B%5D=bo&showCol%5B%5D=bp&showCol%5B%5D=jt&showCol%5B%5D=vl&showCol%5B%5D=wg&showCol%5B%5D=rc&showCol%5B%5D=wk&showCol%5B%5D=sk&showCol%5B%5D=aw&showCol%5B%5D=dw&showCol%5B%5D=ir)']
不要担心看起来杂乱的 url,它是通过选择我们希望在最终数据集中使用的某些列而生成的。
使用 Scrapy Shell 剖析 HTML
Scrapy shell 是一个有用的命令行工具,可以用来分析网页的结构,找出想要的 xpaths 和选择器。键入以下命令开始
scrapy shell "[https://sofifa.com/?col=oa&sort=desc&showCol%5B%5D=ae&showCol%5B%5D=hi&showCol%5B%5D=wi&showCol%5B%5D=pf&showCol%5B%5D=oa&showCol%5B%5D=pt&showCol%5B%5D=bo&showCol%5B%5D=bp&showCol%5B%5D=jt&showCol%5B%5D=vl&showCol%5B%5D=wg&showCol%5B%5D=rc&showCol%5B%5D=wk&showCol%5B%5D=sk&showCol%5B%5D=aw&showCol%5B%5D=dw&showCol%5B%5D=ir](https://sofifa.com/?col=oa&sort=desc&showCol%5B%5D=ae&showCol%5B%5D=hi&showCol%5B%5D=wi&showCol%5B%5D=pf&showCol%5B%5D=oa&showCol%5B%5D=pt&showCol%5B%5D=bo&showCol%5B%5D=bp&showCol%5B%5D=jt&showCol%5B%5D=vl&showCol%5B%5D=wg&showCol%5B%5D=rc&showCol%5B%5D=wk&showCol%5B%5D=sk&showCol%5B%5D=aw&showCol%5B%5D=dw&showCol%5B%5D=ir)"
你会看到大量的日志和消息。它们只是您项目的设置。上面的命令为我们做的是下载给定 url 的 HTML 内容,并且可以通过response
对象访问。要进行检查,请键入
response.url
你会看到
'[https://sofifa.com/?col=oa&sort=desc&showCol%5B%5D=ae&showCol%5B%5D=hi&showCol%5B%5D=wi&showCol%5B%5D=pf&showCol%5B%5D=oa&showCol%5B%5D=pt&showCol%5B%5D=bo&showCol%5B%5D=bp&showCol%5B%5D=jt&showCol%5B%5D=vl&showCol%5B%5D=wg&showCol%5B%5D=rc&showCol%5B%5D=wk&showCol%5B%5D=sk&showCol%5B%5D=aw&showCol%5B%5D=dw&showCol%5B%5D=ir'](https://sofifa.com/?col=oa&sort=desc&showCol%5B%5D=ae&showCol%5B%5D=hi&showCol%5B%5D=wi&showCol%5B%5D=pf&showCol%5B%5D=oa&showCol%5B%5D=pt&showCol%5B%5D=bo&showCol%5B%5D=bp&showCol%5B%5D=jt&showCol%5B%5D=vl&showCol%5B%5D=wg&showCol%5B%5D=rc&showCol%5B%5D=wk&showCol%5B%5D=sk&showCol%5B%5D=aw&showCol%5B%5D=dw&showCol%5B%5D=ir')
如果您想在浏览器中查看页面的外观,请键入
view(response)
您将能够在浏览器中查看该页面。
我们可以选择在 Scrapy 中使用 css 选择器和/或 xpath。如果您不熟悉 css 和 xpath 的概念,请查看这些教程以了解它是如何工作的。
- https://docs . scrapy . org/en/XPath-tutorial/topics/XPath-tutorial . html
- https://docs . scrapy . org/en/XPath-tutorial/topics/selectors . html
- 【https://www.guru99.com/xpath-selenium.html】
- http://scraping authority . com/2016/09/07/XPath-and-CSS-selectors/
现在让我们检查网页并获取数据。
我们可以看到所有的数据都在一个表标签里面,每个球员的信息都在tbody -> tr
里面。遍历所有 tr 标签将有助于我们接近数据。
for player in response.css('table>tbody>tr'):
print(player.css('td.col-name>div>a::attr(title)').extract())
这将同时打印出国家和玩家的名字。让我们试着理解这个片段。
table>tbody>tr
选择tbody
内的tr
标签,该标签在table
内response.css('table>tbody>tr')
返回选择器列表player.css('td.col-name>div>a::attr(title)')
选择带有类col-name
的第一个td
,类col-name
包含一个div
,其内部是一个a
标签。::attr(title)
提取你在 HTML 中看到的标题属性,分别是国家和玩家名字。
为了简单起见,让我们用一个玩家的数据测试所有东西,并在我们的脚本中使用它。所以在 shell 中,键入
player = response.css('table>tbody>tr')[0]country = player.css('td.col-name>div>a::attr(title)').extract()[0]
player = player.css('td.col-name>div>a::attr(title)').extract()[1]
positions = player.css('td.col-name span.pos ::text').extract()
遍历标签时使用>
和空格的区别在于
>
表示类似于td.col-name>div>a
中的直接子标签- 空格意味着任何子元素,不一定是直接子元素,比如在
td.col-name span.pos
中,中间包含一个a
标签。
我们来看看第一个位置,这是玩家的主要位置。
primary_position = player.css('td.col-name span.pos ::text').get()
extract()返回一个列表,而 get()或 extract_first()返回第一个元素
类似地,我们可以得到其他字段
age = player.css('td.col-ae ::text').get()
overall = player.css('td.col-oa ::text').get()
potential = player.css('td.col-oa ::text').get()
height = player.css('td.col-hi ::text').get()
value = player.css('td.col-vl ::text').get()
wage = player.css('td.col-wg ::text').get()
以此类推。
处理分页
滚动到页面底部,我们可以看到下一页链接。每个页面有 60 个玩家,这个网站上大约有 18K 个玩家。因此,我们需要获得分页链接并抓取数据,直到没有下一页的那一页,也就是最后一页。
response.css('div.pagination>a::attr(href)').get()
上面一行打印了一个不完整的 url,它是一个相对 url,这在现代网站中很常见。为了完成它,scrapy 提供了一个方法urljoin
。
response.urljoin(response.css('div.pagination>a::attr(href)').get())
这将打印完整的 url。现在点击下一页,尝试验证我们的 css 是否适用于所有页面。你会发现两个分页链接:上一页和下一页,我们使用的选择器将获得上一页链接。
**解决方案:**使用 Xpath。到目前为止,我们能够使用类来区分 web 元素,但情况并不总是如此。这两个分页链接之间的唯一区别是文本内容(上一页和下一页)。Xpath 允许我们根据文本内容精确地选择 web 元素。
response.xpath('//span[@class="bp3-button-text" and text()="Next"]/parent::a/@href').get()
让我们来分解一下:
//span[@class="bp3-button-text" and text()="Next"]
将选择等级为bp3-button-text
的跨度,然后输入文本**。**parent::a/@href
将遍历树并获取其父a
标签的 href 属性。
同样,我们可以使用response.urljoin
来完成 url。所以我们的代码应该是这样的。
next_page = response.xpath('//span[@class="bp3-button-text" and text()="Next"]/parent::a/@href').get()
if next_page:
yield Request(response.urljoin(next_page), callback=self.parse)
这是为了检查next_page
元素是否存在。然后,它通过加入 url 向该页面发送请求,并再次调用parse
方法。parse
是默认的回调函数,所以如果需要的话,您可以删除回调参数。现在,爬行器递归地爬行每个页面,同时产生数据。
这是我们最终代码的样子。
sofifa.py
执行蜘蛛
Scrapy 有一个内置功能,可以将数据直接转储到 json 或 csv 文件中。记住我们的SofifaSpider
类中的name
变量,我们将使用它来调用蜘蛛。
scrapy crawl sofifa - fifa20_data.csv
如果您想要 json 中的数据
scrapy crawl sofifa - fifa20_data.json
Scrapy 提供了许多现成的特性,使得编写 scrapers 和收集数据变得很容易。我们在这篇文章中看到了其中的一些。在 40 行代码下,我们设法创建了一个爬虫,它将在不到 30 分钟内抓取超过 18K 的数据。
您可以查看其他高级设置,如使用代理、添加延迟、更改并发请求等。
你可以从这个 github repo 下载代码和数据。
结论
每个数据科学项目都需要数据,而 web 是一个巨大的数据源。数据收集是任何数据科学项目的第一步,您的分析结果取决于您所拥有的数据的质量,或者简单地说就是垃圾进垃圾出。因此,如果我们花一些时间在无聊的部分,如收集、清理和准备上,而不是仅仅关注使用哪种模型或制作哪种可视化效果,我们可以改善最终结果。
接下来,我们将了解如何清理数据并为分析做好准备。
以下是一些你可能会觉得有用的学习材料:
- https://docs.scrapy.org/en/latest/intro/tutorial.html
- 【https://learn.scrapinghub.com/scrapy/
- http://scrapingauthority.com/
- https://www . data camp . com/community/tutorials/making-web-crawlers-scrapy-python
- https://www . analyticsvidhya . com/blog/2017/07/we B- scraping-in-python-using-scrapy/
- https://www . digital ocean . com/community/tutorials/how-to-crawl-a-web-page-with-scrapy-and-python-3
如果您在代码中有任何困惑,或者在推导 xpath 和 css 选择器时需要帮助,请告诉我。另外,如果你对如何在接下来的步骤中分析这些数据有任何建议,请在评论中告诉我。你也可以在推特上找到我。
人工智能符合营销细分模型
Flickr DesignAndTechnologyDepartment, Wikimedia BronHiggs, (CC BY 2.0)
新黄金标准:使用机器学习从行为数据中获得用户和产品细分,用于营销 STP 策略
细分、目标和定位(STP)是当今营销方法中常见的战略模式。这反映出以客户为中心的营销策略比产品差异化策略更受欢迎。例如,营销中以受众为中心的方法有助于向商业相关细分市场提供更具相关性和针对性的沟通。因此,STP 与营销角色密切相关。
[OC] (CC BY 4.0)
战略中细分的流行一方面源于 CRM 和 ad-tech 系统过去的局限性,另一方面源于 STP 过程中对人类决策的依赖。在数据驱动个性化兴起之前,大多数系统只能处理少量的细分市场,因此目标定位仅限于一般的受众细分。
[OC] (CC BY 4.0)
为了创建丰富而有意义的受众群体或营销人物角色,有大量的地理、人口、心理和行为数据可供选择。在我们创建人类可解释的分段的愿望中,我们倾向于
- 优先考虑地理、人口和心理数据,而不是使用行为数据
- 给我们的细分市场分配或多或少的离散标签。
(Pixabay)
这种在或多或少不相关的人物角色中的想法引起了市场商人和决策者的强烈共鸣,但最终是有缺陷的和有局限性的。仅举几个问题:
- 对于用户群来说,地理、人口和心理数据通常很少,而且质量参差不齐
- 严重依赖个人数据,限制越来越多,同意程度越来越低
- 这种角色很难扩展、更新和自动化
- 人物角色的不同特征没有相关的重要性或相关性权重
- 现实本质上是不确定和可变的——你的数据和你在其上构建的人物角色也是如此
一些重要的发展促使我们对目前如何进行细分进行了重大的反思:
- CRM 系统和 ad-tech 在处理倾向而非离散细分市场方面的进步
- 人工智能的进步和大数据的可用性,可以从大行为数据中间接提取地理、人口和心理信息。
新的黄金标准是行为数据
(Pixabay)
你可能听说过数据是新的石油,但这到底意味着什么呢?随着数据技术和机器学习的进步,数据科学家可以处理大量数据,以提取微妙的隐藏信号。这种支持数据的方法不仅开启了新的和创新的用例,而且有助于扩展和自动化它们。我们谈论的是哪种数据?特别是行为数据,比如来自你的电子商务网站或应用的点击流、事件和搜索数据。
您客户的不同地理、人口和心理属性对他们的需求和行为有微妙但明确的影响。因此,机器学习允许我们从行为数据中间接提取这些因素。
这种数据驱动的方法有明显的优势:
- 它可以轻松扩展到您的整个客户群——不再有缺失或不完整的数据
- 这完全基于你的第一方数据
- 它包含关于客户属性的相关性的信息。只有与您的产品和品牌相关的相关客户特征才会反映在细微的客户行为中,并以相应的信号强度记录在您的行为数据中。
- 它提供了机器可理解的编码特征,可用于许多其他机器学习问题,如聚类、预测和推荐系统。
有一个缺点:
- 你提取的所有客户属性都经过数学编码,机器可以理解,但人类无法直接理解。
这对市场商人来说可能是件大事,但这真的重要吗?不一定!它只需要改变我们理解和处理客户特征的方式。
- 您可以在不了解“ML 黑盒”本身的情况下对输出进行检测和质量保证。
- 您可以叠加额外的数据来推断人类的可解释性
- 您可以在不理解的情况下操作它,例如使用多臂土匪优化
动物园
在 Zoopla 上,每天大约有 150 万人搜索我们的房源并与之互动,每天产生大约 1000 万的页面浏览量。为了更好地了解这些人和他们的产品需求,Zoopla 自然会关注细分市场。在传统的细分方法中,我们会关注人物角色,比如租户、买家、卖家、房东等。但是房产阶梯并不是一目了然的:如果你正在购买一处房产,你可能会卖掉现有的房产来融资。这种房产链占了英国房产交易的大部分。在伦敦,租房者可能出于需要而租房,但他们也是拥有“先买后租”房产的房东。那些爱管闲事的人又如何呢?他们只是喜欢浏览所在街道的房产详情。与此同时,对于像 Zoopla 这样的房地产门户网站来说,这样的人物角色如何转化为不同的产品需求还不清楚。
从行为中分离
使用行为数据进行细分的第一步是将你的点击流转化为选择的相关维度及其值。找到这些维度的一个很好的方法是利用推荐引擎的数学,并将因子分解应用于用户-产品交互矩阵。如果你读过我之前关于推荐系统和协作过滤的文章,这被称为用户项目模型:
[OC] (CC BY 4.0)
目的是将历史矩阵分解为用户和产品特征,这可以预测我们的历史用户-产品交互。该历史矩阵可以是产品购买、用户评级或您企业的其他相关事件。
矩阵分解可以以不同的复杂程度进行,例如是否考虑用户和产品偏差。 Fast.ai 为协同过滤提供了一些有用的高层抽象。我们使用 SVD++ 作为我们的因子分解,其中包括针对项目 i 和用户 u 的偏差 b ,以及针对维度 f 的用户特征 U 和产品特征 P :
[OC]
在这个例子中,我们使用了 Zoopla 用户的样本数据集,以及他们对某些房产列表的参与度。分数描述了从 0 到 1 的意图度量,捕捉用户与 Zoopla 上的列表的交互深度(例如,页面时间、浏览的图像数量、查看的平面图、向代理发送线索等)。)如下:
[OC] (CC BY 4.0)
我们使用 Fast.ai 和 PyTorch 来训练我们的 SVD++模型:
import fastai.collab as fst_collabdatabunch = fst_collab.CollabDataBunch.from_df(
data, user_name=”userId”, item_name=”listingId”,
rating_name=”score”, valid_pct=0.25
)learner = fst_collab.collab_learner(
databunch, n_factors=10, y_range=(0.,1.)
)learner.fit_one_cycle(10, 1e-1)
learner.show_results()target, prediction = learner.get_preds()
[OC] (CC BY 4.0)
我们的模型学习了 10 个因素来描述 Zoopla 上的用户和房产列表。为了理解这些高维数据,我们可以使用 t-SNE 算法来聚类和可视化我们的数据。t-SNE 是一种随机 ML 算法,用于以可视化的方式降低维度,将相似的用户和列表聚集在一起。这也叫做邻居嵌入。
from sklearn.manifold import TSNEU_embedded = (
TSNE(n_components=2)
.fit_transform(learner.model.u_weight.weight.detach().numpy())
)ax = plt.scatter(
U_embedded[:,0], U_embedded[:,1],
c=learner.model.u_bias.weight.detach().numpy().flatten()
)
cb = plt.colorbar()
_ = ax.axes.set_title(“User Factors”)
_ = cb.set_label(“User Bias”)
[OC] (CC BY 4.0)
从那些情节中我们可以了解到一些有趣的定性见解:
- 房源的种类似乎高于用户的种类。
- 用户偏好比房产列表的偏好更对称,范围更广。更多的房产清单是负面的,而不是正面的。这与人们的观察相吻合,即 Zoopla 的许多待售清单不会产生很多线索。
- 用户分为三个主要群体。租房者彼此更加相似,普遍有积极的偏好,比因子分析预测的更关注房源。买家是最多样化的用户群,拥有更小的子群。浏览器会查看大量待售和待出租的房产列表,但不会深入地关注这些列表,从而导致负面偏见。
- 房产列表显示了一个主要由租赁列表组成的具有正偏差的集群。许多租赁房源吸引的参与度似乎比它们的因子分析预测的要高。造成这种积极偏向的因素包括英国的住房危机、可负担性和地理位置。第二类主要是待售房产,偏向中性。这些房产列表比剩余的“冷”列表彼此更相似,显示出负面偏见。
你可以在我的后续文章中了解使用深度学习和 Tensorflow 的替代方法:
如何使用深度学习来发现客户的偏好,并了解您的产品库存
towardsdatascience.com](/customer-preferences-in-the-age-of-the-platform-business-with-the-help-of-ai-98b0eabf42d9)
memegenerator.net (fair use)
但是营销想更深入!
对于高维数据,T-SNE 是一种有用的可视化技术,但我们从像这样的邻居嵌入中获得的定量信息是有限的。如何从高维因素中提取洞察力取决于您的使用案例和行业。
地理信息:房地产市场非常本地化,我们的用户和房地产特征包含地理信息并不奇怪。房产列表有相关的位置数据,用户可以在 Zoopla 上搜索地理区域。让我们按照最频繁的 Zoopla 搜索的外部代码对属性列表和用户进行分组。然后,我们可以通过外码(如 SE1)查看因子分解中 10 个因子的方差。假设编码地理信息的因素在一个外码中比其他类型的因素显示出较少的变化。
[OC] (CC BY 4.0)
因子 0、2 和 5 似乎编码了地理信息。不足为奇的是,用户因素显示了这些因素的更大的标准偏差:用户在多个位置进行搜索,但我们只根据他们最频繁的搜索对他们进行了汇总。与用户相反,房产列表具有明确的位置,因此地理因素的预期标准偏差较低。该地图显示了与全英国人口中心相关的外码平均用户系数 u_0。但这个因素也凸显了一个重要的观点:它编码了地理信息和人口统计信息,比如租房者和买房者。
[OC] (CC BY 4.0)
在传统的细分方法中,我们独立处理的许多维度实际上是强相关的,我们的因子分解产生了衍生的混合地理、人口和心理信息的维度。例如,在我们的用户-物业分解中,物业的价格、卧室数量以及一些地理信息被编码到一些派生的本地化的可支付性指标中。
[OC] (CC BY 4.0)
不同地区的房价承受能力存在有趣的差异:
- 不出所料,伦敦中南部的房产和河以北一样难以承受,但河以南的房租更容易承受。
- 罗姆福德地区的房价非常便宜,但相比之下,在罗姆福德租房的人负担不起房租。它显示了本地化市场的程度,以及该模型的可负担性指标不是一个绝对的衡量标准,因为它是从本地化的用户资产分解中得出的。
- 相反,希思罗机场地区买房比租房便宜。
局限性和一些关于数据伦理的话
技术 : SVD++和所有协同过滤模型一样,都有一个冷启动的问题。Zoopla 上的新属性和人必须接收/产生一定程度的交互才能被包括在细分中。这也意味着,要向模型中添加新的属性或用户,我们必须重新运行分解。对于 Zoopla 高度动态的房地产目录来说,这比传统的电子商务业务更成问题。
你可以在我的后续文章中读到使用 Tensorflow 的深度神经网络的替代实现,它没有冷启动问题:
如何使用深度学习来发现客户的偏好,并了解您的产品库存
towardsdatascience.com](/customer-preferences-in-the-age-of-the-platform-business-with-the-help-of-ai-98b0eabf42d9)
伦理:这篇博文展示了可以通过机器学习提取的行为数据有多丰富,信号有多详细。但是这样做道德吗?在人们没有明确给我们任何数据的情况下,我们推导出了的详细信号。一方面,这意味着它不一定对用户透明。另一方面,如果我们得出的用户或财产的属性是不正确的,那么更正可能需要无意中披露更多的数据。
读完这篇博文后,你可能不会马上明白为什么这很重要。毕竟,我只提出了定性的见解,主要是在一个汇总的区域级别,以告知一般的 STP 策略。这显然是合乎道德的,并且有助于改善我们的产品和服务。
但我们关注的一个信号是一些派生的可负担性。在分解模型中,此数据存在于酒店和用户级别。把它从一个聚集的领域降低到财产层面,似乎仍然是合乎道德的。我们确实一直在谈论房产的可负担性。但是把它降低到个人 用户级别怎么样?理论上,我们可以告诉代理我们对您发送的销售线索的可承受性的看法。如果这让你感到不舒服,让你想起 DSS(住房福利)歧视,那么你是对的。在这种情况下使用这个数据点会让人立即感到不道德。
作为数据科学家,我们有责任不仅在我们训练的模型的背景下,而且在这些模型可能实现的用例中思考数据伦理。我们应该只使用数据,建立符合比例的模型(T21)。将这一点纳入我们的分解模型的一个方法是我们得到的信号的数量。我在另一篇博文中训练的地理区域嵌入包含 50 个信号。但是用户属性交互的分解我故意限制为 10 个信号,限制了我提取的细节层次。
© https://dilbert.com/strip/2010-10-13, (personal use)
这是一个非常肤浅和高层次的数据伦理讨论,仅仅是为了强调使用数据时的责任。每个数据科学家都应该理解并应用数据伦理框架:https://www . gov . uk/government/publications/Data-Ethics-Framework
我不是专家,但你也可以阅读我关于偏见和算法公平的文章,以了解更多关于这个问题和缓解策略的信息:
现代商业领袖在由数据统治的勇敢新世界中的新责任。
towardsdatascience.com](/bias-and-algorithmic-fairness-10f0805edc2b)
Jan 是公司数据转型方面的成功思想领袖和顾问,拥有将数据科学大规模应用于商业生产的记录。他最近被 dataIQ 评为英国 100 位最具影响力的数据和分析从业者之一。
【https://www.linkedin.com/in/janteichmann/】在领英上连接:
****阅读其他文章:https://medium.com/@jan.teichmann
数据科学实践 101:永远留下分析文件线索
它会救你一命。很多。
Bunny… things from Hokkaido.
对于大多数数据科学家来说,即席分析请求是不争的事实。即使你的主要角色是做高层次的建模/产品开发,你总会做很多小的分析,无论是为你自己还是为别人做一个大项目的基础。
在这样的环境中,很容易得到一大堆分析输出,它们漂浮在一个几乎没有上下文的永久“临时”目录中。“不值得检入的快速小东西”你说,“数据从哪里来很明显”。我明白,这是常有的事,我自己也说过无数次了。从来没有好结果。
忙碌的数据科学家要做什么?不管现在听起来工作有多忙,你都需要留下书面记录,可以清晰地追踪到原始数据。不可避免地,有人会希望你重新运行 6 个月前完成的分析,以便他们可以更新报告。或者有人会伸出手来问你,你对“活跃用户”的具体定义是否恰好包括戴绿帽子的人。除非你有完美的记忆力,否则你不会记得细节,必须去寻找答案。
TL;DR:任何可交付的分析都应该始终带有文档,以显示分析的完整路径,从原始数据一直到交付,包括查询和代码,以及到以前的分析和原始数据转储的链接(如果可行的话)。
分析应该是独立的
在学术界,当发表一篇论文时,我们被训练引用我们的来源,展示我们的推理,并(理想地)记录我们的方法,足以让第三方复制我们的工作和结果。在编写代码时,我们(再次强调,理想情况下)应该编写足够清晰的代码,并辅以注释和文档,让其他人(包括你未来的自己)在审查你的代码时能够理解发生了什么。决定性的特征是最终的可交付成果,无论是签入的代码还是发表的论文,都与文档打包在一起。他们一起生活,一起消费。
这通常不会发生在一个可交付的分析中!
分析可交付成果通常与用来生成它的东西分离开来。结果以幻灯片、电视屏幕上的仪表板、粘贴到电子邮件中的图表、面向高管的联合演示中的单张幻灯片的形式发送出去,或者只是在某处的文件结构中四处浮动的随机 CSV 转储。可交付成果和源代码之间的耦合是不存在的,除非我们有意识地做些什么。
Package all the things!
但是我已经将我的 SQL/代码签入 git 了!
当然,对你来说很好。但是当有人指着你 6 个月前分享的一张图表问“你在这张图表中排除了内部用户吗?”会有答案吗?如果没有,您是否能够利用该图表并追溯到为其生成数据的数据查询/ETL 来回答这个问题?不将大型数据集签入 git repo 通常是最佳实践,因此在签入的代码和产生的数据制品之间总是存在脱节。
这不是一个关于“某处”是否有记录的问题,而是在需要时,在提出问题的任何时间和地点,在几秒钟内是否可以随时获取记录的问题。
开门见山,有哪些示例解决方案?
这里有一个不完整的列表,列出了把东西放在一起的方法。使用对所有利益相关者来说最自然的方式。
- Excel 文件:为你的原始数据转储制作一个标签,一个标签用于查询,一个标签用于分析。如果有些东西太大,放不下,就放上链接/参考。
- CSV 文件:无论如何,你会想压缩你的数据用于发送/存档,tar/zip/bz2/xz 用你的 query.sql 文件,任何处理代码,等等。
- 幻灯片组:取决于观众和论坛,幻灯片本身的引用,或带有分析计算/文档链接的附录幻灯片,或演讲者笔记中链接的文档
- 仪表盘:棘手的,如果可行的话,UI 上的链接,或者隐藏在生成特定仪表盘元素的代码中的注释/链接。
- 电子邮件报告:提供更详细来源的链接,或相关数据的参考。
- Jupyter/colab 笔记本:文档应该被编入代码和笔记本本身,这些文本/html 块是有原因的。
- 生产模型:代码注释和/或链接,指向模型所在的原始分析,或者至少是生成任何参数的分析。
我还应该做什么?
记录文件日期— 大多数分析,尤其是临时分析,都与时间相关—季度董事会议、新功能发布等。2017 年的东西在 2019 年通常不太相关。当所有的上下文都丢失了,但是有人可以在交付物发出的时候产生一封电子邮件通知,你就有了一个可以去寻找的日期。
My personal habit of dating analysis and deliverable files
**无论何时运行查询,都可以得到相同的结果。**通常情况下,很容易进行“提取所有内容”或“最近 7 天”的查询,但它们的一个缺陷是,数据会根据您运行查询的时间而变化,甚至是在 10 分钟之后。这使得不修改查询就无法再现查询结果,这可能是不希望的。
在某些情况下,使用动态时间窗口进行查询很有意义,而在其他情况下则不然。在做决定时,要意识到你潜在的未来用例(人们会要求你用更新的数据重新运行它,等等)。
外面的世界很混乱。试着在你自己的小范围内保持有组织性。
数据科学生产:维护
DS 生产化
花费在可维护性上的时间减少了实际维护的时间。
这是关于数据科学生产的五部分系列的第三部分:
在上一篇文章中,我使用了一个简单的单词规范化函数来说明代码可移植性的一些原则:
现在让我们看一下同样的功能,但这次是优先维护:
第一部分甚至不包括函数本身。我在这里建立的是日志基础设施。我已经指定了一个记录错误的文件(名为“error.log ”),并设置了每当出现错误时在该文件中打印什么单词的规则。通常,日志记录比引发完整错误更可取,因为它允许系统的其余部分即使在出错时也能继续运行。停机时间往往比错误或缺口更具破坏性。还要注意,我添加了注释(以散列符号开头的行)来解释日志设置的每个部分是做什么的。
然后我们到了函数定义(以‘def’开头的那一行,但是在这一点上还是没有实际的代码。这部分被称为“文档串”。它解释了函数的目的、预期输入和预期输出。
现在我们来看函数内容。首先,我们有一个“断言”语句。这种说法是一种考验。如果“word”输入不是一个字符串,那么后续的代码都将不起作用,所以这个测试检查以确保输入是一个有效的类型,如果不是,就抛出一个错误。之后,您可以看到该函数的实际代码,但是我已经将它们都包装在一个“try”语句中了。这条语句首先尝试运行我们最初编写的所有代码。如果有一个系统退出错误或键盘中断错误(这两个问题都来自函数之外),函数会告诉我。任何其他错误,该函数在日志文件中打印错误。这样,我就可以监视日志文件,查看发生的任何错误,并获得帮助我调试错误的信息。
最基本的,可维护性是关于日志、警报和测试的。令人高兴的是,这些东西通常是编程语言的内置组件。不幸的是,设置它们真的很无聊,而且经常被搁置。它们需要额外的几分钟甚至几个小时来设置,但是一旦设置好,它们可以为您节省几个小时甚至几天的时间来识别问题。
当我们从特定的代码中抽离出来,考虑整个代码系统的可维护性时,我们不再仅仅谈论文档字符串和日志基础设施(尽管这些东西很重要)。文档是企业确保其数据科学能力可维护性的主要非代码方式。这是每个人都说你应该做的其他事情之一,但是很少有人真的去做。我认为这是因为人们通常不知道文档提供了什么价值。有不同种类的文档,每一种都有不同的用途:
技术文件
技术文档应该允许一个以前不熟悉代码的有能力的程序员编写新的代码,这些代码将实质上再现原始代码的结果。我说“实质性地”复制是因为精确的复制通常依赖于实现的微小细节——这些细节只能在代码本身中找到。标准技术文档可以分为以下几类:
- 背景。这是产品背后的动机——它试图解决的一般业务问题。它可能还包括产品的目标(和非目标——我稍后会详细介绍)。
- 设计。这是文档中最长的部分。它一步一步地列出了产品的组成部分。它确定了所有要用作输入的数据源,强调了对其他产品的依赖性,定义了将用于处理数据的模型、算法或程序。标记这些过程的配置与标准实践或程序包默认设置的任何不同之处。在这些部分中,流程图会有所帮助。代码片段通常也很有帮助。
- 结果。本节定义了衡量产品性能的具体指标。这可能是显示模型准确性的误差分布或混淆矩阵;它可能是按客户、地区或其他类别细分的结果。这一部分本质上是在论证你的产品做了它应该做的事情。
- 开放式问题。这可能会突出产品中的弱点或它所带来的风险,比如安全性缺陷或不适合的用例。未解决的设计或实现问题,以及改进产品的方法应该在这里列出,这些方法很值得探索,但还不够紧迫,不能马上解决。
非技术文件
非技术文档应该允许非技术用户理解产品在公司提供的更大的生态系统中的位置,不仅理解产品的优点和局限性,而且在高层次上理解为什么这些优点和局限性存在。非技术文档可以分为以下几类:
- 商业背景。这应该简要描述为什么企业应该期望从产品中发现价值。
- 目标。这是产品应该实现的具体结果的列表。这些都应该是可以明确评估的事情——在产品运行一段时间后,您应该能够回顾每个目标,并询问它是否已经完成。
- 非目标。这是产品不打算完成的事情的列表。这是文档的一个重要方面,它定义了产品的范围。
- 注意事项。这应该是一个非常诚实的列表,列出了产品没有做的事情,或者没有尽可能做好的事情。利益相关者在与外部客户交流时,可能会软化列表中的语言,但是总应该有一个地方可以坦率地讨论产品的弱点,而不是罗列出来。
- **解释/使用指南。**这将为非技术用户提供建议,帮助他们了解如何负责任地使用产品输出。这可能包括解释指标的指导方针(例如,什么构成“高”分,什么构成“低”分?),以及在利益相关方对结果不满意时可以要求的设置更改。
非技术文档尤其重要,因为你必须像维护产品本身一样维护用户对产品的参与。只关注技术维护就像建了一座漂亮的房子,却从来没有人住在里面。
一个个人的例子
当我为一个大型特许学校网络组建数据科学团队时,最迫切的业务需求是使用大量不同类型的数据创建学生表现的汇总评估。在我们的每一门核心课程中——英语语言艺术、数学和科学——学生每两到三周接受一次评估,每次评估有 1 到 40 个问题。评估形式从简单的多项选择考试到监考阅读考试不等,在监考阅读考试中,学生大声朗读,教师对他们的流利程度进行评分。每隔几周,一群学校管理人员、内容创建者和教师就会聚在一起,审查分数的电子表格,并就数据的意义展开争论。这是一个学校的电子表格,针对一项评估:
每行是一名学生,每列是一个问题—黄色单元格表示学生在某个问题上的表现低于预期。想象几十个这样的电子表格。现在想象一下,试着回答一个表面上看起来很简单的问题:哪些学生最需要我们的帮助?
当我来到特许学校网络的工作岗位时,我花了至少一周的时间来回答这个问题。管理员会争论一个月前的评估有多相关。老师们会说,最近评估中的第 2 题和第 15 题写得很差,因此没有很好地解读学生的表现。这是我的团队需要应对的挑战。
我们的主要数据科学产品是一种算法,它将这一过程从一周和一个委员会减少到几秒钟内可获得的自动结果。我们通过对每个问题进行评分来区分历史表现差的和历史表现好的。所以,当看个人评估中的个别问题时,如果一年中历史上该科目大多数问题不及格的学生答对了,而历史上该科目大多数问题答对的学生答错了,这意味着该特定问题的结构可能很差。设计糟糕的问题对整体分数的影响应该较小,因为学生不应该因为老师和管理者的错误而受到惩罚。
一旦我们对每个问题进行了评分,我们就可以对几个月的工作进行平均,用问题质量分数对平均值进行加权。我们还加入了指数衰减,使得最近的数据更重要。所有这些使我们能够创建支持这些可视化的数据产品:
每张图代表一所学校,每个点代表一个学生。学生横向从当前最低成绩到当前最高成绩,纵向从一年中成绩下降最多到成绩增加最多。最暗的点是那些处于最大困境的学生——他们的表现很差,并且在下降。橙色圆点最深的是成绩好,成长中的学生。
学校网络管理员可以使用这样的摘要来快速比较学校,并查看它们彼此之间的表现。个别学校领导可以利用这一点来快速识别需要更多帮助或需要更多挑战的学生。
成功采用该产品的最大因素是支持它的非技术性文档。为了让学校领导使用这个工具,我们需要对我们如何计算问题质量分数进行广泛的解释。我们还需要非常详细地阐明算法提供信息的情况。例如,该算法的目的是帮助资源分配——教育工作者一天只有这么多时间,所以我们希望他们将尽可能多的时间花在最需要的学生身上。学校里表现最差的学生仍然可能超过政府规定的表现标准。该算法并不关心这个——它只关心那些学生比他们的同龄人获得的教育收益少。
随着时间的推移,我们必须构建非技术文档来解决关于原始文档的目的和范围的新问题。有一次,几个学校领导来找我,他们认为这是算法中的一个错误。他们拿出了他们的电子表格,显示一些在我们的英语语言艺术表现指数中得分很低的学生实际上在许多 ELA 个人评估中得分很高。当我们深入研究这个问题时,我们发现他们确实在许多评估上得了高分——所有的每周拼写测试。他们的核心读写能力评估得分很低。该算法能够识别出,与能够有意义地解读文本相比,能够记忆单词是一种不太可靠的表现衡量标准。我们记录的越多,这个工具就被越广泛地采用,我们希望,我们能够给学生带来更多的好处。
该系统需要的技术文档和非技术文档一样多。随着对该工具需求的增加,我们不得不改变存储和检索底层数据的方式。在某一点上,来自教育者的反馈使我们确信我们在时间衰减权重上设置了错误的半衰期,所以我们需要进去修改它。我们在使用该算法的第二年发现,在学年开始时,由于没有足够的数据,在评估不太重的科目中,它给出了无意义的结果。所有这些都需要被整理(换句话说,使之可移植),但也需要被记录下来,这样我们未来的自己就可以在不破坏系统的情况下修改它。
花费在可维护性上的时间减少了实际维护的时间。如果我们在构建时没有考虑到未来的维护,那么随着时间的推移,我们构建新东西的能力会变得更弱,因为我们必须花费所有的时间来保持旧东西的运行。