TowardsDataScience 博客中文翻译 2020(二百二十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

利用深度学习识别狗的品种

原文:https://towardsdatascience.com/computer-vision-part-2-8e07029955ee?source=collection_archive---------50-----------------------

继续我们关于计算机视觉的讨论(关于该领域的详细介绍,请参见这篇文章)我们将建立一个深度学习模型,根据狗的图像将狗分类到 120 个品种中的一个。为此,我们将使用谷歌的tensor flowPython 平台。

卷积神经网络:蓝图

在我们建立实际的模型之前,有必要讨论一下卷积神经网络的构建模块。每个模型都是由几个堆叠在一起的“层”组成的,每一层都有特定的功能。我将在下面简要讨论最重要的层的直觉,但是有许多资源提供了关于这些层如何工作以及如何针对特定任务对它们进行微调的更详细的文档(我将从来自 Keras 的官方文档开始)。

  • 卷积层 卷积层用于从图像中提取特征,正如本系列第 1 部分所讨论的。我们通过指定要从图像中提取多少特征以及要使用的卷积矩阵的大小来设置卷积层。我们不需要告诉模型提取哪些特征:例如,我们不需要告诉它检测边缘和轮廓——模型“学习”这一点,因为它被给予数据进行训练。
  • 汇集层
    汇集层用于通过“汇总”图像特定片段中包含的信息来减少数据的维度。这方面的一个例子是,通过用最大值表示每个线段(我们也可以选择平均值而不是最大值),将 44 的网格缩减为 22 的网格。池化有两个目的,一是减少维度,二是使模型对要素的确切位置不太敏感,这是我们所希望的,因为我们希望模型能够识别出一个要素,即使它稍微偏于其参考位置的左侧或右侧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最大池:作者图片

  • 密集层 密集层由固定数量的“神经元”或细胞组成,它们从卷积层(在 CNN 的情况下)获取一维输入,并对其进行处理以供进一步使用——这些层的输出要么被前馈到其他密集层,要么用于预测最终输出。例如,如果我们有一个从图像中提取 64 个特征的卷积层,我们希望使用这些特征来达到我们的预测。我们可以将此信息传递给密集层,例如 16 个节点。密集层中的每个节点都完全连接到卷积层,即它从所有 64 个特征中收集信息。然后,每个节点将一组不同的权重应用于来自每个特征的输入,并得出一个“分数”,该分数随后被提供给其他密集层或用于预测结果。
  • 展平和删除层 卷积层返回 2D 输出(因为图像被处理为 2D 网格),但我们的密集层只接受 1D 输入。为了允许这些层进行通信,我们需要将这些信息从 2D“扁平化”到 1D。我们可以通过使用“全局池”来做到这一点,即通过用单个概要图来表示整个图像,或者通过使用“展平”层。
    删除层用于防止模型过度拟合数据。例如,丢失率为 30%的层将告诉模型每次随机忽略前一层的 30%的节点。这意味着,当 30%的节点将被随机忽略时,模型必须很好地“概括”以给出准确的输出。

过度拟合与欠拟合的快速说明 理解过度拟合和欠拟合的最佳方式是使用类比。让我们想象一下,我们有三个学生正在准备考试。a 的准备包括记忆课程材料,B 花了时间去理解概念,而 C 根本懒得准备。“过拟合”模型就像一个——它“记忆”它所训练的数据集的特征。我们不希望模型过度拟合的原因是,当我们实际上想要对它没有见过的数据使用模型时,它将表现不佳(就像在要求应用他应该已经学习过的概念的考试中一样)。“欠适应”模型就像 C——它没有学习训练数据的特征,我们显然不希望这样。理想的模型就像 B——它从我们训练它的数据中学习,但能够概括这个数据集的特征,并仍然对新数据做出准确的预测。

通常,我们会在同一个模型中使用几个卷积层和密集层。一个简单的结构可能如下所示:

简单的模型结构

数据

我们将使用 10,000 多张属于 120 个品种的狗的图像数据集。数据集在这里可用。我们将把这个数据集的大部分交给模型来训练它,然后看看它能够在剩余的图像上预测品种的准确程度,这是它以前没有见过的。随机猜测正确品种的概率约为 1/120——让我们看看我们的模型表现如何。

数据扩充

对于大多数计算机视觉问题,增加数据集通常是个好主意。我们获取现有的图像,然后在一些设定的参数内随机变换它们。例如,我们可以将图像旋转多达 30 度,将图像的亮度增加和减少多达 20%,增加图像的缩放等。这做了两件事——它增加了我们必须处理的数据量,它有助于确保模型仍然可以识别(在这种情况下)狗的品种,即使图像略有移动。这有明显的优势,因为我们遇到的每一张新图像都不会有完全相同的缩放、亮度等。

为了说明这一点,让我们见见黑兹尔。她是一只可卡犬,不属于用于训练或测试模型的数据集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

原图:作者

现在,让我们“放大”这张图片,创建 15 张图片,每张图片都略有不同。输出如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

增强图像:作者

模型

现在考虑到问题的复杂性(我们必须区分 120 个品种,其中许多看起来很像),像前面描述的简单模型不太可能胜任这项任务。我们可能想要一个更深的模型,有更多的层次。选择正确的模型结构的过程必然涉及大量的试验和错误。幸运的是,有一些“预训练”模型可供使用,这些模型已经被训练(当然是在不同的数据集上)来分类多达 1000 个类别。我们可以使用这些模型,重新训练数据集上的所有或部分图层,并观察其表现如何。这就是所谓的“迁移学习”。

在这里,我使用了 DenseNet 121 模型(它有 121 层和超过 800 万个参数!).我用一个有 120 个节点的密集层替换了最后一个有 1000 个节点的密集层(因为原始模型是在一个有 1000 个类的数据集上训练的,而我们只有 120 个品种),并且只重新训练了模型的最后 11 层。

模型架构在他们的论文中有详细描述,摘录如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

DenseNet 架构:摘自上述 DenseNet 论文

作为 Keras 库的一部分,所有可用的预训练模型的详细信息可在此处找到。

寻找“引擎盖下”

由于其复杂性,神经网络通常是一个“黑箱”。因此,在展示代码和模型性能之前,尝试并可视化模型在最终预测的不同步骤中“看到”的内容是一个好主意。

最终的模型有 120 个卷积层(每个卷积层从图像中提取几个特征)和一个密集层。虽然看到每个图像经历的所有卷积的结果是不实际的,但我使用 Hazel 的图像作为例子,并在下面展示了最终(训练)模型的不同层生成的 3 个“卷积”图像。这将允许我们看到模型所看到的内容(即使它只是模型用来进行预测的全部信息的一小部分)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看 CNN 的“引擎盖下”:作者图片

正如我们所看到的,在前几层提取的特征对我们来说可能仍然是可识别的,但当模型到达第 27 层(120 层)卷积层时,最终的图像基本上是人眼无法识别的。(重要的是要明白,我们没有告诉 CNN 要寻找什么样的特征,这是它自己学会的。)
最后一行显示了最终的一组图像(注意,这是一个 77 的像素网格,每个像素用不同的颜色来表征),然后将这些图像“展平”,并传递到密集层上进行预测。这意味着该模型达到了它的预测,即图像显示的 120 种狗中的哪一种是基于一堆 77 的图像,我们甚至不能再将这些图像与原始图像联系起来。虽然这对我们来说看起来像是胡言乱语,但 CNN 经过仔细校准,可以识别这些“点”中复杂的模式,帮助它做出预测。

模型性能

该模型在测试数据集中的准确率约为 75%(请记住,这些图像不是该模型训练的图像)。虽然可以通过调整一些参数和重新训练原始 DenseNet 模型的更多层来提高性能,但考虑到随机猜测正确品种的概率小于 1%,并且许多狗品种看起来彼此非常相似,这已经是很好的了。

至于预测黑兹尔属于哪个品种,这个模型是这么说的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

密码

计算 Ansys 动力学模型的质量特性

原文:https://towardsdatascience.com/computing-mass-properties-of-ansys-dynamic-models-f0d8dacb2d7c?source=collection_archive---------19-----------------------

使用 MAPDL 命令计算任意坐标系质量特性的方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

群众要紧!(鸣谢: xibarodays 上 Pixaby)

Ansys 是一个商用有限元分析(FEA)软件包。虽然 Ansys 已经获得并集成了许多不同的分析工具,但是它的隐式结构包是健壮的并且得到了很好的支持。Ansys 的隐式结构求解器的一个独特功能是能够使用简单的逗号分隔的 MAPDL 命令编写命令。无论是使用 Ansys 经典接口还是通过 Workbench 接口使用现代 Ansys Mechanical,MAPDL 对于预处理模型和/或后处理结果都非常有用。本文介绍了一些 MAPDL 命令,用于提取关于用户定义坐标系的模型整体或部分的质量属性。

执行动态有限元分析时,验证质量是一个重要步骤。毕竟这是等式的一半!对于三维实体模型,质量是非常微不足道的。但是,在动态模型中,元件通常表示为壳、梁和/或弹簧。此外,动态模型通常包含非结构质量,如SURF154表面元素和点质量元素。验证质量可能变得不简单。

在切换到 Ansys Mechanical 之前的黑暗时代,我会严重依赖 MAPDL 文本文件来定义所有的材料属性和元素类型数据。我会尝试对这些属性进行分组或者控制它们的编号(通常在电子表格中),这样我就可以根据我的意图检查 solve.out 文件中的元素类型批量输出列表。如果动态表示与组件质量(通常从 CAD 获得)不匹配,我会将“质量系数”应用于密度,然后冲洗并重复,直到单个元素类型质量和总质量与预期值匹配。虽然这种方法有效,但有点麻烦,而且没有给我我有时想要的良好控制。

我现在几乎只使用 Ansys 机械应用程序进行预处理。在 Mechanical 中,你可以点击单个物体,从属性窗口中获得质量(无需求解!)或使用选择工具获取多个选定实体的体量,非结构体量的存在会带来一些挑战。使用 Ansys Mechanical,我们放弃了属性编号控制,以换取一系列易于使用的功能。您可以使用选择工具获得一些有限的信息,但同样,我们错过了非结构质量和惯性质量属性。

这些年来,我从谢尔登·今冈的/合作解决方案、nsys.net 以及 PADT 主办的 xansys 论坛(看起来并不活跃)中得到一些提示。因此,站在巨人的肩膀上,我创建了一个锅炉板 MAPDL 脚本,它使用组件对模型的各个部分进行分组,并写出一个 csv 摘要文件,然后我可以将它复制/粘贴到电子表格中进行额外的验证。它提供的主要优势是:

  • 使用组件对模型的任意部分进行分组
  • 获取任意坐标系的部分模型质量属性(包括转动惯量)
  • 专门用于质量属性摘要的格式化输出文件

这里有一个 github 存储库,它包含了几个版本的 MAPDL 脚本文件和一个包含它们的示例工作台项目档案。让我们来看看重要的部分!

关于用户定义坐标系的模型的质量属性

虽然我们可以将模型转换到感兴趣的坐标系,运行分析,并从solve.out文件中读取属性,但这并不总是理想的。注意:我们不能使用CSYSRSYS命令来强制 Ansys 分析不同坐标系的质量。

这里有一个脚本,它计算关于用户定义的坐标系的整个模型的质量属性。我们走一遍吧!

在上面的部分中,我们确保用ALLSEL选择了一切,然后将我们的坐标系 id 分配给cs_mass参数。my_cs如果使用手动编号控制(或 Ansys Classic ),可以是一个整数,也可以是坐标系属性卡上定义的“APDL 名称”。我们*GET坐标系的位置和欧拉角。注意变量替换语法(%var_name%)的使用将在执行时用变量值填充字符串或命令的该部分。这在这里并不重要,但以后会有帮助。

在下一节中,我们进入/sol模块并运行魔法命令(IRLF、& PSOLVE),这些命令形成元素矩阵,因此我们可以获得质量属性,但不会运行模型的完整解。同样,这对于整个模型的质量属性来说并不完全必要,但是我们稍后会用到它。

现在我们开始一些计算!在上面的部分中,我们将惯性属性从重心(CG)转换到坐标系的位置。然后,我们创建一个 APDL 2D 数组,并将其填充为惯性张量。

在这里,我们建立转换矩阵,并将其分配给一个 APDL 2D 数组。

现在来看一些有趣的东西。为了将一些线性代数命令用于矩阵乘法,我们需要将 APDL 数组移到“APDL 数学”空间。我们用*DMAT命令来做这件事。在“APDL 数学”中,我们用适当的转置执行矩阵乘法,最后用*EXPORT命令将结果从 APDL 数学空间复制回 APDL。接下来,我们将质量属性分配给以my_开头的变量,这是默认前缀,Mechanical 会查找该前缀以将参数值打印到命令片段属性卡。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于从全局 CS 旋转的 CS 计算质量属性

关于唯一坐标系的多个分量的质量性质

虽然获得整个模型在任意坐标系下的质量属性很好,但这并不是特别有用。这里,我们将扩展上面的命令,向一些数组添加组件,定义一个*DO循环,并使用*VWRITE命令将格式化的输出写入一个文本文件。这是基于组件的质量属性的完整文件,我将在下面一一介绍。

首先,我们开始将模型分成我们想要计算质量属性的部分。如果使用 Ansys Mechanical 应用程序*,命名选择将作为具有相同名称组件发送到解算器。一个警告是,Mechanical 允许命名选择的名称中有空格,但解算器不允许。最好在 N 个命名选择的名称中避免空格。组件可以包含节点或元素,但不能同时包含两者。对于质量属性,我们希望使用基于元素的组件。通常,当选择模型的任何部分作为质量属性时,我们还希望这些实体上有非结构质量。Ansys 使用与底层结构元素共享相同节点的SURF154元素添加分布式非结构质量,但不添加任何刚度。我认为这比将非结构性体量与一处房产捆绑在一起要灵活得多。下面的代码片段确保 C 组件中的元素节点上的任何SURF154元素都被添加到 C 组件中。对于每个命名的选择,它可以重复。*

cmsel,s,my_named_selection
nsle,s 
esln,1 
cm,my_named_selection,elem

以类似的方式,我们可以通过使用远程点上的 P ilot 节点 APDL 名称属性,创建一个附加到远程点点质量*元素的组件。*下面我们创建一个组件,它包括单节点质量元素,通过选择连接到远程点的引导节点的所有元素,这些元素完全由该节点定义。

nsel,s,node,,my_rp_name
esln,1
cm,my_pm_component,elem

现在,我们已经根据需要创建并扩充了所有构件,以包括非结构体量元素,我们可以继续下一步。下面的命令设置我们将用于文件名的 f_name 参数,并初始化两个数组。一个数组用于组件名称字符串,另一个数组用于分配给坐标系 id 的变量字符串。这样,我可以保持大部分脚本的通用性,并在每次使用时修改这个数组。

接下来,我初始化输出文件。%_wb_userfiles_dir(1)%被替换为工作台项目目录中项目 user_files 文件夹的绝对路径,而%f_name% 被替换为上面我们分配给f_name参数的字符串。然后,我使用*VWRITE将标题写入文件。我初始化了一个临时输出数组outVars,并告诉 Ansys 使用一个新的文件名来将这个输出与结构分析输出分开。

接下来,我们进入组件循环,与总模型情况一样,我们从获取该组件坐标系的属性(位置和角度)开始。唯一的区别是使用了%css(1,j)%来获取参数值,该参数值是使用变量的名称和坐标系 ID 作为值来分配的。然后,我们只选择感兴趣的组件中的元素和相关的节点,并发出IRLFPSOLVE命令。这些命令的美妙之处在于,Ansys 不必执行完整的求解来获得每个组件的质量属性。

下一组命令与通过*EXPORT 命令将惯性张量从重心转换到坐标系的总模型情况完全相同,此时我们将旋转张量带回 APDL 2D 阵列。唯一的区别是我们在圈内。这里就不赘述了。

现在,我们不再将质量属性赋给以my_前缀开头的变量,而是将它们赋给outVars数组。然后我们退出循环并*vwrite我们的组件名称、坐标系变量名和每个组件的质量属性。然后用*cfclos关闭文件,返回默认文件名和后处理器。

以下是输出文件中的一个示例:

我通常把包含这些命令的命令片段放在机械模型树的对象中,作为后处理步骤。一旦求解完成,您应该在项目目录的 user_files 文件夹中找到一个my_mass.txt文件。

就是这样!查看 github 资源库中的命令片段、一个示例输出文件和一个非常简单的工作台归档文件(2020 版 R1 ),其中包含了使用这些命令片段的两个系统。我希望这对你在 Ansys 中的动态建模/大规模验证冒险有所帮助!

查看其他与 Ansys MAPDL 相关的文章:

[## Ansys Mechanical:关于接头的一切

用 MAPDL 定义和后处理关节

medium.com](https://medium.com/@steve.kiefer/ansys-mechanical-all-about-joints-173f1fa40e15) [## 激活您的 Ansys 动态和机械分析

利用 MAPDL 命令在 Ansys Mechanical 中对模态有效质量和势能进行后处理

medium.com](https://medium.com/@steve.kiefer/energize-your-ansys-dynamic-mechanical-analyses-b94c58da9a30)

用图形数据库嵌入计算节点:Neo4j 及其图形数据科学库

原文:https://towardsdatascience.com/computing-node-embedding-with-a-graph-database-neo4j-its-graph-data-science-library-d45db83e54b6?source=collection_archive---------24-----------------------

借助 pygds,使用新版 Neo4j 图形数据科学插件计算节点嵌入并将其提取到熊猫数据帧中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者格尔德·奥特曼

现在的机器学习都是关于向量的。执行分类任务要求将数据排列成行(观测值),每行包含相同数量的要素(列)。虽然这很容易从最初存储在 Excel 表或 SQL 或 noSQL 数据库中的数据中获得,但当问题涉及复杂对象(如文本、图像或图形)时,转换就远不明显。

为了将这些对象表示为向量,使用了嵌入技术。嵌入算法将一个给定“小”尺寸的向量分配给这些复杂对象中的每一个,否则这些复杂对象将需要数千个(至少)特征。嵌入的挑战是保留您试图建模的对象的一些特征,同时减少特征的数量。例如,单词嵌入将尝试并捕获单词*的含义,*使得语义上彼此接近的单词具有相似的向量表示。

图形嵌入

根据要表示的对象,图嵌入涵盖了几种技术。最常见的是节点嵌入,其中要表示为向量的实体是节点,但我们也可以找到边嵌入或整图嵌入。本文将重点讨论前一个问题,节点嵌入。

图形数据库和 Neo4j

图形数据库的主要目的是使关系更容易管理,无论我们谈论的是具有复杂的多对多关系的 web 应用程序,还是图形数据科学。对这种商店的兴趣几乎一直在增加,特别是自从 Cypher 查询语言被引入 Neo4j 之后。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:https://db-engines.com/de/blog_post/53

Cypher 让编写直观的查询变得如此容易。例如,我确信您将立即了解这个查询正在做什么:

MATCH (:User {name: "Emil"})-[:FOLLOWS]->(u:User)
WHERE NOT u.name STARTS WITH "neo"
RETURN u.name, u.dateJoined

上面的查询需要注意一些事情:

  • 由括号()分隔的节点有一个标签,通过前导:可以识别
  • 由方括号[]分隔的关系必须有一个类型。按照惯例,关系类型是大写的。

正在尝试 Neo4j

说服给 Neo4j 一试?你有两种方法可以做到:

在这两种情况下,这是完全免费的。在这篇博客的后面,我将使用 Neo4j 4.1 创建一个新的图表。

导入一些数据

让我们将一些数据导入图表。为此,我们将使用got浏览器指南来使用“权力的游戏”数据集。类型:

:play got

在浏览器中,并按照说明进行操作。

导入数据后,图表模式如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“权力的游戏”图表模式。(调用 db.schema.visualization)

它包含一个节点标签,Character,五种关系类型(取决于哪本书中的人物彼此交互)和一个全局INTERACTS关系。在这篇文章的剩余部分,我们将只使用最后一个。如果您想要可视化某些数据,您可以使用:

MATCH (n)
RETURN n
LIMIT 200

让我们继续进行图形分析和节点嵌入。

图形数据科学插件(GDS)

GDS 是图形算法插件的继任者,其首次发布可追溯到 2018 年。它的目标是支持使用图形算法,从路径查找算法到图形神经网络,而不必从 Neo4j 中提取数据。

按照https://neo4j . com/docs/graph-data-science/current/installation/# _ neo4j _ desktop中的步骤进行安装。

投影图

Neo4j 图通常包含大量数据:具有不同标签的节点、具有不同类型的关系以及附加到它们的属性。大多数时候,数据科学算法只需要这些实体中的一小部分:只有一些节点标签或一些关系类型,以及只有一个属性(例如,最短路径算法的关系权重)。这就是为什么 GDS 没有在完整的 Neo4j 图上运行,而是在一个投影(更轻)版本上运行。所以,让我们开始建立我们的投影图。在 Neo4j 浏览器中,执行:

CALL gds.graph.create(
    "MyGraph", 
    "Character", 
    "INTERACTS"
)

这里我们创建一个名为MyGraph的投影图,包含所有标签为Character的节点。此外,我们将类型INTERACTS添加到这个投影图关系中。

我们在这里,我们的投影图创建,我们可以继续下去,并在它上面执行算法。

执行节点 2vec

MyGraph投影图上运行 node2vec 算法的最简单方法是使用这个简单的查询:

CALL gds.alpha.node2vec.stream("MyGraph")

浏览器中的结果如下图所示,其中一个编号列表被分配给每个节点(由其内部 Neo4j ID,nodeId标识):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

带有默认参数的 node2vec 过程的输出。

如果您对 node2vec 的工作原理有所了解,您就会知道有许多配置参数可以用来配置:

  • 建立训练数据(随机行走参数):步数、每个节点生成的行走数、输入输出和返回因子。
  • 训练 skip-gram 神经网络:嵌入大小、初始学习速率等。

参数的完整列表如下所示,来自 GDS 文档页面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 GDS 文档的 Node2vec 参数https://neo4j . com/docs/graph-data-science/current/algorithms/node-embeddings/node 2 vec/

例如,让我们尝试减小嵌入大小:

CALL gds.alpha.node2vec.stream(“MyGraph”, {walksPerNode: 2, embeddingSize: 10})

不出所料,现在的输出如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在处理这些结果的用法之前,让我们看看如何使用另一个嵌入算法 GraphSAGE。

正在执行 GraphSAGE

虽然 Node2vec 只考虑图结构,但是 GraphSAGE 能够考虑节点属性(如果有的话)。

在我们的 GoT 图中,节点只有一个name属性,这个属性对于嵌入没有多大意义。然后,我们将只使用节点度,或附加到它的关系数,作为属性:

CALL gds.alpha.graphSage.stream("MyGraph", {degreeAsProperty: true})

完整的参数列表包括属性配置(nodePropertyNames)、聚合器功能(默认为mean)、批量……完整列表见下图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 GDS 文档的 GraphSAGE 参数:https://neo4j . com/docs/graph-data-science/current/algorithms/alpha/graph-sage/

通过 Python 利用结果

Neo4j 提供了一个 python 驱动,可以通过 pip 轻松安装。然而,在这篇文章中,我将谈论我开发的一个小工具,它允许毫不费力地从 Python 中调用 GDS 过程: pygds 。它仍然需要大量的测试,所以如果您发现任何问题,请随时报告。

让我们从在您最喜欢的 python 环境中安装软件包开始:

pip install "pygds>=0.2.0"

然后,您可以导入库并定义连接到 Neo4j 图形的凭证:

from pygds import GDS

URI = "bolt://localhost:7687"
AUTH = ("neo4j", "<YOUR_PASSWORD>")

pygds的用法如下:

with GDS(URI, auth=AUTH) as gds:
    # create the projected graph
    # NB: make sure a graph with the same does not already exists
    # otherwise run CALL gds.graph.drop("MyGraph") 
    gds.graph.create(
        "MyGraph", 
        "Character", 
        "INTERACTS",
    ) # run any algorithm on it 

例如,要运行 node2vec 算法,我们将编写:

result = gds.alpha.node2vec.stream(
    "MyGraph", 
    {
        "walksPerNode": 2, 
        "embeddingSize": 10
    }
)

然后可以将结果解析成一个DataFrame:

import pandas as pd_tmp = pd.DataFrame.from_records(result)
df = pd.DataFrame(_tmp["embedding"].tolist())
print(df.head())

从那里开始,您可以执行任何机器学习算法,从可视化的 PCA 到分类,如果节点也有一些目标类…

最后一步,无论你使用的是 Cypher 还是 pygds,你都必须删除存储在你的计算机内存中的投影图:gds.graph.drop("MyGraph")

想了解更多?

太好了!GDS 包含更多奇妙的算法实现(路径查找、节点重要性、社区检测、节点相似性、链接预测)和功能(例如,将算法结果作为节点属性写入,以将结果持久存储在图中,而不是以流的形式存储)。

如果您有兴趣了解更多关于图算法和 Neo4j 的信息,可以查看以下几个在线资源:

概念漂移如何破坏你的模型性能

原文:https://towardsdatascience.com/concept-drift-can-ruin-your-model-performance-and-how-to-address-it-dff08f97e29b?source=collection_archive---------39-----------------------

概念漂移特征的理论回顾和实用技巧,确保您的模型随着时间的推移而适应

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上由 Manja Vitolic 拍摄的照片

T 今年是 2019 年,你部署了一个预测卫生纸(或其他任何东西,真的)需求的机器学习模型。2020 年,新冠肺炎出现,消费者去商店抢购空前数量的卫生纸。实际的销售数字并不是异常值,因为由于人们更经常呆在家里,消费者的行为已经发生了变化。因此,你的卫生纸需求模型不再符合新的、COVID 时代的消费者需求。

机器学习系统如何解释这种损害模型性能的变化?

世界本质上是动态和不稳定的——也就是说,不断变化。

随着时间的推移,许多机器学习模型的性能下降是不可避免的。这与人类行为相关的模型尤其相关。如果没有明确的训练示例,当代机器学习模型不能很好地推广到新环境。随着数据和“基本事实”的变化,模型性能可能会开始下降。这些是机器学习系统中必须考虑的关键弱点。但是,这种导致模型低质量响应的变化的特征是什么?您如何监控和维护您的模型,以便下游用户总是看到高质量的输出?

预测来自动态现实环境的数据变化将如何影响您的模型以及如何处理这些变化是至关重要的。

本文将首先为理解概念漂移如何出现和表现提供理论基础,然后讨论解决漂移的方法。了解数据和模型如何漂移对于设计模型监视器和响应计划至关重要。

[## 模型监控背后的直觉

让你的机器学习系统能够适应世界的变化

towardsdatascience.com](/the-intuition-behind-model-monitoring-bd8b5d8e540b)

什么是概念漂移?

下图提供了一个“概念”的简单说明。根据某个未知过程 G. 二维数据点被映射为红色或绿色,“概念”是数据点到颜色的真实映射G→{绿色,红色}。浅灰色线显示了已学习的映射 F ,它区分了接近 G. 的红色和绿色数据点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个概念——红色和绿色数据点的区别。灰线代表学习到的区分红色和绿色的概念。

简而言之,概念漂移 发生在 G 发生变化的时候,这是生成你观察到的数据的基础函数。当然,我们无法直接观察到 G 。相反,我们通过从由 G. 生成的数据中采样来间接观察 G 。该定义假设我们随着时间的推移接收到描述我们想要建模的某些现象的数据点,例如卫生纸消耗。

在卫生纸需求的情况下,基础数据生成函数是消费(和囤积)的卫生纸数量。当然,无法直接观察到实际的冲水( G) 和卫生纸的囤积。相反,我们只能通过观察通过各种供应渠道购买的数量,从实际消费中“取样”。然后,我们使用观察到的购买数据来训练卫生纸消费的模型, F,。新冠肺炎引发了卫生纸消费和购买模式的变化——也就是 GG的漂移。

概念漂移是什么样子的?

漂移可以表现为虚拟漂移(对模型性能没有直接影响)或真实漂移(对模型性能有影响)。请注意,区别是相对于模型。

真实概念漂移

真实概念漂移是生成数据的机制发生变化,从而导致模型性能下降。如下图所示,概念(红色和绿色数据点之间的区别)已经旋转并改变了形状。在方案 A 期间学习该概念的模型现在在方案 B 下已经过时,并且将具有较差的性能。在真实概念漂移之后缺少对模型的更新,模型将不再正确地描述完整的目标概念空间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

真实概念从状态 A 漂移到状态 b。在状态 A 期间学习的函数对在状态 b 中观察到的一些数据点进行了错误分类。

卫生纸方面,COVID 前消费模式为“A 区制”,COVID 后消费模式为“B 区制”。一个在疫情之前熟练预测 2019 年 TP 需求的模型将在 2020 年疫情期间表现不佳。反之亦然,在 COVID 导致的经济封锁(人们很少离开家)期间,一个已经更新的预测 TP 需求的模型可能会在人们经常离开家的历史数据上表现不佳。

虚拟概念漂移

G 中的概念漂移不一定影响你的模型 F.虚拟概念漂移中,观测数据的分布发生了变化,但之前学习的映射 F 仍然正确地应用于新的数据生成过程G’。下图显示了从状态 A 到状态 b 的虚拟漂移。尽管每个状态中的数据分布不同,但模型 F 仍然根据浅灰色线正确分配数据点颜色。因此,你的机器学习模型只有在真正的概念漂移下才会变得过时。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虚拟概念从状态 A 漂移到状态 b。根据状态 A 的数据训练的函数 F(划分红色和绿色点的灰线)在状态 b 中仍然有效。

在现实世界中,您的模型性能不会表明发生了虚拟漂移,因为您的模型仍然表现良好!事实上,即使您正在监视数据本身的分布,您也可能需要“大量”的观察来确定虚拟漂移的存在。(如果数据有多个维度,直接监控数据的分布通常是不切实际的)。

虚拟漂移是个问题吗?看情况。如果您的目标是确保您的模型继续满足给定的性能指标,那么您的模型在存在虚拟漂移的情况下是足够的。虚拟漂移带来了一个隐藏的风险,即模型可能会错误地对待新分布中的某些异常值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

潜在的虚拟漂移风险:B 区灰色数据点的正确分类是什么?模型(灰线)会继续对这些点做出准确的预测吗?

漂移严重程度

漂移的严重程度变化很大。大多数概念漂移以交叉漂移的形式出现,其中部分输入空间在新旧概念中都有相同的目标类。在极端情况下,当所有的例子在新的目标概念下被错误分类时,就会发生严重的漂移。错误分类可能是由于目标概念中的新类和类定义中的变化造成的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

状态 A 和状态 B 之间出现交叉漂移,因为只有一些数据点分类发生了变化。在状态 A 和状态 C 之间发生了严重的漂移,其中所有数据点的所有分类都发生了变化。

如果您可以检测和测量漂移,您可以指定一个阈值来区分“主要”和“次要”漂移。二元分类任务的漂移量级可以用类别已改变的观测值的百分比来度量。如果漂移幅度小于阈值,模型只需用新数据更新。如果漂移幅度大于阈值,则漂移是“严重的”,应该放弃该模型,而采用新训练的模型。严重漂移通常很少见,如果不使用复杂的漂移检测,严重漂移的存在往往很明显。

漂移速度和稳定性

突然漂移

漂移持续时间短的概念漂移称为突然漂移。当数据生成函数突然停止生成概念为 G 的数据,并突然根据概念*G’*生成数据时,会发生突然漂移。突变漂移范式假设概念漂移发生在离散的时间周期内,以没有漂移的稳定周期为界。

作为一系列突然漂移的例子,医学杂志 Lancet 报道称,在 2020 年 1 月 15 日至 3 月 3 日期间,中国七次改变了新冠肺炎的病例定义。定义的每一次变化都会导致病例统计方法的改变;因此,每一次变化都会导致中国每日 COVID 病例计数概念的突然转变。

增量漂移和稳定性

增量漂移 寓意漂移持续时间长,也称连续漂移。在这种情况下,变化是从概念 G 到概念*G’的稳定进展。*概念漂移的速度或持续时间是一个新概念完全取代一个旧概念的时间步数。

在分类的情况下,在每个随后的时间步,根据旧概念 G 分类较少的数据点,根据新概念*G’*分类较多的数据点。你可以把 G 和 G '之间的每一个时间步长看作不同的中间概念。

增量漂移的一个例子是,随着新冠肺炎经济封锁在一个地区解除,消费者行为如何逐渐改变——人们可能会犹豫是否要恢复“正常”,只是慢慢恢复。行为中的每一个小变化都是 G(锁定期间的行为)和 G’(解除限制后的“正常”行为)之间的一个中间概念。值得注意的是,从 G(锁定)到 G’(“正常”)的行为进展是非线性的,因为人们会对像病例数变化这样的外部因素做出反应,从而特异性地改变他们的行为。

一个概念是不稳定的在概念 G 和 G’之间,概念之间的周期因为它会再次改变。这种不稳定性可以通过数据和模型度量中更大的噪声观察到。此外,一些概念本质上是不稳定和混乱的,永远不会达到一个稳定的概念,如市场价格运动。

下图显示了 100 个时间步长内的增量漂移。函数 v1(t)和 v2(t)分别模拟新旧概念中的一个例子在时间 t 出现的概率。漂移的速度是 v2(t)的斜率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

增量漂移的图示。(资料来源:民酷、怀特、姚 2010 )

如何检测和解决漂移问题?

当然,如果没有检测和校正模型和数据漂移的解决方案,这个讨论将是不完整的。许多人将漂移检测的主题称为模型监控

解决概念漂移的基本方法是监控您的模型以检测漂移,重新训练模型,并部署新的模型版本。

这种基本方法适用于你期望概念漂移从一个稳定的概念突然转移到一个新的稳定的概念的情况。如果对模型性能的变化有一定的容差,在小漂移和/或增量漂移的情况下,这也是可以接受的。对于不太稳定的状态或持续漂移的情况,用新的观测值对模型进行增量更新可能更合适。在在线模型更新的情况下,监控模型漂移仍然很重要。

监测概念漂移有三种基本方法。

监控模型性能

原则上,监控模型性能是直接的:如果模型性能下降到某个预期水平之下,那么重新评估模型。要实现这一点,您需要做出几个决定,这些决定将影响漂移检测的灵敏度和频率。

1.在计算模型性能时,您使用了多少新的预测?

2.您评估哪些绩效指标,应用哪些阈值?

3.您多久监测一次漂移?

4.你的模型的用户有多容错?这将有助于你对(1)-(3)的回答。

5.你如何应对漂移?对你的模型进行人工评估和再培训?自动更新?

监控模型预测置信度的统计测量值

另一种方法是监控模型预测或残差值的分布或这些值的置信度。与潜在的高维输入数据相比,监控模型产生的值的分布变化要容易得多。统计监视器的具体形式取决于要监视的预测的速度和数量。除了上一节中的问题之外,要做出的一些相关决策包括:

  • Kolmogorov–Smirnov(KS)测试是否表明您的预测或残差值的分布发生了变化?为了用 KS 检验准确地比较两个分布是否相同,需要一些最小数量的例子。
  • 给定的预测/残差是否落在训练期间观察到的预测/残差分布的给定置信区间内?

有关学术文献中漂移检测的其他自适应测试统计,请参考参考文献部分的 Dries 和 Ruckert (2009 年)。

在线更新

一种选择是在线训练你的模型*——也就是说,定期用新的观察值自动更新你的模型权重。更新的周期可以是每天、每周或每次收到新数据时。如果您预期增量概念漂移或不稳定的概念,这个解决方案是理想的。*

这种选择并不是万无一失的,因为尽管在线更新,仍然存在模型偏离真实目标的风险。发生这种情况的原因有很多。

  • 一个离群值可能对在线训练中的模型产生过大的影响,使学习到的模型进一步远离目标概念。这种风险可以通过使用成批的观察数据而不是单个数据点进行在线更新来降低。
  • 学习率可能太小,从而在存在大漂移的情况下阻止模型足够快地更新。
  • 学习率也可能太大,导致模型超出目标概念并继续表现不佳。

由于这些原因,监视在线更新的模型仍然很重要。

其他方法

在学术文献中已经提出了各种算法来检测概念漂移。漂移检测中的工作通常旨在高效、准确地识别概念漂移的真正点,同时最小化漂移检测时间。对这些提议的回顾超出了本文的范围。

结论

理解和检测漂移是一项艰巨的任务。最终,选择检测和应对漂移的最佳方法通常需要对数据、模型和应用有深入的了解。漂移检测和模型再训练的理想频率是主观的,取决于您的数据和应用。最后,在任何解决方案中,重要的是要考虑模型性能指标的变化是否是由于样本偏差,或者感知的漂移是否是由于随机性或异常值,而不是数据分布或目标概念的变化。

参考

巴赫斯蒂芬和马克.马洛夫。2010."概念漂移的贝叶斯方法."神经信息处理系统进展。127–135.

陈,凯莉,许允声,和帕特丽夏里德尔。2015.“跟踪数据流中的漂移严重程度.”《人工智能 2015:人工智能的进步:第 28 届澳大拉西亚联合会议》,澳大利亚堪培拉,ACT,2015 年 11 月 30 日-12 月 4 日,会议录,Bernhard Pfahringer 和 Jochen Renz 编辑,96–108。查姆:斯普林格国际出版公司。doi:10.1007/978–3–319–26350–2 _ 9

德里斯,安东和乌尔里希·拉克特。2009.“自适应概念漂移检测。”统计分析和数据挖掘(威利在线图书馆)2:311–327。

Gama、Joao、Indre Zliobaite、Albert Bifet、Mykola Pechenizkiy 和 Abdelhamid Bouchachia。2014."概念漂移适应综述."ACM 计算机。Surv。(美国计算机学会)46:44:1–44:37。doi:10.1145/2523813。

明库,莱安德罗 l,艾伦 p .怀特和姚欣。2010."存在概念漂移时多样性对在线集成学习的影响."IEEE Trans。据了解。和数据工程。(IEEE 教育活动部)22:730–742。doi:10.1109/TKDE

韦伯、杰弗里·I、罗伊·海德、曹洪、阮海龙和弗朗索瓦·珀蒂让。2016.“表征概念漂移。”数据挖掘和知识发现 30:964–994。doi:10.1007/s 10618–015–0448–4。

机器学习中的概念漂移

原文:https://towardsdatascience.com/concept-drift-in-machine-learning-642709cd6868?source=collection_archive---------60-----------------------

“悲观者抱怨风;乐观者期待它改变;现实主义者调整风帆。”威廉·亚瑟·沃德

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源: Unsplash Anthony Aird

任何事物都会随着时间而变化,数据也不例外。数据的变化导致机器学习模型的测试性能随着时间而降低。最终,模型得出的错误预测会影响其商业价值。

输入和输出标签属性之间的关系不是静态的,而是随着时间而变化,这会影响模型性能,因为它无法理解新数据中存在的新的底层模式。这种效应在机器学习中被称为概念漂移**。**

在这篇文章中,我将提供这个概念的一个简要概述,这个概念在机器学习中使用得非常频繁,并且对每个从业者来说都是非常重要的。

这里简单提一下我将在这篇文章中讨论的要点。

  1. 什么是概念漂移?
  2. 这一概念与数据科学生命周期有何关联?
  3. 为什么我们需要监测这种效应?
  4. 如何解决这个问题?
  5. 结论。

什么是概念漂移?

概念漂移是一种导致机器学习模型的性能随着时间退化的效应。这种退化是由于测试模型的新数据集和训练模型的数据集之间的底层模式的变化而发生的。这种变化是由于客户的产品购买模式发生了变化,或者由于一些天气参数随着时间的推移发生了变化。

我们都非常熟悉这个基本的函数概念:

Y= f(X)

这里我们有一个函数 f,它理解自变量 X 和因变量 y 之间的模式或关系。

但是当这种模式消失时,模型就会给出错误的输出,变得等同于垃圾。

这就是概念漂移发挥作用的地方。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:马库斯·斯皮斯克的《un splash》

这一概念与数据科学生命周期有何关联?

我们都知道数据科学项目是在不同的阶段执行的,对吗?从以下内容开始:

  1. 问题识别及其业务环境。
  2. 数据集集合。
  3. 数据探索和特征工程。
  4. 数据可视化。
  5. 模型培训和开发。
  6. 模型测试和部署。
  7. 模型再训练和更新过程。

我认为我们都非常熟悉 6 大概念。概念漂移出现在最后一个阶段,即模型再训练和更新。在这里,模型被部署到客户端,并且每天都进行频繁的模型测试。为了避免模型的偏差,它的预测被监控和检查,就好像它给出了正确的预测或者没有保持业务生产力。

为什么我们需要监测这种效应?

我们需要监控这种影响,因为它会给它所竞选的企业实体带来巨大的问题。错误的预测可能会导致商业公司失去声誉和忠诚的客户,因为模型可能会提供错误的建议,与用户的新购买模式不匹配。

让我们以科罗纳疫情时间为例,那里的人们经历了购买模式的重大转变。他们只是迎合非常必要的东西的需求,这是模型所不知道的。因此,它不断向他们推荐不符合客户选择的产品。因此,企业可能会损失大量收入。

如何解决这个问题?

有许多方法可以处理这个问题。

1。什么都不做(维护单个静态模型)。

不,我不是在开玩笑…!。我们可以假设数据中的潜在模式不会随着时间的推移而改变,而在许多情况下,这种情况确实会发生。

因此,我们可以专注于构建一个最佳模型来进行未来预测,并专注于其他一些项目。

2。定期重新拟合模型。

这个可能比第一个有效一点。我们在新的数据集上重新训练我们过时的模型,从而解释数据集中新的潜在模式。

这避免了模型成为垃圾,并持续带来商业价值。

3。定期更新模型。

当我们的测试显示先前的模型给出错误的预测时,我们可以一次又一次地训练和部署新的模型,而不是在新的数据集上更新过时的模型。

这种方法更有效一点,因为模型的改变可以导致更准确的预测。但是模型训练及其部署需要大量时间。

4。将新型号与旧型号组合在一起。

在这种方法中,我们将在新数据集上训练的一些新模型与过时的模型集成。在这里,新模型与旧模型一起工作,同时纠正旧模型的错误预测。

这个方法看起来有点复杂,但是比上面提到的方法更有效。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:亚伦·伯登的 Unsplash

[编辑]如果你想深入主题,请在 neptune.ai 浏览这篇文章

结论…

好了,伙计们,今天到此为止。我想我们一定学到了一些新概念。这种影响在大多数时候被初级数据科学家忽略了,他们在完成一个项目后认为他们的工作已经结束了,但事实并非如此。他们的责任不止于此。为了维护我们的商业价值,我们必须监控和跟踪我们如何为客户体验增加价值,增加什么价值,以及推荐提供商是否为他们提供了好的推荐。

更多此类访问在这里。

如果这篇文章对你有所帮助。请在这里支持我https://www.buymeacoffee.com/shobhitsri

如果你有任何不清楚的地方,请随时在下面评论。我会尽快回复。你可以在 LinkedIn 上联系我。谢谢你的合作。祝你愉快。

15 分钟的概念和无痛介绍蒙特卡罗方法和应用贝叶斯推理

原文:https://towardsdatascience.com/conceptual-background-for-painless-introduction-to-applied-bayesian-regression-using-pystan-c8f744e3823f?source=collection_archive---------15-----------------------

贝叶斯方法和推理

这篇文章应该作为我的教程使用(Py)Stan 的应用贝叶斯推理的无痛介绍和使用 r-INLA 的(近似)贝叶斯回归的无痛介绍的背景。

在这篇文章中,我将对贝叶斯推理和蒙特卡罗方法提供一个非常简短、自成一体的介绍,希望能启发你更深入地研究我所包含的一些参考资料。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 Pixabayimarksm

你可能听说过也可能没有听说过贝叶斯推理/回归/建模/分析…您可能只是偶然遇到它,从未真正想过它的用途,或者没有任何好的资源来开始。

事实上,贝叶斯推理[1]比它的频率主义对应物要复杂一些,大多数人都曾在学术界或非常专业的工业应用中真正使用过它。然而,它提供了一个非常丰富的框架来理解并最终在推理过程中利用更多的信息。此外,它以一种令人愉快的方式提升了概率和应用统计学之间的联系——一个真正的贝叶斯模型是一个生成模型。

对于这一系列文章,我将采用(传统的)基于可能性的建模方法。

贝叶斯推理 5 分钟

贝叶斯推理允许我们将一些先入为主的,即先于的信念纳入到我们的建模中。我们可以从后验概率分布中进行采样,从而在完成实验后很好地了解我们感兴趣的参数的行为,而不是找到使我们的可能性最大化的参数值(最大可能性估计)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模型拟合和推理中的原始贝叶斯恒等式。

简单来说,我为我的模型参数( 𝜃 )声明一个先验分布,并将其乘以我的观察数据的可能性(d)。为了让这个量作为概率密度函数,我必须用一个归一化常数来除它。然后我得到我的后验分布函数。

请注意,上面的归一化常数 P(D )(通常表示为 C)是难以处理的,除了在您有共轭先验的情况下,我们通常依靠蒙特卡罗方法从这种推断的后验分布中取样。在用各种各样的基本模型这样做的时候,我们可以排除这个量 C 而不会失去我们的睡眠。

你可能会问:为什么要这样做?

更好的科学,更古板的推理,正则化,数值稳定性,昂贵的数据采集不允许极大似然估计,还有很多很多更多的原因。

你可能会问:什么是好的前科?

  • 易处理性?共轭!例如,正态先验 x 正态似然产生一个正态后验,可以解析求解!
  • 科学相关性
  • 正规化。在标准线性回归的情况下,回归器/beta 服务器上的 N(0,1)先验可以用作 L2 正则化。

理想情况下,先验知识不需要查看数据。

你可能会问:有什么样的前科?

  • 无信息的(扁平的)前科。在大多数情况下,原始的无信息先验将是均匀分布的,更具体地说,在下面掷硬币问题的上下文中。
  • 信息不足的前科。我在下面的抛硬币问题中声明的β先验提供的信息很少,因为我没有丢弃θ参数空间中的区间或点,而我倾向于“公平”。
  • 信息丰富的前科。这些通常基于专家意见或扎实的科学知识。

举个例子,假设我在地板上发现了一枚硬币,我想知道它是否公平。我宣布 p=𝜃 是在一次给定的投掷中,硬币将产生“正面”的概率(y=1)。那么 q=1- 𝜃 就是硬币产生“反面”(y=0)的概率。注意,硬币的这种行为可以被建模为具有以下函数形式的伯努利随机变量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

假设我掷硬币 4 次,观察到它总是给我“反面”如果我采用最大似然框架,那么我有以下 ML 估计(样本比例):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们的例子中,上述结果为 0。但这有点太极端了……两面表面积相等意味着硬币应该有非零的“正面”落地概率(尽管非常小)。如果一边比另一边小得不成比例,我们会立即注意到。

现在,作为 Bayesians 人,说我们遇到了同样的硬币。在我们自己扔硬币之前,我们会形成一个关于硬币的先验信念。根据我的经验,硬币通常是公平的,所以我认为这枚硬币很可能是公平的,也有可能是不公平的。然后,我会进行我的实验,并获得一种感觉,这个硬币是否坚持我的信念。哦,我得到相同的结果{0,0,0,0}。

对于有效的(弱信息)先验,我将使用 beta(a,b)分布,其中 a,b 为非负整数。这个先验是有意义的,因为贝塔分布的支持度是[0,1],这里的 𝜃 对应一个概率不能小于 0 或者大于 1。设置 a=b=u,其中 u 是正整数,产生在 0.5 附近对称的分布。此外,贝塔分布与伯努利分布共轭(也与二项式分布共轭,因为二项式随机变量由伯努利随机变量的和组成)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

贝塔(5,5)分布的模拟

然后我考虑以下模型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这导致了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此处 C ≥0 表示归一化常数,对于本应用而言,不需要估计该常数。

如果我们在上面的先验中设置 a=b=5,stan[2]——如何操作参见教程——得出 𝜃 的近似后验均值0.36<5。因此,我们的估计表明一个有偏见的硬币,没有立即去 0。

蒙特卡罗方法 5 分钟

出于本教程的目的,蒙特卡罗方法[3]将允许我们从模型参数的后验分布中取样。

估计一个实值可积函数 f(x)的积分(I)的最简单的蒙特卡罗方法(假设在 0 ≤x≤1 上)表明,我们在[0,1]上对 x 的 K>0 个独立样本进行采样,对这些 x_{i}中的每一个估计 f(x}),然后对它们求和并求平均。我们来要求 I

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

As K goes to infinity, this vanilla Monte Carlo estimate should converge to the value of the integral.

The above is nice and easy, but we can actually use even more knowledge of statistics by observing the below:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

We can think of the integral I as the expected value of f(x) and the below quantity as its unbiased estimator

Our estimator is just an approximation, so it would behoove us to quantify its accuracy:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Here we simply change the notation a bit and show the formula for the standard error

So, what can we do now that we have an unbiased estimate for the mean and an estimate of the standard error? Let’s invoke the 中心极限定理,对于 K 足够大是合理的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用上述方法,我们可以为积分的估计量建立 95%的置信区间:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面的方法非常幼稚和不准确,特别是当目标(概率)在维度、多模态等方面增长时。然而,这给了你 MC 方法的要点:

从一个分布中抽取样本,以逼近另一个分布或感兴趣的数量。

请注意,蒙特卡罗方法是一个非常活跃的研究领域,具有非常丰富的理论和应用,我鼓励你阅读更多关于它们的内容。蒙特卡洛计算引擎上也有几个包装器(PyMC3、Stan、BUGS 等),可以很容易地集成到 Python、R 和其他现代统计/机器学习软件中。

下面是一些非常基本的方法让你开始:

  • 重要性抽样
  • 拒绝抽样
  • Metropolis-Hastings 算法(马尔可夫链蒙特卡罗)
  • 奖励:模拟退火(优化)

乳胶和数学交流

最后一件事。如果你真的想发展简洁而精确地交流数学/统计思想的能力,那么我鼓励你开始尝试使用 LaTeX [5]。LaTeX 是一个强大的排版系统,可以让你写出漂亮的公式,并无缝地呈现在你的文档中。我在本文档和我的所有作品中的所有数学表达式中都使用 LaTeX。

结论

随着更好的计算硬件和软件的出现,贝叶斯推理和计算最近经历了一次辉煌的复兴。此外,贝叶斯方法跨越了大量活跃的研究领域,包括统计学、数学、计算机科学、人口学、经济学和许多其他领域。

以下是现代 ML 和统计研究中的一些最热门的主题,它们依赖或大量使用贝叶斯框架进行推理:

  • 因果推理
  • 可解释性(DL 和 RL)
  • 贝叶斯超参数优化(AlphaGo)
  • 多任务学习
  • RL 中的探索与开发
  • 高效、计算稳定的 MCMC (HMC)

参考文献

[1] R. Neal, 贝叶斯推理教程,供 ML (2004),NeurIPS,2004 .

[2] B. Carpenter 等, Stan:一种概率编程语言 (2017),统计软件杂志。

[3] C .罗伯特和 g .卡塞拉, 蒙特卡洛统计方法 (2005),施普林格文本《统计学》。

[4] D .瓦克利等人, 数理统计与应用 (2014),森盖奇学习

[5]LaTeX 3 项目, LaTeX — A 文件编制系统 (1985),LaTeX 项目公共许可证(https://www.latex-project.org/lppl/)

聚类无监督学习简明指南!

原文:https://towardsdatascience.com/concise-guide-to-unsupervised-learning-with-clustering-4924cdbb27cb?source=collection_archive---------40-----------------------

借助聚类算法详细理解无监督学习的概念。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

威廉·艾文在 Unsplash 上的照片

机器学习任务通常有一些数据集,其中我们有一些参数,对于那些结果参数,我们有它们各自的输出。从这些数据集中,我们建立的机器学习模型可以预测类似数据的结果。这个过程就是在监督学习中发生的。

监督学习的一个例子是用于确定患者是否出现肿瘤。我们有一个大型数据集,其中有一组与他们各自的结果相匹配的患者参数。我们可以假设这是一个简单的分类任务,1 代表肿瘤,0 代表无肿瘤。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Tran Mau Tri TamUnsplash 上拍摄

然而,假设我们有一个关于狗和猫的数据集。没有预先训练好的结果让我们来判断他们中的哪一个是猫还是狗。这种具有未标记数据集的问题可以在无监督学习的帮助下解决。用技术术语来说,我们可以将无监督学习定义为一种机器学习,在没有预先存在的标签和最少人工监督的情况下,在数据集中寻找以前未检测到的模式。聚类关联是两种最重要的无监督学习算法。今天,我们将只关注集群

聚类:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:维基百科

使用某些数据模式,机器学习算法能够找到相似之处,并将这些数据分组。换句话说,聚类分析聚类是对一组对象进行分组的任务,使得同一组中的对象(称为聚类)彼此比其他组(聚类)中的对象更相似(在某种意义上)。

在聚类中,我们没有任何预测或标记数据。我们得到了一组输入数据点,使用这些数据点,我们需要找到最相似的匹配,并将它们分组到聚类中。聚类算法有广泛的应用,我们将在以后的章节中讨论。

让我们分析各种可用的聚类算法。我们将讨论三个最流行和最受欢迎的算法技术。我们还将了解用于无监督学习的性能指标,并最终讨论它们在现实世界中的应用。

聚类算法:

有许多聚类算法,但今天我们将主要关注三种最流行和最重要的聚类算法。这些聚类算法是—

  1. 基于质心的聚类(K 均值聚类)
  2. 基于连通性的聚类(层次聚类)
  3. 基于密度的聚类(DBSCAN)

我们将详细分析每一种算法,并理解它们到底是如何工作的。我们也将看看这些算法的优点和局限性。所以,事不宜迟,让我们开始吧!

1.k 均值聚类:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:维基百科

K-means 聚类算法是执行聚类分析的最流行的方法之一。在 K 均值聚类中,用于评估的超参数是“K”

‘K’=聚类数。

聚类的数量将决定将要执行的聚类分类的类型。在上图中,我们可以假设选择的 K 值为 3。K 值将决定分离和分组过程中考虑的中心数量。

超参数 K 的“正确”值可以用网格搜索或随机搜索等方法来确定。因此,我们可以说,K-means 的主要目标是找到最佳质心,并相应地以适合特定数据集的方式对聚类进行分组。

K 均值聚类要遵循的步骤—

1\. Initialization: Randomly picking the n points from the dataset and initialize them. Choose the K value as well.
2\. Assignment: For each selected point find the nearest centroid values. 
3\. Update: Re-compute the centroid values and update them accordingly. 
4\. Repetition: Repeat the step 2 and step 3 until you reach convergence. 
5\. Termination: Upon reaching convergence terminate the program. 

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图展示了 K-means 的收敛过程。

优势:

  1. 实现和执行相对简单。
  2. 有效且高效地处理大型数据集。
  3. 保证在某一点上收敛。

局限性:

  1. 选择最佳超参数“k”可能很困难。
  2. 计算高维数据的问题。
  3. 在存在异常值或噪声的情况下,更容易出错。

2.分层聚类:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:维基百科

基于连通性的聚类,也称为层次聚类,其核心思想是对象与附近的对象比与更远的对象更相关。

层次聚类的概念基本上是将相似的事物从较大的块分组到较小的块,反之亦然。当我们看下面两种类型的层次聚类方法时,可以更好地理解这一点:

  • 凝聚聚类—这是一种“自下而上”的方法:每个观察从自己的聚类开始,随着一个观察在层次结构中向上移动,聚类对被合并。
  • 分裂聚类——这是一种“自上而下”的方法:所有的观察都从一个聚类开始,随着一个聚类向下移动,分裂被递归地执行。

凝聚聚类通常优于分裂聚类。因此,我们将进一步研究凝聚性集群而不是分裂性集群的分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:维基百科

上面的树状图展示了层次聚类的工作原理,特别是凝聚聚类的工作原理。

让我们来理解聚集成簇过程中所涉及的步骤

1\. Compute the [proximity matrix](https://hlab.stanford.edu/brian/proximity_matrix.html) which is basically a matrix containing the closest distance of each of the similarities i.e., the inter/intra cluster distances. 
2\. Consider each point to be a cluster.
3\. Repeat the following step for every point. 
4\. Merge the two closest points. 
5\. Update the proximity matrix. 
6\. Continue until only a single cluster remains. 

优点:

  1. 查看树状图更容易判断集群的数量。
  2. 总体上易于实现。

限制:

  1. 对异常值非常敏感。
  2. 不适合较大的数据集。
  3. 它具有很高的时间复杂度,这对于某些应用来说是不理想的。

3. DBSCAN:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:维基百科

DBSCAN 代表基于密度的带噪声应用程序空间聚类,并且越来越受欢迎。在 DBSCAN 中,我们为密度高于数据集其余部分的区域创建聚类。需要分离聚类的稀疏区域中的对象通常被认为是噪声和边界点。

DBSCAN 在最小点(或 MinPts)和ε中使用了两个重要的超参数。在我们查看如何解决这些问题的步骤之前,让我们分析一下这些超参数到底是如何工作的。

  • MinPts: 数据集越大,MinPts 的值应该选得越大。minPts 必须至少选择 3 个。
  • **ε’ϵ’😗*然后可以通过使用 k-距离图来选择ϵ的值,绘制到 k = minPts 最近邻居的距离。ϵ的好值是图中显示一个像肘形的强弯曲的地方。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:维基百科

对于 DBSCAN 算法的实现,我们需要遵循的逐步过程如下所述:

1\. Find the points in the ε (eps) neighborhood of every point, and identify the core points with more than minPts neighbors.
2\. Label each of the selected points as a core point or border point or noise point. This initial labeling is an important step for the overall functionality.
3\. Remove all the noise points from your data because sparse regions do not belong to any clusters. 
4\. for each core point 'p' not assigned to a cluster create a loop as follows - 
   a. Create a new cluster with the point 'p'. 
   b. Add all points that are density connected to into this newly created cluster. 
5\. Assign each non-core point to a nearby cluster if the cluster is an ε (eps) neighbor, otherwise assign it to noise. Repeat the procedure until convergence is reached. 

优点:

  1. 基于密度的聚类方法对噪声和异常值有很强的抵抗力。
  2. 它通常适用于任何形状,不像前面提到的两种算法在处理非球形(非凸形)形状时有困难。
  3. 与 K-means 不同,它们对要设置的聚类数没有特定的要求。

限制:

  1. DBSCAN 不能很好地对密度差异较大的数据集进行聚类。
  2. 它不是完全确定的,并且在高维数据集上容易出错。
  3. 由于它有两个可变的超参数,因此容易受到它们的变化的影响。

绩效指标:

监督学习中使用的性能指标,如 AUC(ROC 曲线下面积)或 ROC(接收器操作特性)曲线,不适用于无监督学习。因此,为了评估无监督学习的性能度量,我们需要计算一些参数,如类内和类间参数。看看下面的参考图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

**类内:**属于同一类的两个相似数据点之间的距离。

**类间:**属于不同类的两个相异数据点之间的距离。

任何好的聚类算法的主要目标是减少类内距离和最大化类间距离。用于聚类的主要性能指标之一是邓恩指数参数。

**邓恩指数:**邓恩指数旨在识别密集且分离良好的集群。它被定义为最小类间距离与最大类内距离之比。对于每个聚类分区,邓恩指数可以通过以下公式计算:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比率中的第一行试图最小化类间距离,第二部分试图增加类内距离。由于内部标准寻找具有高的组内相似性和低的组间相似性的组,所以产生具有高 Dunn 指数的组的算法是更理想的。

如果有人对这种说法感到困惑,请将邓恩指数“D”视为衡量两个参数最坏情况的参数,因此当“D”较高时,它被视为理想的聚类。也有其他性能指标可供选择,如戴维斯–波尔丁指数,但在大多数情况下,邓恩指数通常更受青睐。

聚类的应用:

  1. **数据挖掘:**从现有数据集中提取有用的数据元素。聚类算法可用于选择对任务有用的数据组,其余的数据可以忽略。
  2. **模式识别:**我们还可以利用聚类算法找出对象之间的明显模式。模式识别是自动识别数据中的模式和规律。
  3. **图像分析:**可以将相似性和相似类型的图像分组到一起,得到想要的结果。这方面的一个例子是猫和狗的隔离,这在前面的章节中已经提到过。
  4. **信息检索:**信息检索是从资源集合中获取与信息需求相关的信息系统资源的活动。搜索可以基于全文或其他基于内容的索引。聚类可用于类似的自然语言处理任务,以获得选定的重复模式。
  5. **生物医学应用和生物信息学:**聚类在分析医学数据和扫描以确定模式和匹配的领域中极其有益。这方面的一个例子是 **IMRT 分割,**聚类可用于将注量图分成不同的区域,以便在基于 MLC 的放射治疗中转换成可实施的射野。
  6. **异常检测:**聚类是推断模式和检测异常值存在的最佳方式之一,通过将相似的组分组为聚类,同时忽略异常值,即数据集中存在的不必要的噪声信息。
  7. **机器人学:**机器人学领域以跨学科的方式利用上述所有学科的集群。机器人需要在没有标记数据的情况下自己寻找模式,聚类会有很大帮助。它们还用于机器人情境感知,以跟踪物体和检测传感器数据中的异常值。
  8. **电子商务:**我们要讨论的最后一个但肯定不是最不重要的应用是电子商务。聚类广泛用于市场营销和电子商务,以确定客户在其业务中的规格。这些独特的模式允许这些公司决定向他们特定的客户销售什么产品。

集群还有很多应用,我强烈推荐大家去看看在集群领域可以利用的各种应用。

结论:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

聚类是机器学习的一个极其重要的概念,可以用于各种任务。它在数据挖掘过程和探索性数据分析的初始阶段也非常有用。上图是对数据应用聚类后使用 TSNE 构建的图表图像。

在上述三种算法的帮助下,您应该能够非常容易地解决大多数集群任务。提到的技术和应用让我们简要了解为什么聚类算法有助于对未标记数据集进行分类。我希望这篇文章有助于解释这些概念。

看看这些你可能感兴趣的最近的文章吧!

[## 4 个基本正则表达式操作符使自然语言处理变得更简单!

了解四种基本的常规操作,以清理几乎任何类型的可用数据。

towardsdatascience.com](/natural-language-processing-made-simpler-with-4-basic-regular-expression-operators-5002342cbac1) [## 带有完整代码片段和有用链接的 5 个最佳 Python 项目创意!

为 Python 和机器学习创建一份令人敬畏的简历的 5 个最佳项目想法的代码片段和示例!

towardsdatascience.com](/5-best-python-project-ideas-with-full-code-snippets-and-useful-links-d9dc2846a0c5) [## 人工智能是破解宇宙奥秘的关键,下面是原因!

人工智能、数据科学和深度学习的工具是否先进到足以破解人类大脑的秘密

towardsdatascience.com](/artificial-intelligence-is-the-key-to-crack-the-mysteries-of-the-universe-heres-why-56c208d35b62) [## OpenCV:用代码掌握计算机视觉基础的完全初学者指南!

包含代码的教程,用于掌握计算机视觉的所有重要概念,以及如何使用 OpenCV 实现它们

towardsdatascience.com](/opencv-complete-beginners-guide-to-master-the-basics-of-computer-vision-with-code-4a1cd0c687f9) [## 迷失在密林中:用简单的代码对机器学习中稀疏性的直觉!

为什么 ML 需要稀疏性?理解稀疏性的核心概念。

towardsdatascience.com](/lost-in-a-dense-forest-intuition-on-sparsity-in-machine-learning-with-simple-code-2b44ea7b07b0)

谢谢你们坚持到最后。我希望你喜欢读这篇文章。祝大家有美好的一天!

基于机器学习的混凝土抗压强度预测

原文:https://towardsdatascience.com/concrete-compressive-strength-prediction-using-machine-learning-4a531b3c43f3?source=collection_archive---------5-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

里卡多·戈麦斯·安吉尔在 Unsplash 上的照片

机器学习在土木工程中的应用

混凝土抗压强度

混凝土的抗压强度决定了混凝土的质量。这通常由混凝土圆柱体上的标准压碎试验来确定。这需要工程师用不同的原材料组合建造小型混凝土圆柱体,并测试这些圆柱体的强度随每种原材料的变化而变化。测试钢瓶的建议等待时间是 28 天,以确保正确的结果。这消耗了大量的时间,并且需要大量的劳动力来准备不同的原型并测试它们。此外,这种方法容易出现人为错误,一个小错误就可能导致等待时间急剧增加。

减少等待时间和减少尝试组合数量的一种方法是利用数字模拟,我们可以向计算机提供我们所知道的信息,计算机尝试不同的组合来预测抗压强度。这样,我们可以减少物理上可以尝试的组合数量,并减少实验时间。但是,要设计这样的软件,我们必须知道所有原材料之间的关系,以及一种材料如何影响强度。可以推导出数学方程,并基于这些方程进行模拟,但我们不能期望现实世界中的关系是相同的。此外,这些测试已经进行了很多次,我们有足够的现实世界的数据可以用于预测建模。

在本文中,我们将分析混凝土抗压强度数据集,并建立机器学习模型来预测抗压强度。这个笔记本包含了所有的代码,可以并行使用。

数据集描述

数据集由 1030 个实例组成,具有 9 个属性,没有缺失值。有 8 个输入变量和 1 个输出变量。七个输入变量代表原材料的数量(以 kg/m 计量),一个代表龄期(以天计)。目标变量是混凝土抗压强度,单位为兆帕(MPa —兆帕)。我们将研究这些数据,看看输入特征是如何影响抗压强度的。

探索性数据分析

数据科学项目的第一步是在建模之前理解数据并从数据中获得洞察力。这包括检查任何缺失值、绘制与目标变量相关的特征、观察所有特征的分布等等。让我们导入数据并开始分析。

让我们检查输入特征之间的相关性,这将给出每个变量如何影响所有其他变量的想法。这可以通过计算特征之间的皮尔逊相关来实现,如下面的代码所示。

corr = data.corr() sns.heatmap(corr, annot=True, cmap='Blues')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以观察到抗压强度 (CC_Strength)和水泥之间的高度正相关。这是真的,因为混凝土的强度确实随着制备过程中水泥用量的增加而增加。另外,龄期超塑化剂是影响抗压强度的另外两个因素。

这些特征之间还有其他强相关性,

  • 超塑化剂呈强负相关。
  • 超塑化剂粉煤灰细骨料呈正相关关系。

这些相关性有助于详细理解数据,因为它们给出了一个变量如何影响另一个变量的想法。我们可以进一步使用 seaborn 中的 pairplot 来绘制所有特性之间的成对关系以及特性沿对角线的分布。

sns.pairplot(data)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

配对图直观地展示了所有特征之间的相关性。

我们可以在 CC_Strength 和其他特征之间绘制散点图,以查看更复杂的关系。

CC _ 强度 vs(水泥、龄期、水)

sns.scatterplot(y="CC_Strength", x="Cement", hue="Water",size="Age", data=data, ax=ax, sizes=(50, 300))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从这幅图中我们可以观察到,

  • 抗压强度随着水泥量的增加而增加,当我们在 x 轴上向右移动时,圆点向上移动。
  • 抗压强度随着年龄的增长而增加(因为圆点的大小代表年龄),情况并非总是如此,但在一定程度上是可以的。
  • 时间越短的水泥需要越多的水泥来获得更高的强度,因为当我们在 x 轴上向右移动时,较小的点会向上移动。
  • 水泥越老,需要的水就越多,可以通过观察圆点的颜色来确认。深色的大点表示年龄大,水多。
  • 制备混凝土时使用较少的水混凝土强度增加,因为较低侧(y 轴)的点较暗,较高端(y 轴)的点较亮。

CC 强度 vs(细骨料、超塑化剂、粉煤灰)

sns.scatterplot(y="CC_Strength", x="FineAggregate", hue="FlyAsh",
   size="Superplasticizer", data=data, ax=ax, sizes=(50, 300))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

观察,

  • 抗压强度降低飞灰增加,因为黑点集中在代表低抗压强度的区域。
  • 抗压强度随着超塑化剂的增加而增加,因为点越大,曲线中的点越高。

我们可以直观地理解 2D、3D 和 max 直到 4D 图(由颜色和大小表示的特征)如上所示,我们可以进一步使用 seaborn 的行和列绘图特征来做进一步的分析,但我们仍然缺乏自己跟踪所有这些相关性的能力。出于这个原因,我们可以转向机器学习来捕捉这些关系,并对问题给出更好的见解。

数据预处理

在我们对数据拟合机器学习模型之前,我们需要将数据分割成训练和测试分割。可以重新调整特征的比例,使其均值为零,标准差为 1,即所有特征都落在相同的范围内。

X = data.iloc[:,:-1] # Features 
y = data.iloc[:,-1] # Target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2) sc = StandardScaler() X_train = sc.fit_transform(X_train) 
X_test = sc.transform(X_test)

模型结构

在准备好数据之后,我们可以在训练数据上拟合不同的模型,并比较它们的性能,以选择性能好的算法。由于这是一个回归问题,我们可以使用 RMSE(均方根误差)和$R $分数作为评估指标。

1.线性回归

我们将从线性回归开始,因为这是任何回归问题的首选算法。该算法试图在输入特征和目标变量之间形成线性关系,即它拟合由下式给出的直线,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线性回归

其中 w_i 对应于特征 x_i 的系数。

通过对成本函数使用正则化项,可以进一步控制这些系数的大小。将系数的大小相加将导致系数接近于零,这种线性回归的变化称为拉索回归。将系数的平方和添加到成本函数将使系数在相同的范围内,这种变化被称为回归。这两种变化都有助于降低模型的复杂性,从而减少数据过度拟合的机会。

# Importing models 
from sklearn.linear_model import LinearRegression, Lasso, Ridge # Linear Regression 
lr = LinearRegression() # Lasso Regression 
lasso = Lasso() # Ridge Regression 
ridge = Ridge() # Fitting models on Training data 
lr.fit(X_train, y_train) 
lasso.fit(X_train, y_train) 
ridge.fit(X_train, y_train) # Making predictions on Test data y_pred_lr = lr.predict(X_test) 
y_pred_lasso = lasso.predict(X_test) 
y_pred_ridge = ridge.predict(X_test) from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score print("Model\t\t\t RMSE \t\t R2") 
print("""LinearRegression \t {:.2f} \t\t{:.2f}""".format(  np.sqrt(mean_squared_error(y_test, y_pred_lr)), r2_score(y_test, y_pred_lr))) print("""LassoRegression \t {:.2f} \t\t{:.2f}""".format( np.sqrt(mean_squared_error(y_test, y_pred_lasso)), r2_score(y_test, y_pred_lasso))) print("""RidgeRegression \t {:.2f} \t\t{:.2f}""".format( np.sqrt(mean_squared_error(y_test, y_pred_ridge)), r2_score(y_test, y_pred_ridge)))

输出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这三种算法的性能没有太大差别,我们可以用下面的代码画出这三种算法为特性分配的系数。

coeff_lr = lr.coef_ 
coeff_lasso = lasso.coef_ 
coeff_ridge = ridge.coef_ labels = req_col_names[:-1] 
x = np.arange(len(labels)) 
width = 0.3 fig, ax = plt.subplots(figsize=(10,6)) 
rects1 = ax.bar(x - 2*(width/2), coeff_lr, width, label='LR') 
rects2 = ax.bar(x, coeff_lasso, width, label='Lasso') 
rects3 = ax.bar(x + 2*(width/2), coeff_ridge, width, label='Ridge') ax.set_ylabel('Coefficient') 
ax.set_xlabel('Features') 
ax.set_title('Feature Coefficients') 
ax.set_xticks(x) 
ax.set_xticklabels(labels, rotation=45) 
ax.legend() def autolabel(rects): 
   """Attach a text label above each bar in *rects*, displaying its height.""" 
   for rect in rects: 
      height = rect.get_height() 
      ax.annotate('{:.2f}'.format(height), xy=(rect.get_x() + rect.get_width() / 2, height), xytext=(0, 3), textcoords="offset points", ha='center', va='bottom') autolabel(rects1) 
autolabel(rects2) 
autolabel(rects3) 
fig.tight_layout() 
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如图所示,Lasso 回归将系数推向零,而正常线性回归和岭回归的系数几乎相同。

我们可以通过绘制真实值和预测值来进一步了解预测情况,

fig, (ax1, ax2, ax3) = plt.subplots(1,3, figsize=(12,4)) ax1.scatter(y_pred_lr, y_test, s=20) 
ax1.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2) 
ax1.set_ylabel("True") 
ax1.set_xlabel("Predicted") 
ax1.set_title("Linear Regression") 
ax2.scatter(y_pred_lasso, y_test, s=20) ax2.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2) ax2.set_ylabel("True") 
ax2.set_xlabel("Predicted") 
ax2.set_title("Lasso Regression") 
ax3.scatter(y_pred_ridge, y_test, s=20) ax3.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2) 
ax3.set_ylabel("True") 
ax3.set_xlabel("Predicted") 
ax3.set_title("Ridge Regression") 
fig.suptitle("True vs Predicted") 
fig.tight_layout(rect=[0, 0.03, 1, 0.95])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果预测值和目标值相等,那么散点图上的点将位于直线上。正如我们在这里看到的,没有一个模型能正确预测抗压强度。

2.决策树

决策树算法用树状结构表示数据,其中每个节点表示对某个功能做出的决策。在这种情况下,这种算法将提供更好的性能,因为我们在一些输入特征中有许多零,如上面的对图中的分布所示。这将有助于决策树基于某些特征条件构建树,从而进一步提高性能。

from sklearn.tree import DecisionTreeRegressor 
dtr = DecisionTreeRegressor() 
dtr.fit(X_train, y_train) 
y_pred_dtr = dtr.predict(X_test) print("Model\t\t\t\t RMSE \t\t R2") 
print("""Decision Tree Regressor \t {:.2f} \t\t{:.2f}""".format( np.sqrt(mean_squared_error(y_test, y_pred_dtr)), r2_score(y_test, y_pred_dtr))) plt.scatter(y_test, y_pred_dtr) 
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2) 
plt.xlabel("Predicted") 
plt.ylabel("True") 
plt.title("Decision Tree Regressor") plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

均方根误差(RMSE)从 10.29 下降到 7.31,因此决策树回归器显著提高了性能。这可以在图中观察到,并且更多的点更靠近线。

3.随机森林

使用决策树回归器提高了我们的性能,我们可以通过集成更多的树来进一步提高性能。随机森林回归器使用从训练数据中采样的随机数据子集来训练随机初始化的树,这将使我们的模型更加健壮。

from sklearn.ensemble import RandomForestRegressor rfr = RandomForestRegressor(n_estimators=100) 
rfr.fit(X_train, y_train) y_pred_rfr = rfr.predict(X_test) print("Model\t\t\t\t RMSE \t\t R2") print("""Random Forest Regressor \t {:.2f} \t\t{:.2f}""".format( np.sqrt(mean_squared_error(y_test, y_pred_rfr)), r2_score(y_test, y_pred_rfr))) plt.scatter(y_test, y_pred_rfr) 
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2) 
plt.xlabel("Predicted") 
plt.ylabel("True") 
plt.title("Random Forest Regressor") 
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过集合多棵树,RMSE 进一步减少。我们可以为基于树的模型绘制特征重要性。特征重要性显示了在进行预测时特征对模型的重要性。

feature_dtr = dtr.feature_importances_ 
feature_rfr = rfr.feature_importances_ labels = req_col_names[:-1] 
x = np.arange(len(labels)) 
width = 0.3 
fig, ax = plt.subplots(figsize=(10,6)) 
rects1 = ax.bar(x-(width/2), feature_dtr, width, label='Decision Tree') 
rects2 = ax.bar(x+(width/2), feature_rfr, width, label='Random Forest') 
ax.set_ylabel('Importance') 
ax.set_xlabel('Features') 
ax.set_title('Feature Importance') 
ax.set_xticks(x) 
ax.set_xticklabels(labels, rotation=45) 
ax.legend(loc="upper left", bbox_to_anchor=(1,1)) 
autolabel(rects1) 
autolabel(rects2) 
fig.tight_layout() 
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于树的模型将水泥和年龄视为最重要的特征。在预测混凝土强度时,粉煤灰、粗骨料和细骨料是最不重要的因素。

比较

最后,让我们比较所有算法的结果。

models = [lr, lasso, ridge, dtr, rfr] 
names = ["Linear Regression", "Lasso Regression", "Ridge Regression", "Decision Tree Regressor", "Random Forest Regressor"] rmses = [] for model in models: 
   rmses.append(np.sqrt(mean_squared_error(y_test, model.predict(X_test)))) x = np.arange(len(names)) 
width = 0.3 
fig, ax = plt.subplots(figsize=(10,7)) 
rects = ax.bar(x, rmses, width) 
ax.set_ylabel('RMSE') 
ax.set_xlabel('Models') 
ax.set_title('RMSE with Different Algorithms') 
ax.set_xticks(x) 
ax.set_xticklabels(names, rotation=45) 
autolabel(rects) 
fig.tight_layout() 
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

我们分析了抗压强度数据,并使用机器学习来预测混凝土的抗压强度。我们使用了线性回归及其变体、决策树和随机森林来进行预测,并比较了它们的性能。随机森林回归器具有最低的 RMSE,是解决该问题的好选择。此外,我们可以通过执行网格搜索或随机搜索来调整超参数,从而进一步提高算法的性能。

参考

  1. 叶一成,“使用人工神经网络对高性能混凝土的强度进行建模”,水泥与混凝土研究,第 28 卷,第 12 期,第 1797–1808 页(1998 年)。
  2. Ahsanul Kabir,医学博士 Monjurul Hasan,Khasro Miah,“混凝土的强度预测模型”,ACEE Int .土木与环境工程学报,第 2 卷第 1 期,2013 年 8 月。
  3. https://archive . ics . UCI . edu/ml/datasets/Concrete+抗压+强度

原载于 2020 年 3 月 5 日https://pranaymudukuru . github . io

Golang 中的并发数据管道

原文:https://towardsdatascience.com/concurrent-data-pipelines-in-golang-85b18c2eecc2?source=collection_archive---------22-----------------------

利用 Golang 的并发模型为数据密集型应用创建并发数据管道

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

米卡·鲍梅斯特在 Unsplash 上的照片

数据是所有应用程序的重要组成部分。应用程序主要接收数据,处理数据,然后从中生成某种输出。如今可用的数据量是巨大的,这在试图理解数据并将其转化为有用信息时带来了许多挑战。除了通常的数据系统流程之外,我们还必须考虑由这些系统的执行所产生的数据,比如日志和指标。一切都是数据。

因此,对数据驱动的应用程序的需求越来越大。系统只处理移动和转换数据的情况并不少见。从一个地方到另一个地方或者从一个建筑到另一个建筑。这在分布式系统中更为常见,因为每个系统都为自己的目的生成数据,并以更易于处理的方式进行组织。然而,这些系统仍然必须进行通信,因此数据必须进行转换和移动。此外,有时数据必须转移到不同的环境或不同的平台。更麻烦!

有非常复杂的工具来完成这项工作,但通常配置和维护它们都是一件非常痛苦的事情,更不用说所涉及的成本了。因此,它们并不总是最佳选择。有时,根据用例,您可以创建自己的管道,用更简单的解决方案来移动数据。在本文中,我们将了解如何使用 golang 构建数据管道。

数据管道

管道是表达我们想要如何处理数据的一种非常好的方式。根据定义,管道是一系列被执行的步骤或动作。通常上一步的输出被用作下一步的输入。当设计管道时,每一步都不必担心其他步骤的工作,只依赖于输入和输出契约。这使得设计非常健壮,因为它是基于契约和抽象的。此外,这是一个非常灵活的设计,因为你可以添加更多的步骤,只要你不违反合同。好玩!

做这件事有无数种方法。在这篇文章中,我们将关注如何利用 go 的并发模型来创建数据管道,我在这里写的是关于。

使用 goroutines 和通道创建数据管道

正如我们前面提到的,数据管道是一系列的步骤,使用前一个步骤的输出作为下一个步骤的输入来执行。这听起来像是 goroutines 和 channels 的一个很好的用法。我们可以将每个步骤创建为一个 goroutine,并将它们之间的通信创建为通道。这意味着我们的数据管道可以并发执行,如果明智地使用,这是一个很大的好处。让我们跳到一个例子来简化一下。

在本例中,我们将创建一个简单的管道,用于从文本文件中读取一些 GUID,将它们转换为我们要用于处理的输入数据结构,从外部服务中获取相关数据,最后使用批处理操作将数据保存在数据存储中。以下是高级工作流的外观:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

高级工作流

正如我们在这张图上看到的,每个操作都将使用一个 goroutine(由 gophers 表示)创建,并使用通道连接在一起。这样做的整体思路是,每个函数(除了数据生成器之外)将接收其输入通道作为参数,并返回输出通道作为函数的返回值。在每个函数中,我们将旋转一个 goroutine 来实际监听输入通道,并对收到的每一项进行操作,同时在输出通道上发送结果。

为简单起见,所有通道都是无缓冲的,这意味着存储在guids.txt文件中的每个 GUID 都将单独通过管道。唯一的批处理操作是在最后,我们将它们保存到数据存储的批处理中。此外,为了简单起见,错误处理已经被简化,请记住,对于生产管道,您可能希望使其更加健壮。好了,解释够了,让我们开始这个例子。你可以在我的 github 库中找到完整的源代码。

下面是guids.txt文件的样子:

ea464197-d864-4f8a-8a60-2d3a6f3d87bf
74c1a7bd-b536-4f9e-be36-5e16c491d833
c524c1e9-e473-42eb-b74d-97d82575b720
d5003029-7e10-4128-8a18-392e384ef0bd
b1fbf405-7b3c-4b82-8b51-4c5c2c0cca56
b4f6a28c-86b2-4741-89e5-612451346eb7
353629f7-c9ba-4ed1-8e1b-b7694381a36a
d3b305cb-eb1b-4f8a-8a23-4741960c26a4
66c03c1a-45f7-4255-b568-669d9dc553d9
9272d9f4-da5a-4449-8826-f8529ce4f428

我们管道的第一部分是读取该文件的每一行,将其解析为一个uuid.UUID类型,并通过一个通道发送出去。这个函数可能是这样的:

这里重要的部分是我们正在创建输出通道(第 13 行)并返回它(第 37 行),以及在实际执行读取文件和发送解析后的uuid.UUID值(第 15 行)工作的 goroutine 上使用它。这非常强大,因为它允许我们直接使用通道作为另一个函数输入,而不用担心内部工作是如何完成的。同样重要的是,一旦工作完成,我们就关闭通道,这样我们就可以在通道上安全地使用for range语句,而不用担心无限循环。让我们进入第二步,准备数据:

这里,函数签名略有变化。我们正在接收我们想要用作输入的频道。然而,创建通道输出通道(第 16 行)并返回它(第 26 行)的内部技术仍然是相同的。对于这个特定的步骤,我们只使用在输入通道上接收到的uuid.UUID,并将它们转换成一个虚拟结构inputData,同时记录正在处理的内容。这是一个非常基本的例子,但是它说明了你可以为数据转换做什么(数据管道中非常常见的一步),你只需要为你想要的任何结构改变应用相同的逻辑。让我们来看一个更深入的例子,关于我们的第三步,数据获取:

这个函数使用了和以前几乎一样的技术,我们接收一个输入通道并返回一个输出通道。在这种情况下,为了简单起见,我决定模拟外部调用,因此我们实际上是在内存中为给定的 GUID 生成随机相关的值。有趣的是,我们实际上使用并发来调用这个(假的)外部服务。这允许管道的其余部分在我们等待从外部值返回特定值时仍然运行。我们仍然希望在关闭我们的输出通道之前,等待对外部服务的所有调用完成(也就是说,我们对这部分管道的工作已经完成)。

为了做到这一点,我引入了一个非常常见的模式,使用sync.WaitGroup来处理需要在某个时间点同步的异步调用。我们在调用第 29 行上的close(oc)之前等待(同步)。这样,我们可以确保在关闭通道之前,所有对外部服务的调用都已完成。发生这种情况是因为这个特定的步骤可能比数据管道上的前一个步骤运行得慢,因为它依赖于外部服务,所以在我们调用外部服务处理所有值之前,可能会从输入通道接收所有值。

这是一个非常有趣的步骤,让我们来看看管道的最后一步,数据存储:

在这一步中,我们将介绍一种不同的技术,批处理。这对于为每个项目调用每个操作在性能或成本方面效率不高的服务来说可能很有用。因此,为了解决这个问题,我们可以将一些项目成批放在一起。我创建了一个简单的批处理机制,它基于我们想要添加到批处理中的数据量。你可以使用任何你想要的机制,我相信逻辑会非常相似。在本例中,我们一次批处理 7 个项目,所以每次我们有 7 个项目要持久存储到数据库中时,我们调用 persisting 函数(false)并打开下一批。在结束之前,我们检查是否有一个开放的批处理,并保存在这种情况下。此外,我们将返回一个通道,其中包含保存了哪些项目的信息以及时间戳。现在我们只需要把这条管道组装起来:

如你所见,我们以相反的顺序调用管道。如果您愿意,可以更改参数以使其更加清晰。然而,在这种情况下,它几乎像一个装饰模式。如果我们从generateData()函数开始,它不接收通道,但返回一个。因此从该函数返回的通道被用作prepareData的输入参数。该功能的输出通道用作fetchData的参数。输出通道最终被saveData用作输入。最后一个函数也返回一个通道,我们将在这个通道上打印哪些项目已经保存。如果我们执行这个示例,我们将会看到类似这样的内容:

./data-pipeline-golang
2020/06/10 09:49:50 Data ready for processing: {id:ea464197-d864-4f8a-8a60-2d3a6f3d87bf timestamp:1591778990056111000}2020/06/10 09:49:50 Data ready for processing: {id:74c1a7bd-b536-4f9e-be36-5e16c491d833 timestamp:1591778990056467000}2020/06/10 09:49:50 Data ready for processing: {id:c524c1e9-e473-42eb-b74d-97d82575b720 timestamp:1591778990056587000}2020/06/10 09:49:50 Data ready for processing: {id:d5003029-7e10-4128-8a18-392e384ef0bd timestamp:1591778990056744000}2020/06/10 09:49:50 Data ready for processing: {id:b1fbf405-7b3c-4b82-8b51-4c5c2c0cca56 timestamp:1591778990056773000}2020/06/10 09:49:50 Data ready for processing: {id:b4f6a28c-86b2-4741-89e5-612451346eb7 timestamp:1591778990056803000}2020/06/10 09:49:50 Data ready for processing: {id:353629f7-c9ba-4ed1-8e1b-b7694381a36a timestamp:1591778990056814000}2020/06/10 09:49:50 Data ready for processing: {id:d3b305cb-eb1b-4f8a-8a23-4741960c26a4 timestamp:1591778990056984000}2020/06/10 09:49:50 Data ready for processing: {id:66c03c1a-45f7-4255-b568-669d9dc553d9 timestamp:1591778990057220000}2020/06/10 09:49:50 Items saved: {idsSaved:[66c03c1a-45f7-4255-b568-669d9dc553d9 c524c1e9-e473-42eb-b74d-97d82575b720 353629f7-c9ba-4ed1-8e1b-b7694381a36a b4f6a28c-86b2-4741-89e5-612451346eb7 74c1a7bd-b536-4f9e-be36-5e16c491d833 b1fbf405-7b3c-4b82-8b51-4c5c2c0cca56 ea464197-d864-4f8a-8a60-2d3a6f3d87bf] timestamp:1591778990097935000}2020/06/10 09:49:50 Items saved: {idsSaved:[d3b305cb-eb1b-4f8a-8a23-4741960c26a4 d5003029-7e10-4128-8a18-392e384ef0bd] timestamp:1591778990105146000}

我们可以看到,prepareData函数记录了 9 个准备处理的项目,而main函数记录了 2 个实际保存的批次,第一个包含 7 个项目,第二个包含 2 个项目。

最后的想法

对于处理数据驱动或数据密集型应用程序的工程师来说,创建数据管道是一项非常常见的任务。数据管道对于将数据从一个系统转移到另一个系统、从一个平台转移到另一个平台,甚至从一个环境转移到另一个环境是必不可少的。如果我们理解了 golang 的并发模型,我们就可以利用它以一种非常简单明了的方式创建并发数据管道。这里使用的主要模式是为每个步骤创建并返回一个通道,这样我们可以很容易地将所有步骤连接在一起。使用这种范式,我们可以用各种酷的东西来提升我们的管道,比如步骤的并行执行,特定管道步骤的多个工人,等等。

这种技术并不总是正确的选择,有许多工具可以根据具体情况成为更简单的解决方案。

Conda + Google Colab

原文:https://towardsdatascience.com/conda-google-colab-75f7c867a522?source=collection_archive---------1-----------------------

使用 Google Colab 时安装 Conda 的指南

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让 Conda 在 Google Colab 上工作有点乏味,但如果你不能与 pip 相处,这是必要的。来源

Conda 是许多流行的数据科学工具的推荐环境和包管理解决方案,包括 PandasScikit-LearnPyTorchNVIDIA Rapids 和许多其他工具。Conda 还大大简化了安装流行的深度学习工具的过程,如 TensorFlow

Google Colab 是一项免费服务,通过与 Jupyter 笔记本非常相似的用户界面提供交互式计算资源,运行在谷歌云平台(GCP)上,并提供对 GPU 和 TPU 的免费访问。Google Colab 是一个很棒的教学平台,也可能是唯一一个与你的同行共享 GPU 或 TPU 加速代码的免费解决方案。不幸的是,Conda 在 Google Colab 上默认是不可用的,在 Google Colab 的默认 Python 环境中安装并正常工作 Conda 有点麻烦。

在这篇文章中,我将向您介绍我在 Google Colab 中工作时需要使用 Conda 安装包时所经历的过程。

预赛

首先,您需要确认 Google Colab 中默认使用的是哪种 Python。运行以下命令将返回默认 Python 可执行文件的绝对路径。

!which python # should return /usr/local/bin/python

现在检查这个默认 Python 的版本号。

!python --version

在编写时,上述命令返回Python 3.6.9。这意味着,为了使用所有预装的 Google Colab 包,您需要安装一个默认情况下与 Python 3.6 兼容的 Miniconda 版本。默认情况下,Miniconda 的最新版本(即 4.5.12+)面向 Python 3.7 或 Python 3.8。针对 Python 3.6 的 Miniconda 的最新版本是 Miniconda 4.5.4,因此这是您应该安装的版本。

最后,检查是否已经设置了PYTHONPATH变量。

!echo $PYTHONPATH

在编写这个命令时,它只返回/env/python(奇怪的是,这个目录似乎并不存在于 Google Colab 文件系统中)。

通常情况下,在安装 Miniconda 之前取消设置PYTHONPATH变量是一个好主意,因为如果通过PYTHONPATH中包含的目录安装和访问的软件包与 Miniconda 中包含的 Python 版本不兼容,这可能会导致问题。

您可以使用以下命令取消设置PYTHONPATH变量。这一步是可选的,但是如果你不取消设置这个变量,那么你会在安装 Miniconda 后看到一个警告消息。

%env PYTHONPATH=

安装 Miniconda

当在 Google Colab 单元中执行时,下面的代码将下载 Miniconda 适当版本的安装程序脚本,并将其安装到/usr/local中。直接安装到/usr/local,而不是默认位置~/miniconda3,确保 Conda 及其所有必需的依赖项在 Google Colab 中自动可用。

%%bashMINICONDA_INSTALLER_SCRIPT=[Miniconda3-4.5.4-Linux-x86_64.sh](https://repo.continuum.io/miniconda/Miniconda3-$MINICONDA_VERSION-Linux-x86_64.sh)
MINICONDA_PREFIX=/usr/local
wget [https://repo.continuum.io/miniconda/](https://repo.continuum.io/miniconda/Miniconda3-$MINICONDA_VERSION-Linux-x86_64.sh)$MINICONDA_INSTALLER_SCRIPT
chmod +x $MINICONDA_INSTALLER_SCRIPT
./$MINICONDA_INSTALLER_SCRIPT -b -f -p $MINICONDA_PREFIX

一旦你安装了 Miniconda,你应该能够看到 conda 可执行文件是可用的…

!which conda # should return /usr/local/bin/conda

…并且版本号是正确的。

!conda --version # should return 4.5.4

请注意,虽然安装 Miniconda 似乎不会影响 Python 可执行文件…

!which python # still returns /usr/local/bin/python

…然而,Miniconda 实际上安装了一个略有不同的 Python 版本。

!python --version # now returns Python 3.6.5 :: Anaconda, Inc.

更新 Conda

既然您已经安装了 Conda,那么您需要将 Conda 及其所有依赖项更新到最新版本*,而不需要将 Python 更新到 3.7(或 3.8)。下面的conda install命令实际上是将* Conda 更新到最新版本,同时保持 Python 版本固定在 3.6。然后,conda update命令将 Conda 的所有依赖项更新到最新版本。

%%bashconda install --channel defaults conda python=3.6 --yes
conda update --channel defaults --all --yes

现在,您可以通过检查 Conda 的版本号来确认更新。

!conda --version # now returns 4.8.3

另外,请注意 Python 版本再次发生了变化。

!python --version # now returns Python 3.6.10 :: Anaconda, Inc.

追加到sys.path

现在您已经安装了 Miniconda,您需要将 conda 将安装包的目录添加到 Python 在查找要导入的模块时将搜索的目录列表中。通过检查[sys.path](https://docs.python.org/3/library/sys.html),您可以看到 Python 在查找要导入的模块时将搜索的当前目录列表。

import syssys.path

在撰写本文时,Google Colab 上的sys.path如下所示。

['',  
 '/env/python',
 '/usr/lib/python36.zip',
 '/usr/lib/python3.6',
 '/usr/lib/python3.6/lib-dynload',
 '/usr/local/lib/python3.6/dist-packages', # pre-installed packages
 '/usr/lib/python3/dist-packages',
 '/usr/local/lib/python3.6/dist-packages/IPython/extensions',
 '/root/.ipython']

请注意,Google Colab 附带的预安装软件包安装在/usr/local/lib/python3.6/dist-packages目录中。您可以通过简单地列出这个目录的内容来了解哪些包是可用的。

!ls /usr/local/lib/python3.6/dist-packages

你用 Conda 安装的任何包都将被安装到目录/usr/local/lib/python3.6/site-packages中,所以你需要把这个目录添加到sys.path中,以便这些包可以被导入。

import sys_ = (sys.path
        .append("/usr/local/lib/python3.6/site-packages"))

请注意,因为包含预装 Google Colab 软件包的/usr/local/lib/python3.6/dist-packages目录出现在 Conda 安装包的/usr/local/lib/python3.6/site-packages目录之前,所以通过 Google Colab 获得的软件包版本将优先于通过 Conda 安装的同一软件包的任何版本。

安装软件包

现在你需要做的就是安装你喜欢的软件包。只要记住在安装软件包时包含--yes标志,以避免提示确认软件包计划。

!conda install --channel conda-forge featuretools --yes

摘要

在本文中,当我需要使用 conda 来管理 Google Colab 上的包时,我介绍了安装和配置 Miniconda 的过程。希望这能在你下次需要在 Google Colab 上分享 Conda 管理的数据科学项目时有所帮助。

康达(+ pip)和 Docker FTW!

原文:https://towardsdatascience.com/conda-pip-and-docker-ftw-d64fe638dc45?source=collection_archive---------2-----------------------

困扰数据科学项目的环境和包管理问题的解决方案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结合 Conda envs 和 Docker 容器可以提高数据科学工作流的可重复性。来源

进入鲸鱼!

因为这篇文章的重点是将 Docker 整合到现有的 Conda (+ pip)工作流中,所以我假设您已经在使用 Conda (+ pip)来管理数据科学项目的环境。如果您不熟悉 Conda 的基础知识,或者还没有使用 Conda 管理特定项目的环境,那么我建议您查看我最近的文章Conda入门和 使用 Conda 管理特定项目的环境。

我还假设您对 Docker 背后的基本思想有所了解。如果没有,那么我推荐你看一看杰夫·黑尔的这个优秀的系列文章

为什么不用康达(+ pip)?

虽然 Conda (+ pip)解决了我的大多数日常数据科学环境和包管理问题,但将 Docker 整合到我的 Conda (+ pip)开发工作流中,使我的数据科学工作流从我的笔记本电脑/工作站移植到远程云计算资源变得更加容易。将 Docker 整合到我的开发工作流程中,通过消除不明显的操作系统级依赖性(特别是当从运行 Mac OSX 和 Windows 的本地笔记本电脑/工作站迁移到运行 Linux 的远程服务器时),也使我的工作更具可重复性。

然而,让 Conda (+ pip)像预期的那样在 Docker 容器中工作比我预想的要困难得多。我遇到的大多数困难涉及到如何在图像内部正确激活环境,以便在容器内部使用 Conda (+ pip)时的 UX 与在容器外部使用 Conda (+ pip)时的 UX 相同。

所有这些困难都可以通过使 docker 文件“恰到好处”来解决。在下一节中,我将一步一步地向您介绍我开发的 Dockerfile 文件。

写作Dockerfile

让 Conda (+ pip)和 Docker 顺利合作的诀窍是编写一个好的Dockerfile。在这一节中,我将带你一步一步地了解我开发的Dockerfile的各个部分。希望你可以在下一个数据科学项目中不加修改地使用这个Dockerfile

从这里开始,我假设您已经组织了类似于我的 Python 数据科学项目模板的项目目录。特别是,我将假设您存储了所有与 Docker 相关的文件,特别是项目根目录下的docker子目录中的Dockerfile

使用标准基础图像

每个Dockefile都有一个基础或父映像。对于父映像,我使用的是 Ubuntu 16.04 ,这是数据科学社区中最常用的 Linux 版本之一(恰好也是我的工作站上安装的同一操作系统)。

FROM ubuntu:16.04

bash设为默认外壳

构建 Docker 映像时用于运行Dockerfile命令的默认 shell 是/bin/sh。不幸的是/bin/sh目前不是conda init命令支持的 shells 之一。幸运的是,可以使用[SHELL](https://docs.docker.com/engine/reference/builder/#shell)指令改变用于运行Dockerfile命令的默认 shell。

SHELL [ "/bin/bash", "--login", "-c" ]

注意--login标志的使用,它确保~/.profile~/.bashrc都有正确的来源。为了使用各种conda命令在 Docker 映像中构建 Conda 环境,正确地提供~/.profile~/.bashrc是必要的。

创建非超级用户

在您的 Docker 映像中创建一个非 root 用户是一个 Docker 安全“最佳实践”。我创建非根用户的首选方法是使用构建参数来定制非根用户的usernameuidgid。我对uidgid使用标准默认值;默认用户名设置为[al-khawarizmi](https://en.wikipedia.org/wiki/Muhammad_ibn_Musa_al-Khwarizmi)(为了纪念这位著名的波斯学者,他的名字就在我工作的大楼上)

# Create a non-root user
ARG username=al-khawarizmi
ARG uid=1000
ARG gid=100
ENV USER $username
ENV UID $uid
ENV GID $gid
ENV HOME /home/$USERRUN adduser --disabled-password \
    --gecos "Non-root user" \
    --uid $UID \
    --gid $GID \
    --home $HOME \
    $USER

复制配置文件

创建非 root 用户后,我复制了创建 Conda 环境所需的所有配置文件(即environment.ymlrequirements.txtpostBuild)。我还复制了一个 Bash 脚本,我将把它用作 Docker ENTRYPOINT(下面将详细介绍)。

COPY environment.yml requirements.txt /tmp/
RUN chown $UID:$GID /tmp/environment.yml /tmp/requirements.txtCOPY postBuild /usr/local/bin/postBuild.sh
RUN chown $UID:$GID /usr/local/bin/postBuild.sh && \
    chmod u+x /usr/local/bin/postBuild.shCOPY docker/entrypoint.sh /usr/local/bin/
RUN chown $UID:$GID /usr/local/bin/entrypoint.sh && \
    chmod u+x /usr/local/bin/entrypoint.sh

Docker 的新版本支持以非根用户的身份复制文件,但是 DockerHub 上的 Docker 版本还不支持以非根用户的身份复制文件,所以如果你想为你的 Git 存储库设置自动构建,你需要以根用户的身份复制所有文件。

以非根用户的身份安装 Miniconda。

作为 root 用户复制配置文件后,我切换到非 root 用户并安装 Miniconda

USER $USER# install miniconda
ENV MINICONDA_VERSION 4.8.2
ENV CONDA_DIR $HOME/miniconda3
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-$MINICONDA_VERSION-Linux-x86_64.sh -O ~/miniconda.sh && \
    chmod +x ~/miniconda.sh && \
    ~/miniconda.sh -b -p $CONDA_DIR && \
    rm ~/miniconda.sh# make non-activate conda commands available
ENV PATH=$CONDA_DIR/bin:$PATH# make conda activate command available from /bin/bash --login shells
RUN echo ". $CONDA_DIR/etc/profile.d/conda.sh" >> ~/.profile# make conda activate command available from /bin/bash --interative shells
RUN conda init bash

创建项目目录

接下来,我在非根用户主目录中创建一个项目目录。Conda 环境将在项目目录中的env子目录中创建,然后所有其他项目文件和目录可以挂载到这个目录中。

# create a project directory inside user home
ENV PROJECT_DIR $HOME/app
RUN mkdir $PROJECT_DIR
WORKDIR $PROJECT_DIR

构建康达环境

现在我已经准备好构建 Conda 环境了。请注意,我可以使用与我在笔记本电脑或工作站上为项目构建 Conda 环境几乎相同的conda命令序列。

# build the conda environment
ENV ENV_PREFIX $PWD/env
RUN conda update --name base --channel defaults conda && \
    conda env create --prefix $ENV_PREFIX --file /tmp/environment.yml --force && \
    conda clean --all --yes# run the postBuild script to install any JupyterLab extensions
RUN conda activate $ENV_PREFIX && \
    /usr/local/bin/postBuild.sh && \
    conda deactivate

确保运行时激活 Conda 环境

快完成了!倒数第二步是使用一个[ENTRYPOINT](https://docs.docker.com/engine/reference/builder/#entrypoint)脚本来确保 Conda 环境在运行时被正确激活。

ENTRYPOINT [ "/usr/local/bin/entrypoint.sh" ]

下面是/usr/local/bin/entrypoint.sh脚本,供参考。

#!/bin/bash --login
set -econda activate $ENV_PREFIX
exec "$@"

为 Docker 容器指定默认命令

最后,我使用[CMD](https://docs.docker.com/engine/reference/builder/#cmd)指令来指定 Docker 容器启动时运行的默认命令。因为我在所有的 Conda 环境中都安装了 JupyerLab,所以在执行容器时,我倾向于默认启动一个 JupyterLab 服务器。

# default command will launch JupyterLab server for development
CMD [ "jupyter", "lab", "--no-browser", "--ip", "0.0.0.0" ]

建立码头工人形象

下面的命令(应该从包含Dockefiledocker子目录中运行)用定制的$USER(以及相关的$UID$GID)以及特定的$IMAGE_NAME$IMAGE_TAG为您的项目构建一个新的映像。这个命令应该在项目的docker子目录中运行,因为 Docker 构建上下文被设置为../,它应该是项目根目录。

docker image build \
  --build-arg username=$USER \
  --build-arg uid=$UID \
  --build-arg gid=$GID \
  --file Dockerfile \
  --tag $IMAGE_NAME:$IMAGE_TAG \
  ../

运行 Docker 容器

一旦构建了映像,下面的命令将运行基于映像的容器$IMAGE_NAME:$IMAGE_TAG。该命令应该从项目的根目录中运行。

docker container run \
  --rm \
  --tty \
  --volume ${pwd}/bin:/home/$USER/app/bin \
  --volume ${pwd}/data:/home/$USER/app/data \ 
  --volume ${pwd}/doc:/home/$USER/app/doc \
  --volume ${pwd}/notebooks:/home/$USER/app/notebooks \
  --volume ${pwd}/results:/home/$USER/app/results \
  --volume ${pwd}/src:/home/$USER/app/src \
  --publish 8888:8888 \
  $IMAGE_NAME:$IMAGE_TAG

使用 Docker 撰写

手写上述 docker 命令时很容易出现打字错误。一种不太容易出错的方法是使用 Docker Compose 。上述 docker 命令可以封装到docker-compose.yml配置文件中,如下所示。

version: "3.7"services:
  jupyterlab-server:
    build:
      args:
        - username=${USER}
        - uid=${UID}
        - gid=${GID}
      context: ../
      dockerfile: docker/Dockerfile
    ports:
      - "8888:8888"
    volumes:
      - ../bin:/home/${USER}/app/bin
      - ../data:/home/${USER}/app/data
      - ../doc:/home/${USER}/app/doc
      - ../notebooks:/home/${USER}/app/notebooks
      - ../results:/home/${USER}/app/results
      - ../src:/home/${USER}/app/src
    init: true
    stdin_open: true
    tty: true

以上docker-compose.yml文件依靠变量替换。获取$USER$UID$GID的值。这些值可以存储在一个名为.env的文件中,如下所示。

USER=$USER
UID=$UID
GID=$GID

您可以通过在项目的docker子目录中运行以下命令来测试您的docker-compose.yml文件。

docker-compose config

该命令获取docker-compose.yml文件并替换.env文件中提供的值,然后返回结果。

一旦您确信.env文件中的值被正确地替换到了docker-compose.yml文件中,就可以使用下面的命令来打开一个基于项目 Docker 映像的容器,并启动 JupyterLab 服务器。这个命令也应该从项目的docker子目录中运行。

docker-compose up --build

当您完成开发并关闭 JupyterLab 服务器后,下面的命令将拆除正在运行的容器的网络基础设施。

docker-compose down

摘要

在这篇文章中,我经历了一个将 Conda (+ pip)环境注入 Docker 映像的Dockerfile。我还详细介绍了如何使用 Docker Compose 构建结果图像和启动容器。

如果你正在寻找一个生产质量的解决方案,概括上述方法,那么我会鼓励你看看[jupyter-repo2docker](https://repo2docker.readthedocs.io/en/latest/)

jupyter-repo2docker是一个从源代码库中构建、运行和推送 Docker 映像的工具。repo2docker获取一个存储库(从 GitHub、GitLab、Zenodo、Figshare、Dataverse installations、Git 存储库或本地目录)并构建一个可以执行代码的容器映像。映像构建过程基于存储库中的配置文件。

Conda (+ pip)和 Docker 的结合显著提高了我的数据科学开发速度,同时提高了我的数据科学工作流的可移植性和可重复性。

希望这篇文章可以帮助你在下一个数据科学项目中将这三个伟大的工具结合起来!

条件可控的生成对抗网络

原文:https://towardsdatascience.com/conditional-and-controllable-generative-adversarial-networks-a149691ddae6?source=collection_archive---------25-----------------------

理解条件可控 GAN 并在 TensorFlow 2.x 中实现 CGAN

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TT 先生Unsplash 上的照片

在本文中,我们将了解条件和可控 GAN,它们的需求是什么,以及如何使用 TensorFlow 2.x 实现简单的条件 GAN。在您进一步阅读之前,我希望您熟悉 DCGANs,您可以在这里找到。

为什么有条件甘

到目前为止,生成器是随机生成图像的,我们无法控制要生成的图像的类别,即在训练 GAN 时,生成器每次都会生成一个随机数字,即它可能会生成一个、六个或三个,我们不知道它会生成什么。但是条件句我们可以告诉生成器生成一个或六个图像。这就是有条件的 GAN 派上用场的地方。通过有条件的 GAN,您可以生成您选择的类别的图像。

它是如何工作的?

到目前为止,我们将图像作为唯一的输入提供给我们的生成器和鉴别器。但是现在我们将向两个网络提供班级信息。

  1. 生成器将随机噪声和一个独热编码类标签作为输入。并输出特定类别的假图像。
  2. 鉴别器获取一个带有作为深度添加到图像(通道)的独热标签的图像,即,如果您有一个大小为 28 * 28 *1 的图像和大小为 n 的独热向量,则图像大小将为 28 * 28 * (n+1)。
  3. 鉴别器输出图像是否属于该类别,即真实或虚假。

密码

本文的代码与 DCGAN 的代码几乎相同,只是做了一些修改。让我们看看这些差异。

注意:跟随实现是一种幼稚的方式,并且非常慢。你可以参考 这里的 找到一个更好的编码条件 gan 的方法。

组合图像和标签

  1. 首先,我们加载 MNIST 数据集并归一化图像。
  2. 然后,我们定义一个 add_channels 函数,它将一个图像和相应的一个 hot 标签作为输入。并且输出具有表示独热标签的附加深度通道的图像。在添加的所有深度通道中,只有一个通道包含值 1,所有其他通道都包含零值。
  3. 首先,我们迭代所有的图像和相应的标签。对于独热标签中的每个数字,我们创建一个图像形状向量,其中包含等于该数字的每个值。之后,我们把这些向量和图像叠加起来。
  4. 这里,我们有 10 个类,这就是为什么我们在一个热标签中循环了 10 个数字。

结合噪音和标签

  1. 以下代码将噪声向量与一键标签和其他函数结合起来,输出生成器和鉴别器的输入尺寸。
  2. 这是必要的,因为我们的模型是使用顺序 API 编码的,我们需要显式地传递输入维度。

训练循环

  1. 训练循环也与 DCGAN 相同,但这一次我们为生成器合并了噪声和标签。并且在将伪图像送入鉴别器之前对其进行图像处理。

上面的 condition GANs 实现代码非常慢,但它运行良好,有助于理解这个概念。

可控 GANs

条件甘帮助生成我们选择的类的图像。但是我们无法控制输出图像的内容,也就是说,如果我们想要一只戴着红帽子或眼镜的狗怎么办。这就是可控 GANs 出现的原因。但是它是如何工作的呢?所以让我们来找出答案。

概念

可控的 GANs 对于在生成的图像中获得选择的特征是有用的。例如,如果我们想生成一个黑头发绿眼睛的人的图像,那么你需要调整输入噪声。

  1. 当您向发生器提供随机噪声向量时,该噪声向量中的元素对应于所生成图像中的某些特征。
  2. 当您更改噪波向量中的元素时,它会更改图像中的一些特征,例如向量中的一些更改可能会更改人的头发或眼睛的颜色。
  3. 这可以通过在一些向量空间中映射具有相关特征的向量来实现。
  4. 这可以通过使用预先训练的分类器来执行,该分类器告知特定特征是否出现在生成的图像中,例如人的眼睛是否是绿色的。这可以用于找到不同特征的噪声矢量。

可控氮化镓面临的挑战

可控 GANs 面临以下两个主要挑战。

  1. **相关性黑白特征:**当我们为了改变一个特征而改变噪声向量的一个元素时(就像给女性的图像添加面部毛发),会导致其他特征的改变(就像改变图像中人的性别)。这可能是因为模特们见过面部毛发带有阳刚之气的脸。
  2. **矢量空间纠缠:**噪声矢量中的元素在对应特征时发生纠缠。

结论

条件 gan 用于生成属于我们选择的类的图像,而可控 gan 用于控制图像中的特征。

你可以在这里找到这篇文章的完整代码。请继续关注即将发表的文章,我们将在那里实现更多的算法。

所以,本文到此结束。谢谢你的阅读,希望你喜欢并且能够理解我想要解释的内容。希望你阅读我即将发表的文章。哈里奥姆…🙏

参考

[## 生成对抗网络

由 DeepLearning.AI 提供关于 GANs 生成对抗网络(GANs)是强大的机器学习模型…

www.coursera.org](https://www.coursera.org/specializations/generative-adversarial-networks-gans)

Power BI 中的条件格式

原文:https://towardsdatascience.com/conditional-formatting-in-power-bi-3e3bd1198b8e?source=collection_archive---------43-----------------------

了解如何在 Power BI 视觉效果中应用条件格式

在本文中,我将解释什么是 Power BI 中的条件格式。顾名思义,条件格式是一种可视化数据的方式,它基于一些预定义的条件对所选指标的值应用特殊的格式规则。它主要用于数据以表格形式呈现的情况;但是,它也可以用于任何图表,如条形图、折线图等。

Power BI 中的条件格式是什么?

当有大量数据以表格形式表示时,乍一看很难理解哪个值更高或更低。通常,您需要深入观察单元格值,以了解或比较显示的各种指标。

例如,如果您考虑下面左边的图,数据太多了,您需要单独比较每个单元格的值,以便了解更多信息。然而,如果你看到右边的图,你只要看一眼就能明白,什么是较高的值,什么是中间值,什么是较低的值。这就是 Power BI 中的条件格式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1 —条件格式比较

设置数据

让我们首先尝试将一些数据导入 Power BI 数据模型。一旦数据被导入,我们将研究如何实现条件格式。为了这篇文章,我将从微软提供的著名的 WideWorldImportersDW 数据库中导入数据。你可以在本地轻松下载并安装这个数据库。因为我已经安装了数据库,所以我不会在这里介绍这些步骤。为了将数据导入到 Power 中,您可以按照下面的步骤与我一起进行:

打开 Power BI 桌面,点击**获取数据。**从出现的下拉菜单中选择 SQL Server

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2 —获取功率 BI 中的数据

在出现的连接服务器对话框中,提供服务器名称数据库名称并点击确定。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3 —服务器详情

单击 Connect 后,您会看到对话框中列出了数据库中的所有表。对于本文,我们将只选择三个表— 维度。维度城市。日期事实。销售。完成后点击加载

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5 —选择表格

在 Power BI 中构建报告

现在,让我们使用矩阵可视化快速构建一个电源 BI 报告。它将使用我们刚刚导入的表中的数据。点击可视化面板上的矩阵,将各个字段拖放到中,如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7 —构建矩阵

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8 —构建矩阵

一旦字段就绪,您将看到 Power BI 报告中创建了一个类似的矩阵。这是一个简单的矩阵,显示每个销售区域年度含税总额。如你所见,理解矩阵中的最高值和最低值并不容易;我们需要深入视觉,理解这些价值观。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9 —新矩阵

在 Power BI 中实现条件格式

为了在 Power BI 中实现条件格式,让我们继续定义我们想要可视化的规则。让我们考虑一下,我们将根据每个单元格保存的值来更改单元格的背景颜色。例如,具有最低值的单元格将具有红色的背景色,而最高值将以蓝色突出显示。您可以按照下面的步骤来实现相同的功能。

右键单击部分的含税总额字段。或者,您也可以点击格式按钮,打开条件格式下的背景色**。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 11 —条件格式

将打开背景颜色-格式对话框

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 12 —背景颜色

现在让我们通过选项选择色标作为格式,并如前所述选择颜色。对于最低值,我们将指定为红色**,而最高值的颜色将为蓝色。完成后点击确定。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 图 13 —定义色标

现在我们已经了解了 Power BI 中的条件格式是怎么回事,让我们来探索一些实现相同内容的不同方法。在上述步骤中,格式规则基于单元格值的范围。这意味着,根据单元格的值,背景颜色的饱和度会发生变化。但是,在某些情况下,您可能希望基于固定数值来可视化格式,而不希望更改颜色的饱和度。或者,您可能还希望将度量值分为、和值等类别。

在下面的步骤中,我们将尝试将条件格式的规则从范围修改为固定值。

  1. 右键单击部分的含税总额字段
  2. 选择条件格式然后点击背景颜色
  3. 或者,您也可以点击格式按钮,打开条件格式下的背景色
  4. 将打开背景颜色-格式对话框
  5. 现在,我们将创建一些规则,基于这些规则来应用格式。您可以通过点击新规则按钮创建尽可能多的规则

因此,在上面的练习中,我们看到了如何基于两种不同的方式在 Power BI 中实现条件格式。第一个是通过使用色标,第二个是通过为格式定义特定的规则

Power BI 中带有图标的条件格式

现在让我们更进一步,在单元格中实现一些图标作为视觉指示器。这些特定的图标在定义任何 KPI 或根据标准比较指标时非常有用。您可以按照下面提到的步骤来实现单元格中的图标。

  1. 右键单击部分的含税总额字段
  2. 图标——格式化对话框打开
  3. 让选项的格式作为规则****
  4. 选择图标布局为数据右侧的**,选择图标对齐为**中间的****
  5. 样式下拉菜单中选择任意选项,点击确定
  6. 图 20 —图标定义规则
  7. 现在你可以看到矩阵根据上一步定义的条件显示了额外的图标

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 图 21 —带有图标的条件格式
  2. 这是一个重要的特性,有助于用户直观地了解指标是否表现良好
  3. 同样,您可以根据需求添加任意多的规则

结论

在本文中,我解释了 Power BI 中的条件格式是什么以及如何实现它。我还解释了如何应用条件格式以及在什么情况下应用条件格式的不同方式。最后,我们看到了如何在视觉效果中包含一些信息图视觉效果(图标),这有助于在很大程度上提高报告的可读性。

原载于 2020 年 3 月 18 日 https://www.sqlshack.com

条件概率、西雅图雨和狡猾的朋友

原文:https://towardsdatascience.com/conditional-probabilities-seattle-rain-and-tricky-friends-aa1f33c20e29?source=collection_archive---------20-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本·达顿在 Unsplash 上的照片

通过解决这个数据科学面试问题(使用 Python)更好地理解概率

我最不喜欢的一种数据科学面试题是概率。只是这不是我每天想的事情,所以每当我被迫锻炼概率肌时,我总是感觉它们超级生锈。但是,如果你正在寻找一份数据工作,不可避免的是,你会在某个时候遇到一份——所以让我们通过一些实践来保持我们的概率技能。像往常一样,我们将使用模拟(和 Python 代码)来更好地可视化正在发生的事情。

这个问题

你要去西雅图。你想知道你是否应该带一把伞,所以你打电话给住在那里的三个随机的朋友,分别问他们是否在下雨。每个朋友都有 2/3 的机会对你说真话,1/3 的机会撒谎(好刻薄!).三个朋友都告诉你“是的,下雨了”。西雅图真的下雨的概率有多大?

我第一次看到这个问题时,我想“只有当我的三个朋友都对我撒谎时,这才意味着西雅图没有下雨”。因为只要我的一个朋友没有撒谎,那么肯定会有一个是真的(暗示下雨)。

probability rain = 1 - probability all lying= 1 - (1/3)^3 = 0.963

但后来我觉得这似乎太简单了。如果这个问题如此简单,它怎么会如此臭名昭著。遗憾的是,我的直觉是对的,这个问题比看起来更复杂。

这是一个条件概率

我以前的方法忽略了给定的条件。**你问什么条件?面试官告诉我们,我们的三个朋友都回答是。**这是我们的解决方案需要考虑的相关信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

奥斯曼·拉纳在 Unsplash 上拍摄的照片

要知道为什么,想象一下西雅图正在下雨。当我们问朋友是否在下雨时,他们回答[是,是,是]。让我们仔细想想在这种世界状态下可能出现的结果。如果他们都说了实话,那么这与我们所处的世界状态是一致的(因为西雅图正在下雨)。

如果他们都撒谎了呢?那是不可能的。在世界正在下雨的情况下,我们的朋友不可能回答“是”并撒谎(要撒谎,他们必须回答“不是”)。有没有可能他们中只有一个撒谎了?这也是不可能的——所有人都说“是”,而躺在下雨的世界里需要说“不”。所以如果西雅图下雨,唯一可能的结果就是我们的朋友都在说实话。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

塞尔吉奥·索萨在 Unsplash 上的照片

现在想象西雅图阳光明媚。我们可以做同样的练习来找出在这个世界状态下可能发生的事情。如果是晴天,那就意味着我们的三个朋友都对我们撒了谎。那是唯一的可能!因为在阳光明媚的世界里,我们的朋友必须回答“不,没有下雨”才能说实话。他们都没这么说过。

所以只有两种可能:

**World state = it is raining:**
[yes,yes,yes] = **[truth,truth,truth] = raining**
                [lie,lie,lie] = impossible
                [lie,lie,truth] = impossible
                [lie,truth,truth] = impossible
                [lie,truth,lie] = impossible
                [truth,truth,lie] = impossible
                [truth,lie,lie] = impossible
                [truth,lie,truth] = impossible**World state = it is not raining:**
[yes,yes,yes] = [truth,truth,truth] = impossible
                **[lie,lie,lie] = not raining**
                [lie,lie,truth] = impossible
                [lie,truth,truth] = impossible
                [lie,truth,lie] = impossible
                [truth,truth,lie] = impossible
                [truth,lie,lie] = impossible
                [truth,lie,truth] = impossible

基本上,如果下雨,他们一定都在说实话。如果不是,他们一定都在撒谎。如果我们的三个朋友都同意,这是唯一的可能性。

因此,我们正在估计一个条件概率:

Prob(rain | [yes,yes,yes])Which is read as probability of rain given that the responses were yes, yes, and yes].

我们可以在这里突破贝叶斯定理,但我更喜欢一种更直观和深入的方法,这样我们才能真正掌握正在发生的事情。

用 Python 模拟

让我们写一些代码来模拟这个脑筋急转弯。我在代码中添加了一些注释来描述它是如何工作的以及我的思考过程。但是让我们也快速浏览一下。

我们将运行 10 万次模拟。我们还需要具体说明下雨的概率。很奇怪,对吧?我们不是在估算下雨的概率吗?不,实际上我们是在估计下雨的概率,因为我们的朋友都说“是的,下雨了”。为了做到这一点,我们需要模拟世界的两种可能状态(下雨或不下雨)。我们可以通过类似抛硬币的随机变量(0 和 1 之间的均匀分布)来实现这一点,如果随机变量 rain 小于 prob_rain,则在我们的模拟中正在下雨。

接下来,我们以同样的方式模拟我们 3 个朋友的反应——如果反应中的 3 个随机变量中的任何一个大于 2/3,那么这个特定的朋友对我们撒谎了(因为他们有 2/3 的机会说真话,1/3 的机会撒谎)。

我们有 3 个计数器变量来跟踪我们关心的结果:

  1. times_rained_3yes 记录下雨的次数,我们的朋友都实话实说,说“是的,下雨了”。
  2. times_dry_3yes 记录了没有下雨的次数,我们的朋友都撒谎说“是的,下雨了”。
  3. times_rained 跟踪我们的模拟中下雨的次数(大约是我们设置 prob_rain = 0.5 以来的 50%)。
# Inputs
sims = 100000
prob_rain = 0.50# Counter variables to tally the simulation outcomes
times_rained_3yes = 0
times_dry_3yes = 0
times_rained = 0# Loop that runs the simulations
for i in range(sims):   
    # Random variable to simulte whether it rains or not
    rain = np.random.random()

    # Raining Case
    if rain < prob_rain:
        # If it is raining, increment counter
        times_rained += 1
        # Random variables to simulate whether friends lie
        responses = [np.random.random(),
                     np.random.random(),
                     np.random.random()]
        # Tally the number of lies
        lies = sum([1 for i in responses if i > 2/3])

        # If sum(lies) == 0, then all truth
        if lies == 0:
            # This is outcome we are looking for, where the
            # world state = RAINING and all friends tell truth
            times_rained_3yes += 1

    # Not Raining Case
    else:    
        # Random variables to simulate whether friends lie
        responses = [np.random.random(),
                     np.random.random(),
                     np.random.random()]
        # Tally the number of lies
        lies = sum([1 for i in responses if i > 2/3])

        # If sum(lies) == 3, then all lies
        if lies == 3:
            # This is outcome we are looking for, where the
            # world state = DRY and all friends lie
            times_dry_3yes += 1

运行模拟后,我们可以使用计数器变量来计算我们感兴趣的概率。

sims = 100,000times_rained = 49,990times_rained_3yes = 14,852times_dry_3yes = 1,889

所以大约 50%的时间都在下雨(因为我们是这样设置的)。而当真的下雨的时候,我们的朋友大约有 29% (14,852/49,990)的时候会说实话——(2/3)= 0.295。而不下雨的时候,我们 3 个朋友对我们撒谎的时间都是 3.77% (1,889/50,010)-(1/3)= 0.037,由于模拟噪音的原因略有差异。

我们现在已经有了解决问题所需的所有数字!你能看出是怎么回事吗?让我们回想一下我们的问题——当我们的三个朋友都说“是的,下雨了”时,我们想知道下雨的概率。所以我们概率计算的分子应该是下雨的次数和所有人都说是的次数。而分母应该是我们所有的朋友在世界所有的状态下回答是的次数(只有 2 种状态——下雨和不下雨)。

**Numerator** = times_rained_3yes = 14,852**Denominator** = number of times our friends said 3 yeses
            = times_rained_3yes + times_dry_3yes
            = 14,852 + 1,889 = 16,741**The Answer = 14,852 / 16,741 = 0.888**

所以根据我们朋友的回答,西雅图有 89%的可能在下雨(一定要带伞)。

解析解

我们也可以如下解析求解:

  • 分子是 3 赞成和下雨的联合概率。因为它们是独立的事件,我们可以用下雨的概率乘以 3 个真相的概率(因为下雨时回答是等于说实话)。
  • 分母是 3 通过的概率。我们可以通过认识到 3 个“是”只能产生于 2 种情况来计算:要么是下雨时的 3 个真相,要么是不下雨时的 3 个谎言。我们已经有了第一个概率(它是我们的分子)。我们可以用同样的方法计算第二个(不下雨时的 3 个谎言)——用 3 个谎言的概率乘以不下雨的概率。最后,我们将两个案例的概率相加,得到 3 个通过的概率。
**Numerator** = Prob. 3 Truths * Prob. Rain 
 = (2/3)^3 * (1/2)**Denominator** = Prob. 3 Yeses
 = (Prob. 3 Truths * Prob. Rain) + (Prob. 3 Lies * (1 - Prob. Rain))
 = (2/3)^3 * (1/2) + (1/3)^3 * (1/2)**Plugging into Python:**
(2/3)**3*(1/2) /((2/3)**3*(1/2) + (1/3)**3*(1/2))**We get:**
**0.888**

最后,需要注意的是,根据我们对下雨概率的估计(我们之前设定为 0.5),答案会有所不同。这是有道理的——不管我们朋友的反应如何,我们先前对下雨概率的假设仍然很重要。我们朋友的反应会改变我们开始的先验假设,但不会推翻它。例如,如果我们要去拉斯维加斯而不是西雅图,即使有三个“是的,下雨了”的回答,我们也可以不带伞。下图显示了我们关于下雨概率的假设(我代码中的 prob_rain 变量)如何改变我们的答案:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们的开始下雨概率假设对答案的影响

今天的节目到此结束。祝你面试和数据科学一切顺利。干杯!

Python 示例中的条件概率

原文:https://towardsdatascience.com/conditional-probability-with-a-python-example-fd6f5937cd2?source=collection_archive---------4-----------------------

假设一个学生错过了 10 节或更多的课,使用 python 计算该学生数学得 A 的条件概率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本文有 2 个部分:
1。条件概率背后的理论
2。python 的例子

第一部分:条件概率背后的理论和公式

这一次,维基百科有了一个平易近人的定义,

概率论中,条件概率是一个事件发生的概率的度量,假设另一个事件已经发生(通过假设、推测、断言或证据)。

**翻译:**给定 B 为真,A 也为真的概率是多少。

有具体例子的东西更容易理解。下面是一些我们可以计算的条件概率的随机例子。

例子:

  1. 如果一个人是大学生,睡眠少于 8 小时的概率是多少?
  2. 如果一只狗是边境牧羊犬,它活超过 15 年的概率有多大?
  3. 如果你为政府工作,用掉所有假期的概率是多少?

公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

条件概率的公式是P(A|B) = P(A ∩ B) / P(B)

零件:
P(A | B)= A 发生的概率,给定 B 发生
P(A∩B)= A 和 B 都发生的概率
P(B)= B 发生的概率

|意为“给定”。意思是“在其他事情发生的情况下”。

的意思是相交,你可以把它想象成and,或者是维恩图中的重叠。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是为什么我们在公式中用P(B)P(A ∩ B)

因为我们要排除非 B 情况的概率。我们正在确定落入B的概率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

除以P(B)去除了非B的概率。C — B以上。

第 2 部分:python 示例

我们将计算一个学生数学得 A (80%+)的概率,假设他们错过了 10 节或更多的课。

kaggle 下载数据集并检查数据。

import pandas as pd
df = pd.read_csv('student-alcohol-consumption/student-mat.csv')
df.head(3)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

并检查记录的数量。

len(df)
#=> 395

我们只关心列,absences(缺席次数),和G3(从 0 到 20 的最终分数)。

让我们基于这些列创建几个新的布尔列,使我们的生活更容易。

添加一个名为grade_A的布尔列,记录学生最终分数是否达到 80%或更高。原始值在 0-20 范围内,所以我们乘以 5。

df['grade_A'] = np.where(df['G3']*5 >= 80, 1, 0)

如果学生缺了 10 节或更多的课,创建另一个名为high_absenses的布尔列,值为 1。

df['high_absenses'] = np.where(df['absences'] >= 10, 1, 0)

再添加一列,使构建数据透视表更容易。

df['count'] = 1

删除所有我们不关心的栏目。

df = df[['grade_A','high_absenses','count']]
df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

很好。现在我们将由此创建一个数据透视表。

pd.pivot_table(
    df, 
    values='count', 
    index=['grade_A'], 
    columns=['high_absenses'], 
    aggfunc=np.size, 
    fill_value=0
)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们现在有了进行计算所需的所有数据。让我们从计算公式中的各个部分开始。

在我们的例子中:
P(A)是一个等级 80%或更大的概率。
P(B)是缺课 10 节及以上的概率。
P(A|B)是 80%+成绩的概率,给定缺课 10 节或以上。

零件的计算:
P(A)=(35+5)/(35+5+277+78)= 0.10126582278481013
P(B)=(78+5)/(35+5+277+78)= 0.21012658227848102
P(A∩B)= 5/(35+1

并且按照公式,P(A|B) = P(A ∩ B) / P(B),把它拼在一起。

p(A | B)= 0.012658227848101266/0.21012658227848102 = 0.06

我们找到了。如果缺课 10 节或更多,得到至少 80%最终成绩的概率是 6%。

结论

虽然从我们的具体例子中学到的很清楚——如果你想要好成绩就去上课,条件概率可以应用于更严重的情况。

例如,在给定测试结果的情况下,一个人患有特定疾病的概率。

在使用贝叶斯定理进行更复杂的概率估计之前,理解也是必不可少的。

置信区间、计算和特征

原文:https://towardsdatascience.com/confidence-interval-calculation-and-characteristics-1a60fd724e1d?source=collection_archive---------17-----------------------

什么是置信区间,如何计算它,以及它的重要特征

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:维基百科

置信区间在统计学和数据科学中非常重要。在这篇文章中,我将解释置信区间,如何计算它,以及它的重要特征。

置信区间(CI)是一个数值范围。它以百分比的形式表示,预计包含统计参数的最佳估计值。95%的置信区间意味着,我们的总体参数有 95%的把握位于该置信区间之间。

置信区间的解释

这里有一个声明:

在对 659 名带着蹒跚学步的孩子的父母进行的抽样调查中,有 540 人(约 85%)表示,他们在带着孩子的所有旅行中都使用汽车安全座椅。根据这些结果,提供了 95%的置信区间,从大约 82.3%到 87.7%。”

这句话的意思是,95%确定的是,带着他们的孩子在所有旅行中使用汽车安全座椅的人口比例是 82.3 和 87.7。如果我们从这个人群中抽取几个子样本,在 95%的情况下,带着蹒跚学步的孩子出行时使用汽车安全座椅的人群比例将在 82.3%到 87.7%之间。

我们能说置信区间(82.3,87.7)包含了真实的人口比例吗?答案不得而知。人口比例是一个固定值,但未知。记住 95%的信心并不意味着 95%的可能性,这一点很重要。

为什么置信区间很重要?

这一点很重要,因为大多数时候不可能从一个群体中的每一个人身上获取数据。在上面的例子中,样本量是 659。我们从 659 名父母样本中估计了所有旅行中都使用汽车座椅的幼儿父母的人口比例。我们无法从所有带着蹒跚学步的孩子的父母那里获得数据。因此,我们从现有样本中计算人口比例,并考虑误差幅度。有了这个误差范围,我们就得到了一个范围。这个范围称为置信区间。置信区间是一种表示样本数据代表总体情况的方式。可以计算任意数的置信区间(小于 100%)。但是 95%的置信区间是最常见的。

如何计算置信区间

置信区间的公式为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们通常想要一个高置信度,比如 75%、95%或 99%。置信水平(CL)越高,精度越低。在上面的例子中,最好的估计是 85%。我们可以通过以下公式计算估计 SE:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在等式中,p1 以上是最佳估计,n 是样本大小。下面是一些常用置信水平的 z 分数表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入所有的值,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

置信区间分别为 82.3%和 87.7% 。

CL 越高,CI 的范围越大

同样的,我们可以计算出 99%的置信度。你只需要改变 z 值。从上表中可以看出,99%置信水平的 z 值为 2.57。将该值代入置信区间公式,99%置信水平的置信区间为 81.43%至 88.57%。置信区间的范围越大,置信水平越高。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:维基百科

在上图中,中间的‘mu’是最佳估计值,sigma 是标准差。我们在示例中使用了标准误差,因为总体标准偏差是未知的。图中显示,68%的人群保持在距离最佳估计值 sigma 的范围内。这是 68%的置信区间。同样,95%置信区间和 99.7%置信区间在距离最佳估计值‘mu’2 sigma 和 3 sigmas 的范围内。另一种表达方式是,95%和 99.7%的人口位于距离最佳估计值‘mu’2σ和 3σ的范围内。如果这张图片让您感到困惑,请不要担心,使用 z 得分表从上面的公式计算不同的置信水平。那会给你一个趋势的概念。

样本越大,置信区间越窄

样本量越大,置信区间越精确。让我们用父母带着蹒跚学步的孩子的例子来证明一下。让我们假设最佳估计值保持不变,0.85。但是样本量是 1500 而不是 659。现在,在公式中插入这个新的样本量,并计算出 95%的置信区间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

95%置信水平的置信区间变为 83.2%和 86.8%,比 82.3%和 87.7%窄。

向业务用户解释置信区间

原文:https://towardsdatascience.com/confidence-interval-clearly-explained-b9f3fa787d0?source=collection_archive---------17-----------------------

如何简洁地回答著名的数据科学面试问题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 Coursera-stats

当我们作为数据科学家开始我们的旅程时,少数几个任何人都可能被卡住的话题之一是“置信区间”。是我的实习经历让我对这个概念有了清晰的认识。最近,当我在一次采访中被问到“你如何向商业用户解释置信区间?”,我仍在努力恰当地表达我的答案。

这篇文章是写给那些正在努力理解置信区间概念的人,也是写给那些理解了这个概念但不能和非技术人员交流的人。我在这里的目的只是给出一个关于这个话题的直觉。请将此视为构建概念的起点。

这篇文章有两个部分。在第一部分中,我将尝试用简单的英语解释置信区间的概念。在第二部分,我将展示这个概念背后的数学原理。

用英语解释置信区间

假设你是亚马逊的一名数据科学家。现在,亚马逊拥有 1 亿客户。想象一下,其中 5000 万是男性顾客,5000 万是女性顾客。

你想分析两性的消费习惯是否不同。你需要回答的具体问题是:平均而言,女性每笔交易的花费是否比男性多?

一种确定方法是跟踪所有这 5000 万女性顾客的每笔交易的花费金额,跟踪所有这 5000 万男性顾客的每笔交易的花费金额,计算平均值并得出结果。您刚才所做的是收集总体数据并确定总体参数。然而,你几乎没有时间和资源(有时是金钱)来收集整个人口数据。因此,你依靠经典统计学来解决问题。

首先,让我们试着计算一下女性顾客每笔交易的平均支出。

设每笔交易金额用 Si 表示。所有 5000 万女性顾客的平均交易量,即人口平均数是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有 5000 万女性顾客的平均消费

如前所述,由于你没有时间和资源去等待和收集所有 5000 万女性顾客的消费,你可以从这 5000 万女性顾客中抽取一个(随机独立的)女性顾客样本,比如说 30000 个。您将记录这 30,000 名女性顾客的每笔交易支出:

所以现在你有 30,000 笔交易。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在您将计算这 30,000 笔交易的平均值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

样本中 30,000 名女性顾客的平均消费

使用经典统计学有效解决业务案例

在经典统计学中,您使用这个样本平均值来找出总体平均值。在这种情况下,您使用 30,000 名女性客户样本的平均支出来找出 5,000 万名女性客户的整个人口的平均支出。

有两种方法可以做到这一点

  1. 你得出结论,3 万女性顾客的平均消费,(样本平均)等于所有 5000 万女性顾客的平均消费(人口平均)。这被称为点估计,在这里你使用样本数据得出未知总体参数的最佳猜测。
  2. 一个更好更有说服力的方法是用这个样本平均值来找出总体平均值所在的区间。使用这个 30,000 名女性顾客的样本,你将计算出 5,000 万女性顾客的平均消费可能处于的区间。

您使用样本数据计算出的总体参数所在的可信区间称为置信区间。间隔的宽度主要由业务决定:90%、95%或 99%是最常见的。

用简单的英语来说,95%的置信区间告诉你 95%的人口参数值,即 5000 万女性顾客在这里的平均消费,所在的范围。因此,我们可以 95%地确信总体均值将位于区间内。(您必须记住,这 95%的总体数据区间是仅利用样本数据中的信息计算出来的)

这里的一个重要方面是如何对数据进行采样。要获得总体的无偏代表样本:

  1. 样本量不应该太小
  2. 样本应该是随机和独立的。

即,

收集一个数据点不应以任何方式决定您的下一个数据点。例如,仅仅因为你收集了一个 50 岁已婚女性的样本作为你的第一个数据点**,你不应该认为**“现在我将收集一个 20 岁的单身女性”。如果这样做,就会引入偏差,第二个数据点就会依赖于第一个数据点。这样可以确保样本中收集的每个数据点都是随机的并且相互独立。(点击此处了解更多关于选择偏差的信息)

所以,下次当你得到这个问题用非技术的方式解释置信区间时,你可以用这个想法来表述答案。

假设您想要计算出您感兴趣的关于人口的一些参数(根据业务进行定制)。收集全部人口的数据既费时又费钱。所以你收集一个随机的数据样本,从这个样本中,使用统计方法,你可以计算出一个总体参数可能存在的区间。这个区间称为置信区间。

现在回到业务问题

为了更好地理解置信区间的用处,让我回到我们最初的问题。平均而言,女性在每笔交易上花的钱比男性多吗?这是手头的问题

就像你拿了 3 万个女客户的样本,算出平均值,你就拿了 3 万个男客户的样本,算出平均值。让我们假设从这个样本中计算出的女性顾客的每笔交易的平均花费(Female_avg)是 2350 美元,而从样本中计算出的男性顾客的每笔交易的平均花费(male_avg)是 1350 美元。这里女性平均值大于男性平均值。但是在得出女性在每笔交易中花费更多的结论之前,记住你只有样本信息。即使我们正确地获得了样本,样本平均值也可能与总体平均值相差很大。这就是你找到男顾客和女顾客平均消费的置信区间。

假设你得到的男性用户平均消费对应的 95%置信区间为[1150,1250],女性用户为[2340,2360]。这意味着 95%的(全部 5000 万)男性顾客的平均消费介于 1150 至 1250 英镑之间。只有 5%的情况下(非常罕见),你会发现男性的平均支出超过 1250 美元。同样,对于女性来说,只有 5%的时间平均支出低于 2340 美元。因此,你可以得出结论,平均而言,女性在每笔交易中花费的钱比男性多。

具体来说,您正在检查置信区间是否与重叠。如果置信区间没有重叠,那么我们可以说有差异。

假设你得到男性用户平均消费的 95% CI 为[2330,2350]。这里你可以看到置信区间重叠。因此,我们不能得出女性在每笔交易中比男性花费更多的结论。

我希望我能让你对这个概念有个直观的理解。现在是数学时间了。

置信区间背后的数学

在深入研究之前,你必须具备的一个先决条件是很好地理解中心极限定理。

[## 中心极限定理的应用

以及实际应用中的例子

towardsdatascience.com](/central-limit-theorem-in-action-1d4832599b7f)

我们在这里使用的数据集是 Kaggle 的黑色星期五销售数据。这里的数据集是黑色星期五在一家零售店进行的交易的样本。为了解释的连续性,考虑这个数据集是亚马逊的。

[## 黑色星期五购物促销

Kaggle 是世界上最大的数据科学社区,拥有强大的工具和资源来帮助您实现您的数据…

www.kaggle.com](https://www.kaggle.com/sdolezel/black-friday?select=train.csv) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

黑色星期五销售数据集

记住,我们只有 500 万英镑的交易样本。

你想知道的第一件事是,两性之间的花费是否存在差异。从这个数据集中找出女性顾客在黑色星期五期间的平均消费,然后与男性顾客的平均消费进行比较。

我们先从计算女性顾客的平均消费开始。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

女性的平均支出

如前所述,这只是女性用户交易的样本平均值。我们必须用这 8734 美元来得出一个区间,在这个区间内,人口平均数可能会下降。为了计算这个区间值,我们利用中心极限定理。

简而言之,中心极限定理表明,无论总体分布如何,如果总体分布具有有限均值和有限方差σ,样本均值的分布将遵循均值和标准差σ /√n 的高斯分布,其中 n 是样本大小,假设样本大小足够大。

对该数据集应用中心极限定理

  1. 从数据集中随机抽取女性交易的替换 100 个数据点(样本大小)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.记录该样本的平均值(8124 美元)

3.重复步骤 1 和 2 10,000 次。你得到 10,000 个平均值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算 100 个样本中每个样本的平均值。

4.绘制上面收集的所有 10,000 个样本平均值的分布图。那么根据中心极限定理,这个分布将是一个高斯分布。

5.计算这些样本均值的平均值 x。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

x 大约计算为 8700 美元。

在步骤 4 中获得的分布将具有 X 的平均值,因此将以 X 为中心(因为分布是高斯分布),标准偏差σ /√100。(100 为样本量)。然后用这个 X,我们可以给出一个总体均值的估计范围。

但是怎么做呢?

标准差为σ的高斯分布的一个重要特性是,95%的值将位于[ -2σ,+2 σ]范围内。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

维基百科上的正态分布

利用这个性质,我们可以计算出以 X 为中心的 95%范围。记住,X 只不过是样本平均值的平均值。所以这个 95%的范围可以理解为:“95%的样本均值将位于[ -2 σ,+2 σ]之间”。

计算 95%的置信区间

假设我们知道总体标准差σ,设σ为 500。(大假设!!)

样本量=100

样本统计平均值= X = 8700 美元

根据高斯分布的性质,95%的值位于[8600,8800]之间。

区间[8600,8800]是所有女性交易平均花费的 95%置信区间。

说白了,我们可以说【8600,8800】涵盖了所有女性客户平均消费的 95%的数值。就是这样!

或者我们可以说,95%的时间实际人口意味着将位于这个区间。或者我们可以说,我们有 95%的把握认为实际人口平均数在这个范围之内。

任何超出此区间[8600,8800]的值只在 5%的时间内出现。比如所有女性客户平均消费 8200 的概率小于 0.05。

因此,使用一个样本统计量,我们能够给出总体中一个未知参数的一系列似是而非的值。

需要注意的一点是,所有这些都是因为中心极限定理才成立的,该定理认为采样分布本身是高斯分布。如果我们不知道抽样分布是高斯分布,我们就不能利用这个性质来计算区间的上限和下限。

现在你可以猜测 99%的置信区间告诉我们什么。它只是给出了一个覆盖女性顾客平均消费 99%的区间。遵循同样的性质,计算为[ -3σ,+3 σ]。因此,99%的置信区间比 95%的置信区间更宽。

为了简单起见,我做了一个很大的假设,我们知道总体标准差。**我们大多不会有这方面的信息。**当总体标准差未知时,我们用 t 分布来计算置信区间。

注意事项:

  1. 在机器学习中,因为数据的数字化,所以非常容易得到人口数据。如果我们有人口数据,就没有必要计算 C.I。如果获取数据的成本很高(医疗应用)或获取此类数据很困难(第三方营销公司),在这种情况下,像这样的经典统计方法就派上用场了。
  2. 计算置信区间的一个用例是 AB 测试。在 AB 测试中,你将你的人群(用户)随机分成两个(或更多)组:控制组和挑战者组。对照和挑战者是总体的两个样本。使用这些样本,你需要确定这个群体的行为。
  3. 我们使用中心极限定理,只在需要计算均值的置信区间时才计算置信区间。估计标准差、中位数或第 90 百分位等的置信区间。我们使用自举。这是因为 CLT 不适用于标准差或中位数,而是适用于任何加法或加法后加运算的函数。

我很想知道这篇文章是否对你有所帮助,或者你是否有任何反馈。通过你的评论让我知道。

此外,查看另一个令人困惑的主题的简单解释。

[## 学会阅读英文版 P-Value

理解什么是 P 值,它与零假设有什么关系

towardsdatascience.com](/learn-to-read-p-value-in-english-11725c09f30e)

如果这篇文章对你有帮助,请鼓掌!

[## Aparna Gopakumar -会员- Beta Gamma 适马| LinkedIn

一名有抱负的数据科学家和一名刚刚毕业的商业分析和项目管理理学硕士…

www.linkedin.com](https://www.linkedin.com/in/aparna-gopakumar/)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值