TowardsDataScience 博客中文翻译 2020(一千零三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

为什么我们需要机器学习算法中的偏差

原文:https://towardsdatascience.com/why-we-need-bias-in-machine-learning-algorithms-eff0343174c0?source=collection_archive---------35-----------------------

有一种观念认为偏见不是最好的东西,因为根据定义,这是一种给客观观点增加主观性的方式。在机器学习中,算法中也有同样的偏差概念。听到这个,有人可能会说,为什么我们需要偏见,为什么我们不把它从算法中去除,并有一个算法,只使用它已经看到的数据来预测未知的新数据。

让我们看看为什么消除偏见的概念会从根本上破坏机器学习。

提供上下文让我们解决一个简单的分类问题。比方说,我们有一些鱼,我们想建立一个机器,可以分类鱼是鲑鱼还是鲦鱼。一个限制是机器只能测量鱼的高度和重量。现在我们已经定义了我们的问题,我们需要一些数据来学习。

这里有一些数据,是用鱼的种类标注的鱼的身高和体重。

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

培训用数据

现在我们有了一些数据,机器可以从中学习。

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

绘制的数据

我们希望确保机器没有任何偏见,或者对它正在学习的数据做出任何假设。所以机器只依赖上面提供的数据集。

假设我们想预测这条新鱼是鲑鱼还是小鱼。这条新鱼的身高和体重是 3 . 4。机器会将新的看不见的鱼与存储在它的存储器中的鱼进行比较,然后它注意到有一条尺寸完全相同的鱼,它是一条小鱼。厉害!所以机器确定这条新鱼是一条小鱼。如下图所示:

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

用绿色标出未知的鱼

让我们看另一条鱼,它的高度是 9,重量是 8。机器检查了所有的例子,然后说抱歉,我从来没见过这么高这么重的鱼,我不知道它是什么。我不想做任何假设,所以我不能给它贴标签。因此,这种消除偏差的概念将我们引向这种无偏概化器,当给定一个看不见的数据点时,它无法基于数据集做出概化。这并不令人惊讶,但并不明显。

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

用绿色标出未知的鱼

所以这意味着,为了做出一个概括,机器必须做出一些假设,必须有一些偏见,以便从一组可能的概括中选择一个概括。所以,机器学习就是选择这些偏差,并使用它们根据人口数据样本进行预测。

以下是一些来自众所周知的机器学习算法的不同概括或不同偏见的例子:

我们可以做的一个假设是,如果我们说寻找新示例的最近邻居,然后用最近邻居的标签来标记新示例。我们可以说最接近是基于两点之间的欧几里得距离。利用这一点,我们发现新的项目是鲑鱼。这实际上是一个非常著名的算法的基础,该算法被称为最近邻算法。我们引入了一个假设,即每种鱼的数据将来自相同的分布,因此彼此接近。如下图所示:

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

最近邻算法

我们还可以引入一种新的假设。如果我们像这样画一条线。这就产生了一个线性分隔数据的边界。我们这里的假设是,有一条线性线可以将数据分开。使用这条线,我们可以标记新的点,它说这是一条鲑鱼。这是逻辑回归算法的基础。ML 的订书钉。

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

逻辑回归算法

以上两种情况向机器引入了不同类型的偏差,并且当机器试图学习和预测时,还有许多其他类型的归纳可以考虑。

由用户决定向机器中输入多少偏差,并且由用户知道偏差如何影响算法决策。例如,我们可以使用一种叫做朴素贝叶斯的算法,它假设如果我们随机挑选一条鱼,得到一条鲑鱼和一条小鱼的可能性有多大。如果这个假设是非常错误的,那么我们其余的预测就完全错了。因此,了解每种 ML 算法的偏差以及它们如何影响决策过程是很重要的。有一点是肯定的,没有偏见就不会有学习。

我希望这已经提供了一些直觉,关于机器如何学习以及偏见如何成为学习过程的一部分。一篇对定义这些概念非常有帮助的论文是 Tom M. Mitchell 的“学习归纳中的偏见需求”,所以请随意查看。

感谢阅读!

为什么我们需要神经网络中的偏差

原文:https://towardsdatascience.com/why-we-need-bias-in-neural-networks-db8f7e07cb98?source=collection_archive---------6-----------------------

当偏见不是坏事的时候

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

图片由天空电视台拍摄

偏向 ”这个词有很多贬义。当我们想到它时,我们会看到不公平的待遇、偏见、歧视或偏袒某人或某事。这很自然。不幸的是,我们生活在一个所有这些事情都会发生的世界里。然而,根据上下文,单词有许多意思,令人惊讶的是,甚至偏见也是有帮助的。

机器学习是一个领域,我们可以在一些情况下遇到偏见。让我们仔细研究这些含义,并找出使神经网络有用的含义。

偏置数据

首先,让我们讨论偏见的最一般的背景。这是用于训练模型的数据中的偏差。每次我们向神经网络或其他模型提供数据时,它都会决定模型的行为。我们不能指望从基于有偏见的数据构建的算法中获得任何公平或中立的待遇。

这种有偏见数据的一个众所周知的例子是亚马逊招聘工具。它应该对简历进行一些预过滤,这样招聘人员就可以从最有前途的简历中进行选择。这在筛选简历方面非常有用!尤其是在过滤女性简历方面……不幸的是,这个美妙的人工智能解决方案有失偏颇。该系统有利于男性候选人,因为工程师在培训过程中主要使用男性简历[1]。

另一个有偏模型的例子是 Tay 。Tay 是微软发布的聊天机器人。它应该通过发布推文来进行对话。Tay 还能够从用户发布的内容中学习。还有那个注定要失败的泰。它学会了如何具有攻击性和侵略性。Tay 变得有偏见,关掉了。实际上,不负责任的用户用辱骂性的帖子破坏了它,使它变得有偏见。

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

freestocksUnsplash 上拍摄的照片

所以有偏差的数据肯定是一个负面现象。负责并意识到这一点是构建模型的重要部分。当你创造一个人造大脑时,你必须小心你放进去的东西。否则,你可能会让一个怪物复活。

整个神经网络的偏差

让我们来看看偏见的第二种情况。当我们训练和测试我们的神经网络或其他机器学习模型时,我们可以观察到两个主要趋势:

  1. 模型过度拟合数据。
  2. 模型无法从数据中学习模式。

过拟合就像用心学习。你的模型确实记住了你的大部分训练数据,但是,当新的东西出现时,它就不能正常工作了。你可以认为它擅长回答已经被问过的问题,但是当你打破常规提出问题时,这个模型就失败了。

如果我们根据训练集的大小来绘制验证和训练集错误,那么这样的问题可以很好地可视化。然后我们可以用学习曲线来预警。

如果训练集的误差相对较低,但验证集的误差较高,这意味着我们有一个高方差模型。图中可见的验证和训练集误差值之间的巨大差距是过度拟合造成的[3,4]。

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

高方差学习曲线(图片作者提供)。

让我们回到偏见。当我们在模型性能的上下文中谈论偏差时,我们可以说该模型具有高偏差。基本上,这意味着模型在训练期间做得不好,在验证期间做得不好。它的表现就像一个学生不能领会我们试图教给他们的思想。模型或我们的数据可能有问题[3,4]。

当我们看一下学习曲线图,我们看到训练集和验证集的误差都很高,这可能意味着您的模型有高偏差。训练集曲线和验证集曲线之间的差距将会很小,因为模型通常表现不佳。它缺乏归纳和发现数据模式的能力。

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

高偏差学习曲线(图片由作者提供)。

高偏见也是一件坏事。添加更多数据可能不会有太大帮助。但是,您可以尝试向数据集样本添加额外的功能。在搜索模式时,这些附加信息可以为模型提供更多线索。

您可能还需要更换型号。有时候模型太死板,无法从数据中学习。想想非线性分布的数据点,它们看起来像抛物线。如果你试图用一条简单的线来拟合这条抛物线,你的模型会因为高偏差而失败。在这种情况下,需要具有更多参数的更灵活的模型(如二次方程)。

作为单个神经元的偏差

让我们分析第三种情况,特定神经网络中的偏差。在文献中,我们可以找到术语*【4】。为什么我们需要这种特殊的神经元?看一下图片:*

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

简单神经网络(图片由作者提供)。

这个简单的神经网络由 3 种类型的神经元组成。输入神经元只是从数据集中传递特征( x₁ )。偏置神经元模仿附加特征,姑且称之为 x₀ 。这个额外的输入是总是 等于 1 。最后,还有一个输出神经元,这是一个成熟的人工神经元,它接受输入,处理输入,并生成整个网络的输出。

现在让我们详细看看我们的输出神经元:

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

神经元实现线性回归(图片由作者提供)。

它是如何工作的?我们取输入( x₀,x₁ )并乘以相应的权重( w₀,w₁ )。为了简单起见,输出神经元返回这些输入-权重乘积的和:

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

投入和权重乘积之和(图片由作者提供)。

在我们的例子中 i=1x₀=1 。因此,这样的神经网络实际上是一个线性回归模型:

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

神经网络线性回归(图片由作者提供)。

现在是关键的部分。为了理解我们为什么需要偏置神经元,让我们看看当完全没有偏置输入时会发生什么。这意味着将只有一个输入 x₁ ,仅此而已:

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

神经网络无偏倚线性回归(图片由作者提供)。

这样的模型不是很灵活。意味着这条线需要经过点 (0,0) 。线的斜率可能会改变,但是,它与坐标系的原点有关。看一下这个图像:

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

线可以改变斜率,但穿过原点(图片由作者提供)。

为了获得更大的灵活性,我们需要回到有偏差的原始模型。它将为我们配备重量 w₀ ,不依赖于任何输入。如果需要适应数据,这个权重允许模型上下移动。

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

有了 bias,线不需要穿过原点(图片由作者提供)。

这就是为什么我们在神经网络中需要偏向神经元的原因。没有这些多余的偏置权重,我们的模型在搜索解空间时的“移动”非常有限。

再举一个例子,看看使用非线性激活函数的神经元,比如 sigmoid:

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

Sigmoid 函数(图片由作者提供)。

在这种情况下,偏见也给了我们的激活功能“移动”的可能性。由于它,乙状结肠可以向左移动(正偏压)或向右移动(负偏压)。下图显示了这种情况,其中包含不同偏置值的 sigmoid 图:

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

根据偏差值的 Sigmoid 移位(图片由作者提供)。

(但愿)第三次交好运

最后,在经历了偏倚的数据和高偏倚的模型的概念后,我们得出了词偏倚的积极的背景。我们理解为什么偏置神经元是神经网络的关键元素,但还有最后一件事提出了一个问题。为什么一些有积极作用的东西会用一个负面的词来命名,比如偏见?

这是因为偏差权重与输入数据的任何元素都无关。但是,它是用来做决策的。所以偏向神经元或偏向权重反映了我们对数据集例子的信念或偏见。这就像用我们的经验而不是事实来调整我们对某人或某事的想法。挺偏的吧?

参考书目:

  1. https://www . Reuters . com/article/us-Amazon-com-jobs-automation-insight/Amazon-scraps-secret-ai-recruiting-tool-that-show-bias-against-women-iduscn1 MK 08g
  2. https://spectrum . IEEE . org/tech-talk/artificial-intelligence/machine-learning/in-2016-Microsoft-racistical-chatbot-discovered-the-dangers-of-online-conversation
  3. 乔尔·格鲁什,数据科学从零开始,第二版,ISBN:978–1492041139。
  4. *Aurélien Géron,*使用 Scikit-Learn、Keras 和 TensorFlow 进行机器学习:构建智能系统的概念、工具和技术,第二版,ISBN:978–1492032649。

数据产品中的密码学

原文:https://towardsdatascience.com/why-we-need-cryptography-80c7f60b6c0c?source=collection_archive---------55-----------------------

除了透明度和隐私之间的权衡之外

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

来源: Unsplash

技术(仅仅)是一种工具

随着数据产品技术的成熟,它也有潜力改变我们社会结构的底层。

通过改善我们的决策,它可以让我们走向更高的幸福。自动化可以提供更多的材料,减少重复性工作的时间,从而有更多的时间进行创造性表达。以自我实现为目标是我们大多数祖先做梦都想不到的现代奢侈品。我们进步的本质是技术发展。

然而,技术只是一种工具。正如火既可以烤一块牛排,也可以烧毁一所房子,技术也可以用于各种手段。它可以用来控制那些它应该提供价值的人。廉价的传感器和面部识别算法是潜在创造一个监视国家系统的基石。

数据是透明度的燃料

这种由技术引导的治理是通过数据的行为足迹实现的。社会可以看作是一个网络,不同的个体(节点)之间有关系(边)。每个人都可以传输数据点,这些数据点可用于管理他们所属的网络。

网络行为的透明性可以用收集的数据描述网络系统的实际状态的程度来量化。更高的透明度带来了更大的潜力来管理未来的系统状态,以达到期望的结果。

正如我们所看到的,没有隐私的数据透明所带来的自上而下的治理可能是有害的。透明度既可以用于社会发展,也可以用于压制。不管怎样,这都是一场不值得以牺牲我们的社会自由为代价的赌博。

密码学是保护隐私的工具

虽然人们越来越广泛地接受数据产品可以改变我们相互之间的交互方式,但这在密码学中并不明显。

加密技术可能是集体效率和个人自由之间缺失的一环,因此在保留我们隐私的同时实现了透明度的好处

密码原语形成了可在软件系统中用于该目的的构建块。

数字签名通过使签名成为被签名数据的函数,为我们提供了一种可靠的在线身份证明方式。 Merkle roots 可以捕获信息的身份,而不会泄露任何关于底层信息的信息。最后,零知识证明系统给了我们一个工具,让一方(证明者)向另一方(验证者)证明他们知道一些信息,而不共享除证明之外的任何信息本身。

今天,这些在密码经济系统的设计中形成了可信任的核心支柱。这些早期采用者推动了底层技术的成熟。不久,我们可能会看到越来越多的公共机构采用新的可用工具来构建保护隐私的数据产品。匿名、透明和开放的数据,可以聚合并用于治理。这肯定会使透明度和隐私之间的权衡变得更容易处理。

延伸阅读:

为什么我们需要数据库表的索引

原文:https://towardsdatascience.com/why-we-need-indexes-for-database-tables-25198145a8ca?source=collection_archive---------31-----------------------

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

托德·夸肯布什在 Unsplash 上的照片

引入没有任何公式和计算机科学理论的 B+树索引

如果您不是 DBA 或数据库开发人员,您可能不知道数据库索引的机制。但是只要你会写一些 SQL 查询,你一定听说过数据库索引,知道索引可以提高 SQL 查询的性能。

在本文中,我将尝试使用最简单的语言和图表来说明 B+树索引如何提高 SQL 查询的性能。我使用 B+树索引作为例子的原因是

  • 它被大多数关系数据库管理系统使用,如 MySQL、SQL Server 和 Oracle
  • 它可以提高大多数类型的 SQL 查询的性能,而不是特定类型的查询

它看起来怎么样?

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

照片由谢恩·豪泽Unsplash 上拍摄

让我们保持这个指令简单,这里有一个简化的图表说明了 B+树索引的结构。

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

在上面的 B+树示例中,每个矩形代表硬盘中的一个块,而蓝色填充的点代表将这些块链接在一起的指针。

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

请注意,出于演示目的,该图极大地简化了 B+树,因为它假设每个硬盘块只能包含 2 个键。实际上,这个数字会大得多。

理解 B+树索引是如何构造的很重要。我们需要知道“叶节点”级别应该包含创建该索引的字段的所有值。在上面的例子中,很明显我们在这个表列中只有 9 行,它们的值从 1 到 9。

如果你对上面的 B+树是如何构建的感兴趣,请参考我的另一篇文章:B+树索引是如何在数据库中构建的?

[## B+树索引是如何在数据库中构建的?

使用图表来说明如何在数据库管理系统中建立 B+树索引

towardsdatascience.com](/how-b-tree-indexes-are-built-in-a-database-6f847fb3cfcc)

它是如何工作的?

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

玛丽亚·克拉斯诺娃在 Unsplash 上拍摄的照片

B+tree 可以帮助大部分的数据库查询场景,这也是它有用的原因。

对平等测试的质疑

假设我们的 SQL 查询是在“equal”where 条件下进行检索,例如:

SELECT *
FROM TABLE
WHERE ID = 3

为了找到等于 3 的 ID,B+树的用法如下。

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

  • 从树的顶层开始,3 小于 5,所以我们需要使用数字 5 左边的指针
  • 在下一层,3 在 2 和 4 之间,所以我们需要使用中间的指针
  • 我们得到了叶节点上的块,3 在这里

对比较的质疑

如果我们的 SQL 查询在一个范围内搜索会怎样?例如,以下是 SQL 查询:

SELECT *
FROM TABLE
WHERE ID BETWEEN 3 AND 7

下面是该过程的演示。

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

  • 从树的顶层开始,3 小于 5,所以我们需要使用数字 5 左边的指针
  • 在下一层,3 在 2 和 4 之间,所以我们需要使用中间的指针
  • 我们得到了叶节点上的块,3 在这里
  • 因为我们是在比较中查询,所以光标将继续在这个块中获取,所以我们可以得到数字 4
  • 我们还没有到达 7,所以光标将继续移动到下一个(右)叶节点块
  • 我们到了下一个街区,所以我们得到了数字 5 和 6。但是它还没有完成,将使用与上一步类似的机制到达下一个块
  • 我们到达了下一个包含数字 7 的街区
  • 我们已经达到了范围的上限,因此查询结束

b+树特征

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

克里斯汀娜·戈塔迪在 Unsplash 上的照片

B+树索引最重要的特点是它由树的叶节点层搜索关键字层组成。

  1. 该索引列的所有值都出现在叶节点中。
  2. 非叶节点仅用于搜索目的,因此只有指向较低级别的指针。换句话说,它们不能导致实际的数据条目。
  3. 叶节点中的每个键都有一个指向数据条目的额外指针,因此它可以引导光标查找/获取数据行。

B+树如何提高性能?

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

安德斯·吉尔登在 Unsplash 上拍摄的照片

如上例所示,B+树适用于“相等”和比较条件。

叶片与非叶片水平

可以看出,查询只需要遍历非叶节点上的搜索关键字就可以找到期望值。因此,当 SQL 查询在创建 B+树索引的列上进行检索时,只需要遍历几层非叶节点。

您一定认为非叶节点一定是一种开销,当有大量数据行时,它会变慢,因为可能有许多非叶级别。

部分正确。是的,需要扫描非叶节点以获得期望值。实际上,扫描的次数正好等于非叶层的数量。但是,实际上,我们硬盘上的块会比上面的例子大得多。通常,一个有 1000 万个条目的表可以放在一个只有 3 个非叶层的 B+树中。即使表非常大,如十亿级,通常 B+树的非叶层的数量通常是 4 或 5。

因此,使用 B+树索引可以显著减少 SQL 查询中扫描的硬盘块数。

为什么扫描的块数很重要?

我想这篇文章的读者可能没有计算机科学背景,所以我想对“块”的简单解释对于更好地理解这个问题可能是必要的。

在我们的硬盘中,数据并不总是按顺序存储的。单个文件可能被分割并存储到不同的块中。因此,当我们读取文件/数据集/表时,为了扫描整个文件,有必要在不同的块之间跳转。

通常,对于机械硬盘,有一个只能上下移动的磁头。当需要从不同的位置读取数据时,整个硬盘驱动器会将该位置旋转到磁头所在的位置,以便磁头可以读取数据。

假设我们正在扫描 1000 个块。最坏的情况是磁盘需要旋转 1000 次。如果我们使用索引,这个数字将减少到 4-5 倍。这就是指数有助于提高性能的原因。

摘要

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

照片由 Aaron BurdenUnsplash

在这篇文章中,我分享了 B+tree 的样子以及它是如何工作的,并促进了一个 SQL 查询,通常使用相等和比较条件。

事实证明 B+Tree 不再是最先进的数据库索引,但是我相信,作为在大多数 RDBMS 中仍然普遍使用的最经典的索引,它仍然是展示为什么我们需要数据库表的索引以及它如何工作的最好例子。希望这对你来说足够有趣。

[## 通过我的推荐链接加入 Medium 克里斯托弗·陶

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@qiuyujx/membership)

如果你觉得我的文章有帮助,请考虑加入灵媒会员来支持我和成千上万的其他作家!(点击上面的链接)

为什么我们都需要重新鉴定身份?

原文:https://towardsdatascience.com/why-we-need-person-re-identification-3a45d170098b?source=collection_archive---------20-----------------------

从不同角度和位置深入了解如何识别人

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

弗兰基·查马基在 Unsplash 上拍摄的照片

在这篇文章中,我将向您简要介绍跟踪和重新识别领域,但不涉及技术细节。在谈论重新识别之前,有必要提一下什么是身份识别(跟踪)及其工作原理。追踪是安全人员的职责,唯一的区别是机器完成了所有的工作。因此,计算机要么从监控摄像头接收一些预先录制的视频,要么接收实时视频,并试图区分人和对他们进行分类。在跟踪的帮助下,我们可以看到场景中每个人的形状,并识别他们的运动。这一切都很好,但在现实世界的场景中,跟踪还有几个问题…

多人跟踪问题

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

(图片由作者提供,由 Person reID project 制作)

虽然追踪可以让我们接收场景中任何人的所有运动轨迹,并区分不同的人,但当我们有多个摄像头时,问题就开始出现了。例如,如果同一个人穿过购物中心,在摄像机前脱下夹克,他将不会被认出来。不同的姿势、服装、背包和其他细节会搞乱我们的模型,把同一个人当成两个不同的人。

重新鉴定

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

(图片由作者提供,采用多摄像头物体跟踪方法制作)

R 问题的关键是找到代表一个人的特征。最近的许多模型使用深度学习的模型来提取特征并实现良好的性能。由于卷积神经网络(CNN)强大的特征学习能力和拟合能力,一些先进的方法是基于 CNN 提出的。

reID 的良好实践

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

朱利叶斯·德罗斯特在 Unsplash 上的照片

根据熊等人[3]的研究,有几种方法可以建立一个精确的 CNN 模型或改进现有的模型。这些方法在不同的重新识别方法上进行了测试,并被认为是普遍成功的。让我们简要地看一下这些实践,因为它们可以帮助我们定义一个好的重新识别模型应该是什么样子。

1.在全局池层之后使用批处理规范化

这是一个相当技术性的概念,所以总的来说,我们试图在训练中防止过度适应。过度拟合是指我们对一个数据集进行了过多的优化,其他的例子会因此变得不准确。

在批量标准化中,我们的目标是使用最小速度均值和方差来标准化每个神经元的输出。因为训练过程中的某些特征是一般化的,这允许我们在不同的数据集上应用相同的模型。

2.使用一个全连接层进行身份分类

在 CNN 中,通常有两个完全连接的层。第一个问题扮演了减少特征尺寸的“瓶颈”的角色。第二层执行身份分类。

作者建议去掉“瓶颈”层,因为它会降低性能,并直接使用第二层。此外,它还有助于防止过度拟合。

3.使用亚当进行 CCN 优化

Adam 是最近提出的随机目标函数的优化方法。与最常用的 SGD 相比,Adam 处理低阶矩,这使我们能够平滑梯度之间的变化。正如您可能已经想到的,这也有助于防止过度拟合,并减轻对预训练模型的干扰。

重新鉴定申请

(Accuware Inc .的视频)

它最典型的应用场景是某种视频监控。当多个摄像机位于购物中心、停车场、大学或任何其他位置,并且我们希望确保安全时。通过使用重新识别和跟踪模型,我们能够跟踪一个人正在走的路,并确保没有任何非法或不适当的事情发生。这种系统唯一担心的是隐私,但公共场所的监控已经在发挥作用,因此增加人员跟踪不会改变这种情况。

此外,可以跟踪车辆和其他物体。通过这种方式,可以分析路况并进一步改进。

结论

如果计算机的力量被明智而及时地使用,犯罪和其他非法行为可以被阻止,罪犯也很容易被追踪。尽管这种模型的开发仍在进行中,但它们的改进令人难以置信地令人印象深刻,并且应用广泛。

更多资源

以下是该领域中一些受欢迎的项目,供了解 Python 的每个人参考:

[## mhttx 2016/多摄像机-物体跟踪-通过将表示转换到俯视图

基于深度度量学习将表示转移到“俯视图”。通过将主成分分析应用于“俯视图”的可视化…

github.com](https://github.com/Mhttx2016/Multi-Camera-Object-Tracking-via-Transferring-Representation-to-Top-View) [## 开阳州/深-人-里德

Torchreid 是一个深度学习的人再识别的库,用 PyTorch 写的。它的特点:多 GPU 训练…

github.com](https://github.com/KaiyangZhou/deep-person-reid) [## layumi/Person _ reID _ baseline _ pytorch

一个小巧、友好、强大的 Person-reID 基线代码(基于 pytorch)。现在我们已经支持:Float16 保存 GPU…

github.com](https://github.com/layumi/Person_reID_baseline_pytorch)

参考文献:

[1]Person _ reID _ baseline _ py torch(2020)。从 https://github.com/layumi/Person_reID_baseline_pytorch取回

[2]通过深度度量学习的多相机对象跟踪(2018)。检索自https://github . com/mhttx 2016/Multi-Camera-Object-Tracking-via-transfer-presentation-to-Top-View

[3]熊福林,肖,杨,曹,郑,龚,方,周,周建堂(2018).建立有效的 CNN 基线模型进行身份识别的良好实践。 arXiv 预印本 arXiv:1807.11042

[4]Accuware 的 CCTV 行人识别和跟踪技术(2017)。从 https://www.youtube.com/watch?v=nuhBnlHKAK0取回

为什么我们需要微型人工智能?

原文:https://towardsdatascience.com/why-we-need-tiny-ai-bb04af9e48ae?source=collection_archive---------27-----------------------

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

图片由 Adobe Stock 授权的 Worawut 制作

我们都知道算法每天都在变得越来越智能,但它们也变得越来越环保了吗?

一点也不,这正在成为一个严重的问题。因此,研究人员正在努力寻找开发更小算法的新方法。

在这篇文章中,我们将讨论为什么微型人工智能是确保人工智能未来的重要一步。

人工智能在过去的几年里展示了许多突破。深度学习是那些为许多提供高精度的人工智能系统提供动力的突破之一。得益于深度学习,算法可以扫描医学图像并识别肿瘤,甚至在复杂的交通模式中导航自动驾驶汽车,并将文献从几乎任何语言翻译成另一种语言。

人工智能每天都变得越来越精确,但高精度背后隐藏着环境成本。

麻省大学阿姆赫斯特分校的研究人员最近进行了一项研究,揭示了算法的训练是多么耗费精力。根据这项研究,训练一个算法可能会消耗一辆普通汽车一生二氧化碳排放量的 5 倍,或者相当于纽约和旧金山之间大约 300 次往返飞行。

为了追求高精度,我们似乎已经失去了对能效的关注。

艾伦研究所的研究科学家罗伊·施瓦茨和他的合著者在一篇名为《绿色人工智能》的论文中建议人工智能研究人员应该努力将能效作为准确性和其他衡量标准的评估标准。

最近的一篇文章引用了 Schwartz 的话说“我们不想达到人工智能成为全球变暖的重要因素的状态。”

这就是微型人工智能可以帮忙的地方。

什么是 Tiny AI?

微型人工智能是用来描述人工智能研究社区努力减少算法大小的术语,特别是那些需要大量数据集和计算能力的算法。Tiny AI 研究人员开发了一种称为蒸馏方法的方法,这种方法不仅可以减少模型的大小,还可以加速推理并保持高水平的准确性。使用这些蒸馏方法,模型可以显著缩小,缩小倍数可达 10 倍。此外,一个小得多的算法可以部署在边缘上,而无需将数据发送到云,而是在设备上做出决定。

以伯特为例。BERT 是由谷歌的 Jacob Devlin 和他的团队开发的预训练语言模型(PLM)。这个算法非常有用,因为它有助于你写作。它可以做到这一点,因为与以前的模型不同,BERT 理解单词和上下文。因此,BERT 可以提出写作建议或完成您的句子。

但是伯特是个大模特。麻省理工科技评论报道更大版本的 BERT 有 3.4 亿个数据参数。此外,训练它一次所需要的电量相当于一个美国家庭 50 天的用电量。

伯特成了微型人工智能研究人员的完美目标。在最近的一篇文章中,华为的研究人员声称他们能够将 BERT 的大小减少 7.5 倍,同时将速度提高 9.4 倍

他们称他们的新模型为 TinyBERT。但是,TinyBERT 和 BERT 相比有多好呢?作者声称 TinyBERT 的表现达到了它的老师 BERT 的 96%。

随着这些进步的发展,我们将看到微型人工智能的许多好处。一方面,现有的服务,如语音助手和摄像头,将不需要在云和本地设备之间传输数据。

另一方面,微小的 AI 将使我们有可能在边缘设备上部署复杂的算法。例如,使用智能手机的医学图像分析。或者没有云的自动驾驶。最重要的是,将数据存储在 edge 上也提高了数据的隐私性和安全性。

考虑到人工智能的爆炸式增长,让研究人员和工程师研究和测量训练和部署他们的算法对环境的影响是很重要的。

让我们不要只是努力建立更精确的模型。让我们也考虑一下它们对环境的影响。否则,我们可能会发现自己又多了一项破坏我们星球的技术。

原载于 2020 年 2 月 28 日https://www . rapid digital . ventures

为什么我们需要使用 Pandas 新的字符串数据类型而不是文本数据的对象

原文:https://towardsdatascience.com/why-we-need-to-use-pandas-new-string-dtype-instead-of-object-for-textual-data-6fd419842e24?source=collection_archive---------27-----------------------

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

伊洛娜·弗罗利希在 Unsplash 上的照片

我们必须用数值来表示每一位数据,以便由机器学习和深度学习模型进行处理和分析。然而,字符串通常不会有一个好的和干净的格式,需要大量的预处理。

Pandas 提供了许多函数和方法来处理文本数据。在这篇文章中,我们将关注字符串的数据类型,而不是字符串操作。使用合适的数据类型是充分利用 Pandas 的第一步。文本数据目前有两种数据类型,对象字符串类型。

在 pandas 1.0 之前,只有“object”数据类型用于存储字符串,这导致了一些缺点,因为非字符串数据也可以使用“object”数据类型存储。Pandas 1.0 引入了一种新的特定于字符串数据的数据类型,即string type。到目前为止,我们仍然可以使用 object 或 string type 来存储字符串,但是在将来,我们可能会被要求只使用 string type。

这里需要注意的一点是,对象数据类型仍然是字符串的默认数据类型。要使用 StringDtype,我们需要显式声明它。

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

我们可以传递“字符串或 **pd。用于选择字符串数据类型的 Dtype 参数的 string type()**参数。

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

我们还可以使用 astype 函数将“对象”数据类型转换为“字符串”数据类型:

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

尽管默认类型是“object ”,但出于一些原因,建议使用“string”。

  • 对象数据类型的范围更广,允许存储几乎任何东西。因此,即使我们在应该是字符串的地方有非字符串,我们也不会得到任何错误。

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

  • 拥有专用的数据类型总是更好。例如,如果我们用“字符串”数据类型尝试上面的例子,我们会得到一个 TypeError。

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

  • 拥有专用的数据类型允许特定于数据类型的操作。例如,如果使用了“对象”数据类型,我们不能使用 select_dtypes 只选择文本列。Select_dtypes(include="object ")将返回任何具有对象数据类型的列。另一方面,如果我们对文本数据使用“string”数据类型,select_dtypes(include="string ")将给出我们所需要的。

就目前的性能而言,“字符串”数据类型并不优于“对象”。但是,预计随着未来的增强,“字符串”数据类型的性能将会提高,内存消耗将会减少。因此,对于文本数据,我们应该已经在使用“字符串”而不是“对象”了。

感谢您的阅读。如果您有任何反馈,请告诉我。

为什么正规化有效

原文:https://towardsdatascience.com/why-we-should-always-consider-regularization-3767062709e8?source=collection_archive---------66-----------------------

正规化背后的直觉

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

弗兰基·查马基Unsplash 上拍摄的照片

当我们训练机器学习模型或神经网络时,我们会看到有时我们的模型在训练数据上表现得非常好,但在测试或验证数据时却无法给出预期的输出。模型性能如此不同的许多原因之一是在模型训练期间学习的大权重,从而导致过度拟合。较大的权重会导致我们的模型不稳定,测试数据的微小变化会导致较高的误差。除此之外,大重量还会在训练的梯度下降步骤中造成问题。为了惩罚这些大的权重,我们将它们调整为较小的值。

但是为什么将权重调整到一个较低的值会有效呢??

让我们来探讨为什么权重的较低值实际上是必要的背后的直观逻辑。

首先是一些数学

梯度下降算法根据模型产生的误差更新权重。

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

梯度下降函数-作者图片

上述等式中的导数部分表示误差函数的斜率或误差函数相对于权重的变化。

这个导数部分经常用链式法则来计算。假设我们使用平方误差函数来计算误差,并对我们的线性输出应用 sigmoid 激活函数来获得最终输出。

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

以 H 为输入的线性函数-作者图片

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

Sigmoid 激活函数-作者图片

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

平方误差函数-作者图片

根据链式法则,我们需要计算:

  1. 误差函数相对于激活函数输出的斜率。
  2. 激活函数相对于线性输出的斜率。
  3. 最后,线性函数的斜率与权重相关。

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

链式法则-作者图片

模型的权重值在梯度下降的权重更新步骤中起着非常关键的作用。

我们通过一个简单的例子来理解这一点。

主要的戏剧

sigmoid 函数是用于确定模型输出的非常常见的激活函数。

上面给出的代码针对给定的 x 值绘制了一个简单的 sigmoid 函数,用于形式为 y=mx+c 的线性输出。m’ 照常代表我们所说的线的斜率或我们模型的权重。

现在,我们将了解不同的斜率值如何影响我们的 sigmoid 函数。

plot_sigmoid(0.001)

产出 1:

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

输出 1 -作者的图像

plot_sigmoid(0.0005)

产出 2:

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

输出 2 -作者的图像

plot_sigmoid(0.0002)

产出 3:

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

输出 3 -按作者分类的图像

plot_sigmoid(0.0001)

产出 4:

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

输出 4 -按作者分类的图像

从以上 4 幅图中,我们可以观察到,随着线性函数中斜率或权重的降低,sigmoid 函数的陡度也随之降低。

对于输出 1,我们可以看到 sigmoid 函数的值从 0 快速变为 1。因此,该函数任意点的斜率大多保持接近 0 或 1。

这导致梯度下降步骤中的不便,因为它将导致权重几乎没有变化,从而减慢我们的模型的学习,并最终无法达到我们的误差函数的最小尖端,或者有时太大的变化可能导致错过误差函数的最小值。

现在,在其他 3 个输出中,我们随后降低了斜率值,并观察到输出函数的陡度也降低了。sigmoid 函数值开始从 0 到 1 逐渐变化,并忽略斜率的快速变化,这种变化有利于梯度下降步骤。现在,权重以更加一致的方式更新,从而实现误差函数的最小值。

很明显,当使用期望的正则化技术来训练模型时,为什么大的权重需要被惩罚并被带回到较低的值。

为什么我们应该更频繁地使用 Python Decorator

原文:https://towardsdatascience.com/why-we-should-use-python-decorator-more-often-e59b56b2b8df?source=collection_archive---------16-----------------------

Python 装饰者

Python Decorator 是一个强大的工具,它可以帮助我们操作一个函数的功能,一个只需添加@decorator_name 的测试方法

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

马库斯·斯皮斯克在 Unsplash 上的照片

在 Python 中,一切都是对象,这意味着每个实体都有一些元数据(称为属性)和相关的功能(称为方法)。这些属性和方法是通过点语法访问的。我们定义的名字只是绑定到这些对象的标识符。函数也不例外,它们也是对象(带有属性)。同一个函数对象可以绑定各种不同的名称。

例如:

这里我们将函数赋给一个变量。我们会注意到,变量赋值后,就变成了函数。下面是 test_decorator 的输出:

test_decorators.py::test_decorator PASSED                                [100%]8
3

Python 中的函数也可以将其他函数作为输入,然后返回其他函数。这种技术被称为高阶函数。

这里我们传递函数(double 或 triple)作为函数 operate 的输入。当运行 test_decorator 时,我们将在控制台中看到:

test_decorators.py::test_decorator PASSED                                [100%]6
9

函数和方法被称为可调用的,因为它们可以被调用。

事实上,任何实现特殊的__call__()方法的对象都被称为 callable。所以,在最基本的意义上,装饰器是一个返回可调用对象的可调用对象。

基本上,装饰者接受一个函数,添加一些功能并返回它。

运行 test_decorator 会显示

test_decorators.py::test_decorator PASSED                                [100%]I got decorated
I am ordinary
None

通常,我们会看到使用@decorator_name 以语法糖的方式编写 decorator

运行 test_decorator 会显示相同的

test_decorators.py::test_decorator PASSED                                [100%]I got decorated
I am ordinary
None

可以一起玩的简单装饰

这是一个简单的装饰器,为使用该装饰器的方法打印开始时间和结束时间。

在控制台中,您将看到

test_decorators.py::test_decorator_simple PASSED                         [100%]Start time is : 2020-07-21 14:41:44.064251
Time in test : 2020-07-21 14:41:44.064337
End time is : 2020-07-21 14:41:44.064366

有争论的装饰者

运行测试代码将向控制台显示这一点

test_decorators.py::test_decorator_with_arguments PASSED                 [100%]Inside wrapped_f()
Decorator arguments: Donald Le 1990
Testing decorator with arguments
After f(*args)

用 Python 链接装饰器

在 Python 中,多个装饰者可以链接在一起。

也就是说,一个函数可以用不同的(或相同的)装饰者进行多次装饰。我们简单地将装饰器放在期望的功能之上。

运行这个将显示

test_decorators.py::test_decorator PASSED                                [100%]..............................
Start time is 2020-07-22 10:35:17.462552
Test Decorator
End time is 2020-07-22 10:35:17.462579
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Decorators 与 pytest 等其他框架集成

然后我们可以在测试方法中使用它

很好奇装饰器的值是如何使用的,它实际上是在收集 testrail id 的 pytest 挂钩中使用的。

这是我们如何从 pytest 获得装饰值的:

testrail_ids = item.get_closest_marker('testrail').kwargs.get('ids')

就是这样。

感谢您阅读我的帖子。

参考

https://www.geeksforgeeks.org/decorators-in-python/

[## 装饰者——Python 3 模式、配方和习惯用法

请注意,本章是一项正在进行的工作;在我完成之前,你最好不要开始改变…

python-3-模式-习语-test.readthedocs.io](https://python-3-patterns-idioms-test.readthedocs.io/en/latest/PythonDecorators.html) [## Python 装饰者

Python 有一个有趣的特性,叫做 decorators,用于向现有代码添加功能。这也叫…

www.programiz.com](https://www.programiz.com/python-programming/decorator)

:如果你喜欢这个故事,想看类似这样的故事,而你还没有订阅媒体,请通过这个链接【https://ledinhcuong99.medium.com/membership】的订阅媒体。这可以支持我这样写内容。谢谢大家!

为什么我们在推荐系统中使用稀疏矩阵

原文:https://towardsdatascience.com/why-we-use-sparse-matrices-for-recommender-systems-2ccc9ab698a4?source=collection_archive---------23-----------------------

SciPy 的稀疏模块介绍

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

诺德伍德主题公司在 Unsplash 上拍摄的照片

在推荐系统中,我们通常使用非常稀疏的矩阵,因为项目领域非常大,而单个用户通常与项目领域的非常小的子集进行交互。以 YouTube 为例,用户通常会观看数百甚至数千个视频,相比之下,YouTube 的语料库中有数百万个视频,导致稀疏度超过 99%。

这意味着当我们在一个矩阵中表示用户(作为行)和项目(作为列)时,结果是一个由许多零值组成的极其稀疏的矩阵(见下文)。

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

稀疏用户-项目矩阵(来源按作者)

在现实生活中,我们如何最好地表示这样一个稀疏的用户-项目交互矩阵?

为什么我们不能只使用 Numpy 数组Pandas DataFrames

为了理解这一点,我们必须了解计算的两个主要约束条件— 时间内存。前者就是我们所知的“一个程序运行需要多少时间”,而后者是“程序使用了多少 ram ”。前者非常简单,但对于后者,确保我们的程序不消耗所有内存是非常重要的,尤其是当我们处理大型数据集时,否则我们会遇到著名的“内存不足”错误。

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

来源:stack exchange byalessandro 308

是的,我们电脑上的每个程序和应用程序都使用一些内存(见下图)。当我们运行矩阵计算,并希望将这些稀疏矩阵存储为 Numpy 数组Pandas DataFrame 时,它们也会消耗内存。

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

Mac 的活动监视器(来源作者)

为了形式化这两个约束,它们被称为时间空间复杂度(内存)。

空间复杂性

当处理稀疏矩阵时,将它们存储为完整的矩阵(从这一点上称为 密集 矩阵)是非常低效的。这是因为一个完整的数组为每个条目的占用一块内存,所以一个n x m数组需要n x m块内存。从简单的逻辑角度来看,存储这么多零根本没有意义!

从数学的角度来看,如果我们有一个100,000 x 100,000矩阵,这将需要我们有100,000 x 100,000 x 8 = 80 GB的内存来存储这个矩阵(因为每个 double 使用 8 个字节)!

时间复杂度

除了空间复杂性之外,密集矩阵也恶化了我们的运行时。我们将用下面的例子来说明。

那么我们如何表示这些矩阵呢?

介绍… SciPy 的稀疏模块

在 Python 中,稀疏数据结构是在 scipy.sparse 模块中有效实现的,它主要基于 Numpy 数组。实现背后的思想很简单:不是将所有值存储在一个密集的矩阵中,而是以某种格式存储非零值(例如,使用它们的行和列索引)。

在我们深入 CSR 之前,让我们比较一下使用 numpy 数组稀疏矩阵在时间和空间复杂度上的效率差异。

import numpy as np
from scipy import sparse
from sys import getsizeof# **Matrix 1**: *Create a dense matrix (stored as a full matrix).*
A_full = np.random.rand(600, 600)# **Matrix 2**: *Store A_full as a sparse matrix (though it is dense).*
A_sparse = sparse.csc_matrix(A_full)# **Matrix 3**: *Create a sparse matrix (stored as a full matrix).*
B_full = np.diag(np.random.rand(600))# **Matrix 4**: *Store B_full as a sparse matrix.*
B_sparse = sparse.csc_matrix(B_full)# Create a square function to return the square of the matrix
def square(A):
    return np.power(A, 2)

然后我们计算这些以不同形式存储的不同矩阵的时间,以及它们使用了多少内存。

%timeit square(A_full)
print(getsizeof(A_full))>>> 6.91 ms ± 84.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> 2880112%timeit square(A_sparse)
print(getsizeof(A_sparse))>>> 409 ms ± 11.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> 56%timeit square(B_full)
print(getsizeof(B_full))>>> 2.18 ms ± 56.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> 2880112%timeit square(B_sparse)
print(getsizeof(B_sparse))>>> 187 µs ± 5.24 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> 56

显然,当我们使用稀疏模块存储稀疏矩阵时,可以获得时间和空间方面的最佳性能。

压缩稀疏行(CSR)

尽管在 SciPy 中有许多类型的稀疏矩阵,如键的字典(DOK)和列表的列表(LIL),我将只涉及 压缩稀疏行 (CSR),因为它是最常用和广为人知的格式。

CSR (还有 CSC,又名压缩稀疏列)用于一次写入多次读取任务[1]。为了有效地表示稀疏矩阵,CSR 使用三个 numpy 数组来存储一些相关信息,包括:

  1. data:非零值的值——这些非零值存储在稀疏矩阵中
  2. indices:列索引的数组—从第一行开始(从左到右),我们标识非零位置并返回它们在该行中的索引。在下图中,第一个非零值出现在第 0 行第 5 列,因此 5 作为第一个值出现在indices数组中,后面是 1(第 1 行,第 1 列)。
  3. indptr:代表索引指针,返回一个行开始的数组。这个定义让我困惑,我选择这样解释:它告诉我们每行包含多少个值。在下面的例子中,我们看到第一行包含一个值a,因此我们用0:1对其进行索引。第二行包含两个值b, c,我们从1:3开始索引,依此类推。len(indptr) = len(data) + 1 = len(indices) + 1因为对于每一行,我们用开始和结束索引来表示它(类似于我们如何索引一个列表)。

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

来源:StackOverflow 作者 Tanguy

构建 csr_matrix 有哪些方法?

创建一个全矩阵并将其转换为稀疏矩阵

some_dense_matrix = np.random.random(600, 600)
some_sparse_matrix = sparse.csr_matrix(some_dense_matrix)

如前所述,这种方法效率不高,因为我们必须先获得这个密集矩阵,这非常耗费内存,然后才能将其转换为稀疏矩阵。

创建一个空的稀疏矩阵

# format: csr_matrix((row_len, col_len))
empty_sparse_matrix = sparse.csr_matrix((600, 600))

注意,我们不应该创建一个空的稀疏矩阵并随后填充它们,因为csr_matrix被设计为一次写入多次读取。写入csr_matrix将是低效的,应该考虑其他类型的稀疏矩阵,如列表的列表列表在操纵稀疏结构方面更有效。

用数据创建一个稀疏矩阵

# **method 1**
# format: csr_matrix((data, (row_ind, col_ind)), [shape=(M, N)])
# where a[row_ind[k], col_ind[k]] = data[k]data = [3, 9, 5]
rows = [0, 1, 1]
cols = [2, 1, 2]sparse_matrix = sparse.csr_matrix((data, (rows, cols)), 
                                  shape=(len(rows), len(cols))
sparse_matrix.toarray()>>> array([[0, 0, 3],
           [0, 9, 5],
           [0, 0, 0]], dtype=int64)# **method 2**
# format: csr_matrix((data, indices, indptr), [shape=(M, N)])
# column indices for row i: indices[indptr[i]:indptr[i+1]]
# data values: data[indptr[i]:indptr[i+1]]data = [3, 9, 5]
indices = [2, 1, 2]
indptr = [0, 1, 3, 3]sparse_matrix = sparse.csr_matrix((data, indices, indptr))
sparse_matrix.toarray()>>> array([[0, 0, 3],
           [0, 9, 5],
           [0, 0, 0]], dtype=int64)

希望这有助于你开始使用稀疏矩阵!

支持我! —如果你喜欢我的内容并且没有订阅 Medium,请考虑支持我并通过我在这里的推荐链接订阅 ( 注意:你的一部分会员费将作为推荐费分摊给我)。

参考

[1]Python 中的稀疏数据结构

[2] 复杂性和稀疏矩阵

为什么我们使用无监督学习(从头开始使用 K 均值聚类)

原文:https://towardsdatascience.com/why-we-use-unsupervised-learning-with-k-means-clustering-from-scratch-1401efdd6fde?source=collection_archive---------34-----------------------

为什么无监督学习是一个伟大的工具,却不能产生定量的结果。

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

在数据科学世界中,监督学习是一个有趣的话题,不从事数据科学的人通常不会强调这一点,此外,这也是许多数据科学家自己经常忽视的一个想法。对此有一个解释,因为对于许多就业机会来说,无监督学习根本不重要。当然,有时它会发挥作用,但在大多数情况下,企业不会投资做他们永远不知道结果的研究。在不知道结果的情况下做研究正是无监督形容词在这种情况下的应用,所以如果我们不知道我们的模型输出了什么,那么我们怎么能在它的预测和发现中找到价值呢?

分析

无监督学习算法的主要功能是分析。使用无监督学习算法来探索您的数据可以告诉您许多关于所述数据的某些属性的信息。例如,聚类分析可以显示某些连续值是如何分组的,不管它们是相关还是不相关。您可以使用无监督学习来发现数据中的自然模式,这些模式仅通过统计分析或比较值并不明显。

无监督学习算法在图像识别和基因组学中也有自己的优势。在基因组学中,它们可以用来对遗传学进行聚类或分析基因组数据序列。无监督学习用于建模概率密度,这对生物信息学学科非常有用。

无人监管的另一个好处是,不需要任何人工干预就可以非常容易地收集分析数据。典型的机器学习,无论是强化的还是监督的,都需要手动绘制标签,以便正确理解模型的结果。有监督学习和无监督学习的区别如下:

无监督学习

  • 不太准确
  • 不需要标记数据
  • 最少的人力

监督学习

  • 高度准确
  • 有一致的目标
  • 需要带标签的数据
  • 需要人的努力

示例:Kmeans 聚类

聚类是最常用的无监督学习方法。这是因为这通常是可视化探索和发现更多数据的最佳方式之一。有几种不同类型的集群,包括:

  • 层次集群:通过创建一个集群树来构建集群的多层次结构。
  • k 均值聚类:根据到聚类质心的距离将数据划分为 k 个不同的聚类。
  • 高斯混合模型:将聚类建模为多元正态密度成分的混合物。
  • 自组织地图:使用学习数据拓扑和分布的神经网络。
  • 隐马尔可夫模型:利用观测数据恢复状态序列。

在今天的例子中,我们将学习 klearn 中提供的 Kmeans 集群。在 K-均值聚类中,对于每个点 x:

  • 找到最近的质心 c
  • 将点 x 分配给群集 j

然后对于每个聚类 j (=1…k):

  • 新的质心 c 等于在前一步骤中分配给聚类 j 的所有点 x 的平均值。

虽然这个模型在 sklearn.cluster 的 KMeans 类下可用,但今天我将编写自己的函数来计算 K 均值聚类。我们将从创建一个能够测量欧几里德长度的函数开始。这就像使用 Numpy 的 linalg 一样简单。

import numpy as np
def euclidian(a, b):
    return np.linalg.norm(a-b)

我还导入了 Matplotlib.pyplot 和 Matplotlib.animation,以便将来对我们的集群进行可视化:

import matplotlib.pyplot as plt
# animation
import matplotlib.animation as animation

因为我将使用文本数据,所以我使用 numpy 的这个函数来加载它:

def load_dataset(name):
    return np.loadtxt(name)

现在是时候做我们实际的 K 均值函数了。首先,我们将添加参数 k、ε和距离(在我们的例子中是欧几里得的。)之后,我们将为质心创建一个空列表,并设置距离算法以使用之前的欧几里德函数。

def kmeans(k, epsilon=0, distance='euclidian'):
    history_centroids = []
    #set the distance calculation type 
    if distance == 'euclidian':
        dist_method = euclidian

接下来,我们将加载数据集并检查数据集的形状,以获得实例(观察)的数量和特征的数量

dataset = load_dataset('durudataset.txt')
num_instances, num_features = dataset.shape

现在,我们将使用 Numpy.random 中的随机数来定义 k 原型:

prototypes = dataset[np.random.randint(0, num_instances - 1, size=k)]

之后,我们会将它们添加到质心历史列表中:

history_centroids.append(prototypes)

现在,我创建了这些列表来存储我们的质心聚类,并在每次迭代中跟踪它们:

prototypes_old = np.zeros(prototypes.shape)
belongs_to = np.zeros((num_instances, 1))
norm = dist_method(prototypes, prototypes_old)
iteration = 0

然后,我们将按照我之前陈述的公式执行 for 循环:

while norm > epsilon:
        iteration += 1
        norm = dist_method(prototypes, prototypes_old)
        for index_instance, instance in enumerate(dataset):
            dist_vec = np.zeros((k,1))
            for index_prototype, prototype in enumerate(prototypes):
                #compute the distance between x and centroid
                dist_vec[index_prototype] = dist_method(prototype, instance)
            belongs_to[index_instance, 0] = np.argmin(dist_vec)

        tmp_prototypes = np.zeros((k, num_features))

当范数大于ε时,对于数据集中的每个实例,我们将定义一个 k 大小的距离向量。然后对于每个质心,我们将计算 x 和质心之间的差。接下来,我们将遍历我们的原型列表,并获取分配给该原型的所有点。然后,我们将找到这些点的平均值,这将为我们提供新的质心。最后但同样重要的是,我们将把相应的值添加到列表的索引中。

for index in range(len(prototypes)):
            instances_close = [i for i in range(len(belongs_to)) if belongs_to[i] == index]
            prototype = np.mean(dataset[instances_close], axis=0)
            #add our new centroid to our new temporary list
            tmp_prototypes[index, :] = prototype

最后,我们可以将我们的临时原型设置为等于我们的最终质心列表。为了创建一个 Matplotlib 动画,我还会在这里添加质心列表的历史。

prototypes = tmp_prototypes
history_centroids.append(tmp_prototypes)
return prototypes, history_centroids, belongs_to

对于最终的函数,如下所示:

def kmeans(k, epsilon=0, distance='euclidian'):
    history_centroids = []
    if distance == 'euclidian':
        dist_method = euclidian
    #set the dataset
    dataset = load_dataset('durudataset.txt')
    num_instances, num_features = dataset.shape 
    prototypes = dataset[np.random.randint(0, num_instances - 1, size=k)]
    history_centroids.append(prototypes)
    prototypes_old = np.zeros(prototypes.shape)
    belongs_to = np.zeros((num_instances, 1))
    norm = dist_method(prototypes, prototypes_old)
    iteration = 0
    while norm > epsilon:
        iteration += 1
        norm = dist_method(prototypes, prototypes_old)
        for index_instance, instance in enumerate(dataset):
            dist_vec = np.zeros((k,1))
            for index_prototype, prototype in enumerate(prototypes):
                dist_vec[index_prototype] = dist_method(prototype, instance)
            belongs_to[index_instance, 0] = np.argmin(dist_vec)

        tmp_prototypes = np.zeros((k, num_features))
        for index in range(len(prototypes)):
            instances_close = [i for i in range(len(belongs_to)) if belongs_to[i] == index]
            prototype = np.mean(dataset[instances_close], axis=0)
            #add our new centroid to our new temporary list
            tmp_prototypes[index, :] = prototype
        prototypes = tmp_prototypes
        history_centroids.append(tmp_prototypes)
    return prototypes, history_centroids, belongs_to

现在,如果我们决定绘制它,我的结果看起来有点像这样:

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

很酷,对吧?

结论

虽然非监督学习可能不会像大多数监督学习模型那样受到喜爱或使用,但仅仅因为结果没有被标记并不意味着不能从数据中学习到很多信息。无监督学习是探索和真正理解数据如何分组以及不同特征如何相互作用的一个很好的工具。虽然在很多情况下,数据科学家可能会偏离使用无监督学习有点远,但很容易明白为什么它有时会非常有益!

为什么世界范围的合作比自私行为的效率高 5 倍

原文:https://towardsdatascience.com/why-worldwide-collaboration-can-be-up-to-5-times-more-efficient-than-selfish-behavior-b0a8e05ce50d?source=collection_archive---------38-----------------------

用博弈论理解疫情和气候变化时代自私的代价

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

凯尔·格伦在 Unsplash 上的照片

你有没有想过,为什么我们需要所有这些试图让世界上所有 195 个国家为一个共同目标而合作的国际组织?你可能从其他人(甚至某些国家的总统)那里听说过,这只是浪费时间和金钱,对吗?!如果我们让每个人自己收拾残局,不是更容易吗?!令人惊讶的是,选择这种方法的后果在全球范围内可能是灾难性的,博弈论为我们提供了为什么会出现这种情况的清晰解释。

社会适性和自私行为

为了理解自私行为的后果,我将使用正在进行的新冠肺炎疫情的例子,其中不同的行动者(也称为代理人)由独立的国家代表,他们在面对疫情时所付出的成本由遏制它所需的费用(人道主义或经济)量化。为了分析在这种不景气的环境下协作的效果,让我们考虑以下场景:

  1. 我们假设有一个国家(例如,病毒的发源地)贡献最大。让我们用 1 来表示它的总损耗(它可以是 100 或 100K,为简单起见使用 1)。
  2. 与前一个国家相比,病毒随后传播到的每个国家都可以更有效地应对它。比方说,第二个国家只需支付第一个国家支付的一半(1/2)就可以遏制疫情,而第三个国家只需支付三分之一(1/3),以此类推。最终国家数 k 将只支付受影响最严重国家的 1/k 分数。
  3. 我们假设社会最优结果是通过要求每个现有国家平等地参与所需费用来遏制第一个国家的疫情。假设这个最优结果的总成本为(1+a ),其中> 0 是一个很小的开销,说明了为第一个受灾国家动员所需资源的成本。

请注意,虽然前两个假设没有反映现实中发生的一切,但通过根据疫情造成的损失按降序对国家进行排序,当前情况仍可简化为该模型。

显而易见,在我们的模型中,所有国家决定不合作的总成本等于调和数

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

其行为如下图所示:

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

自私成本和社会最优(表示为合作基线)之间的差异非常大,对吗?!你可能会奇怪,当手头有一个更有效的选择时,为什么有人会选择这样一个额外的损失。这就是博弈论与纳什均衡的概念相结合的地方,为了解释它,让我们考虑博弈中代理人的不同选择。

单边偏差

让我们从上面例子中的最后一个国家开始。在我们的模型中,这个国家可以选择支付 1/k 来独自遏制疫情,或者与其他潜在合作者一起支付(1+a)/k 来实现 1+a 的总体社会最优成本

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

自私的时候,这个国家会选择为了自己的利益付出 1/k 的选择。一旦发生这种情况,国家(k-1)面临的选择是与其他国家支付(1+a)/(k-1)或选择 1/(k-1)独自处理这种情况。

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

它再次选择自私的行为,原因和之前的国家一样。最终,自私的方法导致了纳什均衡的概念:每个国家都采用最小化其成本的策略,没有一个国家可以通过单方面改变他们的策略而做得更好。纳什均衡的总成本就是上面定义的谐波数。

价格稳定

纳什均衡的成本与社会最优之间的比率通常被称为稳定的价格 ( PoS )。

稳定的价格量化了自私行为的最佳结果(最佳纳什均衡)和涉及一组战略代理的给定博弈的社会最优之间的潜在效率损失。

在我们的例子中(FOCS 04 年 4 月的 Anshelevich 等人研究的所谓的公平费用分摊博弈的例子) PoS 以上面定义的调和数为界,其中 k 等于世界上现有的 195 个独立状态。如果我们非常粗略的疫情模型接近事实,那么缺乏全球合作的代价将是惊人的

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

再说一次,如果我们的模型,尽管它的设置过于简单,在某个地方接近正确,那么缺乏合作的成本会比社会最优成本多 5 倍。还要注意的是,这超出了我在 COVID 疫情的例子,并扩展到任何独立国家可以选择自己解决问题或选择全球合作的情况。例如,它强调了 195 个国家签署的巴黎协定对共同应对气候变化的重要性,并意味着我们很可能会避免效率急剧下降的情况,这可能对我们的未来产生毁灭性影响。

我们生活中的公平成本分担游戏

虽然我的文章可能看起来像一个抽象的博弈论结果的简单说明,当应用于具有高度社会重要性的情况时,它的信息更普遍,并且注定适用于我们每个人和我们的日常选择。

事实上,尽管有一些表面上的差异,地球上的所有人都在玩一个类似于上面描述的游戏,尽管有时甚至不知道。我应该乘公共汽车并与其他乘客分担旅行费用,还是应该坚持使用我的汽车?我应该选择共享经济平台,还是应该拥有我需要的所有商品?所有这些都是我们日常生活中的公平成本分摊游戏,所有这些都受制于低效率,当更多的人关注它时,这种低效率变得更加明显。

为了进一步推动这一想法,毫不夸张地说,我们经常试图为了眼前的利益而避免个人牺牲(1/k 或(1+a)/k 的情况),并认为一个人的行动不会改变太多。但是正如我的例子所显示的,一个人的行为足以对其他人的行为产生前所未有的改变。事实上,如果第一个国家选择牺牲其微不足道的收益,它就可以激励其他国家,让合作的选择对他们更有吸引力。

我同意全球合作可能一点也不容易。但是第一步是意识到它的好处。下一步就是当你在生活中面临任何这样的选择时,好好想想。谁知道下一步可能会是享受一个更好的生活环境。

为什么要用 WebAssembly 把 scikit-learn 放到浏览器里?

原文:https://towardsdatascience.com/why-would-you-use-webassembly-to-put-scikit-learn-in-the-browser-77671e8718d6?source=collection_archive---------21-----------------------

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

老实说。我不知道。但是我确实认为 WebAssembly 是 ML/AI 部署的一个很好的目标(在浏览器和其他地方)。

在我自己的学术工作中,以及在与各种公司和医院的合作中,我经常面临将经过验证的模型投入生产的挑战。部署证明是困难的;这是阻碍在各个领域采用许多有用模型的主要障碍之一。在尝试了各种解决方案后,我们决定使用 WebAssembly 二进制文件进行模型部署。现在,这种选择并不总是被理解:许多数据科学家还没有听说过 WebAssembly ,即使他们听说过,他们也大多将其与浏览器中的运行任务联系在一起。此外,感兴趣的读者会很快找到像 pyodide 这样的项目,虽然非常有趣,但却让读者误解了通过将整个 python 堆栈移动到浏览器中就可以完成模型部署:我们并不这么认为。我们简单地将 WebAssembly 视为一个安全、可移植、高效的编译目标,可以在任何地方部署合适的模型。在这篇文章中,我将试着解释我们选择这项技术的原因。

需求:当将模型投入生产时,我们想要什么?

选择一项技术通常受益于一套好的需求(如果你愿意的话,可以称为需求):我们希望我们的技术做什么?以下是我们为 AI/ML 模型部署考虑的一些事情:

**注意:**我在这里非常宽泛地对待“模型”的概念;这可能包括预处理和后处理。实际上,当生成推理时,“模型”通常只是对一些输入数据执行的一组操作,从而导致一些输出。

  1. *我们希望对那些创建和验证模型的人的工作实践产生最小的影响。*实际上,如果构建和验证有用模型的数据科学家/研究人员也可以使用他们的首选工具进行部署,那将是一件好事。应该很容易。
  2. *我们希望部署的模型计算效率高(即速度快)。*在训练期间,执行速度可能不是一个大问题(尽管训练速度很可能是),但当我们想要重复生成推理时,这将是一个问题。一旦你在一秒钟内评估一个模型数千次,如果它运行得很快就好了。
  3. 我们希望部署的模型具有较小的内存占用。在部署中,如果推理不仅在时间上有效,而且在内存上也有效,那就太好了。一个小而快速的任务最终改善了用户体验,降低了成本,并且节省了大量能源
  4. *我们希望部署的模型是可移植的。*当我们将模型从服务器转移到物联网设备、手机和网络浏览器时,我们不应该不得不重建模型。
  5. *我们希望部署的模型是安全且可验证的。*模型应在沙盒中安全运行,并且应能够验证正确的模型是否可用。
  6. *我们希望能够轻松地试验已部署的模型。*一旦部署了模型,应该可以轻松地 A/B 测试模型的各种版本。

使用 WebAssembly 部署

鉴于上述迫切需要,我们研究了几种技术,从使用 docker 容器将 jupyter 笔记本投入生产,到在crust中重建我们的模型并为各种运行时编译可执行文件,到使用当前提供的不断增长的产品套件之一使模型投入生产更容易(即 pyTorchTFXLambdaAzure 等)。).都以这样或那样的方式失败了。Docker 容器允许您简单地复制现有的 Python 堆栈、包、模型等等,但是生成的容器通常臃肿而缓慢。重建是高效的,但是耗时的。现有的云服务在某些方面表现不错,但并非所有方面都是急需的。因此,我们创建了自己的模型部署流程。

我们使用 WebAssembly 的部署流程

在检查我们使用 WebAssembly 的部署流程是否符合需求之前,我想我应该解释一下相关的步骤:

  1. 我们允许数据科学家使用他们最喜欢的pythonR包/工具来拟合模型。
  2. 使用我们的简单包,例如python[sclblpy](https://pypi.org/project/sclblpy/)包,数据科学家可以直接从他们喜欢的工作空间上传存储的模型(或管道)。
  3. 上传模型后,我们自动“分解”它——也就是说,我们剥离所有不必要的细节——并将最基本的必需品转换成 WebAssembly 二进制文件。不可否认,这一步很有挑战性,构建起来让我们很头疼,但是幸运的是,对于每个模型类,只需要做一次。一旦完成,已知模型类的每个模型都可以自动优化并传输到 WebAssembly。( 举个例子: 假设你用 *scikit-learn* 拟合一个线性回归模型。在这种情况下,一个存储的模型对象包含了许多对于推断来说并不重要的信息:我们有效地剥离了该对象以创建一个只包含所需向量操作的 WebAssembly 二进制文件)。
  4. 在生成一个遵循 WASI 标准的.wasm二进制文件后,它可以在任何地方运行。我们通常会在服务器上托管二进制文件,并创建一个 REST 端点来执行推理任务,但是我们也在浏览器和边缘部署了模型对象。

这就是我们结束的过程。

什么是 WebAssembly?

我想简单地离题解释一下 WebAssembly 是有用的。根据官方 WebAssembly 页面、*“web assembly(缩写 Wasm)是一种基于堆栈的虚拟机的二进制指令格式。Wasm 旨在作为编程语言的可移植编译目标,支持客户端和服务器应用程序在 web 上的部署。”*现在,虽然这是真的,但随着 WASI 的出现,以及我们在 Wasmer 的朋友提供的精彩开源工具,这个定义看起来太有限了:WASI 二进制文件可以在任何地方运行。因此,对我们来说,WebAssembly 是一个编译目标,它可以有效地提供以本机速度运行的可执行文件,放在非常小且高效的容器中,几乎可以在任何地方运行。

所以,让我们检查一下这是否合适…

需求 1:易用性

我们目前能够使用一行代码将模型转换为 WebAssembly。这里有一个超级简单的例子:

我们可以对几乎所有的sklearnstatsmodelsxgboost都这样做。你可以使用[sclblpy](https://pypi.org/project/sclblpy/) 来完成。

最近,我们开始支持 ONNX 上传,有效地覆盖了您想要部署的几乎任何模型或管道。

是的,我们认为这个过程很简单。

需求 2:计算效率

虽然 WebAssembly“承诺”高效快速,但看看实际数字总是好的。我们适合自动财产估价的 BART 模型(AVM);点击这里查看演示应用。当使用 Docker 容器部署 fitted 模型时,生成 1000 个后验绘制对于一次往返需要 4.5 秒多一点(即,包括网络延迟)。使用我们的 WebAssembly 部署始终如一地做同样的事情只需不到一秒钟。我们一直在寻找这样的速度提升:查看这篇文章,了解更多基准(我们也密切关注 WebGPU ,这是一个快速发展的补充标准,将使我们能够为我们的 CPU 优化 WebAssembly 二进制文件添加 GPU 支持)。

所以,是的,WebAssembly 模型部署很快。然而,理解为什么它通常比现有的基于rpython的推理要快得多是有好处的。在某种程度上,速度的提高来自于转向编译的、较低级的语言(即,强类型、更好的内存管理、强编译器优化等)。).然而,这些改进只是故事的一部分:WebAssembly 模型部署还允许我们剥离许多相关的“层”:

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

使用 docker 容器(左)和使用 WebAssembly(右)的模型部署;剥离这些层大大提高了执行速度。

由于每一层都需要时间和资源来运行,所以剥离它们最终会在延迟、能耗和计算成本方面带来巨大的好处。

需求 3:内存占用

我们希望模型在内存方面更小。并且,考虑到上面提出的层的分析,不仅仅是模型“包”本身应该小;如果整个运行时能尽可能的小而高效就好了。在 AVM 演示的基础上,这似乎工作得很好:在R我们把 BART 模型本身降低到大约 40Mb,运行时间降低到大约 80Mb(两者都需要一些努力)。使用 WebAssembly 部署,我们最终得到的模型“包”只有 3Mb 多一点,而运行时只有 10Mb。所以总共是 120Mb 对 13Mb。是的,WebAssembly 模型部署占用的内存很少。

需求 4:便携性

小而快创造了新的机会。WebAssembly 模型的可移植性允许在服务器、浏览器、或边缘设备上运行它们。这产生了新的用例:我们在无人机上部署了物体识别模型(绕着港口飞行,识别货运集装箱的维护状态)。我们还在用户的浏览器上运行了推荐模型,我们能够将模型发送到医院(用于放射诊断目的),而不是将敏感的患者数据发送到中央服务器。便携性。检查。

需求 5:安全且可验证

一个经常出现的问题是“我们如何确保返回的推论是有效的”?使用 WebAssembly 二进制文件的一个好处是,我们可以广泛地验证模型的输入和输出,并整合功能。随后可以使用简单的校验和来验证生成的二进制文件;我们可以确保在正确的地方交付正确的型号。

接下来是验证,我们显然希望模型包不会对周围的计算环境造成任何伤害;幸运的是,这就是 WebAssembly 的设计目的;它本质上是沙箱化的和安全的。

所以,是的,这一次也成功了。

渴望 6:简单的实验

一旦部署差距被弥合,世界不会停止。通常,一个已部署的模型只是所有模型的一个实例,这些模型可能是为特定问题而设计的。如果测试一个模型的不同版本很容易,那就太好了。WebAssembly 二进制文件使这个过程变得简单:一旦一个模型成为一个独立的、易于发布和易于运行的“包”,用两个二进制文件建立 A/B 测试(或者甚至建立自适应方案,例如 Thompson 在多个竞争模型上采样)就变得简单了。

适当的沙盒和可移植性使实验变得容易。

包裹

我们有很多将模型投入生产的经验。基于这一经验,我们最终开发了一个新的平台,通过 WebAssembly 简化了模型部署;对我们来说,这符合所有的条件。也就是说,一个技术解决方案永远不会完全解决“模型部署的问题”。每当我们试图弥合从模型训练和验证到实际使用之间的差距时,我们都会面临组织、法律、财务和伦理方面的问题。我们不能说所有这些都可以轻易解决。但是,我们确实认为从技术上来说,部署问题是可以解决的,WebAssembly 提供了解决相关挑战的完美工具。

放弃

值得注意的是我自己的参与:我是 Jheronimus 数据科学院 的数据科学教授,也是可扩展的的联合创始人之一。因此,毫无疑问,我对 Scailable 有既得利益;我有兴趣让它成长,这样我们就可以最终将人工智能投入生产并兑现它的承诺。这里表达的观点是我自己的。

为什么 XGBoost 不能解决你所有的问题。

原文:https://towardsdatascience.com/why-xgboost-cant-solve-all-your-problems-b5003a62d12a?source=collection_archive---------9-----------------------

入门

XGBoost 和其他基于树的算法的一个关键限制。

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

谢尔盖·科洛米耶茨Unsplash 上拍摄的照片

如果你曾经在 Kaggle 上参加过机器学习比赛,或者浏览过数据科学社区撰写的文章或论坛,你可能听说过 XGBoost。这种算法已经赢得了许多 Kaggle 竞赛,并且有许多基准研究表明 XGBoost 始终优于其他算法。XGBoost 是并行的,并且比其他梯度增强实现运行得更快,这一事实增加了它的吸引力。

对于那些不熟悉这个工具的人来说, XGBoost (代表“极端梯度提升”)是一个高度优化的框架,用于梯度提升一种迭代地组合几个弱学习器(如决策树)的预测的算法,以产生一个更强大、更健壮的模型。自 2014 年问世以来,XGBoost 已经成为许多数据科学家和机器学习实践者的首选算法。

“有疑问的时候用 XGBoost”——Avito上下文 Ad 点击预测比赛上 Kaggle

这听起来可能好得难以置信,对吗?XGBoost 对于许多任务来说无疑是强大而有用的,但是有一个问题…事实上,这个问题不仅影响 XGBoost,而且影响所有基于树的算法。

基于树的模型不擅长外推

这可能是所有基于树的模型固有的根本缺陷。不管你有一个决策树,一个有 100 棵树的随机森林,还是一个有 1000 棵树的 XGBoost 模型。由于基于树的模型划分任何给定问题的输入空间的方法,这些算法在进行预测时很大程度上无法外推超出训练数据限制的目标值。在分类任务中,这通常不是一个大问题,但在涉及预测连续输出的回归任务中,这绝对是一个限制。

如果训练数据集只包含 0 到 100 之间的目标值,则基于树的回归模型将很难预测出该范围之外的值。以下是一些预测性任务的例子,在这些任务中,外推很重要,而 XGBoost 可能并不奏效…

预测气候变化对全球气温的影响

在过去的 100 年里,全球气温上升的速度越来越快。想象一下,试图使用 1900 年到 2020 年的数据来预测未来 20 年的全球气温。像 XGBoost 这样的基于树的算法将受到今天全球最高温度的限制。如果气温继续上升,该模型肯定会低估未来 20 年全球气温的上升。

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

从 1880 年到 2020 年的全球温度异常。来源:美国宇航局 GISS

预测股票市场指数(如标准普尔 500)的价格

如果我们观察一个受欢迎的股票市场指数如标准普尔 500 在过去 50 年的趋势,我们会发现该指数的价格经历了高点和低点,但最终会随着时间的推移而上涨。事实上,根据历史数据,标准普尔 500 的平均年回报率约为 10%,这意味着价格平均每年上涨约 10%。尝试使用 XGBoost 预测标准普尔 500 的价格,您会发现它可能会预测价格下降,但无法捕捉数据中的整体上升趋势。公平地说,预测股票市场价格是一个极其困难的问题,即使是机器学习也没有解决,但关键是,XGBoost 无法预测超出训练数据中存在的范围的价格上涨。

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

标准普尔 500 历史价格。来源:标准普尔转载自 multpl.com 的

预测网络流量

这个任务是我几年前参加的下面这个 Kaggle 比赛的目标。正如 XGBoost 可能无法捕捉全球气温或股票价格的增长趋势一样,如果一个网页正在传播,那么即使增长趋势很明显,XGBoost 也可能无法预测该页面的流量增长。

树木不擅长外推背后的数学原理

决策树获取输入空间并将其划分为子部分,每个子部分对应一个单一的输出值。即使在回归问题中,决策树也使用有限的规则集来输出有限的可能值集中的一个值。由于这个原因,用于回归的决策树总是难以对连续函数建模。考虑下面的例子,决策树可以用来预测房子的价格。请记住,我下面创建的数据集是完全虚构的,并且只用于证明一个观点。

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

一个简单的房价数据集。

如果我们使用这个小数据集来训练决策树,下面的树可能最终成为我们预测房价的模型。

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

一种简单的房价预测决策树。

显然,这不是一个很好的模型或数据集,但它展示了决策树回归的一个基本问题。根据数据集,似乎卧室的数量和房子的大小与其价格正相关。换句话说,有更多卧室的大房子比有更少卧室的小房子要贵。这似乎合乎逻辑,但决策树永远不会预测低于 20 万美元的价格或高于 55 万美元的价格,因为它已经将无限的输入空间划分为有限的可能性集。由于决策树回归模型根据平均值为树叶赋值,请注意,由于有两栋 4000 平方英尺的三居室房屋,决策树预测了这两栋房屋在这种情况下的平均价格($550,000)。即使数据集中存在价值 600,000 美元的房子,决策树也无法识别价值 600,000 美元的房子。

即使像 XGBoost 这样的模型计算了 1000 个决策树的加权平均值,每个决策树也将被限制为仅预测一组范围的值,因此,加权平均值也被限制为取决于训练数据的预定范围的值。

基于树的模型擅长做什么

虽然基于树的模型不擅长外推,但它们仍然擅长解决广泛的机器学习问题。XGBoost 通常不能很好地预测未来,但它非常适合以下任务:

  • 分类问题,尤其是那些与现实世界业务问题相关的问题,如欺诈检测或客户流失预测。许多决策树的组合的基于规则的逻辑可以检测用于处理这些分类问题的合理的和可解释的模式。
  • 有许多分类变量的情况。决策树基于规则的逻辑能够很好地处理包括具有诸如是/否、真/假、小型/中型/大型等类别的特征的数据。
  • **训练集中存在的目标值的范围或分布可以预期与真实世界测试数据的范围或分布相似的问题。**这个条件可以适用于几乎每一个训练数据被正确采样的机器学习问题。一般来说,机器学习模型的质量受到训练数据质量的限制。如果数据集中房屋的价格范围在 30 万美元到 40 万美元之间,则无法训练 XGBoost 有效预测房价。显然会有很多房子比训练集中的房子更便宜也更贵。对于像预测房价这样的问题,你可以用更好的训练数据来解决这个问题,但是如果你试图预测未来的股票价格,XGBoost 根本就行不通,因为我们对未来目标值的范围一无所知。

你应该用什么来代替推断

对于预测或任何涉及外推的机器学习问题,神经网络通常会优于基于树的方法。与基于树的算法不同,神经网络能够拟合任何连续函数,从而允许它们捕捉数据中的复杂趋势。在神经网络背后的理论中,这种说法被称为 通用逼近定理 。这个定理本质上是说一个 神经网络只要有一个任意大小的隐藏层,就能以任何期望的精度水平逼近任何连续函数。基于这个定理,神经网络可以捕捉股票价格的上升趋势或全球气温的上升,并可以预测训练数据范围之外的值。

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

只有一个任意大小的隐藏层的神经网络可以逼近任何连续函数。作者使用 NN SVG 创建的图像。

对于时间序列预测问题,如预测全球气温,具有 LSTM(长短期记忆)单元的递归神经网络可以非常有效。事实上,LSTMs 通常可以很好地处理序列数据,我甚至在本文的中使用它们进行文本分类。

这是否意味着神经网络比 XGBoost 更好?

不,不一定。对于某些问题,神经网络比 XGBoost 更好,但肯定不是所有问题。在机器学习中,没有免费的午餐,任何算法的优势都需要付出代价。

事实上,虽然神经网络的泛化能力是一个优势,但它也是一个弱点,因为神经网络可以拟合任何函数,也可以很容易地过度拟合训练数据。神经网络也倾向于需要大量的训练数据来做出合理的预测。有趣的是,与基于树的算法相比,使神经网络如此强大的复杂性也使它们更加难以解释和诠释

这个故事的寓意是不是所有的算法都是平等的,但是每个算法都有缺陷,没有一个算法在所有机器学习问题和商业用例中都是普遍优越的

摘要

  • XGBoost 是一个非常复杂的算法,但是像其他基于树的算法一样,当涉及到外推的任务时,它就有所欠缺。
  • 对于各种各样的现实世界的机器学习问题,XGBoost 仍然是一个很好的选择。
  • 神经网络,尤其是具有 LSTMs 的递归神经网络通常更适合于时间序列预测任务。
  • 机器学习中没有免费的午餐,每种算法都有自己的优缺点。

来源

  1. T.陈,C. Guestrin, XGBoost:一个可扩展的树增强系统,(2016),第 22 届 ACM SIGKDD 国际会议。
  2. Kaggle, Avito 上下文广告点击量,(2015),Kaggle 比赛。
  3. 美国宇航局戈达德太空研究所(GISS),全球气温,(2020),《全球气候变化:地球的生命体征》。
  4. 标准普尔, S & P 500 历史价格,(2020),multpl.com。
  5. 维基百科,通用逼近定理,(2020),维基百科免费百科。

将数据仓库迁移到云时需要考虑什么

原文:https://towardsdatascience.com/why-you-are-throwing-money-away-if-your-cloud-data-warehouse-doesnt-separate-storage-and-compute-65d2dffd450f?source=collection_archive---------23-----------------------

要让您的数据仓库和数据湖面向未来,需要考虑什么&雪花、亚马逊、谷歌、SAP 和 IBM 是如何实现存储和计算分离的

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

约翰·施诺布里奇在 Unsplash 上的照片

不久以前,建立一个企业数据仓库需要几个月甚至几年的时间。如今,有了云计算,您可以很容易地注册一个由云供应商提供的 SaaS 或 PaaS 产品,并且很快就可以开始构建您的模式和表。在本文中,我将讨论将数据仓库迁移到云时要考虑的关键特性,以及为什么选择一个将存储和计算分开的数据仓库是明智的选择。

将存储和计算分开意味着什么?

从单个服务器到数据仓库集群

归结起来就是向外扩展&向内扩展向上扩展&向下扩展之间的差异。在旧的数据库和数据仓库解决方案中,存储和计算驻留在单个(通常很大&强大)服务器实例中。这可能会很好地工作,直到这个服务器实例达到其最大计算或存储容量。在这种情况下,为了适应增加的工作负载,您可以纵向扩展,即将 CPU、RAM 或存储磁盘换成容量更大的,对于云服务,这意味着要切换到更大的实例。类似地,如果你的单个实例太大,为了省钱,你可以把它换成一个更小的,也就是缩减。这个过程有两个主要缺点:

  • 向上扩展和向下扩展的过程非常耗时,并且通常意味着您的数据仓库将在一段时间内不可用
  • 由于单个服务器实例的自然限制,您可以纵向扩展的范围是有限的。

大规模并行计算

为了缓解这个问题,数据仓库供应商开始使用 MPP ( 大规模并行计算)范例,允许您的数据仓库一次使用整个实例集群。这样,如果您开始达到最大容量限制,您可以简单地向集群添加另一个具有更多存储和计算容量的服务器实例(即横向扩展)。

MPP 可以在很大程度上解决最初的可扩展性问题。然而,这也要求您的存储和计算能力在集群中的节点之间紧密结合。这意味着,如果你想在晚上关闭一些计算能力(即扩展,因为几乎没有人在这段时间查询数据,你不能这样做,因为终止实例将意味着要么丢失数据,要么必须创建备份并在早上从它恢复。如果您的架构不允许您轻松扩展 闲置的计算资源,您只需扔掉您的钱

这里讨论的范例通常被称为无共享架构。维基百科[1]是这样定义的:

无共享架构 ( SN )是一种分布式计算架构,其中每个更新请求由单个节点(处理器/内存/存储单元)满足。目的是消除节点之间的争用。

如何才能把 SN 架构的 MPP 做的更好?

我们可以清楚地看到,瓶颈在于存储和计算紧密耦合,无法相互独立地扩展。理想情况下,我们希望获得一种架构,在这种架构中,我们可以根据查询工作负载按需扩展计算能力,并且在所有计算节点之间共享存储。存储应该具有无限的容量,以使架构经得起未来的考验,并且随着时间的推移,随着我们存储越来越多的数据,存储应该自动扩展。

所以我们想实现 SD-MPP共享数据大规模并行处理集群,而不是 SN-MPP。

这正是许多云供应商所做的。他们的实现有一些不同,但他们的目标是相同的:一个弹性计算层和一个独立且可无限扩展的共享存储层

为什么存储和计算的分离非常适合分析查询?

Hadoop 最初设计用于分析数据(,即运行查询以检索&流程数据,尽可能接近其存储位置。这意味着,如果您的销售数据存储在节点 A 上,那么您检索销售数据的查询也可能在节点 A 上执行,以提高性能。总的来说,获取数据进行处理的最快方式是(按此顺序):

  • 来自 RAM,
  • 然后从固态硬盘
  • 然后从硬盘和对象存储。

因此,将存储和计算分开可能看起来违反直觉,因为我们将数据(存储)移动到离处理数据的地方更远的地方。

然而,对于高性能列数据库,云供应商将许多优化技术 应用于存储和计算 ( 例如。AWS Redshift 应用 AQUA [4] ),因此存储与计算的分离不会对性能产生任何负面影响。这些优化技术涉及压缩、编码、缓存以及在对象存储和 SSD 之间内部移动数据的组合。

当您在一个列式内存数据库中运行一个查询时,在的掩护下,您只从一个共享存储层 ( 比如说从对象存储 ) 将该数据的一小部分加载到内存 ( 中,同时还对该数据应用字典编码和压缩以减小其大小)。然后,可以用与从具有块存储的本地磁盘加载时相同的方式处理这些数据。

Spark 等分布式计算引擎也支持直接从对象存储加载数据[2],这是分析数据处理的计算和存储分离的又一个例子。

在数据仓库中分离存储和计算有什么好处

  • 没有闲置的计算资源 —存储和计算可以相互独立地扩展和缩减
  • 如果与对象存储一起使用(例如。AWS S3)或与网络文件系统 (es。AWS EFS),我们以低成本获得无限的高可用性和容错存储
  • 没有存储节点管理 ( 这是您通常需要用 ex 维护的。Hadoop 集群节点或 Amazon 红移密集型存储节点)—使用 SD-MPP ,您(通常是)只需监控和扩展您的计算节点
  • 大幅降低成本— 能够在夜间、季节性高峰过后或不需要时关闭一些计算节点,可以节省大量资金
  • 让您的架构在数据增长方面面向未来 —随着我们这些天经历的数据增长,我们的数据量不可避免地会随着时间的推移而增加。通过使用 SN-MPP ,仍然有可能适应这种增长,但价格是许多公司无法承受的。
  • 灵活性 —能够将季节性考虑到您的架构中。在一年中的特定时间需要更多计算,例如黑色星期五、圣诞节或您发布新产品的时间
  • 更高的性能——你可以在你的时间内做更多的事情:例如。如果您有一些计算成本更高的作业,您可以启动一个具有更多 RAM 和 CPU 容量的额外计算节点,以更快地完成计算密集型作业,之后,您可以终止该节点,而不必重新设计整个数据仓库
  • **容错:**如果由于某种原因,您的所有计算节点都停止运行,您不会丢失数据——您可以简单地启动一个新的计算实例,并立即恢复对您的模式和表的访问
  • 横向扩展时,无需对集群中的数据进行重新分配、重新分区或重新索引 —借助紧密耦合的 SN-MPP 架构,需要重新分区或重新索引来防止某些特定节点过度燃烧,即防止一个节点占用所有存储或所有计算工作,而其他节点保持空闲。简而言之,在节点间均匀分布存储和计算。
  • 将不同团队的计算分开,同时仍然将您的数据(共享存储)保存在一个每个人都可以访问的中心位置。例如,您可以将单独的“虚拟”计算能力分配给数据科学家,以便他们对 ML 的计算开销很大的查询不会影响其他用户。这个特性并不是所有云厂商都支持的(只从雪花那里听说过【10】)。

云供应商如何实现存储和计算的分离

在下文中,我只列出了利用 SD-MPP 架构的云数据仓库服务,该架构将存储与计算分开。由于这些云产品互不相同,我简要描述了它们是如何将共享数据范式整合到服务中的。

雪花

雪花首创,营销(他们好像有很扎实的营销预算!)多集群共享数据架构的概念( SD-MPP )。他们进一步将其分为[3]:

  • 数据库存储层 —在我们将任何数据加载到 Snowflake 之后,这是数据被持久化和优化的地方(变成柱状形式并被压缩)。这种存储对用户来说是抽象的,数据只有在运行查询时才可见。
  • 查询处理层 —决定数据在*虚拟仓库内部如何处理。*这是我们可以主动管理的计算层。我们可以为特定的团队创建几个仓库。
  • 云服务层 —包括元数据&基础设施管理、认证&访问控制以及查询优化。

雪花的最大卖点之一是他们的 SD-MPP 产品是云不可知的——你可以在亚马逊网络服务、Azure 或谷歌云平台上设置它[9]。

亚马逊红移

直到 2019 年 12 月,红移将被视为 SN-MPP 架构的典型例子。Redshift 是首批云数据仓库解决方案之一,自 2012 年 10 月上市。

AWS 可能注意到其他云供应商正在提供具有 SD-MPP 架构的竞争服务(由于存储和计算分离而大幅降低成本),或者他们可能听取了客户的意见。起初,AWS 实现了红移光谱——一种提供额外计算层以直接从 S3 查询数据的服务。这个特性允许我们创建外部表 ( 外部,因为它们不存在于数据仓库中——它们是从 S3 ) 中检索的,并将它们与数据仓库中的现有表连接起来。它提供了数据仓库和数据湖之间的无缝数据集成,但它没有解决红移所基于的 SN-MPP 架构的问题。

2019 年 12 月,AWS 发布:

  • 亚马逊红移托管存储,它允许我们在计算节点之间使用共享存储,可自动扩展至 8.2 PB。这种存储基于 S3 和固态硬盘的组合。AWS 完全管理数据在 S3 和 SSD 之间的存储和移动方式。
  • 面向红移的 AQUA(高级查询加速器) —在托管存储层中包含硬件加速缓存,以加快操作速度。根据 AWS 的说法,这使得 Redshift 比任何云数据仓库快 10 倍[4]。这是来自 re:Invent [5]的幻灯片,他们声称这种速度提升——然而,他们“*忘记”*链接他们性能基准的来源,所以我无法验证。
  • 新 RA3 实例类型 —此实例类型系列中的计算节点与红移托管存储协同工作。

AWS 雅典娜

亚马逊还有另一个可以用于数据仓库和数据湖的服务:Athena。与 Redshift 相反,Athena 是一个无服务器选项,它将 Presto 引擎(计算)与 S3 ( 存储)结合在一起,以按需从位于 S3 的数据湖中查询数据。您需要为每个查询支付+的 S3 存储费用。

国际商用机器公司

IBM Db2 Warehouse on Cloud 是一个完全托管的服务,采用 SD-MPP 架构,但有一些额外功能,如基于人工智能的查询优化器:

正常的查询优化器可能会继续建议相同的查询路径,即使在它被证明不如希望的有效之后,机器学习查询优化器可以模仿神经网络模式,从经验中学习。这有助于它不断改进,而不是不时地优化”。[6]

**补充说明:**在撰写本文时,IBM 声称提供 1000 美元的 IBM 云信贷,以便您可以试用他们的云数据仓库。你可以在这里找到更多关于的信息。

SAP 数据仓库云

在某些方面,SAP 采取了与雪花相似的方法,他们也提供虚拟仓库*,他们称之为“空间”😗

空间[…]是独立的,可以为可用磁盘空间、CPU 使用率、运行时间和内存使用率分配配额。[7]

他们承诺,在这些空间内,您可以彼此独立地扩展存储和计算。然而,存储似乎没有弹性增长,因为您被要求专门分配每个空间的磁盘空间配额。

谷歌大查询

BigQuery 是完全无服务器的,因此它从用户那里抽象出存储和计算是如何工作的。BigQuery 自动扩展存储和计算,无需我们做任何事情。在引擎盖下,它使用了一个名为 Colossus 的独立分布式存储层和一个名为 Dremel计算引擎。与 Amazon Athena 类似,Big Query 使用按查询定价的模型。

现代数据仓库解决方案中存储和计算的分离模糊了数据湖和数据仓库之间的界限

公司倾向于构建数据湖以节省成本 —数据湖提供无限存储,许多数据湖云服务提供附加服务以快速高效地从数据湖中检索数据,通常使用构建在数据湖之上的 SQL 接口。这样,我们可以获得一个存储层(你的数据湖 ex。通过利用 AWS S3 和一些 SQL 查询引擎作为(无服务器计算层来查询这些数据(例如。亚马逊雅典娜)。从架构的角度来看,这是一个类似于数据仓库中共享数据层的概念。另外,使用那些为数据湖构建的 SQL 接口通常类似于使用数据仓库。在某种程度上,这模糊了数据湖和数据仓库之间的界限。

证实这一假设的常见例子:

  • 开源的 Presto+亚马逊雅典娜的 AWS 实现
  • Upsolver 为摄取和转换存储在数据湖中的数据提供 SQL 接口[8]
  • “老好人” Apache Hive 自 2010 年以来就为存储在 Hadoop 上的数据湖提供了一个 SQL 接口
  • 雪花已经称自己为云数据平台*,因为它在一个产品中结合了数据仓库和数据湖功能*
  • Amazon Redshift 创建了 Redshift Spectrum 来提供在单个服务中一起查询数据仓库和数据湖的能力。

结论

在本文中,我们了解了为什么计算与存储的分离对于以经济高效的方式让您的云数据仓库和数据湖架构面向未来至关重要

我们回顾了我们如何实现共享磁盘大规模并行处理架构的历史,以及它是如何被雪花、亚马逊、谷歌、SAP 和 IBM* 实现的。*

最后,我们列出了这种方法的优势,并得出结论,在现代云数据仓库解决方案中,计算与存储的分离模糊了数据湖和数据仓库之间的界限。

感谢您的阅读,并随时关注我的下一篇文章。

资源:

[1]https://en.wikipedia.org/wiki/Shared-nothing_architecture

[2] Preetam Kumar: 切断绳索:使用对象存储将您的数据湖中的数据与计算分离https://www . IBM . com/cloud/blog/Cutting-cord-separating-data-compute-data-lake-object-storage

[3]雪花文档:https://Docs . snow flake . com/en/user-guide/intro-key-concepts . html #:~:text = installation % 20 和%20updates。-,雪花% 20 体系结构,节点% 20 在% 20 数据% 20 仓库中。

[4]AWS Pages:https://Pages . AWS cloud . com/AQUA _ preview . html #:~:text = AQUA % 20 is % 20a new % 20 distributed,to % 20 compute % 20 clusters % 20 for % 20 processing。

[5] AWS 幻灯片来自 re:Invent 2019 年 12 月https://D1 . AWS static . com/events/reinvent/2019/NEW _ LAUNCH _ Amazon _ Redshift _ re imagined _ RA3 _ and _ AQUA _ ant 230 . pdf

[6] IBM 博客:https://www . IBM . com/blogs/journey-to-ai/2020/03/the-technical-advances-behind-DB2/

[7] SAP 博客:https://saphanajourney . com/data-warehouse-cloud/resources/what-are-spaces/

[8]上解器:https://www.upsolver.com/data-lake-platform

[9]雪花—支持的供应商:https://docs . snow flake . com/en/user-guide/intro-cloud-platforms . html

[10]雪花虚拟仓库:https://www . analytics . today/blog/snow flake-Virtual-warehouse

作为一名数据科学家,你为什么感觉不够好,你能做些什么

原文:https://towardsdatascience.com/why-you-dont-feel-good-enough-as-a-data-scientist-and-what-you-can-do-about-it-c69ca51ca06b?source=collection_archive---------54-----------------------

尤其是如果你是一个有抱负的数据科学家

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

iSAW 公司Unsplash 上拍摄的照片

你有没有觉得自己没有资格去做别人信任你去做的事情?你有没有想过,你设法骗过他们给你一个机会,但他们发现你只是时间问题?你有没有觉得自己是个骗子,或者你不够好,只是运气好?

我去过那里。尽管我对自己的能力和技能完全有信心,但我仍然觉得除了我之外,还有很多事情大家都知道。我觉得我设法欺骗了系统,得到了一份工作,现在我不得不保护我的封面。

如果你也遇到过类似的情况,那说明你经历过冒名顶替综合症。如果你还没有,并且正在努力成为一名数据科学家,那么你可能会在第一份工作中有这种感觉。

冒名顶替综合征就是觉得自己无法胜任这份工作,认为自己是靠运气才走到这一步的,别人会发现你并指出你的错误。我来告诉你为什么我觉得这种感觉在数据科学家中特别普遍,为什么有这种感觉很正常。我也会给你一些建议,告诉你如何改变你的观点,拥有更健康的心态。

为什么这种感觉在数据科学家中很普遍?

数据科学或数据科学家还不是定义明确的术语。可能会看到许多相互矛盾的定义。因此,有抱负的数据科学家可能会看到不包括他们的定义,并认为他们仍然没有获得数据科学家的头衔,因为他们缺乏提到的某种技能。

更重要的是,数据科学经常被用作一个庞大的总括术语,其下还有许多其他领域。当你看到不断有新的主题、学科、技术、算法出现,并且都被描述为数据科学的一部分时,感到不知所措和不合格是正常的。记住,不是你听到的每件事都会适用于你。

我知道当你在网上听到同事、朋友、人们讨论某些你从未听说过的话题时,你会更难过。很自然的认为自己是面对地球唯一不知道这件事的数据科学家(候选人)。

除此之外,互联网本身对冒名顶替综合症没有帮助。正如我在以前的一篇文章中谈到的,数据科学精英可能会让你对他们的在线评论感到不满意。别让他们得逞。看到类似“谁能自称数据科学家?,“你如何判断一个人是否是真正的数据科学家?”“你怎么能算出一个假的数据科学家?".

为什么不好?

迷失在冒名顶替综合症中是不好的,因为它可能会限制你的潜力。特别是当你刚进入这个领域时,你的主要目标应该是从你的前辈和你正在做的项目中吸取一切,而不是隐藏你的缺点。

如果有的话,你应该感到足够舒服,公开谈论你不知道的事情,这样别人就会知道如何帮助你。

你能做些什么呢?

首先,你能做的是知道有这种感觉是正常的,并在这种感觉被触发时意识到这一点。我遇到过在各自领域都有成就的人,却仍然觉得自己懂得不够多,更别说新手了。在某种程度上,感觉不够好是好事,它会给你动力去学习更多,更努力。不过,你应该确保留意负面影响,这样它才不会阻止你发挥潜力。学会利用这种感觉。

为了减少冒名顶替综合症的影响,特别是如果你正处于旅程的开始,我建议你在允许自己称自己为数据科学家之前,保留一份你想学习的基本技能的列表。你可以保持它的灵活性,在你进行的过程中添加你认为合适的东西。只要确保不要把你在那里听到的所有与数据科学相关的东西都堆砌起来。需要有一个可实现的终点线。您可以使用数据科学入门课程中的理论知识层作为起点。说到底,谁是数据科学家并没有明确的描述,你需要建立自己的门槛,不要担心其他人在说什么。由你来定义你的标准。如果需要的话,你可以在以后调整你的标准以适应某个专业或某个职位。

因此,在学习要求方面,不要苛求自己。我以前说过,现在我再说一遍,你最重要的资产是你在需要的时候学习的能力。没有人指望你什么都知道。夯实你的基础,并愿意在此基础上再接再厉。这就是一个好的数据科学家。

👉对数据科学领域以及如何开始学习感到困惑? 免费参加数据科学入门迷你课程

测试准确度越来越低?像这样比较训练集和测试集

原文:https://towardsdatascience.com/why-you-may-be-getting-low-test-accuracy-try-this-quick-way-of-comparing-the-distribution-of-the-9f06f5a72cfc?source=collection_archive---------8-----------------------

如果你是一名数据科学家,这可能发生在你身上:你在学习过程中为你的模型获得了极好的结果,但是当使用测试集时,或者在部署到生产中之后,你得到了低得多的分数:一切都出错了。

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

来源: makeameme

我是不是太适合了?我的代码有问题吗?我是不是患上了数据泄露

有时,测试集中的数据分布与训练/验证集中的数据分布非常不同。也许你正在处理时间序列,测试数据属于我们 2020 年 4 月后的世界🦠.也许你需要在数据科学面试中取得好成绩。

这个问题也会发生,尤其是当您部署一个在运行时工作的模型时。事情是这样的:

  1. 你跟踪用户数据。您使用的跟踪系统通常会有一些错误,您会有不正确的或丢失的值。
  2. 您可以使用这些数据来训练模型并将其部署到生产中。
  3. 由于生产中的数据具有不同的分布,您的模型可能表现不佳。

不幸的是,如果测试集不在您的能力范围之内——例如,它是生产数据,而您无法访问它——那么解决方案就是获得运行时可用数据的更忠实的表示。这很有挑战性。

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

资料来源:imgflip

然而 ,如果你有访问测试集的权限,检查测试集的分布是否与训练集的分布相似是相当容易的。你是怎么做到的?

当然,随着更多的机器学习。

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

来源:可爱的 XKCD (CC BY-NC 2.5)

这个想法非常简单:构建一个随机森林模型(或任何其他分类器),其目标是对“训练”或“测试”中的数据点进行分类。*您不应该能够正确地决定一行是属于训练集还是测试集,它们应该是不可区分的。因此,*如果我们的模型表现太好,那么您可以将低测试分数归咎于与训练集具有不同分布的测试集。

这里有一个完整的工作示例。试试吧!

当正确创建训练和测试数据集时,分类器的平均准确度从 0.93 下降到 0.53。这正是我们所期待的!如果你稍微挖掘一下,你会发现(剧透一下)测试数据包含了 86%的目标变量等于‘virginica’的行。这就是问题所在。

还有其他方法来测试 2 个数据集的分布相似性。一个这样的例子是 Kolomogorov-Smirnov 测试,它是您分别应用于每一列的东西。我将在以后的文章中更多地讨论这个问题——优点、缺点、发现这个问题后该做什么,以及当你在进行 NLP 和工作嵌入时会发生什么。

更新:帖子现已上线:https://medium . com/@ Billy . mosse/why-you-may-get-low-test-accuracy-try-this-simp statistical-tests-30585 b7ee 4 fa

祝你黑客生涯愉快,并保持健康!

学到了什么?单击👏说“谢谢!”并帮助他人找到这篇文章。

为什么你可能得到较低的测试精度:试试 Kolmogorov-Smirnov

原文:https://towardsdatascience.com/why-you-may-be-getting-low-test-accuracy-try-this-simpstatistical-tests-30585b7ee4fa?source=collection_archive---------53-----------------------

Kolmogorov-Smirnov 帮助比较训练集和测试集的分布。首先使用 Mahalanobis 进行单词嵌入。

在之前的一篇文章中,我描述了一个当你获得高训练分数但低测试分数时可以尝试的巧妙技巧。这个想法是,也许你的测试集与训练集有不同的分布,你可以通过一点(更多)机器学习的帮助,实际上知道是否是这种情况。

在文章的最后,我提到这个问题也可以通过统计测试来解决:主要是 Kolmogorov-Smirnov 统计。它是如何工作的?

Kolmogorov-Smirnov 统计检验(所谓的“零”)假设,即从相同的连续分布中抽取两个独立的(数字)样本。它在 SciPy 中有一个 Python 实现。

让我们试一试。我们首先将数据非随机分为训练集和测试集,因此我们可以尝试 Kolmogorov-Smirnov 测试:

数据集包含列 sepal_lengthsepal_widthpetal_lengthpetal_width 。这可以通过运行以下命令来检查:

X.columns

那我们现在怎么办?Kolmogorov-Smirnov 试验必须在每个连续柱上分别进行。例如,让我们在 sepal_width_column 上进行:

stats.ks_2samp(X_train.sepal_length, X_test.sepal_length)

该行比较了 X_train.sepal_lengthX_test.sepal_length 的分布。它们是相同的吗?

我们得到以下输出:

Ks_2sampResult(
statistic=**0.5511895215183106**, pvalue=**9.307408288528052e-09**
)

统计值给了我们两个分布之间的距离的概念。对于那些稍微了解统计学的人来说,它无非是经验累积分布函数之间的距离的上确界:

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

来源:维基百科 (CC0)

基本上,这个值越大,分布的差异就越大。在我们的例子中,0.55 是一个很大的数字,因为 ECDF 输出 0 到 1 之间的概率值。这是有意义的:如果你检查我们如何创建 X_trainX_test ,我们让参数 shuffle 在分割期间为假,以模拟数据的非随机分割。

另一方面, pvalue 给了我们一个统计检验的重要性的概念。它告诉你我们应该有多信任这个测试。在这种情况下, 9.3 e09 是一个真正接近于零的值——e09 的意思是乘以 10^(-9)——所以我们处于安全区(通常如果低于 0.05,甚至 0.1 就足够了,这取决于上下文)。

为了结束这一部分,让我们看看如果随机选择训练和测试集会发生什么(在我们的例子中,删除 shuffle=False 选项就足够了)。所以,把这一行改成:

#We remove the shuffle=False option and add a specific random_state so that you get the same random splitX_train, X_test, y_train, y_test = train_test_split(
 X, y, test_size=0.33**, random_state = 42**)stats.ks_2samp(X_train.sepal_length, X_test.sepal_length)

我们得到以下结果:

Ks_2sampResult(statistic=**0.16813686180165732**, pvalue=**0.3401566277318967**)

0.168 的统计值表明我们可能有一个稍微不同的分布,但是我们不能拒绝零假设,即分布实际上是相同的,因为p 值不够小(它应该小于 0.1)。

太好了。这让我们可以比较列数据的分布。但只是一维数据。如果我们处理的是不能真正拆分成列的矢量数据,会发生什么?例如,如果我们的数据集由 NLP 单词嵌入组成呢?在这种情况下,列是非独立的,每个列本身没有太多意义。

好吧,同样,我们可以使用我在文章开头提到的这个简洁的[机器学习技巧](http://Ks_2sampResult(statistic=0.16813686180165732, pvalue=0.3401566277318967)),它非常适合矢量数据的分布。正如帖子所解释的,基本想法是尝试通过机器学习模型将数据点分类为训练或测试,例如随机森林。如果你成功了,这意味着集合有不同的分布。换句话说,你不应该能够成功。

还有其他方法。您可以转换数据,使其成为一维数据。例如,您可以计算向量的长度,然后将 Kolmogorov-Smirnov 应用于的*。当然,在任何这些转换过程中,您都会丢失信息,因此,如果测试结果告诉您两个数据集具有相同的分布,您不应该过于相信测试结果。*

一个不仅仅是计算向量长度的简单转换是计算数据的每一对数据点的 Mahalanobis 距离。当然,您可以(也应该)尝试进行多种转换,这样您就可以从不同的角度测试您的数据。

Mahalanobis 距离背后的一个可能的直觉是,它计算 2 个向量点之间的距离,就像我们都知道并喜爱的正常欧几里德距离(又名,尺子),但知道这 2 个点是属于特定分布的随机向量。

事实上,当计算两个向量点之间的马氏距离时,你必须通过一个叫做*协方差矩阵的东西。*这个对象是您用来描述您正在使用的发行版的。

这个协方差矩阵是从分布中计算出来的,并且在 Python 中有一个实现。现在,假设我们正在处理一个训练集 X 和一个测试集 Y。我们不应该计算两个不同的协方差矩阵(一个用于 X,一个用于 Y ),但我们需要处理 X 和 Y 的联合的协方差矩阵。请相信我,否则,您将丢失更多信息,并且无法检测到分布中的某些差异(用数学术语来说,您将无法检测到分布的……协方差中的差异)。)

我们得到以下结果:

 Ks_2sampResult(statistic=**0.13218600000000003**,
 pvalue=**0.0**)

所以分布略有不同,这是肯定的*—*p 值很低,四舍五入为零。

如果我们在两种情况下使用完全相同的分布,我们可能会发现如下数字:

Ks_2sampResult(statistic=**0.008912000000000031**, 
pvalue=**6.42297518848271e-35**)

(当然,有随机性,所以这些玩具的例子你可能会得到不同的结果)。但是,检查一下统计值与之前相比有多低。

总而言之:

  • 有时,模型中的低测试分数可能是因为测试数据与训练数据的分布不同。
  • 您可以通过对数据集的每一列应用 Kolmogorov-Smirnov 统计测试来检查这一点。Python 中有一个实现,你也可以借用我的代码示例。
  • 如果你正在处理具有非独立列的数据集,比如单词嵌入,你不应该使用 Kolmogorov-Smirnov。你应该首先转换你的数据,使它是一维的。例如,你可以计算所有向量的范数,但是如果你使用马氏距离会更好。对此也有一个 Python 实现,您可以再次借用我的代码示例。

黑客快乐!

学到了什么?单击👏说“谢谢!”并帮助他人找到这篇文章。

为什么需要替代数据以及如何使用它

原文:https://towardsdatascience.com/why-you-need-alternative-data-and-how-to-use-it-54ff5f416f03?source=collection_archive---------50-----------------------

依赖传统数据集的日子已经一去不复返了

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

美国宇航局在 Unsplash 拍摄的照片

你是替代技术的所有者,这是沙特王国的一家连锁技术商店。迄今为止,替代技术在利雅得取得了成功,这主要归功于对当地市场的了解。

您的业务合作伙伴利用他们对当地动态的了解来定制商店:为会说正确语言的人配备员工,寻找战略位置,并为商店储备符合这些地区人们兴趣的商品。

你的下一步?扩展到吉达城。挑战?你不了解当地的动态,没有合作伙伴来填补这一空白,也没有数据来通知你的决定。

你知道,缺乏适当的数据是企业普遍面临的一大难题,尤其是在中东地区。然而,我希望你将此视为一个机会。

让我们退一步看看美国。美国人口普查局进行全国范围的人口普查,除其他外,产生邮政编码级别的人口统计数据,如收入、国籍和年龄组。政府、公共机构和私营企业等都利用这些数据来制定各种决策,包括:

  • 决定新住房和公共设施的位置和容量
  • 优化电信塔的位置
  • 开设和定制零售店

美国人口普查数据远非最佳,面临着记录过时和偏见等问题。然而,这是一个很好的起点。

中东的情况并非如此。传统数据不仅在许多方面缺乏,而且过于宽泛,通常只能在地区或区域一级获得。

这就是替代数据出现的地方。

那么什么是替代数据呢?这个名字源于金融,投资公司开始使用关于公司的非传统数据集,从常规公司文件以外的来源提取对公司业绩的独特和及时的见解。例如,对冲基金可能使用卫星图像显示零售商店的停车场,并使用这些图像预测季度收入,并相应地在股票市场进行交易。

事实上,2019 年,估计有 11 亿美元被注入替代数据行业,预计 2020 年将增长 55%。

简而言之,替代数据提供精细的最新信息,可以填补传统数据缺乏的空白(例如中东地区缺乏适当的人口普查),或者用来自不同的、可能是专有的视角的丰富信息覆盖现有数据集。

现在我们已经确定了什么是替代数据,让我们通过一个例子来帮助解释您将如何使用替代数据来指导您在吉达的新技术商店的决策。

  1. **确定你需要回答的问题。**为了简洁起见,假设你有两个悬而未决的问题:商店应该设在哪里,销售人员应该说什么语言?
  2. 将问题转化为可以分析的维度。说店铺的位置主要取决于附近的收入水平,因为替代技术专注于高收入水平的地区。此外,假设语言主要是由附近的民族密度驱动的。
  3. 研究有助于回答这些问题的数据来源。首先,从研究官方数据开始,比如来自国家或地方当局的数据。虽然这些数据可能无法提供您想要的最新粒度视图,但它提供了一个基线,可以帮助您验证和三角测量您遇到的任何粒度数据。然后,探索替代数据。对于收入水平,你可以使用在线平台上的住宅价格数据作为替代。
  4. **使用数据分析提取、清理和汇总替代数据。**对于房产价格,您可以解析(即提取信息)Airbnb 或 Property Finder 等平台,以确定每平方米的平均价格。并将这些社区分为三个等级:低、中、高收入水平。
  5. 验证你的发现。这是最重要的一步。事实没有单一的来源,而是对不同的数据源进行三角测量,以获得对业务有意义的精确的、最新的信息。为了验证调查结果,您可以对同一维度使用替代数据源的组合,或者使用以前收集的地区级数据来检查您的粒度调查结果并填补任何缺失的空白。

无论你是企业对消费者公司的决策者、政策制定者、顾问,还是公共机构的项目主管,你都可能已经从第一手资料中了解到,你的洞察力和为他们提供信息的数据一样好。因此,拥有补充传统数据集的替代数据源对于丰富您对决策之旅的见解极其重要。

这是关于数据分析和可视化领域的系列文章的第一篇。在接下来的文章中,我将进一步定义数据源,强调不同的用例,处理相关的风险,并触及数据分析和可视化中常用工具的各个方面。

[1]“替代数据。是什么,谁用,为什么有意思?”福布斯,2019 年 12 月 12 日,https://www . Forbes . com/sites/Forbes insights/2019/12/12/alternative-data-what-is-it-who-uses-it-and-why-it-is-interest/# 5024058 c 6123。

为什么你需要测试机器学习中的测试

原文:https://towardsdatascience.com/why-you-need-to-test-the-tests-in-machine-learning-fed99de5e1c7?source=collection_archive---------52-----------------------

即使您小心翼翼地分离训练和测试数据集,还有什么可能出错

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

国家癌症研究所Unsplash 上拍摄的照片

如果你曾经与机器学习产品进行过交互,你很可能知道将模型的训练和测试分开的重要性,以避免过度拟合,并确保模型能够在看不见的数据上很好地推广。

培训与测试分离的背景

对于那些在这个领域的人来说,如今对培训和测试的关注似乎是显而易见的,但并不总是如此。在数据科学出现之前,它的祖先统计学还没有完全接受这个概念。

为什么?

**在机器学习和大数据出现之前,模型比较简单,**而现在更多的数据已经允许我们建立更复杂的模型。正如我们所知,当模型复杂性增加时,过度拟合会变得越来越成问题。如果你运行的是线性回归,你就不用担心过度拟合。此外,简单模型的模型可解释性通常更容易,一些过度拟合可以通过细致的手工工作来补偿。

因此,分离训练和测试数据集更多地是一种需要,而不是最佳实践。

培训 vs 测试分离就够了吗?

假设你是一个机器学习产品的商业消费者或产品经理。您的数据科学团队开发了一种新的 ML 产品,采用黄金标准的方法来分离训练集和测试集。

您需要决定是否将产品投入生产。但是你要对它的性能有 100%的把握,才能做最后的决定。

因此,您要求数据科学团队向您展示模型和数据。他们向您展示了完整的数据集,以及它是如何划分为 70%的训练和 30%的测试子集的,并发誓最终的模型纯粹是在训练数据集上训练的,其性能指标仅来自测试数据集。

你现在放心了。不会出错的。对吗?

嗯,有三件常见的事情仍然可能出错。

1.测试数据集以前已经使用过

理论上,这个规则看起来很简单:不到最后阶段,永远不要使用测试数据集。然而在实践中,100%地尊重这一点是非常罕见的,其影响可以从小的高估到非常严重的错误。

为了验证这一点,需要问两个问题。

在哪个数据集上执行了初始数据探索?

数据科学的第一部分(通常更耗时)是数据探索和数据争论。这是在划分训练和测试数据集中的数据之前还是之后执行的?

从纯理论的角度来看,在模型评估的最后一步之前,你不应该以任何方式看到测试数据。短于这个时间的任何东西都可能让你对自己的预测能力过于自信。

然而,这在实践中往往不那么容易,尤其是如果您的数据来自业务环境。如果作为数据探索的一部分,您需要评估来自手动或外部来源的缺失数据并决定如何处理这些数据,该怎么办?(例如,是填充还是删除缺失的行或列)您在查看完整数据集时做出这些决定的事实偏离了理想的场景,但在实践中这通常是无法避免的。

如果在这个阶段您已经执行了特征选择和工程,这一点会变得特别重要。如果您根据要素与其在整个数据集中的目标变量的相关性来选择要素,这肯定会影响概化误差。

在测试数据集上评估了多少不同的模型?

测试集失去其纯粹状态的最常见方式是当您在其上测试多个模型时。这有时可能是恶意的,但是在我的经验中,大多数时候是糟糕的计划迭代的结果。

典型案例:您的数据科学团队选择并构建了一个模型,在某种程度上,他们确信它是最终的,因此他们在测试集上测试它以评估它的性能。在此阶段,与业务部门讨论模型,给出反馈并建议尝试合并另一个功能,或者降低某些变量的重要性。这样的迭代做两到三次可能不会被注意到,但是做的越多,问题就越大。

一个警告:如果你使用 交叉验证 **呢?**当您需要调整超参数时,通常最佳做法是进一步分割训练和验证集中的“训练”数据。如果您的数据有限,交叉验证可以帮助您将相同的子集用于训练和验证目的。然而,交叉验证不应该用来替代测试集,否则前面提到的问题仍然存在。

2.测试数据包含某种形式的数据泄漏

数据泄漏是指您的模型使用了在生产中不可用的数据。这可能会通过欺骗错误地增加模型性能指标。

发现数据泄露问题并不总是那么容易。实践中有两种常见的方式:

  • 只有在必须做出预测的时刻之后,数据才是可用的
  • 该数据在当时理论上是可用的,但在技术上对预测系统是不可用的

我在工作环境中遇到的一个场景是试图预测酒店预订的取消。预订酒店时,特定数据在当时可用(例如,关于客户、旅行、预订季节性),但其他数据仅在预订和计划入住日期之间的时间跨度内收集。

问题是,有些数据可能在数据仓库的相同表中被跟踪,或者可能在不断更新的相同字段中被跟踪。如果没有这些字段的历史视图,这些字段将无法用于模型训练目的。

最极端的情况是,一些字段可能只有在取消被实际处理时才被填充。例如,我们可能只在发送取消请求时收集某些客户信息。如果我们尝试使用这些字段来训练我们的模型,我们将获得取消结果的完美预测!

3.你仍然不能测试未来的数据

现在,让我们假设您已经非常小心地使用了您的测试数据集,并且避免了任何数据泄漏。

您还能相信经过测试的车型性能会在生产中得到体现吗?

好吧,至少你的泛化性能仍然是参考过去的数据,最有可能的是,你将使用你的模型来预测未来的现象。

每个模型的基本潜在假设是,在一定限度内,你相信你试图预测的现象在未来不会变化太快,否则你无法从过去的数据中进行推断。

这个问题有多大很难讲,当然很大程度上取决于应用程序。试图对此建模也可能变得棘手,可能需要结合对未来预期的假设(如贝叶斯模型),这通常不是微不足道的。

根据我在商业环境中的经验,这一点经常被忽视。然而,在后 COVID 时代,这种情况可能会改变。想想训练一个模型来预测酒店取消,就在 COVID 爆发之前(像我一样!).

当生活在 COVID 之后慢慢回归正常时,如果不进行某种调整,相信过去的数据来预测未来将变得越来越困难。但是这可能是另一篇文章的主题!

为什么需要像对待数据一样对待人工智能模型

原文:https://towardsdatascience.com/why-you-need-to-treat-ai-models-like-data-e34563c4e3e4?source=collection_archive---------61-----------------------

为什么像对待数据一样对待模型是一种非常战略性的方法

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

亚历山大·辛恩在 Unsplash 上的照片

这里有一个非常抽象的问题——人工智能或数据科学模型看起来像什么?我们在日常生活中都在使用数据科学模型。大多数不是数据科学家的人都经历过数据科学模型,但从未见过。所以,让我来揭示这个秘密。可能看起来很吓人。这是数据科学模型的样子

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

这是一个加密成字母数字字符的数学公式。但是不要搞错,这个看起来很奇怪的东西是让你的企业成功并击败竞争对手的秘密武器。它可以通过一些先进的高级分析来帮助您执行业务运营。各种业务案例,如增加收入的产品推荐、防止收入损失的欺诈检测、保护资产价值的资产故障预测,都有预测模型支持

因为模型在创造商业价值中是如此重要,我们需要小心处理它们。让我们看看处理这些模型的不同方式

最糟糕的护理—留在笔记本电脑上的模型:

最糟糕的是,这些模型被留在笔记本电脑上,通常是在最初创建的地方。想象一下,把你的企业秘制酱当成一个被遗弃在孤岛上的人。这种情况多少有点可比性。

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

照片由约翰·苏Unsplash 拍摄

不幸的是,这种情况发生了很多次。数据科学家使用笔记本电脑或个人电脑上的分析工具创建的模型仍然存在。大量的努力和脑力被用来创建它们,它们包含了企业成功的关键因素。然而,由于它们保留在本地机器上,并且从未被操作,这是对如此美丽的数据科学作品可能发生的最糟糕的事情

变得更好——将模型放入容器

更好的方法是将模型放在 docker 容器中。通过这种方式,你离以更好、更合理的方式对待模型更近了一步。您现在将模型放入容器中,这意味着它们在容器中是安全和隔离的,并且更易于操作。

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

威廉·费尔克在 Unsplash 上的照片

虽然模型在一个安全的容器中,但它仍然是孤立的。这意味着,如果您想要使用该模型,您需要将数据发送到 docker 容器,并使用 API 来获取结果。这意味着数据移动增加了,这可能不是所有业务运营都希望出现的情况

战略方法——像对待数据一样对待模型

近来,数据已经成为任何公司的宝贵资产。许多技术进步都是将数据作为一种宝贵的资产来管理,例如,数据仓库和大数据存储平台都围绕着保持数据的安全、可管理并使其易于使用来为企业带来好处

因此,如果我们开始将模型视为数据,我们就可以利用数据管理的所有优势,并将其应用于模型。通过像对待数据一样对待模型,我们确保模型也会像数据一样对业务运营具有战略意义。

以下几点说明了为什么将模型视为数据是一个有趣的命题

模型是由数据构成的

模型不是凭空产生的,也不是用魔杖创造的。它们是通过将算法应用于数据而创建的。你可以把它看作是数据的数学投影。因此,将它们视为数据的一部分是有意义的。

模型结果需要数据来理解它们

假设你的模型在未来几天提醒你一个关键的资产故障。为了能够采取任何行动,您需要了解关于该资产的更多细节,例如其位置和价值。您还需要评估是否有必要进行紧急维修或冒险等待下一次定期维护。

正如你现在意识到的,模型的输出只是一个警报触发器。真正的行动需要完成,而将模型输出转换成有形的东西需要关于有问题的资产的数据。因此,如果您将您的模型作为数据的一部分,即作为表中的数据存储在系统中,您可以轻松地将模型的输出与其他数据集成,这使模型输出变得有意义,也使其更具可操作性

管理数百万个模型

在《预测机器》(predictionmachines.ai)一书中,作者写道,人工智能预测变得越来越便宜,这意味着我们将更多地使用它。这也意味着会有越来越多的车型。

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

预测机器. ai

需要数百万模型的用例不是科幻小说。准确的零售库存预测需要每个商店中每种产品的模型。欺诈检测需要对正常的客户行为进行建模,以便预测任何偏离正常行为的情况。由于客户 X 的正常行为可能不同于客户 Y 的正常行为,您将需要与客户一样多的模型。

随着企业管理数以百万计的产品和数以百万计的客户,突然之间拥有数以百万计的模型的需求变得不可避免。

在这种情况下,最好将模型视为数据,并将所有大数据管理原则也应用于模型

模型是您企业的知识产权——保护好它们

模型是由数据构成的,它们编码了您的企业如何工作。例如,欺诈检测模型对您打算如何检测欺诈进行编码。这是贵公司的知识产权,因此应该妥善管理和保管。

想象一下,欺诈检测模型被盗并被解密,甚至更糟的是,解密后的模型被放在互联网上,让每个人都知道你是如何检测欺诈的。突然之间,您将很容易受到欺诈攻击。

然而,管理像数据这样的模型并将数据的所有安全原则应用于模型将有助于使您的知识产权更加安全。

管理模型的经济性

开发一个模型是有成本的,管理你的模型并保持其可操作性也是有成本的。如果你投资专门的系统来管理模型,你就增加了模型的成本。所以你需要仔细考虑创建和管理一个模型的总成本。

正如好的模型来自好的和集成的数据,如果你有一些好的模型,你已经有了一个数据管理平台。因此,如果您还利用数据管理平台来管理您的模型,您将保持模型的总体成本较低。从长远来看,这有助于保持模型的经济性和盈利性

现在,您已经看到了为什么管理像数据这样的模型是有意义的,让我简要地描述一下其中的内容。这些是你想把模型当作数据的一些构件

模型库 —这是一个存储模型数据的地方。通常,它是一个具有专门字段的表,用于保存模型加密定义

模型元数据 —模型看起来很奇怪,人类很难读懂。你需要某种元数据来描述这个模型是关于什么的。这就是使用模型元数据的地方。它包含诸如模型的用途、使用哪种算法以及关于模型准确性的信息

模型传承——像数据一样,你也需要知道模型是如何构建的,以及它是如何被使用的。您需要获取用于构建模型的数据信息。这在可追溯性或审计情况下非常有用

设计模式将外部模型引入数据库——模型就像数据。其中大多数都源自数据管理平台之外。如果您必须像管理数据一样管理模型,您需要将它们放入数据库中。这需要设计模式,设计模式描述了将外部模型引入数据库的不同方式

总之,如果你像对待数据一样对待模型,它们将会像有价值的资产一样被管理。

额外资源

网站(全球资讯网的主机站)

你可以访问我的网站进行零编码分析。https://experiencedatascience.com

订阅每当我发布一个新故事时,请随时关注。

[## 每当 Pranay Dave 发表文章时,您都会收到电子邮件。

每当 Pranay Dave 发表文章时,您都会收到电子邮件。注册后,如果您还没有,您将创建一个中型帐户…

pranay-dave9.medium.com](https://pranay-dave9.medium.com/subscribe)

你也可以通过我的推荐链接加入 Medium。

[## 通过我的推荐链接加入 Medium—Pranay Dave

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

pranay-dave9.medium.com](https://pranay-dave9.medium.com/membership)

Youtube 频道
这里是我的 Youtube 频道
https://www.youtube.com/c/DataScienceDemonstrated的链接

为什么你应该成为一名数据科学家

原文:https://towardsdatascience.com/why-you-should-be-a-data-scientist-86446b1c5c56?source=collection_archive---------46-----------------------

为什么数据科学是世界上最好的工作领域的动机。

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

本·怀特在 Unsplash 上的照片

如果您对数据科学以及它是否适合您感到好奇,您会喜欢这篇文章。或者,如果你已经是一名数据科学家,只是想听到你的职业充满赞美和迷人的话语。

数据科学是一个令人敬畏的工作领域,因为:

这就像用藏宝图寻宝一样。

是啊。说真的!
从事数据科学时,你会觉得自己像一名侦探或探险家,在寻找线索和提示。对我来说,这是非常令人兴奋的。你知道你面前的数据包含有用的信息,而这取决于你去发现它是什么。以来自 Kaggle 的介绍性 Titanic 数据集为例,然后考虑以下适合您的情况的场景(在移动设备上,您可能会滚动一点):

  • 如果你还没有处理过泰坦尼克号的数据集:

数据集包含了泰坦尼克号上可怜灵魂的数据。每位乘客都有关于性别、票价、年龄、父母和兄弟姐妹数量以及乘客是否幸存的数据。乍一看这些数据,很难准确地认识到哪些因素将决定一名乘客是否幸存,作为一名数据科学家,这就是探索步骤发生的地方。 现在开始激动人心了!

你现在可以扭曲和翻转数据,颠倒它,尝试不同的组合,用你的常识逻辑地和批判性地思考它。做所有这些事情,就像一个侦探试图解决一个犯罪,你将能够理解这些数据并获得有价值的信息。

  • 如果你已经使用过泰坦尼克号数据集:

试着回忆一下当你第一次意识到一个只区分男性和女性乘客的模型的准确率接近 77%时的感觉。你对此感到惊讶吗?有没有让你去:什么?”

又或许你只是淡然一笑,摇摇头,心想 “当然。他们当然会先救妇女”。

无论如何,几乎不管这种认识在你心中引发了什么样的反应,我确信它给了你一种积极的感觉。在我看来,这就是数据科学有趣和令人兴奋的地方。

你可以和世界上任何话题一起工作

你是一个好奇的人!我敢说这是因为你正在阅读《媒介》,从定义上来说,它把你归类为渴望学习和探索的人。数据科学是像你我这样好奇的人的完美领域。作为一名数据科学家,你有机会了解世界的各个角落。我一生中的大部分时间都想成为一名心理学家,因为我发现我们人类的行为方式很有趣,但我也认为社会科学和政治是非常有趣的话题。
事实上,我对这个世界上的一切都很好奇,除了数据科学,没有其他职业能让你接触这个世界提供的一切。这是一个非常好的机会。

某一周,你可能正在处理一家大公司的数据。你试图预测什么样的顾客应该得到更多的爱,以保持他们是快乐的顾客。
下一周,你可能会处理海洋中海豚的数据、体育统计数据、癌症患者或猫狗的图像识别。
你现在明白了。我只是想让你想想,作为一名数据科学家,你有多幸运,你可以洞察任何事情。这使得数据科学对我来说非常有价值。

逻辑思维、编码和工程

你喜欢通过对手头的信息进行逻辑思考来解决谜题和谜语吗?
如果你的答案是肯定的,那么数据科学可能非常适合你。

也许你已经熟悉了编程和代码,幸运的是数据科学也包括这些!

我喜欢编码。尤其是它的结构和逻辑。每次你做一个数据科学项目,你就可以构建一个新的系统。首先导入您肯定需要的基本库:例如 Pandas、NumPy 和 seaborn。然后,你对数据进行预处理,并将其分配给不同的变量,你将数据可视化,做一些调整,当一切准备就绪时,你就可以训练一个模型并测试它的性能。

如果表现不佳,你就咬紧牙关

并加以改进。

还有…

如果表现良好,你就会微笑

并加以改进。

这整个工作过程可以建立为一个组织良好的系统。这对我们逻辑思考者来说确实是令人愉快的。

可以远程工作的好工作

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

照片由埃里佐·迪亚斯Unsplash 上拍摄

作为一名数据科学家,你可以获得相当不错的薪水。当然,具体数量因国家和你的专业水平而异。想知道在你居住的地方作为一名数据科学家你能挣多少钱,试着谷歌一下你所在的地区和数据科学的薪水。

自由职业也是一个很好的选择。作为一名数据科学家,你有机会与许多国家的许多不同公司合作,你可以被派驻到世界上任何你想去的地方。只要你有一台电脑和互联网连接。

我并不是说做自由职业者很容易,我也要指出,在一家你会错过的公司任职有很多好处。刚开始做自由职业者时,你可能会经历一段艰难的时期,因为你必须向潜在的客户证明你值得他们的金钱和兴趣。
话虽如此,但你有选择、有机会、有自由来决定你想在哪里工作以及如何工作,这仍然令人惊讶。
这种自由对我来说意义重大!

你可以做出真正的改变

你想改变世界吗?
你想帮助治愈世界上像新冠肺炎这样的危险疾病?
你想为公司和真实的人提供价值?

你当然行!

这个世界需要更多像你这样的人。因为我们需要让地球成为每个人更好的居住地。这个世界有很多问题,我们有责任为一个更光明的未来而努力!如果不是为了我们自己,那么至少是为了子孙后代。

作为一名数据科学家,您可以参与做出必要的改变!
数据科学已被用于制作模型,帮助医生更早发现癌症肿瘤。它被用来更好地理解像新冠肺炎病毒是如何传播的。它允许我们制造自动驾驶汽车和许多其他很酷的东西。可能性是无限的!你可以有所作为。

数据科学在很多方面都充满乐趣、挑战和回报。

我希望这篇文章能启发您去研究数据科学领域。或者,如果你已经是一名数据科学家,那么你对数据科学的迷恋现在会更加强烈。

坚持学习!
—雅各布·托夫特加德·拉斯姆森

为什么应该使用 Python 分析营销活动

原文:https://towardsdatascience.com/why-you-should-be-analyzing-your-marketing-campaigns-with-python-453f3a3528e7?source=collection_archive---------17-----------------------

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

照片由威龙 AUnsplash 上拍摄

像大多数小孩一样,我最喜欢的生日游戏之一是 piata。我会急切地等待轮到我,在我被蒙住眼睛的时候露出最灿烂的笑容,手里拿着球棒走上前去,疯狂地挥棒打开一边,释放里面储存的所有美丽的糖果。显然,蒙着眼睛试图击中目标被证明是一项几乎不可能完成的任务,这令人难以置信地沮丧,因为你知道肯定有东西藏在那个皮囊里。

**试图在没有数据的情况下建立一个成功的营销活动,就相当于蒙住眼睛时希望击中目标。**不幸的是,从事营销工作常常会有这种感觉。许多营销团队努力获得足够的分析师资源,以成功采用数据驱动的方法开展增长型营销活动:识别用户群、发现增长机会、开发流失和保留预测模型,并最终设计和分析绩效&影响。如果没有数据,这些活动产生的任何影响都将是纯粹的运气。

我不喜欢蒙着眼睛做手术。我相信数据,你也应该相信。

于是我投入了时间和精力,自己去学习如何挖掘和分析营销数据。作为一名能够进行深入、有意义的数据分析的成长型营销人员,我能够识别营销和增长机会,设计快速实验,及时分析结果,并根据实验结果提出其他营销活动想法,而无需依赖数据科学家或分析师。

这并不容易。我花了将近两年的时间精通 SQL、Python 和统计学,达到了能够正确分析和解释增长型营销数据的水平。作为一名营销人员,达到这种水平的分析能力让我大开眼界,现在我已经达到了这一水平,我想帮助其他营销人员也摘掉眼罩。

事实是,你不必成为数据科学家来有效地分析营销活动,但是你需要精通统计学(尤其是频率学家)来设计和解释实验。如果你刚刚开始,我建议你先学习统计学的入门课程。如果您已经精通基础统计学,那么投资学习基本的 Python 函数,这将有助于您更高效、更深入地分析营销活动。

营销活动最常见的实验形式是 A/B 测试,也称为“假设测试”。虽然 Mixpanel 或 Amplitude 等程序提供了一些用于分析活动绩效的“现成”解决方案,但即使是在最基础的层面上使用 Python,也能让您探索数据中不同部分之间更复杂的关系,识别可能的错误或问题,并通过自动化节省时间。

让我们更详细地了解一下如何开始部署 Python 进行营销分析:

简化您的探索性数据分析(EDA)

每个分析都是从了解你的数据开始的。这包括(但不限于):了解数据的结构化方式,删除不需要的列,解决空值问题,运行汇总统计并通过创建段或组来探索可能的关系,最后通过绘制数据进行可视化探索。

由于您将利用的大多数功能都包含在您进行的每个 EDA 中,您可以创建一个模板,或者使用我在这里创建的的模板,以使探索您的数据变得简单而快速。

发现数据中的关系

每个营销活动都有特定的目标,大多数活动都将关注转化率指标。假设您正在发送一封电子邮件,让用户知道您的产品有限时折扣。为了正确分析您的活动的影响,您需要定义转化率指标,例如兑换了电子邮件目标折扣的用户的转化率,以及兑换折扣后继续使用该产品的用户的转化率。

你的活动可能会使一些用户比其他人更容易转化,所以你需要对不同的人群进行重复分析,以确定影响的差异。

使用 Python,您可以定义一个循环,该循环遍历您的人口的不同部分,并计算每个部分的转换率。您的细分可以是年龄组、参与度或任何其他感兴趣的细分。Python 允许你在更精细的层次上快速探索转化,这是每个成功的营销活动所需要的。如果没有 Python,您会发现自己要花费大量时间重复类似的分析。

现在让我们把这些原则付诸实践。

步骤 1:定义转换率和保留率的公式

转换率的计算方法是转换的用户总数除以目标用户总数。在本例中,我们将假设数据已经清除了空值,并进行组织,以便标记每个用户,如果他们是活动中的目标,如果他们在活动后转换,和/或如果他们在活动后被保留。

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

转化率和保留率计算示例(图片由作者提供)

对您的数据运行这些公式将会得出总体转化率和保留率。如果你是作为实验的一部分进行这种分析,你应该将你的结果与对照进行比较,或者将结果与活动设计中定义的其他基准进行比较。

步骤 2:使用自动化功能加速您的分析

一旦您对您的营销活动表现有了一个总体的了解,您将想要更深入地了解并发现在整个营销活动期间您的人群的子群体之间的表现差异,以及比较您的人群的某些特征。

这就是使用 Python 可以真正加快分析速度的地方。使用自定义函数,您可以分析您的群体中任何所需子群体的转化率和保留率,例如不同的语言、服务日期或您的目标群体的任何其他相关特征。

首先,创建接受任何数据集和列的自定义函数,并返回每个段的转换率和保留率。您可以通过使用“分组依据”功能来实现这一点。然后,您可以像在步骤 1 中那样计算转化率和保留率,并将结果作为新的数据帧返回。请注意,您可能需要首先拆分结果。您的函数应该类似于以下内容:

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

自定义转化率和保留率函数示例(图片由作者提供)

虽然您可以将这两个函数合并成一个函数,但我通常更喜欢将它们分开——您可能希望探索影响每个函数特定性能的不同特性。例如,在某些情况下,您可能会发现某些群体的转换率较低,但他们的保留率较高,您需要进一步探索可能分别影响每个比率的功能。

步骤 3: 使用自定义绘图功能来检测关系,并识别数据中可能的不一致

使用表格格式来探究不同功能和细分市场的影响可能会让人感到力不从心。使用绘图功能直观地(快速地)检测影响整体结果的波动和潜在关系通常更容易。您可以定义自定义绘图函数,以节省时间并简化调试。

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

自定义绘图功能示例(图片由作者提供)

数据波动可能有多种原因。在某些情况下,您可能会发现用户在一周的某些天或一天中的某些时间进行不同的转换。在其他情况下,您可能会注意到某些语言的表现差异,这可能表明与活动翻译相关的问题,以及活动是否以正确的语言提供给用户。你甚至可以确定需要使用不同类型的视觉效果、颜色或触发器,以便在不同的市场更好地定位活动。

深入数据并解决不一致可能需要更高级的编码,这超出了本文的范围。我将在以后的另一篇文章中探讨如何处理这些问题。与此同时,如果您发现数据中有任何可能的不一致,我建议您咨询您组织内的分析师。当我建立我的分析技能时,我发现来自我的分析师同行的输入是绝对无价的。

识别重要性和提升

当你开始发现你的目标人群中的子群体的关系和转换率时,你需要计算提升率——这将使你了解你的活动实际上增加了转换率。如果你以假设检验(也称为 A/B 检验)的形式设计你的活动,你首先需要将数据分成相关的对照组和治疗组,然后分别计算每组的转化率。在此基础上,您将计算治疗组转换率和对照转换率之间的差值,除以对照转换率。

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

升力计算公式(图片由作者提供)

使用 Python,我们可以为此定义一个函数:

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

自定义升力计算函数的示例(图片由作者提供)

最后,如果不理解它们的统计意义,你所揭示的转化率和保留率以及提升将毫无意义。要做到这一点,你需要进行 T 检验。T 检验有几种类型,取决于你的实验和活动的设计。在这种情况下,我们来看一个双样本 T 检验计算。T 检验将为我们提供一个 T 统计量和一个 P 值,它将决定得到一个至少和你最终得到的结果一样极端的结果的可能性。也就是说,这个活动的结果是随机的结果,还是这个活动确实有影响力?

一般来说,在 95%的显著性水平上,至少 1.96 的 T 统计被认为是统计学显著的。我们的 P 值需要小于 0.05 才能认为我们的结果具有统计学意义。

使用 SciPy 库时,在 Python 中运行 T-test 实际上非常简单。它应该类似于以下内容:

# t-tetst for two independent samples
from scipy.stats import ttest_indt= ttest_ind(control,treatment)print (t)

为了最准确地了解您的宣传活动取得成功的群体,重要的是要估计提升,以及这些结果在您的目标人群的子群体和人口统计数据中是否具有统计显著性。未能揭示占目标人群的子群的提升和统计意义,可能会导致对您的活动的整体影响的错误结论。

如果你想了解更多关于使用 python 进行假设检验,以及分析 lift 和显著性水平的信息,你可以在我的文章“使用 Python 设计 A/B 测试的成长型营销人员指南”中了解更多。

总而言之

虽然许多营销团队可能缺乏足够的分析师资源,但每个团队仍然可以采取更加数据驱动的营销方法。营销人员,特别是那些专注于增长型营销的营销人员,可以通过提高他们在统计和编码语言(如 Python)方面的熟练程度来开发更有意义的活动并正确分析其影响,从而大大受益。

在这篇文章中,我们介绍了使用 Python 可以如何帮助你:(1)快速发现影响产品使用的数据关系,(2)加快对每个活动的分析,这将允许你进行更多的试验,以及(3)优化你的活动,以提高转化率和保留率。

花时间学习成为最好的成长型营销者所需的工具。你会发现奖励甚至比那块旧皮纳塔糖还要好。

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

图片由拍摄经由pixabay.com

为什么你应该谈论可解释的机器学习

原文:https://towardsdatascience.com/why-you-should-be-talking-about-explainable-machine-learning-eb9430d11312?source=collection_archive---------68-----------------------

随着我们对机器学习的依赖增加,我们对它的理解也必须增加。

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

艾莉娜·格鲁布尼亚克在 Unsplash 上的照片

那么问题出在哪里?

简而言之:大多数机器学习(ML)模型都没有得到很好的理解,随着经济越来越依赖 ML 结果,人工智能驱动的技术中预测不佳和系统性歧视的风险也在增加。

长回答:

众所周知,几乎所有的大中型公司都是在数据的基础上做出决策的。大多数公司在某种程度上直接(通过内部开发)或间接(使用第三方软件)利用人工智能。我们现在已经到了“人工智能”不再是一个时髦词的地步——大多数公司对它的使用只是假设。

然而,所有人工智能的根源在于机器学习。传统上,机器学习模型是“黑匣子”,数据输入其中,预测出来,而开发人员不知道如何或为什么。一个模型的准确性足以让人相信它是可信的。

“随着 ML 现已内置于大多数应用程序中,数据驱动的系统性歧视和不公平预测实践的风险达到了前所未有的高度。”

考虑一笔因种族、性别、宗教或性取向而被拒绝的房屋贷款。这样的场景虽然不公平也很荒谬,但并不少见。类似的例子在几乎每个行业都很普遍——想象一下这种歧视在医疗保健、银行和保险等行业的影响!幸运的是,这种情况通常不是由恶意意图引起的,而是由发展中的数据科学家遗漏的有偏见的数据引起的。有了正确的技术和正确的应用,我们就可以告别歧视性的技术,迎来一个公平、没有偏见的 ML 驱动的世界。

进入可解释的机器学习

随着世界对 ML 的依赖越来越深,我们对预测是如何以及为什么在逐个模型的基础上产生的理解必须成熟。

可解释机器学习(EML)是下一代机器学习,它为 ML 模型提供可解释性和可解释性。正是这种技术将极大地降低有偏见和歧视性的机器学习的风险,并帮助组织和经济体做出更好的决策和更有效地运营。

那么我所说的可解释性和可解释性是什么意思呢?这两个术语经常(并且错误地)互换使用,但是在 ML 评估中,有几个关键的区别。

可解释性

可解释性用人类可以理解的语言回答了模型内部机制背后的“是什么”和“为什么”,带来了几个有价值的好处:

  • 非技术领域专家对模型功能的理解
  • 预测误差的发现
  • 识别以前未见过的概念(给定观察到的事件,可能会发生什么未观察到的事件)
  • 更好地理解何时存在不确定性、偏见或不公平

可解释性

可解释性回答了模型如何在不了解其内部机制的情况下获得给定的输出,有助于揭示数据科学家经常忽略的关键问题的答案:

  • 如果你改变特定的输入参数,会导致相同的、更好的还是更坏的结果吗?
  • 如果情况发生变化,事件还会发生吗?

“可解释的机器学习有效地充当了翻译器,允许其用户理解甚至改变结果。”

如果你曾经作为数据科学家工作过,或者与数据科学家一起工作过,你几乎肯定会思考这样一个问题:“为什么模型会做出这样的预测?”或者“我们能做什么来改变这个预测的结果?”。根据我自己的经验,能够清楚而自信地回答这些问题与微调模型的超参数一样重要,如果不是更关键的话。为什么?有几个原因。

EML 带来了什么

1。模型评估领域的专业知识

优秀的模型在开发时会考虑统计技能、计算机科学专业知识和特定于手头问题的领域知识的组合(你们都看过经典的维恩图)。因此,有效的模型在评估时也应该使用这三个领域。EML 邀请技术含量较低的团队成员加入到模型评估和解释的对话中——到目前为止,这一直是纯粹的统计学问题。随着这些额外的大脑加入到等式中,领域专业知识的透镜被引入到 ML 评估工具包中。

2。影响结果

如果一个预测是不利的,如果你不明白为什么它是不利的,你怎么知道如何改变结果?假设你开发了一个近乎完美的模型,能够以 98%的准确率预测客户流失(无论你的客户是否会离开)。您将您的预测传达给客户团队,他们注意到如果您不采取任何行动,您的最高价值客户几乎肯定会离开。如果你不知道他们为什么可能会离开,这有什么用?你不是应该能知道是哪些变量导致了这个预测吗?这是你能控制的吗?

“EML 不仅阐明了为什么我们可以期待某些结果,还让我们了解这些结果是如何受到影响的。”

3。高管买入

如果你不能简单地解释或证明你的预测,决策者为什么要相信你的预测呢?当一位拥有 20 年行业经验的高管质疑一项违背其直觉的预测时,他不太可能接受“该模型在验证数据上的准确率达到 90%,因此你可以相信它”作为答案。能够用他们的语言直观地证明和解释为什么一个模型达到了一个特定的结果,这是高管买入的关键。

4。公民数据科学家的崛起

加上自动机器学习(AutoML),EML 允许技术含量较低的人进行准确、无偏见和歧视的日常机器学习任务。通过消除日常机器学习任务对高技术数据科学家的需求,EML 正在推动一个“公民数据科学家”的新时代,并允许技术专家专注于更复杂的问题、行动和结果。

下一代

传统上,数据科学项目主要围绕收集正确的数据、清理和设计正确的功能,以及选择和调整正确的模型。下一代公平、自动化和可解释的机器学习才刚刚开始。

EML 正在通过将技术含量较低的工人与复杂的 ML 模型联系起来,并将数据劳动力市场从能够构建 ML 模型的人转移到能够理解它们、解释它们并采取行动的人,来增强公民数据科学家的能力。有了它,我们可以创造一个由人工智能驱动的世界,这个世界是公平的,没有偏见和歧视。

为什么应该使用 Pandas 数据框架进行关于图像分类问题的 Keras 培训

原文:https://towardsdatascience.com/why-you-should-be-using-pandas-dataframes-for-keras-trainings-on-image-classification-problems-db220134cbc6?source=collection_archive---------51-----------------------

停止使用 flow_from_directory,改用 flow_from_dataframe。

正如我在之前的文章中看到的,缺乏组织的研究项目可能会很艰巨。周围有如此多的资源,有时会减慢研究的进程。

在这篇文章中,我将关注由图像组成的数据集,尤其是那些用于图像分类问题的数据集。我们将看到在使用 Pandas 数据框架时,在这种数据集上启动 Keras 训练有哪些优势。

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

照片由米卡·鲍梅斯特Unsplash 上拍摄

Keras 提供了一种在处理神经网络时使用大型数据集的方法:无论是在训练阶段还是评估阶段。这是 Keras 预处理模块,它有几个从磁盘加载数据并动态预处理数据的方法。最常见的方法是flow_from_directory(),这是一个非常简单的工作流程,因为你只需要将你的图像文件分成每个类的文件夹。生成器会将每个文件夹作为要训练的类。是的,这非常简单,但它涉及到必须开发耗时的脚本来为每个训练数据集版本将图像从一端复制或移动到另一端。

  • 但是,如果你决定为一个特定的实验做一些修改,比如把一个班分成两个班,那该怎么办呢?— 数据集版本化
  • 如果您想用来自两个或更多数据集的图像组成一个数据集,该怎么办?— 多个数据集的组合
  • 如果因为你的网络模型有两个输出,你想同时训练两个标签怎么办?— 多任务问题

我们将会看到如何使用熊猫图书馆来帮助缓解这些问题。

Keras 有一个生成器函数,使用 Pandas dataframe 从磁盘加载数据:flow_from_dataframe()。此数据帧必须有一列,您可以在其中为每个项目指定图像文件名。有了这个和directory参数,Keras 将按如下方式为每个图像文件构建路径:os.path.join(directory, <filename_column>) 此时,您可以忘记将文件组织在类的文件夹中的想法,取而代之的是,您可以将它们都放在同一个文件夹中。

下面的每一节都试图通过使用这个flow_from_dataframe()方法来回答前面三个问题中的一个。

数据集版本化

我在处理数据集时的工作流程是手动创建一个版本控制系统:每个版本都是我为特定实验所做的任何修改的结果:添加额外的数据、修改标签、修正等等。

这导致具有由数据帧更清楚地表示的不同数据集版本,而不是必须创建单独的文件夹,在该文件夹中用新的类结构复制图像。最重要的是,大文件(图像)仍然在同一个目录中。因此,您可以拥有由相同图像的不同组合组成的多个数据集版本(csv 文件)。

多个数据集的组合

正如我之前提到的,Keras 通过使用directory参数和文件名列组成了要读取的图像的路径。最新的必须有文件名,但它也可以包含子路径。Keras 将执行连接,而不询问是否只有文件名。这对于您在线下载的数据集来说非常强大,这些数据集具有特殊的结构,其中图像位于不同的子目录中。此外,通过这种方式,我们可以轻松地构建一个数据集版本,其中包含来自不同来源的图像,而不必将它们移动到同一个文件夹中。

让我们看一个例子:

假设数据集 1 和数据集 2 具有以下图像路径:

/media/datasets/dataset_1/train/image_1.png
/media/datasets/dataset_1/train/image_2.png/media/datasets/dataset_2/train/0289323/image_1.png
/media/datasets/dataset_2/train/3453453/image_1.png

数据集 1 具有所有图像都在同一目录下的结构: dataset_1/train/* 。但是,数据集 2 不同,它有子文件夹,图像文件名本身是重复的(“image_1.png”),所以我们需要将这个子文件夹添加到文件名列中。这是两个数据帧及其相应的 Keras 方法调用:

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

数据集 1(左)和数据集 2(右)的数据框

要创建一个合并的版本(数据集 3),我们只需要从两条路径变得不同的地方添加路径:“*数据集 _ 1/”*和“数据集 _ 2/”

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

包含不同来源文件的合并数据集示例

对于本例,我们必须将flow_from_dataframe()中的目录参数设置为公共路径,以便 Keras 能够组合适用于两个数据集的路径。

这里我建议创建一个文件夹,例如 dataset_3,用符号链接指向两个数据集:

~/datasets $ mkdir dataset_3
~/datasets $ cd dataset_3
~/datasets/dataset_3 $ ln -s ~/datasets/dataset_1/train dataset_1
~/datasets/dataset_3 $ ln -s ~/datasets/dataset_2/train dataset_2
~/datasets/dataset_3 $ ls -l
dataset_1 -> /home/sruiz/datasets/dataset_1/train
dataset_2 -> /home/sruiz/datasets/dataset_2/train

这只是出于组织的目的,因为两个数据集不同的基本路径将是: /home/datasets/dataset_3 ,而不是更一般的: */home/datasets。*但是,如果数据集位于不同的位置,并且它们不共享任何基本路径,并且您不想移动它们,那么它也会非常有用。

多任务问题

在一个任务中,当训练一个多任务问题时,使用数据框架是不可协商的。这指的是可以为一个输入预测多个输出的网络模型:例如,如果一幅图像有一只猫或一只狗以及它的皮肤颜色。

对于这类问题,我们需要在训练步骤中为每个输入设置两个标签。因此,将文件分离到每个标签的文件夹中的方法,尽管也有可能,涉及到每个标签组合有一个文件夹。这可能会导致创建大量的文件夹。

一个数据框架的好处是,你可以有一个标签猫/狗的列和另一个皮肤颜色的列。将flow_from_dataframe()方法用于双输出网络时,您只需在y_col参数中指定标签在哪些列中:

感谢阅读。

塞尔吉奥·鲁伊斯(@塞尔楚)

[## 用概念组织和记录你的机器学习(或任何)研究项目

由于缺乏组织和文档,研究可能会很困难。

towardsdatascience.com](/organize-and-document-your-machine-learning-or-any-research-project-with-notion-623d52fae972)

作为一名数据科学家,你为什么应该建立自己的个人品牌

原文:https://towardsdatascience.com/why-you-should-build-your-personal-brand-as-a-data-scientist-c686bbc2b8ef?source=collection_archive---------29-----------------------

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

(来源)

当我刚开始从事数据科学时,在数据科学领域找工作时,我和其他人一样。

长话短说,我去了求职门户 , 投了几百份简历应聘各种数据科学家岗位,“希望”最好的

不出所料,大多数时候我都被拒绝了,到了一定程度,我的收件箱就塞满了电子邮件,比如:

感谢您申请 ___ 的数据科学家职位。不幸的是…

感谢您申请 ___ 的数据科学家职位。由于我们收到了大量的申请,我很抱歉地通知你…

我很沮丧,想知道这里出了什么问题。

我完全按照大学时代别人告诉我的去做。

“嘿,阿德蒙德,你需要取得好成绩,获得一些你所在行业的相关实习经验,润色你的简历,去工作门户网站申请工作,你就没事了。”

对不起…我不好。

最重要的是,我正面临着一段艰难的时期,甚至连一个面试的机会都没有。

🚀我人生的转折点

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

(来源)

但当我开始活跃在 LinkedIn 上,通过学习和分享数据科学社区时,出现了一个转折点

我从来没有意识到,作为一名数据科学家,我实际上是在打造自己的个人品牌。

从那以后,也有一些招聘人员/猎头和公司在找我,希望我能成为数据科学家。

更令人惊讶的是,机遇之门向我敞开了——说话写作商务 和工作岗位。

这些机会不仅帮助我发现了自己的潜力,走出了自己的舒适区,还将我的职业生涯,甚至生活带到了一个全新的水平,这是我以前认为不可能的。

现在,如果你问我,有没有一件事我希望在我的职业生涯中早点学会…

这将是建立我的个人品牌

在这篇文章结束时,我希望你能理解为什么作为一名数据科学家建立个人品牌如此重要,并希望能激励你开始采取行动!😄

让我们开始吧。

那么…什么是个人品牌?

如果你只是谷歌一下,个人品牌有很多定义。

但下面是我对个人品牌的理解。

P 个人品牌是关于做你自己——真实的自己,有你的信念、你自己的故事和经验,在你的领域展示专业知识和权威。

个人品牌不是仅仅为了打动招聘经理或雇主而伪造自己的品牌和经历。

你看。每个人都是独特的。每个人都有不同的视角、不同的心态和不同的信仰。

除了你自己,你不需要成为别人。个人品牌是关于你是谁,以及人们如何看待你,即使你不在那里。

建立个人品牌的最好方式就是做你自己。

你的价值观是什么?你的信仰和主张是什么?你为什么要这么做?你的动力是什么?

对我来说,我的使命是 让每个人都能接触到数据科学 以及使用数据赋予人们和企业清晰的洞察力。

这是我的信念,也是激励我的动力。你呢?

为什么苹果和耐克是世界上最成功的公司?

为什么苹果和耐克是世界上最成功的公司?

那是因为他们的 品牌和他们所信仰的 。句号。

🍎苹果公司相信有激情的人可以让世界变得更好。

✔️ 耐克表彰伟大的运动员,他们也表彰伟大的运动员。

苹果和耐克都很少谈论他们的产品,人们仍然在购买它们,因为人们喜欢他们的品牌,相信他们的愿景。

这与建立我们的个人品牌非常相似。当人们想到你时,他们会如何看待你?你的品牌和信念是吸引人们/公司的原因。

我们每个人都有自己的品牌,不管是有意还是无意。这就是为什么我们要有自我意识,在更深的层次上发现自己是很重要的。

为什么你现在应该作为一名数据科学家建立自己的个人品牌?

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

1.更多的工作机会

如果现在还不明显,建立个人品牌是在不久的将来获得工作机会的长期策略。

当你开始建立自己的个人品牌时,招聘人员/公司不会马上找你。

建立和赢得信任、信誉和关系需要时间。

但是一旦你在自己的领域建立了自己的个人品牌……相信我,随着你将自己定位为所在领域的权威(这里指的是数据科学),工作机会会逐渐向你走来。

你猜怎么着?你不再需要向不同的求职网站提交数百份——有时甚至数千份——简历,希望得到他们的回复。

2.与志同道合的人建立关系网

在建立个人品牌的过程中,你可能会利用社交媒体平台(LinkedIn、Medium 等)。)为他人提供内容和增加价值,让它为你说话。

因此,你也将有机会与志同道合的专业人士交流。

这意味着它允许你继续向他人学习,同时能够超越地域限制与他人分享你的激情和知识。

3.更多地了解自己

你看。谈论建立个人品牌很容易。

但是要真正理解你的价值观是什么,你相信什么…那是另一回事。

需要诚实、残酷和彻底的自我分析和自我认识才能在更深的层次上真正发现自己。

你会开始质疑自己所做的一切,并试图理解背后的原因。

这里的好消息是,你也将能够了解和发现更多关于你自己的东西来激励和推动你前进

4.激励和帮助他人

归根结底,建立个人品牌不是你一个人的事。

而是激励和帮助他人。

这是关于你如何用你的热情、专业知识和信念帮助他人。

能够帮助他人是我收到的最好礼物之一,因为帮助数据科学爱好者了解更多该领域的知识以及用数据科学解决方案帮助企业的成就感是无价的。

最后的想法

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

(来源)

感谢您的阅读。

我希望到现在为止,你已经理解了作为一名数据科学家建立个人品牌的重要性,并希望能激励你开始采取行动!😄

如果你认为数据科学是你的长期职业道路,那么在数据科学领域打造你的个人品牌就是你的长期战略,让你的职业生涯更上一层楼。

事实上,我最近创建并推出了一门在线课程— 数据科学家个人品牌工具包 —从头开始,指导你如何作为一名数据科学家建立个人品牌。

这些正是我用来在数据科学领域建立个人品牌的步骤、框架和策略,并最终获得大量工作和其他机会。看看就知道我什么意思了。

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过我的网站LinkedIn 联系我。在那之前,下一篇文章再见!😄

关于作者

Admond Lee 目前是Staq**—**的联合创始人/首席技术官,该平台是东南亚首屈一指的商业银行应用编程接口平台。

想要获得免费的每周数据科学和创业见解吗?

你可以在 LinkedInMediumTwitter脸书上和他联系。

[## 阿德蒙德·李

让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。

www.admondlee.com](https://www.admondlee.com/)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值