Python 机器学习应用教程(二)

原文:Machine Learning Applications Using Python

协议:CC BY-NC-SA 4.0

五、医疗保健中机器学习要避免的陷阱

在这一章中,我将分享我多年来在构建机器学习和非机器学习应用程序中积累的经验和知识。本章的主要目的是让你意识到人们在商业环境中实现机器学习时经常犯的错误。我将强调机器学习团队和实现机器学习的组织需要避免的一些陷阱。你可能在工作环境中遇到过这些,或者有些对你来说是新的;然而,根据我的经验,我给出的这个场景是你会珍惜的,我们会知道如何避免这些问题的专家意见。从这个角度出发,我希望你能阅读我在本章中谈到的所有六个陷阱。我将从我的经历中使用并给出各种例子,而不指名客户,以保持匿名,当团队没有关注这些原则时,它是如何导致项目被延迟或终止的。以我作为一名超过 17 年的程序和项目经理的身份,我不能强调这样一个事实,如果你不遵循这些原则,你的机器学习项目也注定会失败。

满足业务目标

满足业务目标是我从第一章开始已经讨论过的事情。然而,在这里,我不仅要强调为满足业务需求这一唯一目标构建机器学习应用程序的重要性,还要给你一些真实的例子,当机器学习开发团队没有遵循这一原则时,项目以灾难告终。

在我的一个客户的任务中,我被介绍给一个非常有才华的年轻团队,他们正在开发一个人工智能应用程序。该团队由机器学习工程师测试人员、文档专家和其他跨职能专家组成。由于发布应用程序的严格时间表,该团队在压力下工作。团队使用 scrum 敏捷方法进行开发,为了获得他们项目的状态,我开始参加他们的日常会议。我知道团队正在开发中,产品负责人已经对正在开发的应用程序发出了几次警告。有几名经验丰富的工程师在这个团队工作,并且由一名经验丰富的经理监督。接下来的一周,团队和产品负责人开了一次会,我深入了解了产品负责人对正在开发的应用程序的看法。

在产品演示中,产品负责人同意在团队的各种冲刺阶段向他展示的应用程序的部分内容;然而,当团队集成应用程序时,产品负责人给出的反馈是这个应用程序不符合业务目标。任何开发过 1.0 应用程序的人都经历过这种情况。突然,当应用程序以部分形式展示给产品负责人时,产品负责人同意这些部分是好的,并且符合业务目标;然而,当应用程序被集成时,它不符合业务目标。

这种情况通常会发生,在这种情况下,应用程序的业务目标之一是自动化手动流程,并应用机器学习算法来加快医疗保健领域的速度;然而,当应用程序集成到 GUI、设置和配置模块、机器学习引擎和 web 报告模块的地方时,应用程序需要花费更多的时间来创建自动化流程,这违背了构建应用程序的原始业务目标。每个模型,比如设置和配置、引擎、web 报告和 GUI,都是由不同的团队在称为 sprints 的迭代周期中开发的。他们没有想到通过使用搜索算法和技术来构建一个高效快速的应用程序,这将减少人类完成该应用程序自动执行的相同任务所需的时间。当您开发要满足特定业务目标的应用程序时,任何人都不应该在开发应用程序时忽略这些业务目标。否则,它将导致失败,并且由于忽略了业务目标而导致项目终止。

这是我给所有读者的建议:关注业务目标,并询问每个团队他们正在构建的模块是否满足业务目标。应用程序会比执行工作的人更好吗?这个应用程序会比执行这项工作的人更快吗?如果你作为一个团队认为这个应用程序将会比手工任务更好,那么这个自动化将会提供多少时间或者减少多少流程?

这些是从团队成员到产品所有者到经理的每个人每天都需要问的关于应用程序满足其业务目标的一些问题。团队大部分时间都在努力解决技术问题,例如使用哪种算法、哪种语言用于 Goa、哪种技术用于 web 报告应用程序,以及如何使每个模块相互通信,而不是着眼于主要的业务目标——在这种情况下,提供快速高效的人工替代。如果团队忽略了业务目标,应用程序的部分将会成功;然而,当它们被总结时,它们将被定义为一个失败,项目可能因此被废弃。在所有的会议中,无论是业务会议、团队会议、产品负责人会议,还是任何其他类型的评审会议,讨论的主题都必须是我们现在构建的应用程序是否能够满足主要的业务目标。如果应用程序将满足业务目标,那么满足的百分比是多少,这应该基于团队进行的一些实际测试来衡量。只有当我们将这种严谨性放在业务目标的首位时,我们才能希望应用程序能够满足其业务目标。

这不是比赛,是应用商业!

每个应用机器学习工程师需要具备的另一个重要心态是,他们正在为业务开发,这不再是一场黑客马拉松或竞赛。我这样说是基于我与许多机器学习团队交谈以及在 LinkedIn 等社交平台上与机器学习工程师互动的经验,我看到人们普遍认为机器学习就是了解统计数据、常见的机器学习算法以及 Python 或 r 等编程语言。但是,当同一位机器学习工程师在黑客马拉松或竞赛中获胜后,他们进入了商业世界,他们无法满足机器学习应用程序的商业目标。我现在将强调应用机器学习和竞赛中使用的机器学习之间的差异;这将帮助你理解应用机器学习与流行机器学习的不同之处。表 5-1 显示了这种差异。

表 5-1

应用机器学习和流行机器学习的区别

|

因素

|

应用机器学习

|

流行的机器学习

|
| — | — | — |
| 目标 | 解决商业问题 | 在比赛中获得最高名次 |
| 代码所有权 | 由组织专有并可申请专利 | 公共不可专利 |
| 焦点 | 申请商业成功 | 黑进分数 |
| 实现的手段 | 端到端工作应用 | 符合竞争标准的代码 |
| 技术成就 | 应用程序满足业务需求 | 代码符合顶级标准 |

在表格中,你可以看到有五种类型的参数,我根据这些参数区分了应用机器学习和流行机器学习。首先是客观。在应用机器学习的情况下,目标是解决业务问题。业务问题可能与自动化人工工作或创建一个创新应用程序有关,该应用程序将使用人工智能和机器学习为业务的最终客户执行新任务。目标显然是解决企业面临的问题,并应用机器学习来解决它们。在竞赛中使用的流行机器学习的情况下,目标是在竞赛中获得最高等级。有人可能会争辩说,如果不满足或解决竞争中给出的业务问题,你就无法在竞争中获得最高排名。因为比赛中至少有数百名参与者能够以他们自己的方式解决比赛中给出的业务问题,所以他们可能不会被选为获胜者,因为他们没有排名最高。在黑客马拉松或竞赛中,从来没有应用标准来查看哪个参与者的解决方案能够最佳地解决业务问题;但是,这是为了看给出的解决方案是否能够满足一定的精度水平。达到或超过准确度水平可能并不意味着该解决方案最佳地解决了所识别的业务问题。你可能有一个非常准确的机器学习算法,但它可能无法解决业务问题,因为它没有考虑到业务试图解决的问题。在这种情况下,流行的机器学习方法将产生灾难性的机器学习解决方案。

下一个参数是代码所有权。在应用机器学习的情况下,通常 code credit Python 机器学习团队归该组织所有,并可申请专利,归该组织所有。与此相反,随着竞赛中流行的机器学习,代码不可申请专利,因为它可以被公众访问。该解决方案没有版权,因为任何参与竞赛或黑客马拉松的人都可以看到它。这对于在 kaggle.com 这样的网站上举办的比赛来说是真实的。

下一个参数是焦点。在这里,应用机器学习侧重于商业成功和创建一个不仅满足而且超过商业目标的解决方案。通过机器学习应用程序,就像我们在实验室协调员的案例研究中看到的那样,kiosk 中的聊天机器人能够用某些有限的功能取代实验室协调员,并能够使业务取得成功。在流行的机器学习的情况下,重点是在代码中使用黑客来获得更高的准确性或竞争对手瞄准的任何基准。这种关注的一个例子是,有一些算法,如梯度提升或 Ada,已经受到竞赛参与者的欢迎,因为它们能够提供更高的精度水平。准确性水平并不意味着保证您的解决方案能够解决业务问题。尽管您可能有一个高精度的机器学习解决方案,但它可能不符合业务目标,这有多种原因。其中一些可能与解决方案的效率有关。也可能是我们试图在我们的机器学习算法中进行偏差和方差的权衡。

下一个参数是实现应用程序或业务目标的方法。在应用机器学习的情况下,方法是创建一个端到端的工作应用程序,模拟解决其业务需求。然而,在流行的机器学习的情况下,目的是编写符合竞争标准的代码。

下一个参数是技术成就。在应用机器学习的情况下,只有当应用程序满足业务需求时,它才会成功。在流行的机器学习中,代码只有在满足或者是顶级标准时才成功。在我看来,这是一个机器学习工程师必须抛弃和重新学习这些参数的方式的重大差异,以及方法上的差异,并改变他们成为应用机器学习工程师的心态。

不要陷入规划和设计的缺陷中

规划的目的是为应用程序开发提供一个结构,并识别可能会破坏项目的风险。一些常见的规划缺陷是:

  • 未能识别机器学习应用的关键业务目标。

  • 无法识别应用程序所需的所有模块。

  • 无法确定应用程序性能的基准。

  • 一些设计缺陷是:

  • 为机器学习应用程序创建反馈架构失败。

  • 由于技术原因,未能识别集成挑战。

  • 失败的原型。

在我的计划缺陷列表中,最大的缺陷是未能确定组织正在开发的机器学习应用程序的关键业务目标。举个例子,一个特定的客户要求一个机器学习应用程序来代替医疗机构的前台。这个特定的商业目标本身对于理解如何将它转换成交互式机器学习应用没有多大用处。不同的主题可以有不同的解释。例如,一个团队可能会说,因为我们需要更换整个前台系统,所以我们需要制造一个机器人。其他一些团队可能会说,我们需要构建一个信息亭计算机,为到达的客户提供与医院交互的选项。另一个团队可以将其解释为构建一个可以帮助前台人员的应用程序。因此,它不仅有助于定义业务目标,而且有助于确定流程的哪一部分需要替换或模仿。如果这样做不正确,那么不同的团队和不同的人将会提出他们自己的想法来解决所确定的业务问题,因此,确定那些对于机器学习应用来说重要的关键业务目标是非常重要的。

下一个失败是在应用程序规划期间确定应用程序所需的所有模型。我看到各种各样的主题发现,例如,为了让应用程序正常工作,他们需要一个他们以前没有考虑过的配置模块。在开发活动的中期发现这样的模型是一件昂贵的事情。因此,谨慎的做法是,团队进行有效的规划,并确定机器学习应用程序成功运行所需的所有模型。在我们的例子中,如果配置模块将在开发周期的中间被开发,那么它需要重新计划和重新安排,然后重新处理机器学习应用的成本。如果结果是模块很小,并且不需要很多天的工作,那么就没有必要回去找企业所有者来确定重新计划是否得到他们的批准。然而,如果这是一个主要的开发活动,需要几周的开发和测试活动,并且会影响软件的集成,那么这就是一个错过计划或糟糕计划的例子。重要的是,开发机器学习应用程序的团队在开始设计和编码之前,要做大量的计划工作,确定该应用程序所需的各种模型。

对于规划中的下一个失败,我提出了一个导致机器学习应用程序失败的非常常见的问题——一旦应用程序进入生产,就要确定性能基准。我说这很常见的原因是因为许多与机器学习相关的算法都是计算机密集型的,如果机器学习应用程序使用像深度学习神经网络这样的东西,那么性能基准在这样的应用程序构建过程中是极其重要的。根据我的经验,我可以告诉你,当一个机器学习应用程序为一个著名的客户构建并投入生产时,该算法运行了 12 个多小时,以便计算一个关于客户是否会从网站购买产品的预测值。当团队开始规划时,他们从未想过要加入任何应用程序性能基准,因为所有的机器学习工程师都来自热门的机器学习领域,他们没有将机器学习应用于业务的经验。因此,尽管该应用程序在使用深度学习模型后具有很高的准确性,但它未能满足预测客户是否会购买产品以及谁在实时状态下访问过网站的值的业务目标。在机器学习应用程序的应用程序开发生命周期中,当应用程序被集成并一起工作时,这些性能基准必须以测试用例的形式出现。这将确保机器学习应用能够按照业务目标的预期来执行。

现在我们来看看设计缺陷,第一个是为机器学习应用程序创建反馈架构的失败。这是另一个非常常见的问题,其中机器学习架构师未能在软件的设计中创建反馈循环,并且机器学习应用程序没有从实时生产系统中获取反馈,并且随后被业务抛弃,因为给出了不准确的结果。让我澄清一下我所说的机器学习应用的反馈架构是什么意思。任何机器学习团队都可以规划、设计和开发预测流程的某些业务参数的机器学习应用程序。在现实世界中,很难找到一个不具有 100%准确度的应用程序。每个算法都有一定的准确度,这意味着算法会做出一些错误的预测,分类为类型 1 和类型 2 错误。如果机器学习应用不从预测错误值中学习,那么它被认为在反馈架构中有设计缺陷。反馈架构要求机器学习应用程序从它所犯的错误中学习,并在下一次提高自己的性能。这被称为真正的学习,并模仿人类每天进行的学习过程。

在下一个设计流程失败中,我谈到了识别技术带来的集成挑战。在机器学习应用程序中,你可以创建聊天机器人——例如,我在第四章中为我们模拟实验室协调员的案例研究创建的聊天机器人。我用 Python 创建了 GUI 然而,在现实世界中,当你实现这样一个应用程序时,你很难用 Python 来构建人工智能。为了创建前端应用程序,您可以使用一种机器友好的语言,如 C#或 Java。这种应用程序的下一个集成挑战是聊天机器人的智能在 Python 中运行,但目标出现在 dotnet 中,这两者如何集成在一起?这可以通过使用各种插件技术来实现,这些插件技术将 C#集成到 Python 中,或者将 Python 集成到 C#中,然后让它们通过这些插件库相互通信。这只是设计机器学习应用程序时可能面临的技术集成挑战的一个例子。另一个例子是,如果聊天机器人需要通过网站与人交互,那么他们需要一种方法从 web 前端 GUI 连接到 Python 代码。这可以通过像 flask 这样的服务和技术来实现,它们允许集成过程。

我谈到的下一个失败是原型的失败。在这次失败中,团队构建了一个概念证明,并向业务所有者展示了一个原型;然而,当我们试图在现实世界中实现原型时,我们面临着多重问题。这些问题通常与所用技术的扩展有关,例如 10 个用户的原型。然而,当我们将它扩展到成千上万的用户时,它就挂了。在这种情况下,虽然我们有一个原型,但在扩大规模时失败了。在某些情况下,我们也可以有一个使用某种技术的原型,但是当该技术被用来创建某个在原型开发时没有构建的功能时,它就失败了,我们意识到这种技术不适合我们试图构建的原型应用程序。因此,原型失败也是机器学习应用程序可能面临的设计失败之一,这也可能导致机器学习应用程序项目的终止。

为您的预测模型选择最佳算法

这是机器学习应用失败的另一大原因。我推荐使用 scikit-learn 备忘单进行算法选择。这是为您的机器学习算法 [1 ]选择最佳算法的复杂过程中导航的最佳方式。

让我用本书第四章中的案例研究为参考,给你演示一个例子。我来到橙色的开始按钮,它问的下一个问题是,“你有大于 50 的样本吗?”在我们的案例中,如果你还记得的话,我们有 125 家医院的样本,多于 50 家。所以在我们的案例中,没有必要获取更多的数据。我们转到下一个圈,它问:“你是在预测一个类别吗?”在我们的例子中,我们预测食物浪费是以千克为单位的,这是数量而不是类别,所以我们说不,我们转而预测数量。然后它要求用是或否来预测一个量。我们说是。它会问:“是不是少于 10 万个样本?”我们说是的,因为我们只有 125 个样本。下一个问题是,“应该重要的功能是不是很少?”我们说不,因为大多数数字特征在我们的例子中是重要的。我们选择 SVR 核线性回归,我们看到它不起作用,因此箭头的下一部分将我们带到集成回归器,我们选择线性回归回归器来解决我们确定的问题。所以在这本书里,你已经看到了我是如何使用小抄来得到最好的机器学习算法的。

你在用敏捷机器学习吗?

目前,基于敏捷 scrum 的软件开发方法非常流行,并且正在全世界的组织中使用。敏捷方法已经证明了它加速软件开发和授权团队自己做决策的能力。我谈论敏捷机器学习是因为有各种各样的机器学习应用程序不是由软件组织开发的,而是由商业组织开发的,比如零售店、医院或金融公司。在这种情况下,当他们开发内部应用程序时,为了取得成功,他们也应该使用最现代的软件开发方法。敏捷为机器学习应用程序开发团队提供了能力和灵活性,如果应用程序不能满足业务需求,他们可以中途改变路线。机器学习是一种试错的努力,不能说一定会有特定问题的解决方案。试错法可以基于算法的选择、数据集的选择或技术的选择。如果团队以瀑布方式工作,那么他们就失去了敏捷的好处,敏捷允许团队在中途修正其路线。敏捷为你提供了将产品所有者整合到开发周期中的框架,并接受早期的反馈,这样在应用程序开发的最后就不会出现意外。敏捷也给团队带来了民主,因为团队成员在执行工作时做出重大决策,而且他们自愿承担必要的工作,以便按时完成应用程序。使用机器学习应用程序的敏捷 scrum 类型的开发也带来了透明性,允许每个人看到机器学习工程师和其他跨职能团队成员在项目中做什么。由于机器学习的试错法,一些开发周期可能会以失败告终,因此最好让利益相关者立即知道某个方法不起作用,而不是让他们一直等到周期结束,就像瀑布模型中发生的那样。考虑到所有这些好处,我强烈建议,无论何时你组建一个机器学习应用团队,你都应该开始使用敏捷形式的开发。

确定项目中的技术风险

开发机器学习应用程序的最大风险是,这是一个基于试错的过程。有时,这些算法在某些类型的数据集上有效,有时在其他类型的数据集上表现不佳。尽管有一个备忘单(我们在前面讨论过),但是在最佳算法选择中没有唯一的答案。尽管商业世界存在这种限制,但机器学习顾问面临着为客户提供最佳解决方案的压力。即使找到了正确的算法,超参数优化也需要很长时间来确定算法的正确参数。人工神经网络和 RNN 等深度学习算法需要非常高的计算能力和处理时间,以达到最佳参数集。

还有其他技术风险,例如通过使用 GPU 需要高计算能力,深度学习应用程序的 RAM 如果没有针对生产环境进行适当的规划,可能会导致整个项目脱轨。我收到了许多来自工业客户的 sow,他们希望在 4 GB RAM、1,1 GHZ CPU 和普通 GPU 上实现工业视觉应用,我必须告诉他们基于神经网络的系统的最低计算要求。

我发现大多数客户的另一个风险是,他们从市场上雇佣了一个机器学习工程师团队;然而,他们中没有一个人有能力开发一个生产就绪的机器学习应用程序,因为他们从来没有这样做过。这种技术资源对本组织来说是一种负担,而不是资产。然后,他们必须聘请像我这样的顾问来指导他们建立端到端的机器学习算法。具有实现机器学习应用知识的经验丰富的机器学习工程师很难找到。

与从不懂应用机器学习的黑客马拉松中获得机器学习工程师的风险相对应的是,他们可能知道开发应用程序的公司不使用的编程语言。我的一个客户雇佣了懂 Java 和 R,不懂 Python 的机器学习工程师。应用程序是用 Python 开发的,他们在学习和实现代码时都有困难。他们设法编写了代码,但是当涉及到测试和消除缺陷时,他们很努力,因为由于他们对 Python 编程语言缺乏经验,他们编写了一个固有的性能滞后的应用程序。最后,为了加快这个过程,他们不得不雇佣一个像我一样的顾问来帮助他们。当招聘经理面临组建机器学习工程师团队的压力,每个人都急于开始项目时,就会发生这种情况。如果没有为项目仔细挑选人员,技能肯定是一个很大的风险,并可能导致延误。机器学习不仅仅需要编程技能;它需要一个深入了解数学和统计学,并且知道算法如何工作的人。它还需要 SQL 数据库的知识,比如 MongoDB 或 Cassandra,以及基于 web 服务器的集成引擎,比如 Flask。机器学习也需要优秀的分析能力;机器学习工程师分析算法结果的能力也非常重要。机器学习工程师的另一项经常被忽视的技能是理解和迎合业务目标的能力。这种能力是在应用应用机器学习的过程中获得的,我在本书中已经概述了这一点。通过使用我概述的一些技术,您可以为您的客户开发快速且健壮的应用程序。

另一个非常重要的陷阱是在没有数据的情况下创建机器学习应用程序。如你所见,在第四章的案例研究中,我只有 125 家医院的数据。不建议为如此小的数据量创建应用程序,因为这是对技术的一种不充分利用。机器学习算法和底层技术能够使用数 Pb 的数据。我遇到过几个确实想构建机器学习应用程序的客户,但是当我问一个简单的问题时,“你的数据在哪里?”他们无法为他们希望我构建的机器学习应用程序找到任何明确的数据来源。他们给我看的是不能超过 1 千兆字节的数据。如果你最终使用机器学习应用程序来处理如此小的数据量,那么你可能不会通过投资应用机器学习来获得所需的回报。因此,即使在你开始构思一个机器学习应用程序之前,你也必须在你的组织内部问一问,你是否有数据来为这项任务构建一个机器学习应用程序。例如,如果你想创造一个机器人来取代医生,那么你是否有所有症状、疾病、病因和药物的数据,以及以某种机器可以阅读的文本格式编译的成分?这是你需要的一个非常小的例子;然而,机器学习应用需要的数据比我所谈论的要多得多。

在我看来,任何机器学习团队最重要的能力是将技术机器学习术语翻译成商业语言的能力。这种最单一的能力区分了流行的机器学习工程师和应用的机器学习工程师。告诉业务主管 SVM 算法最适合预测客户流失对他们来说没有任何意义,除非你告诉他们我开发了这种算法,可以预测客户何时会离开该业务。很多时候,去掉行话可以让商界人士更容易理解机器学习。我经常让机器学习工程师思考,如果他们必须向一个外行人解释他们在机器学习中最喜欢的算法,他们会如何用三句话来解释?这里的关键是不仅要减少行话,还要保持简洁。在商业世界中,在正确的时间用正确的时态用正确的词语表达正确的事情是极其重要的。只有这样,我们才能希望企业能够理解机器学习应用程序给组织带来的价值(或者没有)。

在任何机器学习应用中要避免的另一个极其重要的陷阱是数据隐私。我们在脸书和其他组织最近的数据泄露事件中看到,公共数据及其处理、传输、存储和保护方式对于企业的长期持续发展非常重要。任何机器学习应用程序都需要数 Pb 的数据,忽略应用程序的数据隐私方面将意味着我们将组织置于风险之中。不仅在应用程序的设计阶段,而且在实现阶段都需要进行仔细的规划。数据的安全性、数据传输的时间以及数据存储的位置都需要仔细考虑。如果使用平面文件来存储数据,那么它们是否足够安全?谁将访问它们?它们是否存储在安全的服务器上?这些数据将与谁共享?我们如何确保从长远来看,数据仍然是安全的,甚至没有人从组织内部窃取数据?未能保护机器学习应用程序的数据隐私可能会导致法律诉讼,并给组织带来极其糟糕的结果。如果组织有数据隐私政策,那么我们需要检查并询问这个机器学习应用程序是否符合组织的数据隐私政策。机器学习应用程序的用户故事需要包括数据泄露测试案例,以便崩溃并证明机器学习应用程序能够安全地传输数据并存储数据,而没有任何类型的黑客或不应访问数据的团体能够访问数据。

尾注

  1. Buitinck 等人,2013 年。机器学习软件的 API 设计:来自 scikit-learn 项目的经验, http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

六、医疗保健机器学习货币化

这一章是关于医疗保健中的想法,其中使用机器学习技术将有助于组织将这些想法货币化。我只向大家介绍三个想法,根据我在医疗保健领域的研究,并在咨询了医疗保健领域的专家后,我得出的结论是,这三个想法不仅需要更多的关注,而且将成为医疗保健行业未来的焦点。我在这一章中告诉你的一些事情可能听起来很牵强,离现实很远,但你会意识到,随着进步,这些想法肯定会成形,并将在医疗保健行业得到实现。当然,这些想法对任何创业公司来说都是不错的选择。这并不是说没有创业公司在研究这些想法,但就机器学习而言,我正在向你展示如何将这些想法货币化的新观点。第一个想法是关于通信应用程序。第二个想法是连接患者数据网络。第三个想法是关于医疗保健中的物联网。当我告诉你这些想法的时候,我也会告诉你这些想法目前所处的状态中存在的一些陷阱和危险。

医院通信应用简介

为了向您介绍医院内部通信应用的概念,我首先想带您了解一个医院内部的个人经历,它认可并讲述了医院内部通信的必要性。

1998 年,我母亲生病住院。然而,根据扫描报告,没有一个医生能够诊断出任何形式的癌症。当她的胃被打开时,医生惊讶地发现她的肠道中有一个肿瘤球,并紧急决定将其移除。虽然我在这里谈论的不是医生犯下的诊断错误,但我要谈论的是发生的沟通错误,这种错误可能会在我母亲去世之前杀死她。手术后,她定期接受注射,由于她患有贫血,她还接受了输血。工作人员中有护士 24 小时轮班,每个护士都应该告知医生正在监控的任何药物变化或生命体征变化。在我母亲的案例中,一名工作人员未能就通过静脉注射给药的药物变化进行沟通。这是一个值夜班的护士(当人们最不警觉的时候),但由于医生已经谈到了药物的变化并轮换了处方,我知道了药物的名称,并检查了护士在静脉注射的盐水中注射了什么。我发现她又要使用导致我母亲发炎的旧药物,而上一个护士没有向新护士传达药物的变化。这是医院内部日复一日发生的沟通错误的一个例子。如果照顾病人的人不警觉,那么这种错误就不会被注意到,病人就会受苦。

我现在请你们注意印度报纸《印度时报》上的一篇文章。这篇文章的标题是,“医疗疏忽——70%的死亡是沟通失误的结果。”这篇文章发表在 2016 年的报纸上。这篇文章强调了这样一个事实,即在美国,有 44,000 到 98,000 人因这类错误而死亡。在印度,由于人口众多,这更令人担忧——500 万人死于这种人为错误[1; https://timesofindia.indiatimes.com/life-style/health-fitness/health-news/Medical-negligence-70-of-deaths-are-a-result-of-miscommunication/articleshow/51235466.cms

当我们谈到沟通不畅时,有些领域比其他领域更容易出现这种沟通不畅。最大的风险是当病人在医疗提供者之间转移或移交时。我举了一个沟通不畅的个人例子,护士没有就我母亲的药物治疗变化进行沟通,因为分享需要传递的关于患者药物治疗的信息非常重要,而且必须在医生、护士和药剂师之间传递。在创建医院内部交流应用程序的想法中,该应用程序应该有一个良好的 GUI,可供医院工作人员在任何 android 或 iPhone 上下载。目标应该具有某些普通应用程序所不具备的特征。例如:

  1. 图形用户界面应该有大字体和大控件,比如按钮、文本框和标签。保持 GUI 元素较大的原因是医疗保健专业人员,无论是护士、医生还是药剂师,都面临着同时照顾多个患者的压力。即使这样,医疗急救也可能随时到来。因此,如果图形用户界面元素被绘制在电话屏幕上,并且不够大而无法阅读,则可能导致错误的数据选择和输入。

  2. 图形用户界面需要对护士、医生或药剂师的数据输入要求非常低。这里的想法是,以文本框形式输入数据越开放,就越容易出现人为错误。几乎所有输入数据的选项都必须是下拉框选项等形式的自由字段。这将确保开放式数据输入不会发生,并且会减少错误。

  3. 该应用程序应该是护士、医生、药剂师和任何其他在医院工作的医疗保健专业人员的常用程序。这很重要,因为我们希望任何医院的员工之间都有单一的沟通来源。我会给你一个例子,说明这个应用程序如何减少员工之间的沟通差距。该应用程序将有护士换班时的详细信息。护士移交给下一个护士的输入屏幕将要求她选择从医院患者数据库中预先填充的所有患者 id。对于每个选定的患者 ID,将会有当前正在服用的药物的详细信息以及监视患者所需的时间间隔。由于这是一个医生常用的应用程序,当护士选择一个处于手术或常规轮班期间被移交的风险区的患者 ID 时,该应用程序将开始闪烁,并提醒护士医生已开出新的药物,以及需要移交给下一个轮班人员的信息。事实上,医生更改的新药物将通过应用程序提供,因为医生会有一个患者 ID 选择屏幕,并从应用程序的下拉菜单中选择更改的药物。该警报系统将应用 SMS 通信,并将其发送给与特定患者 ID 轮班的所有护士。实际上,这可能看起来像过度沟通,但请记住,我们正在处理人类的生命,任何沟通都是极其重要的,不能被视为过度沟通。药物变化的警报传到医生自己、与照顾病人有关的护士以及给药的药剂师那里。你可能会说,即使在收到有关患者药物变化的警报后,护士、药剂师或任何其他医护人员也可能会忽略这种沟通,从而导致错误发生。然而,当护士在应用程序中打开她的轮班时间表时,应用程序会显示关于药物变化、患者话语变化、饮食要求变化或任何其他类型变化的警报。当警报出现在医护人员的个人屏幕上时,很难忽略它。我不是说这会百分之百地消除误解;但是在医院内部引入这样的 app,肯定会减少沟通上的失误。app 应该具备的某些特性。在一次紧张的手术或病人护理后,没有人想做的一件事是电子病人健康记录的数据输入。我不打算研究电子病人健康记录的法律方面;然而,我将从医疗保健专业人员的角度探讨维护电子健康记录的便利性。他们将成为该应用程序的用户,因此在该应用程序最终确定之前,需要咨询他们如何让他们在手机屏幕上进行选择时更加舒适。为了制作一个不需要医疗保健专业人员输入开放文本(如文本框)的应用程序,需要对医疗保健专业人员经历的医院流程的每个方面进行研究,以便不会遗漏任何需要医疗保健专业人员以开放文本格式输入数据的内容。这需要对任何医院的流程进行广泛的研究,然后将其转换为合适的 GUI 选项。如果该应用程序要求医疗保健专业人员输入大量数据或从多个屏幕中选择大量选项,它将会失败。选项应该尽可能少,屏幕也应该尽可能小,这样忙碌的医疗专业人员就不会被应用程序中的数据输入网络所困扰。

我会给你一个例子,为了建立这个应用程序,必须进行广泛的研究。在第四章中,我试图在案例研究 1 中模拟一名实验室协调员所做的工作。我们很难调用 Python 应用程序来代替实验室协调员;然而,该应用程序确实为我们需要采取的机器学习应用程序构建的狭隘方法提供了一个结构。要了解实验室协调员的所有工作,需要仔细研究并记录实验室协调员一天中执行的所有任务或活动。一旦知道了这些任务,我们就需要知道在这些任务之间发生了什么样的工作流。接下来我们需要看到的是每一项任务都涉及到什么样的参与者。对于参与者,我指的是与实验室协调员交互的人,比如实验室技术人员、医生、护士或病人。接下来,需要理解的最重要的部分是,对于这些任务和工作流中的每一个,需要什么样的数据以及它们之间流动的数据。构建该应用程序的团队需要仔细地将数据分为结构化、半结构化和非结构化数据。举个例子,实验室协调员可能会在实验报告上做一些手写笔记,这将构成非结构化数据。结构化数据存储在专有的传统数据库中,如 Oracle DB、SQL server 等。半结构化数据存储在平面文件或 XML 文件以及 csv 或 JSON 等文件中。如果实验室协调员使用这些形式的数据,需要记录下来,然后决定如何处理非结构化数据。在我看来,任何非结构化数据,如手写笔记,都是对医疗界的严重威胁。原因是手写可能会被误解,并可能导致混乱。开放文本很容易被误解。因此,该应用程序应该旨在要求医疗保健专业人员将所有这些开放式文本转换为结构化数据。这似乎很难,但有可能查看实验室协调员在一段时间内完成的所有事情,然后得出手写内容中的常见内容。这确实需要大量的工作,这就是为什么我在开始时提到,需要对这样一个应用程序进行大量的研究,以消除医院系统的误解。

连接的患者数据网络

我们来看下一个关于盈利的想法,即连接患者数据网络。当我们谈论任何与数据有关的事情时,我们必须谈论数据隐私。医疗保健行业的数据隐私比任何其他行业都更重要,因为它涉及每个人的个人数据。这些数据,如果被引向错误的来源,会导致灾难性的情况。在当前的医疗保健系统中,有多个级别的多个医院,并且有独立的医生和医疗保健顾问,他们无法看到患者健康记录的统一视图。没有维护患者病历的统一系统。举个例子,当一个新病人到达世界各地的任何一家医院时,医生会在检查一些生命体征(如心率、血压、氧含量)以及需要对病人进行的 17 项常见实验室检查后,开始开药和治疗。如果病人从一家医院转到另一家医院,新医院的医生会重复同样的过程。从患者的角度来看,这对他们来说是一笔巨大的成本,如果我们有一个集中连接的患者数据网络,这是可以避免的。

假设你在医院 a 接受了某种疾病的治疗,但是你对他们给你的治疗不满意,你想换一家医院。除了物流,最大的障碍是数据。医院已经为你收集的数据没有传达给 B 医院,这就是问题所在。如果我们有一个连接的患者数据网络,那么一旦患者授权医院 B 访问其数据,医院 A 收集的关于特定患者的数据将可供医院 B 使用。

医院和他们的数据系统目前在各自为政,他们没有维护任何可以在系统之外访问的患者的中央记录。创建这种互联患者数据网络的最大障碍是数据安全和数据隐私。如果有一种安全的方式来存储这种集中的信息,或者可以使用区块链技术来分散存储,而不需要集中存储信息,那么我们就可以大大降低患者的医疗成本。连接的患者数据网络面临的另一个问题是证明患者的身份。这个障碍可以通过引入生物认证来克服。然而,我们需要说,世界上没有一个生物认证系统是百分之百成功的。我认为互联患者数据网络的最后一个障碍是,如果我们有某种存储如此大量数据的组织,它最终可能会转向数据恐怖主义,就像我们最近在美国大型企业中看到的那样。在患者不知情的情况下进行非法数据挖掘对这种网络来说是一个更大的威胁。数据挖掘的优势可能在于,它可以根据提供给患者的药物来挖掘患者疾病中的发现。因此,当我们构建这样一个应用程序时,我们需要权衡构建这样一个应用程序的利弊。

关联患者医疗记录的另一个问题是,维护这样一个记录系统的成本需要有人来承担。医院或患者需要承担维护系统数据的成本。这两种模式都可能行得通。可以向患者收取 X 金额的订阅费,用于在电子记录系统上存储数据(这可以是月费或年费)。另一方面,可以要求患者付费以在特定时间段内访问特定患者的记录。当然,如果你要求医院付款,它最终会被计入医院向病人收取的账单中。因此,这将是间接向病人收取维护电子健康记录的费用。第三种模式是病人和医院都付钱。患者为电子健康记录的维护时间付费,医院为其访问特定患者健康记录的时间付费。第一种模式是病人付费,第三种模式是病人和医院都付费,这两种模式在经济不景气的情况下很难维持。富裕的病人将能够支付维护他们的电子健康记录的费用。在更贫穷的经济体中,将来必须有一个公共系统来维护这样的电子健康记录。世界上的每个公民都需要这样做。

医疗保健中的物联网

物联网,即物联网,是物理设备、车辆、家用电器和其他嵌入了电子设备、软件、传感器、致动器和连接的物品的网络,使这些物体能够连接和交换数据[1; https://en.wikipedia.org/wiki/Internet_of_things

简单外行来说,IoT 就是嵌有常见东西的小设备,比如画。以给予他们连接和交换数据的能力。你可能会说,“从一幅画这样简单的东西上收集数据有什么用呢?”但是,想想这个:一幅画可以收集很多数据,比如参观者的脸,参观者的侧面,他们看到这幅画时的表情,观众与这幅画的距离,平均参观这幅画的次数,没有停下来或者看这幅画的人数等等。这只是一个例子,说明如何利用物联网平台实现简单的壁画,可以获得更多关于人们反应的数据。

在医疗保健领域,尤其是物联网正在大规模发展。主要原因是,医疗保健行业总是面临拯救生命和治愈可怕疾病的压力。从这个行业的本质来看,医院和医疗保健专业人员的态度是为了患者的福祉而尽早采用技术。物联网正在进入医疗保健领域的许多领域,其中一些是嵌入患者皮肤的活动跟踪器,以跟踪癌症治疗。在我看来,物联网最突出的用途将是在传感器领域帮助医生治疗病人。我们已经看到,沟通是当前医疗保健行业的一个大问题。基于感官向医生、护士和药剂师发送信息的物联网设备将被证明是他们的福音。因此,在这一部分,我将集中讨论使用物联网传感器实现货币化的应用。

为了将物联网技术用于远程健康监测,我们可以构建一个针对特定疾病的远程健康监测器。科德角 v 带在患者家中使用传感器,可以收集患者的心率、氧气水平和血糖水平的数据。该套件不仅有嵌入式传感器,病人可以将其绑在胸前,还会有额外的发射器,可以连接到互联网,并将病人的信息实时传递给医生。开发这种试剂盒的关键是,它需要患者定期订阅,以便进行监测,并定期将数据传输到医院。中央监控系统通过互联网连接来自传感器的数据,如果医生发现患者的生命体征出现异常,就会向医生发出警报。重要的是,药物也通过这些传感器进行监控。我们可以开发出能够识别血液中某种化学物质存在的传感器,这种化学物质可以指示病人已经服用了某种药物。这种类型的远程健康监测不仅可以在患者家中使用,还可以在医院内的病床上使用,以便对患者进行监测。让基于物联网的传感器监控患者的健康状况对患者和医院都有一些关键优势。被监视的病人可以确信不会有任何人为错误,并且只要病人的生命体征有变化,机器就会发出警报。从医院方面来说,这将使他们的员工从他们所做的监控活动中解脱出来,他们可以将监控人员部署到医院中其他重要且需要关注的工作中。我可以清楚地看到未来的医院,为更紧急的问题提供紧急病床,对于非危急的疾病,患者将在家中接受监测。当这种类型的医疗保健环境发展时,我们肯定会有专门的医疗保健机构。当然,这些类型的系统将更少人接触,更多机器存在。为了构建远程监控物联网设备,您还需要一个中央电子患者数据库系统,这一点我已经在本章中讨论过了。我们正在讨论为未来开发这种病人健康监控远程系统;因此,我们还应该考虑让机器人取代医生,这些机器人连接到这些远程健康监控系统,并在产生关键监控警报时向所需人员(如急救人员)发出警报。因此,在这种情况下,我们会让员工处理紧急情况,而不是让员工做普通的病人健康监测工作。有人担心机器人会接管医疗保健行业的所有工作。然而,我想告诉你,对于某些工作来说,这可能是真的,但总是需要专家和急救人员来帮助自动化系统为患者提供更好的医疗服务。

图 6-1 展示了这个用例中的三个参与者的完整想法:

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

图 6-1

基于物联网的患者健康监控系统

第一是病人,第二是医生,第三是护士。这三个因素在危重病期间对病人都至关重要。从图中我们可以看到,患者有一种可捆绑的监测设备,在他们的家中,他们有一个物联网发射设备,在从患者监测设备接收到关于患者的特定生命统计信息后,发射该信息。物联网发射器将有关患者的统计数据发送到医院的集中式患者健康监控系统。患者健康监控系统是自动化的,它使用机器学习来提前预测患者健康的危急程度,并向医生和护士发送警报。为了让您了解这一点,让我们举一个例子,一名患者因心脏病发作病情危急,正在家中通过物联网监控套件进行术后监控。患者的心率、氧气水平和其他关键生命统计数据正在从患者监护设备传输到患者家中的物联网发射器,这些信息每隔 1 小时通过互联网中继到医院患者健康监护系统。患者健康监测系统具有智能来增加或降低从患者监测设备传输回它的监测数据的频率水平。由于患者健康监测系统使用机器学习,因此它能够基于从大量可用患者数据中获得的学习,自动提前预测关键的心脏状况。事实证明,预测可以提醒医生、护士和急救小组已经被监测的病人的潜在心脏状况。这种预测能力在当前由医生和护士监控病人的人类设置中是完全缺失的。因此,仅仅通过引入物联网和集中式患者健康监控系统,我们就能够对患者的疾病发作进行一定程度的预测。这种系统将使低级员工摆脱监控患者的单调重复活动和过程,目前这种过程非常容易出错,导致 70%的死亡是由于医疗错误造成的。未来医疗机构的全体员工将使用基于物联网的患者健康监控系统,提前为患者可能发生的任何情况做好准备。他们还将准备准确地采取紧急程序。这将极大地提高我们在当前环境下为患者提供的医疗保健水平。这是我想让你们想象和建立的一个系统,用来改善医疗保健行业。

这种物联网服务的货币化将有三种类型。首先,实现物联网的医院需要承担保持物联网服务全天候运行的成本。第二,患者必须承担最初在家中安装传感器套件的费用。下一个费用是订阅费,病人无论使用多长时间都要付费。例如,租用这项服务进行 10 天的监控可能会花费患者 X 美元。订阅费还将包括定期通过互联网获取信息和收取信息费用。

尾注

  1. Buitinck 等人,2013 年。机器学习软件的 API 设计:来自 scikit-learn 项目的经验, http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html

七、零售业中的机器学习概述

几年前,在班加罗尔的一次数据科学会议上,一位来自零售业的潜在客户找到了我。他对数据科学有一个明确的目标,即帮助他们的公司增加零售业务。目前的团队无法取得突破,正在寻找有经验的人来指导他们。这位客户告诉我,零售业正在经历一场变革,电子商务门户打破了以往的销售方式。他解释说,在过去的 3 年里,他的公司已经失去了近 25%的市场份额,被 Flipkart、亚马逊和 Bigbasket 等在线零售商占据。这种趋势看起来并不健康,他想知道是否有可能通过机器学习来使用有针对性的营销来促进销售。

零售业是一个既有功能细分又有价值细分的行业,我们将在本章中看到。零售业跨越企业对消费者交易非常频繁的各个行业。在企业对消费者的交易中,商品或服务从商品和服务的生产者转移到消费者手中。消费者然后直接消费这些商品或服务。让我们通过一个例子来理解这一点。世界上大多数大银行都有零售部门,如花旗银行或美国银行以及其他此类银行的零售部门。在世界各地的主要时装店里,都有直接向消费者销售时尚服装和配饰的零售部门。同样,所有大公司都有零售部门,比如肥皂和化妆品生产商。这些专门的零售部门有责任确保消费者获得产品,以发送组织生产的服务。当我们在组织环境中谈论零售时,我们指的是他们的零售部门。现在让我们看看这个术语在一个组织或部门中的总体使用情况。有专门的公司,他们的主要业务是零售。这样的公司不从事任何其他活动,比如生产商品和服务。这种类型的组织的一个很好的例子是沃尔玛,它属于也被称为实体组织的类别。Amazon.com 就是一个通过互联网进行网上零售的例子。

我们在美国也有直销组织,它们也充当零售商,生产商组织有自己的零售店。像戴尔这样的公司,既向终端消费者销售电脑,也向组织销售电脑。它有直销店,用来接触终端消费者。在这两种情况下,组织的目标都是接触最终消费者,让他们做出购买决定。

由于互联网在家庭中的广泛使用,全球零售业正在经历一场变革,导致像亚马逊这样的公司为客户提供快速送货上门的选择。需要注意的关键是,这些电子商务零售商能够使用机器人、人工智能和机器学习等技术。从表 7-1 中可以看出业务方法的明显差异。

表 7-1

不同的零售商类型及其产品

|

零售类型

|

焦点

|

区别

|

收支平衡

|

物流

|

费用

|
| — | — | — | — | — | — |
| 砖块和砂浆 | 店内体验 | 折扣品牌 | 短周期 | 零售店仓库 | 高的 |
| 在线零售商 | 易于访问节省客户时间 | 送货上门大幅折扣 | 长周期 | 仓库 | 低的 |
| 混合物 | 延伸店内体验 | 已知品牌价值 | 中等周期 | 零售店仓库 | 中等 |

从表 7-1 中我们可以看到,目前有三种类型的零售商。第一种是实体零售商,第二种是纯在线零售商,第三种是混合型零售商。实体零售商专注于为顾客提供店内体验,顾客走进商店,看一看陈列的各种产品,然后做出购买决定。他们通过打折和给零售店打品牌来使自己与众不同。与其他零售商相比,实体零售商的盈亏平衡周期更短。实体零售商还必须管理零售店和仓库的物流。实体店的成本更高,因为他们必须维护零售店和仓库。对于在线零售商来说,重点是方便访问他们的网上商店,并通过不去零售店来节省客户的时间。顾客可以在家舒适地订购。一家在线零售商与众不同,它为顾客提供送货上门的选择,并为他们提供的产品提供大幅折扣。在线零售商有一个非常长的周期来实现收支平衡。一个恰当的例子是亚马逊,它花了 10 多年才实现盈利。在线零售商没有零售店,因此他们只需要管理仓库来存放他们的产品。在线零售商的运营成本明显低于实体零售商,因为他们不必管理零售店的不动产。由于在线零售商的流行,现在出现了第三类零售商,他们是混合零售店。他们既有实体零售店,也有在线网站来销售产品。他们专注于将店内体验扩展到已经从实体店购买过产品的顾客。他们的差异化基于这样一个事实,即忠诚的顾客知道实体店的品牌价值,因此他们可以在自己舒适的家中希望获得相同的品牌价值。由于混合模式增加了在线零售商的成本,混合商店的盈亏平衡周期是中等的。混合店的物流优势是已经拥有零售店和仓库;然而,它需要在各个城市开设更多的仓库来分销其产品。这就是为什么我们来到下一个夏季成本之旅,在所有三种类型的零售商中,他们的成本最高。

零售细分市场

图 7-1 解释了零售业中存在的各种细分市场。这是一个高层次的细分,让读者了解零售业的整体业务是如何细分的。第一个细分市场是专业零售,这些商店迎合购买者的特定需求,如服装、办公用品、手工艺品等。在美国,有像 Staples 和 Office Depot 这样的商店供应办公用品;同样,也有像巴诺书店&这样的连锁书店,还有像美泰书店这样的儿童用品连锁店。这些商店迎合购买者的特殊需求,如儿童、书籍、办公用品。

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

图 7-1

零售细分市场

下一部分是食品和饮料。有各种世界知名的全球性公司,如麦当劳、必胜客和多米诺迎合这一部分。其他食品公司如 Citarella Gourmet foods 仅举几例。

另一个流行的零售领域是工作、家居和生活方式。纽约的 Story、Spell and the Gypsy collective、维也纳的 Song 和梅西百货(目前在全球拥有 600 多家门店)都是家居和生活零售商店的典范。

下一个细分市场是普通零售业,而名列榜首的是沃尔玛,它销售所有类别的产品。与沃尔玛类似的是亚马逊;然而,沃尔玛过去更多的是实体经营,而亚马逊主要是零售。家得宝还销售一般零售产品,如花园产品、家居装修产品、建筑材料和其他与一般零售相关的服务。

零售的最后一个环节是零售物流,对于零售商来说,这更像是一种后端操作,他们通过外包运输业务来进行合作。我之所以将物流归类为一个独立的零售部分,是因为它是零售业务中最重要的决策,在零售业务中,企业必须根据其物流来决定在哪里设置商店、仓库和配送设施。有时,大型零售商店巨头不得不在各自国家的主要港口和主要内陆枢纽附近建立仓库和配送中心,因为这些商店出售的许多商品都是进口的,然后在他们的商店重新包装和销售。由于零售业中的这些进出口交易,世界各地百万平方英尺的大型配送中心激增。在世界各地的主要城市市场的郊区,土地价格低廉的城市地区周围也出现了大型配送设施。这些超大型配送设施被零售连锁店用作区域或中心枢纽,以管理其零售业务。对于零售公司来说,决定在哪里开设实体零售店来满足客户需求是一个非常重要的决定。失败和表现不佳的零售店的位置会给公司带来收入损失、机会损失和时间损失。正是物流使零售部门的运营成本更高,因为其中涉及货物的流动。在医疗保健行业中,房地产由医院使用,类似于零售店。然而,这在金融界是不同的,我们将在第三节看到。

零售价值主张

Google dictionary 定义的价值主张是营销和创新、服务以及旨在使公司或产品吸引客户的功能。为了确定零售业的价值定位,“创新”、“服务”和“特色”这些词在这里很重要。在图 7-2 中,我向您展示了每种零售商类型给予其客户的价值主张。

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

图 7-2

零售客户价值主张

在这里,我将零售部门分为三个价值部分。第一个是直接产品服务。这种类型的零售业务的三个特点是,它是面向企业对消费者的,有直销店供消费者购买产品,并有一个直接在网上购买的选项。这类公司的一个很好的例子是戴尔公司。它通过直接的公司商店向世界各地的顾客销售,它还有一个直接的在线网站,允许人们订购各种类型的计算机。

在下一个分类中,我将零售公司基于体验的产品放在一起。这类商品的三个特征是,它们通常位于大型购物中心、奢侈品店或专卖店。这类商店的例子有 Jeffrey Gallery d、Crush Boutique、The Velvet Fly 和 Blake 等。

第三类产品是那些通过在线产品向客户提供价格和收入优势的产品。这种类型产品的三个典型特征是,这些类型的零售商在其网站上提供深度折扣,他们还提供送货上门商店,并且他们提供独特的产品发布,这些产品仅通过电子商务渠道发布,如移动或其他电子设备。这方面的例子有亚马逊和 Alibaba.com。

你可以说客户获得的价值有三种类型。但是,您需要前两个细分市场的直接产品和基于体验的产品,以及向客户销售商品和服务的传统方式。葡萄酒价格收入产品是零售业的一项最新进展,有可能扰乱直接和基于体验的产品。直接产品服务存在各种缺点;例如,当一个人走进一家直接零售商的商店时,顾客没有选择检查其竞争对手的竞争性价格。即使在有奢侈品店和专卖店的基于体验的产品中,他们也不能提供在家选择产品的舒适感。顾客需要走进公司的专卖店或专卖店来选择产品。这种局限性正被在线电子商务零售商所利用,这些零售商通过其他买家的视频和客户评论视频来分享客户体验,以便让客户在不同的竞争产品之间进行选择。

在一个典型的零售商店中,有一些常见的部门,如商店管理、营销管理、商品管理、人力资源管理、财务和会计管理以及客户支持。我们现在将看看机器学习是如何在这些部门中应用的。需要注意的一点是,客户一般只面对市场部或者客户支持部,其余部门都在后端工作。从这个角度来看,我将首先讨论零售组织中的客户支持和营销管理,以讨论机器学习的应用。

零售行业的技术采用流程

图 7-3 描绘了取自本书医疗保健部分的技术采用流程。

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

图 7-3

技术采用过程

在客户关怀和客户支持方面,机器学习和人工智能正被用于自动化一些客户服务任务、自动化内部客户服务流程、自动化产品交付和自动化前台办公室。客户服务的自动化可以通过简单的事情来实现,如自动向客户发送电子邮件或短信,自动使用聊天机器人或机器人在正常工作时间之外为客户提供服务。机器学习在客户服务中的智能使用将是在客户购买产品时预测下一次客户投诉的能力,以及机器学习找出满意客户的概况。客户服务的另一个应用是,客户提出投诉,投诉被发送给技术熟练的代理,代理是机器人,他们会像任何技术人员一样提供推荐的解决方案。如果解决方案对客户不起作用,那么投诉就会转移到一个人身上。当 it 能够估计客户服务呼叫何时会达到高峰时,客户服务变得更具预测性,从而使组织能够在这些预测时间内加快处理这些呼叫。在客户服务中,我将在早期应用阶段对技术采用过程进行分类,因为它目前正在取代低效率的任务,例如接受客户投诉,诊断客户面临的问题并给出简单的解决方案。它需要进入辅助应用的下一个级别,在这个级别上,它能够应用智能并协助高技能专业人员解决下一个级别的客户问题。它还需要从它创建并可以访问的客户服务数据中预测业务需求。

在市场营销中,公司正在应用机器学习来描述他们获得的线索,并创建类似销售代表的档案,然后机器学习软件将这两个档案进行匹配,并为特定线索推荐最佳销售代表。这不同于任何公司基于地域分配销售线索的方式。机器学习使营销部门能够描述和匹配最适合该工作的销售人员。机器学习的一个类似应用是创建客户人物角色,例如创建网站的某个访问者的个性,该访问者在该月的前 10 天有购买产品的历史。使用这个角色,营销部门可以在每月的 1 号到 10 号之间为该客户定制优惠。像亚马逊和 YouTube 这样的网站正在使用推荐引擎;然而,通过创建客户角色,然后基于产品与其角色之间的匹配进行推荐,使用机器学习为推荐引擎增加了更多智能。机器人的一个非常常见的用途是在客户服务中,它们被用于零售店或营销办公室,与客户直接互动。这种趋势将会增长,因为创建和维护一个机器人是有成本效益的,并且为客户提供了独特的体验。机器人将能够回答任何问题,他们将会达到能够像任何其他人一样转换的水平。从技术采用的角度来看,这仍处于辅助应用阶段,这些部分正在使用低级智能,他们已经自动化了人的能力。他们能够通过向客户提供公司或组织提供的相关产品,根据数据预测业务需求。

在目前的情况下,就客户服务和营销而言,我看不到独立运营层面的技术。然而,再过 5 到 6 年,我们将能够看到基于机器人的营销的增长趋势,其中机器人被用来在读取、分析、解释和智能理解客户数据后与人类进行智能交互。机器人将能够比人类营销人员拥有优势,因为它们将有能力分析过程,并从大量数据中提取有意义的信息,而人类无法处理这些信息。

下一个部门是销售部门。零售商店中销售部门的主要活动是在正确的时间以正确的价格购买正确的产品。它还负责产品的库存控制或仓储。机器学习正被用于确定百货商店的购买周期,并找出客户对特定产品的需求出现峰值的高峰时间。商店可以在高峰需求活动开始前准备好。这只是机器学习帮助在正确的时间购买正确的产品的方式之一。采购的另一个应用是在仓库中使用机器人来智能地存储在出口附近移动更快的产品,而不是那些具有更长存储寿命的产品。机器人使用马氏链等算法来确定到达、移动和运输大型仓库内特定产品的最快路径。机器人一旦接到订单,就会智能地移动货物,而不是让人们在跨越数千平方米的巨大仓库设施中分类并找到特定产品。

零售行业的分析现状

  • **描述性分析:**这个分析字段被调用来了解已经发生的项目的问题的答案,例如 X 销售在过去是什么状态?

  • 传统上,零售部门一直使用描述性分析来生成任何给定产品类别的销售报告,这在高层管理人员做出各种决策时产生了很大的影响。产品方面的销售报告产品方面的折扣报告、商店方面的销售报告和产品方面的销售报告是传统上使用描述性分析的一些例子。这种趋势不会消失。我们将看到描述性分析在零售领域的应用;然而,我们也将看到其他分析方法的出现,我将在下一节中讨论。

  • **诊断分析:**这种类型的分析用于了解现象的根本原因,如项目成功或失败。X 项目为什么会失败?从这次产品发布会的成功中,我们可以学到哪些积极的经验?所有这些问题都可以用诊断分析来回答。在零售领域,诊断分析还被用于分析某些结果,例如失败的产品发布或成功的产品发布,并找出这种成功和失败的根本原因,然后在未来的产品发布中模仿它们。诊断分析也着眼于过去,然后试图找出成功或失败的原因,其基本概念是未来跟随过去。这可能并不总是正确的,因为客户的偏好和客户所处的环境一直在变化。因此,我们需要进入下一个层次的分析,这是预测性的。

  • **预测分析:**这种类型的分析用于确定未来事件的结果,如项目成功或失败、项目预算超支或正在进行的产品发布的进度延误。这种分析带来了避免未来情况的实际能力。例如,通过使用预测分析,我们可以预测产品发布会是成功还是失败。在得出这样的结论之前,机器学习模型代码可以考虑各种参数来进行分析。然而,整个目的是让高层管理人员了解企业的发展方向。即使这样也不能解决问题,但它几乎告诉或充当了一个失败或未来偏离计划的警告信号。为了能够对偏差采取措施,我们需要更高层次的分析。

  • **规定性分析:**在这个分析领域,分析的最大价值已经实现,因为它建立在基于预测性分析的预测之上,并且它规定了未来应该采取的行动。在规定分析中,它使用机器学习来建立未来的行动计划,该计划基于类似情况下的过去失败,例如失败的产品发布,并给出为了产品发布成功而需要执行的特定活动。随着零售部门获得规范性分析,它现在真正能够在故障发生之前进行路线修正。你可能会说,如果一家公司在其零售业务中没有失败,那么它会看到多重增长的发生。是的,这就是机器学习在零售业务中从事后诸葛亮走向远见卓识的目的。

八、零售业的关键技术进步

情景 2025

在不太遥远的 2025 年,住着一位名叫珍妮的机器人工程师。她的房子完全由一个名为 GENIE 的房屋监控机器人管理。珍妮的房子配备了许多智能常用物品,如智能冰箱和智能橱柜。珍妮醒来后,她的家庭机器人为她准备好了一天的生活,给她洗了个澡,准备了早餐。像 2025 年的其他人一样,珍妮在楼上的家庭办公室工作。她上楼去和她在家办公室的机器人老板开电话会议。她不必担心订购常见的家庭用品和食物,因为她的整个房子都是智能的,并连接到她的房屋监控机器人。她的智能冰箱创建了一个快用完的物品清单,比如黄油、奶酪、果酱等。智能冰箱内部的机器学习应用程序使用传感器和图像来检查需要重新排序的商品数量。在这个时代,智能冰箱会与珍妮交谈,了解她对新产品的偏好,并为自己订购。根据这个反馈,冰箱会记住并从重新排序列表中删除珍妮不喜欢的东西。她的房子有智能橱柜,每种常见产品都有智能容器,咖啡豆、盐、糖等都有单独的智能罐子。智能容器称量储存在其中的数量,当它们达到完美的再订购阈值重量时,会向智能橱柜发出警报。这些工具在周末汇总所有订单,并将它们发送给 house GENIE。房屋精灵从智能冰箱、智能橱柜和其他类似设备中收集订单,然后向珍妮显示完整的订单。house GENIE 还从互联网上找到了每种要订购的产品的当前报价和折扣,并向 Jenny 展示了她通过选择这些产品可以节省的成本。在 house GENIE 报告订单列表后,它从 Jenny 那里获得语音反馈,对订单进行修改,然后下单。在这个新的现代世界中,所有的零售店都有自己的营销机器人,这些机器人连接到房屋监控机器人并接受订单。零售店使用无人机送货上门。物品到达珍妮的家,房屋机器人通过视觉检查检查所有物品后送货上门——这是视觉机器学习的另一种用途。对珍妮来说,最大的优势是她不必参与平凡的任务,机器人可以高效地完成这些任务。这就是零售业未来将如何改变我们的社会。

这听起来是不是很牵强或者太遥远了?

今天对你来说这听起来像科幻小说;然而,在不久的将来,这将成为现实。看看已经取得的一些技术进步,这将向你保证,未来将通过使用人工智能、机器学习和机器人等技术来帮助我们更有效地做事。2025 年场景中显示的智能冰箱可以通过创建一个简单的基于机器学习的深度神经网络来使用视觉分析,以识别冰箱中的某个项目是否接近补充需求。它还可以有传感器来确定冰箱中保存的物品与墙壁的距离。冰箱内的机械臂可以帮助抓住产品,同时对其拍照以确定其水平。我们场景中的智能冰箱需要的另一个东西是说话的能力。聊天机器人技术已经存在,我们让机器人以某种智能的方式与客户交谈。然而,机器学习需要进一步发展,才能从基于文本的转换技术转向基于音频的技术。我的意思是,聊天机器人需要理解用户发送给它们的音频,并需要实时处理答案。智能零售店中的智能聊天机器人需要理解一个狭窄的应用程序,即找出用户对店内特定产品的反馈。为了让机器人确定是否需要再次订购该产品,必须与用户进行这种对话。它需要一种程序化的方法,以特定的频率醒来,智能冰箱的用户可以使用 home GENIE 系统设置该频率,以让智能冰箱醒来并开始为下一个订单收集数据。例如,用户可以设置双周周期来补充冰箱内的产品。一旦设置完成,智能冰箱就会读取标签并扫描条形码来确定其内容。它确定并记录特定产品的使用频率,并给出在冰箱中存放了很长时间的用过的产品的列表。这当然有助于减少人们购买他们不用的产品的费用。这样的报告肯定会帮助用户做出更好的决定。

我们看到的另一个应用是支持物联网的智能橱柜。这款智能橱柜配有智能充电装置,可储存家庭使用的某些产品。智能橱柜芯片内部有传感器和机器学习应用程序,它们以一定的频率醒来,并确定是否需要重新订购任何特定的产品。用户设置重新订购产品的阈值;例如,如果储存在智能罐中的大米的数量达到储存价值的 20%,则可以重新订购。这个警报是由智能充电通过智能橱柜传感器发送的,智能橱柜传感器记录警报并将其发送到 home GENIE 系统。home GENIE 收集所有这些奖项,并每天向客户展示一次,以获得他们的反馈。我们现在有技术来实现搜索场景;然而,一些公司需要做实际的研究,然后创建这样的系统。

零售业中的狭义与广义机器学习

正如我们在医疗保健领域看到的那样,零售领域也有类似的趋势,狭义的机器学习技术突然大量增长,而不是广泛的应用。

购物中心的客流量有下降的趋势,人们越来越多地从最佳购买文化转向选择性购买文化。人们的购买模式也发生了变化,他们不再花在衣服上,而是花更多的钱在旅游、赌博和其他娱乐活动上。 https://risnews.com/top-8-retail-trends-watch-2018

在我看来,这并不是一个令人惊讶的趋势,而是零售业应该提前思考和准备的事情。从基于体验的购买转向基于选择的购买的原因之一是全球流量的上升。周末的交通状况变得很糟糕,每个人都试图在同一时间购买,堵塞了道路。因此,人们选择在线家庭送货模式,送货上门,而不必冒险去堵车。

为了迎合这些城市购物者,大型购物中心将不得不通过创建社区自动驾驶商店来重塑自己。我的意思是,将会有移动自动驾驶商店,它将根据他们的社交媒体活动驶过特定的社区,并为该社区提供走出家门购买产品的选项,而不是开车去零售店。基于社区的自动驾驶零售店可以是一辆改造成小型购物中心的大卡车,它足够智能,可以跟踪用户对展示在里面的特定产品的面部反应。这种智能商店还会记录顾客当前的颜色偏好,并通过指导他们选择与他们穿着相似的颜色来与顾客交谈。它还可以温和地询问顾客是否有任何颜色偏好。这是零售部门如何利用技术来迎合消费者不断变化的模式和需求的一个例子。智能商店还会通过提前了解特定社区的回头客的偏好来迎合他们。它可能会返回客户上次访问智能社区自动驾驶商店时订购的某些商品,当时可能没有该产品。这种类型的商店可能类似于 Amazon Go,其中客户资料与卡片一起使用,以跟踪他们在访问智能社区自驾车商店期间购买的商品。该商店将通过社交媒体宣传活动等渠道宣布其下一次访问,这些活动基于地理位置地图,只针对居住在该社区的人。这将降低零售公司的促销成本,因为有针对性的促销将有助于他们只接触到那些可能在附近购买的人。

全球零售机构的现状

在图 7-1 中,你可以看到我们有三种类型的零售机构。第一种类型是典型的实体组织。这是销售产品的传统方式,让顾客来到商店,然后购买产品。一些实体组织确实有网站;然而,这些网站只是为了提供关于他们商店的公司及其产品的信息,以及做促销广告。他们的主要精力是把顾客带到商店。

下一种零售机构是在线零售商。这种类型的零售组织的主要精力集中在将客户带到其在线商店网站上。这家在线零售商使用社交媒体博客和其他互联网服务将顾客带到其网站。成为一个在线零售商并不意味着他们没有一个实体的存在。这实际上意味着实体建筑仅用于仓储和销售目的。

第三种零售商是既有实体店又有在线电子商务网站来为其在线客户服务的零售商。实体店通过创建在线电子商务网站获得的优势是信誉。去过那家公司商店的购物者非常了解这家公司,因为他们是忠实的回头客,他们知道他们从这些商店购买的产品。因此,对于这样的客户来说,通过其在线网站从实体店订购经常使用或购买的物品是很方便的。由于顾客减少,越来越多的实体店开始转向这种商业模式。

为了向您解释全球零售机构的现状,让我们以美国的一家大型零售连锁店为例。TJX 是一家美国大型零售商,年收入超过 3300 万美元,员工总数为 35,000 人。它有八个部门。它的零售店遍布世界各地,如加拿大、英国和欧洲。它主要经营服装、鞋类、婚礼用品、食品、家具、珠宝、美容产品和家庭用品等产品。这家零售巨头旗下有各种品牌,如 TJMaxx、HomeGoods、HomeSense、Marshalls、Sierra Post、Winners 等。Marshalls 是一个专注于时尚、家居用品和其他配饰的品牌,是 TJX 集团的实体零售连锁店。TJMaxx 是另一个不提供在线销售的品牌。类似地,TJX 集团的家居商品零售商店品牌不提供在线购物设施。TJX 集团有另一组零售商店,它们遵循混合模式,既有商店,也有购买商品的在线设施,其中包括 Sierra Trading Post,它出售男女老少的服装和鞋类,以及家具、珠宝、家居和时尚商品。顾客可以在网上查看产品,并订购送货上门。TJX 还有另一个与风格和时尚服装相关的零售商店品牌 Winners,它也不提供任何在线购买其产品的选项。你必须去 Winners 商店看看它的新品,然后做出购买决定。同样,TJX 还有另一个名为 HomeSense 的零售商店品牌,也不提供任何在线购物服务。

实体零售连锁店的另一个例子是家得宝,它现在为顾客提供了通过电子商务网站购物的便利,家得宝通过其零售商店和在线网站提供家具、室内装潢和其他家居服务。沃尔玛也是类似商店的一个例子,它有一个巨大的实体商店;然而,它现在允许顾客选择在线订购。“美国制造”也是一个既有实体店又有网上购物设施的商店的例子。

机器学习在零售业中的重要性

零售部门不同于大多数其他部门,因为它依赖于活动、物流或供应链管理。这也是 TJX、沃尔玛和梅西百货等大型组织每分钟都有大量来自客户的内部数据产生的一个因素。只要商店还开着,就会产生账单,每个顾客都会有大量的数据。塔吉特百货是首批建立精确模型来预测顾客下一步会买什么的商店之一。在媒体发表的一篇报道中,Target 正处于一场争议之中,其机器学习系统能够预测一名少女的怀孕,甚至在她的父亲意识到她怀孕之前。商店收集与每个客户的信用卡、姓名或电子邮件地址相关联的数据,并创建一个人在商店购买的商品的存储桶。使用孕妇的购买模式,它能够检测出孕妇在第二个三个月开始时购买香味乳液的模式。因此,机器学习系统能够将孕妇描述为购物者,因为她突然大量购买无味肥皂、超大棉球、洗手液和毛巾。Target 使用这些数据,在系统预测到孕妇怀孕的特定阶段时,向她们发送特定的优惠券。在这种情况下,该系统能够如此准确地预测明尼阿波利斯一名少女的怀孕,以至于其系统向该少女发出了关于婴儿服装和痉挛的提议。当这位父亲在邮件中看到这些时,他变得很愤怒,并愤怒地去找目标商店经理谈话,经理道歉了。然而,当父亲回家后与女儿交谈时,她透露自己怀孕了。这位父亲后来道歉说,你比我更清楚我家发生了什么事[2; https://www.forbes.com/sites/kashmirhill/2012/02/16/how-target-figured-out-a-teen-girl-was-pregnant-before-her-father-did/#4a9c59c86668 。这是一个经典的例子,通过机器学习使用技术,并根据人们的购买行为预测他们的事件。这也引发了数据隐私问题,以及大公司试图通过挖掘数据来控制人们生活的事实。在零售业的机器学习真正开始预测人类生活的方方面面之前,所有这些问题都需要得到解决。

就我个人而言,在社交媒体上,我没有看到有人在走出家门的那一刻就抱怨隐私被完全侵犯了。据报道,有这样的情况,一个家庭去餐馆,正要点菜,正在讨论他们想吃什么,这个男人在和他的女儿谈话时多次说出“比萨饼”这个词。突然,他的移动设备上收到一条短信,说如果他今天订购比萨饼,他所在的餐馆将给他 25%的折扣。他很惊讶,他刚刚对他的女儿说了几次比萨饼,现在他收到了比萨饼的报价。从零售商的角度来看,这种对技术的过度使用看起来不错;然而,从顾客的角度来看,这意味着他们在餐厅内的谈话不仅被听到和记录,而且还被分析和采取行动。机器学习和音频分析使这成为可能。在这种机器学习技术成为主流并应用于每个零售柜台之前,隐私问题需要得到解决。

需要注意的重要一点是,这种技术的应用根本不可能通过人类来实现。人类无法从如此海量的数据中发现模式。为了发现女性怀孕这样的事件,像 Target 或沃尔玛这样的公司需要数 Pb 的数据来发现她们之间的频繁模式。为了做出准确的预测,训练数据也需要相当准确。因为俗话说,垃圾进,垃圾出。这将要求顾客能够允许商店进行分析并得出结论。

现在,我将带您通过一项在线调查,由零售行业的专家通过德尔菲法找出该行业的哪些细分市场属于技术采用水平。这项调查与本书医疗保健部分的调查非常相似。零售专家在初步调查中确定的关键领域是商店管理系统、数字商务、供应链管理、销售和客户管理。开展这项调查的目的是让读者清楚地了解零售业各个领域的技术采用成熟度。专家分散在实体商店、在线零售商和混合组织中。

零售业应用机器学习的一些关键领域包括:

  1. 商店管理系统

  2. 数字商务

  3. 供应链

  4. 商品销售

  5. 客户管理

商店管理系统包括管理商店车间各种产品的内部布局。它还包括运用技巧在顾客经常光顾的地区附近展示最有吸引力的商品。这在很大程度上是一个领域,商店经理利用自己的经验将最有利可图的产品摆在顾客面前。不仅如此,商店管理还包括将商品归类到相似的类别中,并将它们放在一起,这样顾客就可以更容易地对同一产品的不同品牌进行比较。虽然这听起来像一个简单的活动,但如果你考虑到世界上任何地方的任何大型商店都有数千种不同类别的产品要展示,这几乎会成为商店管理的噩梦。从仓库库存中填满货架上的产品也是一件需要小心处理的事情。在世界各地,商店经理一直在尝试最能吸引顾客的商店地板设计和陈列。确定具有季节性促销价值的产品,如圣诞节展示和 12 月或任何其他地方或地区节日期间的礼品,也是商店管理人员的工作。这种活动在很大程度上是一种由人推动的活动,需要一些技能和经验来了解在增加商店销售额方面什么可行,什么不可行。

数字商务是一个快速增长的领域,也是大多数客户在不久的将来会迁移到的领域。大多数实体店现在都有自己的网站,比如沃尔玛有 walmart.com,TJX 有 TJx.com,梅西有 macys.com,塔吉特有 target.com。当一家公司从一个实体设施延伸其服务时,它就更容易将产品运送到人们的家中。该公司节省了商品仓储费用,而这是独家在线零售商需要做的。实体店提供的额外优势是,它有一个忠诚的客户群,不断回来接受更多订单。因此,当顾客从这样的商店订购产品时,他们知道如果寄给他们的产品不符合标准,他们可以去实体店并向他们的顾客服务台提出投诉。Amazon.com 和 Alibaba.com 等在线零售商没有任何大型实体店;然而,他们可以使用机器学习,根据用户过去的购买模式向用户提供更好的建议。

供应链管理处理零售商店运作所必需的物流。它具有客户无法直接看到的后端活动,并涉及保持数以千计的产品供应商的联系,并根据即将到来的需求进行更新。主要零售连锁店提前向供应商下订单,这样任何一家商店的库存都不会枯竭。这里要注意的关键点是,一个糟糕的供应链系统会让一个零售连锁店损失数百万美元。如果订购的产品多于市场需求,将导致更多材料的库存,这将增加零售商店公司的仓储成本。如果订购的产品少于市场需求,就会导致客户不满。这就是为什么供应链管理被称为零售业的心脏。一些商店遵循将仓库设在离商店更近的地方的做法;然而,一些连锁商店遵循在供应商附近开店的做法。这两种方法都适用于不同的公司,在解决这一关键活动时没有对错之分。

销售是另一个非常重要的活动,它决定了商店是否盈利。我这样说是因为销售包括确保商店库存充足,产品价格有竞争力。在零售连锁店的幕后工作的跟单员确保他们跟上消费者销售趋势,允许他们以适合零售连锁店的价格购买该类型的产品,以获取利润。举个例子,采购经理至少提前 6 个月就开始计划圣诞销售,他们通过购买特定类型的产品,查看过去的圣诞销售报告和与圣诞销售一致的新产品发布来进行计划。他们还决定什么样的产品在商店陈列中得到优先考虑,这样顾客就会被吸引过来,从而做出有利的购买决定。采购经理的关键技能是谈判零售链购买的库存商品的最低价格。采购计划是采购经理使用的一项重要技能,目的是确保商店在正确的时间储备正确的商品。大型零售连锁店的销售专家确保他们知道哪种销售策略对顾客最有吸引力,因为他们随时了解全年发生的消费者变化或购买模式。销售还包括商品成本的评估和监控,以及双赢的合同谈判。

客户管理包括获得新客户和增加现有客户的忠诚度。零售连锁店的这一部分监控到商店的新顾客流,以确保连锁店的收入增长。回来购买更多产品的老客户也同样重要,因为他们会重复购买,并传播关于该品牌的好消息。如果一家商店只有新顾客光顾,而老顾客减少,那么这表明该商店的促销计划是有效的,但当顾客从连锁店购买商品时,他们对这种体验不满意。在这种情况下,一段时间后,即使是新的顾客流也会停止,因为坏的口碑会在连锁店中传播。只有老顾客光顾,很少有新顾客光顾,这种情况也不太健康。这说明连锁门店的促销方案没有被新客户接受,有可能是因为更好的优惠而去竞争。在这种情况下,当老顾客在市场上看到更好的报价时,他们也可能转向新的竞争对手,慢慢地放弃连锁店。所以在这两种情况下,连锁商店都失去了生意。任何连锁商店的客户管理实践都应该真正照顾到老客户,并确保新客户在市场上也能提供有竞争力的产品。现在让我们来看看调查及其研究方法。

  • **研究目标:**本研究的主要目标是利用专家意见找出并绘制人工智能和机器学习的两个参数:(1)零售行业关键领域中人工智能和机器学习的当前技术成熟度,以及(2)零售行业内部的技术采用流程。

  • 在第一次迭代中,专家组确定了 16 个初始关键领域。然后,与专家组一起重申这些领域,以找出其中将来会发展的重要演示领域。专家组确定了零售业中对零售业进一步发展至关重要的五个领域。调查研究不提供关键领域的迭代选择结果,但它从专家选择这五个关键领域的点开始。我已经在本章讨论了这五个领域,从商店管理到顾客管理。

  • **研究样本:**从总共 125 名专家中选出一组专家。这些专家包括在该行业工作了 20 多年的零售专业人士,从客户服务到零售机构的管理专家、零售设施的主管、零售组织的首席执行官,或者从事零售业研究并发表过论文的学术教授。我介绍了零售业各个领域的所有专家,例如供应链管理、客户服务、商品销售、首席执行官和人工智能专家——仅举几例。共有 20 名这样的专业人士入围了这项研究。在这项研究中没有缺席或流失。

  • **所需信息:**为了做出决策并支持决策,提供了各种二手数据(例如,关于机器学习和人工智能在零售业中的状态的已发表论文);一些例子是塔吉特或沃尔玛。创建上述两个参数之间的映射所需的信息基于专家对从商店管理到顾客管理这五个领域的技术实现现状的理解。为了使专家对技术成熟度水平的解释做出决策,向他们提供了分阶段的技术鉴定。除此之外,没有提供其他信息,所以要小心不要在专家的头脑中产生偏见。这项研究需要的信息是背景知识、理论知识和专家知识。还要求专家们利用他们在零售业中长期积累的隐性或固有知识。

研究设计概述:

这项研究涉及的主要步骤如下:

  1. 定义研究的目标。

  2. 寻找愿意帮助这项研究的专家。

  3. 设计问卷,收集信息,减少专家的写作工作量。

  4. 向专家发放调查问卷。

  5. 收集对问卷的答复,并对其进行分析,以了解是否达成了共识。

  6. 重复并管理更多的问卷,直到专家们就某个特定的关键领域达成共识。

  7. 一旦达成共识,继续下一个关键领域,并重复调查问卷,直到达成共识。在达成共识之前,将根据专家之前的回答提供更多信息。

  8. 分析并创建技术成熟度水平和采用人工智能和机器学习阶段的地图。

数据收集方法

关于零售的文献不是这项研究要收集的数据。进行的测试研究(我在前面提到过)是在专家的帮助下,将对零售业的未来至关重要的 16 个关键领域缩小到 5 个。这是一件重要的事情,因为在我们的研究专家中,我们根据他们过去的经验来判断零售业的重点。我们使用了奇图·奥科利和苏珊娜·德·波斯基题为“德尔菲法”的论文中的德尔菲法作为研究工具、范例、设计、考虑和应用[1; https://www.academia.edu/399894/The_Delphi_Method_As_a_Research_Tool_An_Example_Design_Considerations_and_Applications 因为它是收集专家意见供我们研究的最佳研究工具。

问卷调查法用于通过电子邮件和在线调查从专家那里收集数据。

数据分析

在收集数据的特定迭代过程中,使用 Microsoft Excel 软件以表格形式记录专家的回答。对于任何给定的关键领域,都会绘制一个图表来检查是否达成了共识,如果图表充分显示了共识,那么迭代就会停止。所以数据分析是在计算机软件的帮助下手工完成的。使用 Excel 软件绘制技术成熟度和技术采用阶段的地图,以创建技术地图。这也是在微软 Excel 的帮助下完成的。

道德考量

如果我们没有确保结果和专家的回答是匿名的,并且不影响这项研究的结果,那么研究中可能会出现偏见。因此,采取了适当的措施来确保专家之间互不相识。正如我已经提到的,在零售业中有两种人:一种人喜欢技术,另一种人不喜欢技术。我们没有根据这些特定的标准进行专家选择,所以这项研究很可能在这些基础上有所偏差,我们也没有对此进行测试。

研究的局限性

定性研究的最大局限是不能准确量化未来的结果,这也非常适用于我们的研究。然而,通过在我们的问卷中使用分类变量,我们也试图对我们的结果进行定量分析。绘制技术采用图和理解技术成熟度不是一个普通人能做的事情,除非他们已经与行业相关联;这就是为什么我们选择专家来进行这项研究。然而,有可能一些专家可能没有足够的知识或接触人工智能和机器学习的进展。我们承认这可能是研究的一个局限。

检查研究

从本书的图 1-1 中,我们已经知道技术采用有四个阶段。在图 8-1 中,我们看到了这个映射。

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

图 8-1

零售业技术采用阶段

从图 8-1 来看,有两个轴:x 轴代表图 8-1 中概述的技术采用阶段,y 轴代表技术成熟度水平。技术成熟度应用级别。**成熟度应用级别分为低、中、高。低表示该技术处于研究阶段,尚未投入生产。中等意味着该技术已经在生产中实现,有些成功和失败,需要更多的研究才能进入主流生产。高表示该技术经过充分研究,准备投入生产或正在生产环境中使用,**如零售店等。

这里介绍的是表格和图表中的数据及其对德尔菲研究方法的分析。

表 8-1

关于研究中使用的德尔菲研究方法的数据

|

主题

|

零售专家数量

|

迭代次数

|
| — | — | — |
| 德尔菲法 | 邀请 | 入围的 |   |
| 人工智能和人工智能在零售业的应用现状 | One hundred and twenty-five | Twenty | four |
| 人工智能和人工智能在零售业的未来应用 | One hundred and twenty-five | Twenty | five |

我们已经在本章的方法一节中讨论了这些数据。现在,我们来看看零售领域人工智能和机器学习的技术成熟度参数的数据及其图形表示。

现在,我们来看看图 8-2 中零售部门的人工智能和人工智能在商店管理中的状态。

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

图 8-2

人工智能和人工智能在商店管理中的地位

在商店管理领域,关于零售业人工智能和机器学习技术成熟度水平的第一个参数,50%的专家认为它具有很高的成熟度。确定商店管理处于高成熟度水平意味着该技术已经在该生产领域实现,并且正在主流生产中使用。这方面的一个很好的例子是百思买商店雇用的机器人售货员,被称为“克洛伊”( https://www.businessinsider.in/I-went-to-Best-Buy-and-encountered-a-robot-named-Chloe-and-now-I'm-convinced-shes-the-future-of-retail/30-seconds-later-she-brought-me-my-purchase-and-passed-the-DVD-to-me-through-a-chute-/slideshow/49507844.cms).

机器人使用触摸屏与商店顾客交流,并能够在 30 秒内让他们购买他们选择的产品。克洛伊测试于 2015 年在纽约切尔西区开始。测试机器人看起来更像一个自动化的工业手臂,但能够通过玻璃屏幕后面显示的屏幕进行通信。在这家机器人商店中,地板机器人已经完全取代了员工,每天为顾客检索商品。它能够在商店内的整个地板空间内移动。克洛伊机器人具有智能,它能够跟踪客户的购买模式,并能够预测对高需求产品的新库存购买。

甚至沃尔玛也在为商店管理部署机器人,它已经在几家商店成功测试了货架扫描机器人。这些机器人有 2 英尺高,它们使用摄像机来检查是否有任何商品缺货。机器人还会检查商品上错误的价格或缺失的标签。它们与商店管理系统相连接,这样人们就可以看到任何问题,例如遗漏的价格或错误的股票价格。这些机器人被设计成当它们看到顾客走近时就会停下来。这是辅助操作的一个应用,机器人正在帮助人类做得更好。

现在让我们看看另一个领域:图 8-3 中的数字健康记录。

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

图 8-3

人工智能和人工智能在数字商务中的地位

我们的专家得出结论,这是一个技术成熟度很高的国家,80%的专家得出了这个结论。我们可以在图 8-3 中看到,他们中的一部分人(约 15%)也觉得成熟度处于中等水平。中等意味着该技术还没有进入主流生产,在这里和那里有一些成功和失败。然而,高状态意味着研究已经进入生产阶段。

户外服装零售商 North Face 正在其网站上使用基于机器学习的 IBM Watson 引擎,以个性化其在线客户的购物体验。在他们的手机上下载应用程序,并对着应用程序说话,就像你对销售人员说话一样。虚拟销售人员向客户提出一系列问题,帮助他们了解客户的偏好,并提供符合客户需求的产品。机器学习的另一个很好的应用是 Amazon.com 大学的推荐引擎。电子商务零售商使用机器学习的另一个好例子是网飞如何使用大数据和机器学习来研究观众如何消费电影,包括研究整季剧集的发布以及何时自动播放下一集,并优化与特定电影相关的推荐。网飞大学的机器学习每年为他们节省 100 万美元。这超过了他们从推荐产品和自动播放下一部电影中获得的收入增长。这是对机器学习的一种非常明智的使用,它不仅为公司增加了收入,还降低了成本。电子商务公司很快采用了机器学习,并获得了优势,因为他们的运营已经数字化。只需要机器学习工程师团队确定应用的业务领域,然后为它们编写生产就绪的代码。这就是为什么实体公司需要更多时间来适应机器学习应用程序,因为他们有物理限制要解决。

在图 8-4 中,现在我们来看看人工智能和机器学习在供应链领域的状态。

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

图 8-4

供应链中人工智能和物流管理的现状

在五次迭代之后,我们的专家告诉我们,技术采用成熟度处于非常低的水平;我们 60%的专家肯定地告诉我们这是事实。供应领域也被称为物流。亚马逊正在提供机器学习,用于实时预测、规划和优化履行网络所需的数百万件商品。亚马逊将机器学习应用于不同问题的大量数据:推荐、销售运营、规划、自动化和机器学习,其中它根据预测确定要通过其供应商订购的搜索产品。

沃尔玛正在使用人工智能和机器学习来为客户提供产品。它正在将机器学习用于沃尔玛员工配送计划,在该计划中,机器学习选择最佳路线,以更高效地向客户配送订单。这有助于购物者避免在沃尔玛超市排队结账。沃尔玛使用机器学习来学习客户想要什么,然后在正确的时间和正确的地点以正确的价格提供给他们[4; https://scsolutionsinc.com/news/Walmart-turns-to-ai-to-serve-you-better

现在我们来看另一个关键领域——图 8-5 中的销售领域。

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

图 8-5

人工智能和 ML 在商品销售中的地位

我们可以清楚地看到,我们的专家告诉我们,技术成熟度处于较低水平。经过四轮反复,当达成共识时,67%的专家认为是这样。这方面的一个很好的例子是曼坦系统公司关于商品分析的案例研究 [5 ],秘鲁的一家零售公司通过对商品数据实现机器学习,成功地利用了这些数据。Manthan 的解决方案能够利用其数据仓库中 350 的未使用数据,这些数据通过基于季节生成报告和比较各种趋势分析来发现模式。通过该系统,使用商品分析与供应商进行当前数据交流也变得非常容易,因为所有的库存、销售预测和当前采购都放在同一个系统中,以便预测未来的需求[5; https://www.manthan.com/downloads/case-studies/Ripley-peru.pdf

在图 8-6 中,我们现在来看看人工智能和机器学习在客户管理领域的一个有趣应用。

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

图 8-6

人工智能和人工智能在客户管理中的地位

经过四次迭代后,我们的专家告诉我们,该领域的技术成熟度处于中等水平,70%的专家得出了这一结论。我们都知道 Amazon.com 的客户产品推荐引擎已经帮助它产生了 55%的重复订单。对于实体销售人员来说,推荐引擎是一个很好的在线替代品。然而,在这里,几乎没有人可以交谈,人们只是在屏幕上得到一个关于推荐产品的通知。像这样显示推荐并不容易,但必须有机器学习应用于其中,这样客户才能看到他们实际上会购买的推荐。仅仅显示顾客最后从商店购买的东西并不是一个好的建议。我们看到这种失误发生在许多声称使用机器学习向现有客户推荐产品的网站上。一个好的推荐引擎的真正关键是在研究了数百万用户的数据后,然后用一般一起购买的产品研究他们的行为模式,从而创建一个商业模式。在挖掘出这样的模式后,我们可以希望机器学习算法会推荐人们会购买的东西。一个人正在尝试进行的产品搜索不应该是向客户推荐产品的唯一影响因素。我们将着眼于创建一个推荐引擎,尽管规模很小,这样您就可以了解一个实际的推荐引擎需要什么。机器学习的另一个客户管理用途是创建聊天机器人。聊天机器人的好例子是易贝和丝芙兰。在易贝,它被称为购物机器人,一个虚拟的个人购物助手,通过提供价格和描述等特定细节来帮助人们找到他们想要的物品。 https://ww.ebay.com

2018 年零售业技术采用阶段

现在我们继续我们研究的第二个参数,即零售中技术采用的阶段(我已经在第一章中讨论过了),从快速应用阶段到独立运营阶段,我们有四个阶段。经过分析,我们可以从图 8-7 中看到,对于人工智能和机器学习在商店管理中的应用,40%的专家表示处于第二阶段水平。

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

图 8-7

2018 年零售行业的技术采用阶段

您会记得,我已经将阶段 2 归类为早期应用,其中机器学习被用于问题检测系统和自动化低效率测试。重点是诊断业务问题的根本原因。我们的专家将数字商务归类为第三阶段,这意味着它已经达到辅助应用。你会记得当一项技术是在辅助应用,因为它有一个良好的自动化水平,它使用低水平的智能,它只是熟练的专业人员。在我们的例子中,他们可能是销售专家、商店经理、客户服务人员或营销人员。我们已经了解了这个零售部分,我已经向你们展示过,客户服务部正试图通过将机器人放在顾客面前进行服务来实现机器人操作。然而,对于或多或少自动化的数字商务,我们还没有看到机器人在后台独立管理网站的运营,而不使用人类专家。这就是我们的专家将其技术归类为辅助应用的原因。接下来我们来看看供应链管理,根据我们 55%的专家的说法,它被归类为实现的第 4 阶段的高级别。供应链管理涉及到物业运营的使用,我们已经看到在亚马逊、沃尔玛和其他零售巨头的仓库中大量使用机器人,这些零售巨头正在使用机器学习算法,如马尔可夫链,来优化他们的库存存储。这就是我们的专家将这项技术归类为实现独立机器人操作的原因。对于商品销售,经过五次迭代后,我们的专家将其列为第一阶段,这意味着应用技术自动化和重复商品销售自动化是一个必须进行研究以改进其应用的领域,以便随后可以进入第二阶段和第三阶段。对于客户管理,我们的专家在第 3 阶段和第 4 阶段之间找到了平衡点,我们的专家报告说两个阶段都达到了 40%。该阶段是辅助应用,其中机器学习处于高级阶段,并且具有预测能力。我们已经看到了零售店提前预测顾客购买行为的能力,这就是为什么这些例子处于第 4 阶段。他们也在客户管理方面,日本的几家商店引入了机器人进行客户服务,并在地板上问候客户。

至此,我结束了我与零售业专家历时 3 个多月完成的研究报告。我真的希望它能为读者提供一个关于零售业在应用和适应人工智能和机器学习方面的简明观点。

尾注

  1. https://www.academia.edu/399894/The_Delphi_Method_As_a_Research_Tool_An_Example_Design_Considerations_and_Applications

  2. https://www.businessinsider.in/I-went-to-Best-Buy-and-encountered-a-robot-named-Chloe-and-now-

  3. 可儿机器人在百思买门店: https://www.businessinsider.in/I-went-to-Best-Buy-and-encountered-a-robot-named-Chloe-and-now-I'm-convinced-shes-the-future-of-retail/30-seconds-later-she-brought-me-my-purchase-and-passed-the-DVD-to-me-through-a-chute-/slideshow/49507844.cms

  4. https://scsolutionsinc.com/news/Walmart-turns-to-ai-to-serve-you-better

  5. https://www.manthan.com/downloads/case-studies/Ripley-peru.pdf

  6. https://ww.ebay.com

九、如何在零售业实现机器学习

零售业最有前途的三个领域是:

  • 零售消费者购买模式

  • 客户管理

  • 供应链管理

在零售行业,最具潜力的项目是应用机器学习来理解零售消费者的购买模式。虽然在这个领域已经有了一些进步,比如推荐引擎的创建,但这只是冰山一角。消费者购买模式是一种人类行为,需要机器更好地理解,以便从数据中获得任何好处。购买者出于内在需求购买产品,对产品类型进行某种研究,评估各种购买选择,然后做出购买决定。虽然这看起来很简单,但是想想你最近不得不购买某样东西的时候,以及你是如何购买该产品的。事实上,你认识到需要购买该产品只是一个起点。你可以谷歌一下这个产品,或者问问你可能用过这个产品的朋友和家人的意见。如果你在搜索一部电影,那么你会在网上或许多移动应用程序中查看各种电影评论。一旦你做了调查,并确信你应该购买这种产品,你就可以看看你可以购买这种产品的各种选择,包括网上销售或实体店。你购买产品的时间也是一个重要的决策标准。例如,如果你没有时间去实体店,你会选择在网上购买产品。在对各种选择进行评估之后,你就可以做出购买决定了。为了理解这种消费者购买模式,机器需要学习人类如何做出购买决定。机器学习可以用来实现营销个性化。这包括了解客户的购买需求,然后为目标客户定制促销方案。机器学习的另一种应用方式是通过学习消费者过去的购买行为,然后向他们提供建议。像 Amazon.com 这样的电子商务商店已经成功地做到了这一点。使用机器学习算法将产品与消费者偏好相匹配,在确定品牌对正确消费者的正确定位方面可以发挥至关重要的作用。这是一个需要做更多研究和建立商业应用的领域。通过识别客户的行为模式,有两种销售策略可用于向客户提供优惠:追加销售和交叉销售。追加销售是指向客户提供比客户最初选择的产品更高档、更优质的产品。交叉销售是从顾客选择的品牌中给顾客一个现有品牌的替代品。这两种策略都可以包含在推荐引擎中,以便测试和创建良好的促销要约推荐系统。

在客户管理方面,组织正寻求实现一项战略,从获得新客户的阶段,到在首次购买时创造或促进品牌忠诚度,再到实现重复购买的战略。使用机器学习来了解客户新的和不断变化的购买需求,查看竞争产品及其供应,然后给出比竞争产品更好的促销优惠,可以通过对竞争产品实现在线情感分析和对导致购买行为的那些情感进行数据挖掘来完成。例如,在对竞争产品进行情感分析时,我们可能会发现竞争对手组织利用某个特定名人开展的促销活动促进了该公司的销售。现在为了取得成功,我们公司也必须做一些类似的事情来获得新的客户。机器学习的这种智能使用可以极大地帮助营销智能策略。对首次购买者的数据进行深入分析,可以在首次购买者如何以及为什么对特定公司做出购买决定方面产生很多好处。在这样的数据集上使用机器学习可以给你隐藏的购买模式,这种模式迄今为止还没有被探索过。忠诚客户数据集来自那些从特定组织重复购买的客户。我们可以通过数据挖掘来了解和挖掘关键的购买模式。在本章中,我们将看到一个实现数据挖掘的例子,在这个例子中,我们将使用无监督学习中的聚类来挖掘消费者购买模式的隐藏维度。

使用机器学习来提供有效的促销优惠是机器学习可以用于促进销售的另一个方面。如果一个组织基于消费者的背景创建了一个过去促销优惠和消费者行为的数据库,它可以帮助机器学习应用程序挖掘出那些构成成功促销优惠的模式。例如,上班族喜欢使用该公司的应用程序购买产品的优惠。

供应链管理中的机器学习很难,因为这个过程涉及到商品和服务的物理移动。在实现机器学习以改进所提供的参数时,我们需要大量的数据,如供应商计算最优库存的提前期等。数据源可能来自不同的系统,这是在供应链管理中实现机器学习的主要挑战,并且增加了这种复杂性的事实是,关于供应品的数据在具有非常不同的格式和过程的数据库系统中使用。例如,供应商数据可能来自采购管理系统,而运输数据可能来自运输管理系统。在某些情况下,数据可能会导致外部系统不与公司的供应链系统直接对话。如此多样的数据面临的另一个挑战是数据来源,数据的质量和准确性都成问题。为供应链管理实现机器学习的最大挑战是创建一个拥有最新数据并经过适当清理的单一存储库。如果你无法在机器学习中创建一个供应链管理应用程序,你将不得不设计一个机器学习解决方案,该解决方案具有中间件数据库管理功能以及在几分钟内集成各种数据源的能力。

在零售业中实现机器学习生命周期

现在,我将带您了解零售行业中机器学习的一个实现。在这里,我将使用无监督学习技术向您展示如何对零售数据集进行数据挖掘。本例中使用的数据集是虚构的,适合您理解如何使用。我们知道无监督学习技术,我们心中有一个解决方案架构;然而,还没有找到,因为我们不知道我们将在数据准备的步骤中构建什么模型,这在第三章中给出。机器学习生命周期。在数据准备(如清理和预处理数据)后的这个阶段,我们停留在探索性数据分析这一步,以便在零售数据集中找到任何模式。我想让你明白,在这个阶段,我们不是在寻找建立一个解决方案或模型,而是在询问在可用的数据集中是否有任何模式。我们正在挖掘数据,从中找出任何意义。这里的重点是机器找出数据集中的任何模式或维度,而不是像我们在监督学习技术中所做的那样,为机器重新定义任何预定义的学习。我将只向你展示如何用零售数据集建立一个无监督的模型;但是,在本练习结束时,您将获得可进一步用于开发监督学习模型的维度(如果有)。通常,我们使用无监督学习技术来挖掘购买模式,然后基于使用无监督学习发现的维度来创建预测模型。我将帮助你使用监督学习,并创建一个类似于我在第三章中所做的模型,使用的数据是通过应用无监督学习技术开发的。一旦您开始处理实时零售数据集,这将有助于您在实时生产环境中实现。该数据集是平面文件的形式,可从以下 URL 获得: http://www.PuneetMathur.me/Book009/ 。现在让我们开始在这个数据集上实现无监督学习。

信息

本练习中使用的所有代码都在 Anaconda 环境中测试了与 Python 2.7 的兼容性。它应该也能在 3.x 上工作;但是,还没有经过测试。

无监督学习

在清单 9-1 中,我首先取消了一些关于从 matplotlib 导入库的基本警告,否则大量的警告会导致无法解释结果。在我们继续之前,让我解释一下代码的结构。我将这段代码分为两部分:第一部分是我们进行数据可视化和处理所需的所有功能,如 PCA 输出、Y 绘图仪输出和通道输出;代码的第二部分是无监督学习技术的实际实现。在第二部分中,我使用前面定义的函数的逐步求和,并使用力和特征来找出这个零售数据集中隐藏的维度模式。

import warnings
warnings.filterwarnings("ignore", category = UserWarning, module = "matplotlib")
warnings.filterwarnings("ignore", category = UserWarning, module = "cross_validation")
# Importing libraries
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import pandas as pd
import numpy as np
import pandas.plotting

Listing 9-1Importing Necessary Libraries

现在让我来解释我在清单 9-2 给出的代码的第一部分中定义的四个函数。

def pcaOutput(good_data, pca):
      "'
      Visualizing the PCA results and calculating explained variance
      "'

      # I am doing Dimension indexing through pca components
      dims = dims = ['Dimension {}'.format(i) for i in range(1,len(pca.comps_)+1)]

      # Creating the PCA components pandas dataframe from the dimensions
      comps = pd.DataFrame(np.round(pca.comps_, 4), columns = good_data.keys())
      comps.index = dims

      # Calculating PCA explained variance for each component
      ratios = pca.explained_variance_ratio_.reshape(len(pca.comps_), 1)
      variance_ratios = pd.DataFrame(np.round(ratios, 4), columns = ['Explained Variance'])
      variance_ratios.index = dims

      # Creating a bar plot visualization for better understanding
      fig, ax = plt.subplots(figsize = (14,8))

      # Plotting the feature weights as a function of the components
      comps.plot(ax = ax, kind = 'bar');
      ax.set_ylabel("Feature Weights")
      ax.set_xticklabels(dims, rotation=0)

      # Displaying the explained variance ratios
      for i, ev in enumerate(pca.explained_variance_ratio_):
            ax.text(i-0.40, ax.get_ylim()[1] + 0.05, "Explained Variance\n            %.4f"%(ev))

      # Returning back a concatenated DataFrame
      return pd.concat([variance_ratios, comps], axis = 1)

Listing 9-2Function to Output PCA Results

PCA 输出函数给出了在该函数中对零售状态运行的主成分分析的结果。我首先创建维度,然后通过运行 for 循环将所有 PCA 组件复制到其中。然后我在熊猫数据框架中从维度创建组件,之后我计算每个组件的 PCA 解释的方差。解释的方差将被用作选择那些彼此独立的特征的度量。完成后,我通过绘制作为组件函数的特征权重来创建一个柱状图可视化。此函数返回串联的 Pandas 数据框,其中包含解释过的方差比率和分量。

现在让我们看看清单 9-3 中的下一个函数 clusterOutput。

def clusterOutput(redData, preds, centers, pca_samples):
      "'
      Visualizes the PCA-reduced cluster data in two dimensions
      Adds points for cluster centers for-selected sample data
      "'

      preds = pd.DataFrame(preds, columns = ['Cluster'])
      plot_data = pd.concat([preds, redData], axis = 1)

      # I am Generating the cluster plot
      fig, ax = plt.subplots(figsize = (14,8))

      # Creating the Color map to distinguish between clusters
      cmap = cm.get_cmap('gist_rainbow')

      # Coloring the points based on assigned cluster
      for i, cluster in plot_data.groupby('Cluster'):
          cluster.plot(ax = ax, kind = 'scatter', x = 'Dimension 1', y = 'Dimension 2', \
                       color = cmap((i)*1.0/(len(centers)-1)), label = 'Cluster %i'%(i), s=30);

      # Plotting the centers with indicators
      for i, c in enumerate(centers):
          ax.scatter(x = c[0], y = c[1], color = 'white', edgecolors = 'black', \
                     alpha = 1, linewidth = 2, marker = 'o', s=200);
          ax.scatter(x = c[0], y = c[1], marker='$%d$'%(i), alpha = 1, s=100);

      # Plotting transformed sample points
      ax.scatter(x = pca_samples[:,0], y = pca_samples[:,1], \
                 s = 150, linewidth = 4, color = 'black', marker = 'x');

      # Plot title
      ax.set_title("Cluster Learning on PCA-Reduced Data - Centroids with Numerical markingr\nTick marks denote Transformed Sample Data");

Listing 9-3Cluster Output Results

在 clusterOutput 函数中,我使用简化数据的输入、质心中心的预测和 PCA 样本来可视化给定样本的聚类中心并向其添加点。在第一组语句中,我首先用名为 plaster 的预测列创建了一个 Pandas 数据帧,然后创建了一个包含预测和简化数据的串联 Pandas 数据帧。我现在生成一个包含 14 乘 18 大小的支线剧情的集群剧情,并使用彩虹色图。然后,我将所有的点按聚类分组,并迭代数据。我还使用 for 循环来绘制中心,用黑色指示器十字标记来表示采样数据。这样,您将能够可视化样本所属的聚类图。

可视化和绘图

接下来,在代码中,我使用了绘图仪函数,它采用干净的数据来减少数据,并将 PCA 作为代码清单 9-4 中的输入。

def biPlotter(cleanData, redData, pca):
    "'
    Building a biplot for PCA of the reduced data and the projections of the original features.
    Variable cleanData: original data, before transformation.
    Creating a pandas dataframe with valid column names
    redData: the reduced data (the first two dimensions are plotted)
    pca: pca object that contains the components_ attribute

    This function returns: a matplotlib AxesSubplot object (for any additional customization)
    This function is inspired by the script by Teddy Roland on Biplot in Python:
    https://github.com/teddyroland/python-biplot
    "'

    fig, ax = plt.subplots(figsize = (14,8))
    # scatterplot of the reduced data
    ax.scatter(x=redData.loc[:, 'Dimension 1'], y=redData.loc[:, 'Dimension 2'],
        facecolors='b', edgecolors="b", s=70, alpha=0.5)

    feature_vectors = pca.components_.T

    # we use scaling factors to make the arrows easier to see
    arrow_size, text_pos = 7.0, 8.0,

    # projections of the original features
    for i, v in enumerate(feature_vectors):
        ax.arrow(0, 0, arrow_size*v[0], arrow_size*v[1],
                  head_width=0.2, head_length=0.2, linewidth=2, color="red")
        ax.text(v[0]*text_pos, v[1]*text_pos, cleanData.columns[i], color="black",
                 ha='center', va="center", fontsize=18)

    ax.set_xlabel("Dimension 1", fontsize=14)
    ax.set_ylabel("Dimension 2", fontsize=14)
    ax.set_title("Principal Component plane with original feature projections.", fontsize=16);
    return ax

Listing 9-4Biplots for Sample Data

在清单 9-4 中,我为简化的 PCA 数据构建了一个双标图,并在原始特征上进行投影。Y 绘图仪功能的数据通过三个参数发送:干净数据、读取数据和最后一个可佩戴的 PCA。定义此双绘图函数的目的是创建双绘图,然后将其返回到颜色。你会注意到我创建了一个尺寸为 14 乘 8 的图形作为支线图,并使用散点图打印维度 1 和维度 2,因为我们使用的是二维平面图。我使用了箭头大小和文本位置来允许从质心投射箭头。在下一个 for 循环中,我使用了原始特征的投影,遍历特征向量,并用红色填充箭头的大小、长度和线宽。下一个文本出现在文本位置,颜色为黑色。我在这个 biplot 中使用了 18 的字体大小。对于维度 1 和 2 的 x 坐标和 y 坐标,我使用了 14 的字体大小;但是,您可以根据自己的要求进行调整。标题使用 16 的字体大小,然后函数将图形返回给调用者。

在清单 9-5 中,我们看到一个函数,它通过在二维空间中可视化 PCA 简化的聚类数据来给出通道输出结果。这里的通道只是数据点,显示所选的样本数据。

def channelOutput(redData, outliers, pca_samples):
      "'
      Here we are Visualizing the PCA-reduced cluster data in two dimensions using the full dataset
      Data is labeled by "Channel" points added for selected sample data
      "'

      # Check that the dataset is loadable
      try:
          full_data = pd.read_csv("retail.csv")
      except:
          print "Dataset could not be loaded. Is the file missing?"
          return False

      # Create the Channel DataFrame
      chl = pd.DataFrame(full_data['Channel'], columns = ['Channel'])
      chl = chl.drop(chl.index[outliers]).reset_index(drop = True)
      labeled = pd.concat([redData, chl], axis = 1)

      # Generate the cluster plot
      fig, ax = plt.subplots(figsize = (14,8))

      # Color map
      cmap = cm.get_cmap('gist_rainbow')

      # Color the points based on assigned Channel
      labels = ['Segment 1/Segment 2/Segment3', 'Retail Customer']
      grouped = labeled.groupby('Channel')
      for i, chl in grouped:
          chl.plot(ax = ax, kind = 'scatter', x = 'Dimension 1', y = 'Dimension 2', \
                     color = cmap((i-1)*1.0/2), label = labels[i-1], s=30);

      # Plot transformed sample points
      for i, sample in enumerate(pca_samples):
            ax.scatter(x = sample[0], y = sample[1], \
                 s = 200, linewidth = 3, color = 'black', marker = 'o', facecolors = 'none');
            ax.scatter(x = sample[0]+0.25, y = sample[1]+0.3, marker='$%d$'%(i), alpha = 1, s=125);

      # Set plot title
      ax.set_title("PCA-Reduced Data Labeled by 'Channel'\nTransformed Sample Data Circled");

Listing 9-5Channel Output Results or Sample Data Projection on the Graph

在通道输出功能的第一部分,我们尝试再次加载数据集,然后构建包含完整数据的通道数据帧。然后我们删除离群值列,因为不再需要它,然后我将减少的数据与通道数据帧连接起来。之后,像我们之前做的那样,用彩虹色地图创建一个 14 乘 8 大小的子图,然后我将这些标签分配给零售客户的三个部分。在 for 循环中,我使用每个通道数据遍历分组的通道数据,以便分别在维度 1 和维度 2 上绘制它们。在下一组 for 循环中,我通过 PCI 样本对其进行了枚举,以便创建一个黑色散点图,餐饮服务提供者函数获取每个样本的输入,然后创建输出。在最后一行,我定义了情节标题。现在我们已经理解了这些函数,让我向你解释我将如何使用它们来执行或实现无监督学习技术。

加载数据集

首先,我们将导入库,然后导入数据集。之后,我们将通过描述来看看数据。现在,因为我们正在进行探索性数据分析,我将从数据集中选择三个样本。

样本的选择已经完成,这样我们就可以探索数据,看看是否有任何模式出现。在选择了三个索引之后,我现在开始按照样本的名称创建这些样本的数据框架。我删除了其余的列,因为它们不是必需的,所以 samples 数据集只包含我将在 sample 数据集中用来计算平均值和中值偏差的样本数据。为了了解特定特征中是否存在任何巨大的异常值,这是必需的。在此之后,我继续创建一个决策树回归评分使用 R2 分数为每个功能。这一步允许我们过滤掉那些不独立的特征。然后,我使用一种自然算法来缩放样本数据,然后生成一个散布矩阵。在此之后,我们查看离群值,为此,有一个函数可以列举给定特性的所有离群值。在去除异常值后,我们留下了好的数据,然后用于主成分分析(PCA)。在拟合好的数据之后,我使用我们之前看到的 PCA 输出函数来获得 PCA 结果,然后我调用 biplotter 函数来创建一个 biplot。然后,我随后调用集群输出函数来显示集群的实现。

从清单 9-6 中,在实现了代码之后,我们可以看到 retail.csv 文件已经被加载,并且有 440 个样本,每个样本有 30 个特性。

# This is Necessary for a newer version of matplotlib
import warnings
warnings.filterwarnings("ignore", category = UserWarning, module = "matplotlib")
warnings.filterwarnings("ignore", category = UserWarning, module = "cross_validationb")
warnings.filterwarnings("ignore", category=DeprecationWarning)
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import pandas as pd
import numpy as np

# Load the retail customers data set
try:
    data = pd.read_csv("retail.csv")
    data.drop(['Region', 'Channel'], axis = 1, inplace = True)
    print "Retail customers data set has {} samples with {} features each.".format(*data.shape)
except:
    print "Data set could not be loaded. Is the dataset missing?"

Retail customers data set has 440 samples with 30 features each.

Listing 9-6Loading the Data Set

简单来说,有 440 行 30 列。现在让我们看看表 9-1 中的详细数据集。

表 9-1

描述数据集

|   |

面包

|

牛奶

|

沐浴皂

|

冷冻食品

|

清洁剂

|   |
| — | — | — | — | — | — | — |
| 计数 | 440.000000 | 440.000000 | 440.000000 | 440.000000 | 440.000000 |   |
| 表示 | 12000.297727 | 5796.265909 | 7951.277273 | 3071.931818 | 2881.493182 |   |
| 标准 | 12647.328865 | 7380.377175 | 9503.162829 | 4854.673333 | 4767.854448 |   |
| 分钟 | 3.000000 | 55.000000 | 3.000000 | 25.000000 | 3.000000 |   |
| 25% | 3127.750000 | 1533.000000 | 2153.000000 | 742.250000 | 256.750000 |   |
| 50% | 8504.000000 | 3627.000000 | 4755.500000 | 1526.000000 | 816.500000 |   |
| 75% | 16933.750000 | 7190.250000 | 10655.750000 | 3554.250000 | 3922.000000 |   |
| 最大 | 112151.000000 | 73498.000000 | 92780.000000 | 60869.000000 | 40827.000000 |   |
|   | 巧克力 | 洗发水 | 再吃 | led 灯泡 | 包装水 | |
| 计数 | 440.000000 | 440.000000 | 440.000000 | 440.000000 | 440.000000 | … |
| 表示 | 1524.870455 | 1172.447727 | 639.102273 | 1838.736364 | 26792.865909 | … |
| 标准 | 2820.105937 | 527.238879 | 369.311261 | 396.316449 | 9186.632655 | … |
| 分钟 | 3.000000 | 192.000000 | 17.000000 | 1164.000000 | 10811.000000 | … |
| 25% | 408.250000 | 751.750000 | 329.750000 | 1495.500000 | 19412.500000 | … |
| 50% | 965.500000 | 1202.500000 | 647.500000 | 1808.000000 | 26530.000000 | … |
| 75% | 1820.250000 | 1625.500000 | 951.250000 | 2169.500000 | 34425.750000 | … |
| 最大 | 47943.000000 | 2020.000000 | 1240.000000 | 2562.000000 | 43085.000000 | … |
|   | 配件设备 | 鼻中隔雷 | 清洁剂。1 | 果汁 | 黄油 |   |
| 计数 | 440.000000 | 440.000000 | 440.000000 | 440.000000 | 440.000000 |   |
| 表示 | 9.875000 | 4457.306818 | 223.106818 | 1288.706818 | 18678.575000 |   |
| 标准 | 5.547501 | 979.522344 | 99.645453 | 754.998453 | 10419.614651 |   |
| 分钟 | 1.000000 | 2851.000000 | 52.000000 | 38.000000 | 202.000000 |   |
| 25% | 5.000000 | 3522.250000 | 138.000000 | 651.000000 | 9690.250000 |   |
| 50% | 10.000000 | 4486.000000 | 222.000000 | 1252.000000 | 19584.000000 |   |
| 75% | 15.000000 | 5326.500000 | 304.250000 | 1931.500000 | 27397.750000 |   |
| 最大 | 19.000000 | 6125.000000 | 539.000000 | 2589.000000 | 35969.000000 |   |
|   | 果冻 | 尿布 | 烤面包机 | 电影 | 爆米花 |   |
| 计数 | 440.000000 | 440.000000 | 440.000000 | 440.000000 | 440.000000 |   |
| 表示 | 219.047727 | 31805.109091 | 120.011364 | 22.984091 | 2300.545455 |   |
| 标准 | 93.574304 | 38012.651316 | 126.492916 | 12.707583 | 1273.548161 |   |
| 分钟 | 59.000000 | 12.000000 | 0.000000 | 1.000000 | 58.000000 |   |
| 25% | 137.750000 | 8612.000000 | 31.000000 | 12.000000 | 1207.500000 |   |
| 50% | 219.000000 | 19022.000000 | 85.000000 | 23.000000 | 2316.500000 |   |
| 75% | 299.000000 | 42623.000000 | 169.000000 | 34.000000 | 3419.000000 |   |
| 最大 | 381.000000 | 371120.000000 | 1122.000000 | 45.000000 | 4512.000000 |   |

这个零售客户的数据集有 440 个样本,每个样本有 30 个特征。

8 rows × 30 columns

我们可以看到,代码输出给出了每个特性或列的平均标准偏差、最小值和最大值。第一列(面包)的平均值为 12,000.29,标准偏差为 12,647,最小值为 3,最大值为 112,151。这意味着,对于面包,该零售连锁店的顾客平均每年订购 12,000 块面包,他们订购了最少 3 块面包,最多 112,151 块面包。由 25%、50%和 75%表示的行代表面包数据的第 25 个百分点、第 50 个百分点和第 75 个百分点。你可以看看从牛奶到爆米花的其余栏目,了解这 30 种商品对这家零售连锁店意味着什么。该数据属于一个特定的零售连锁店一年的数据,它显示了每种商品以美元计算的销售额。这是一个全球数据集,并不构成个人购买交易。它在频道之间被划分。值 2 表示实体商店,值 1 表示渠道是在线零售商。同样,该数据有一个列 region,用于表示销售发生的地区。

现在我转到清单 9-7 中的下一步,它显示了我选择的三个索引,以及 samples Pandas 数据帧的创建和 samples 数据帧的输出。

#   Selecting three indices of my choice from the data set
indices = [225,182,400]

# Creating a DataFrame of the chosen samples
samples = pd.DataFrame(data.loc[indices], columns = data.keys()).reset_index(drop = True)
print "Chosen samples of Retail customers dataset:"
display(samples)
display(samples)
Chosen samples of Retail customers dataset:
   Bread  Milk  BathSoaps  FrozenFood  Detergents  Chocolates  Shampoo  \
0  12680  3243       4157         660         761         786     2008
1    694  8533      10518         443        6907         156      842
2   4446   906       1238        3576         153        1014     1933

   ReadytoEat  LEDBulbs  PackagedWater    ...     FitnessEquipments  \
0         600      1694          36590    ...                     3
1         230      2298          18582    ...                    17
2        1232      1603          26071    ...                     8

   NasalSpray  Detergents.1  Juices  Butter  Jelly  Diapers  Toasters  Movies  \
0        2948           294    1613   33305    349    16628       127      23
1        4236           138    1406   32028    322    42072         7      35
2        5868           270    1134    9964     90     4952        44      23

   Popcorns
0      2291
1      3490
2      2256

[3 rows x 30 columns]

Listing 9-7Selecting Samples

选择三个样本的原因是为了了解数据的情况。如果数据集较大,您可以选择比这更多的样本。但是如果加了五个以上的样本,情节就会变得复杂,难以理解。

可视化样本数据集

在图 9-1 中,我们看到了可视化样本数据集的代码。

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

图 9-1

可视化零售客户样本数据集

pd.DataFrame(samples).transpose().plot(kind='bar', stacked=False, figsize=(8,8), title='Retail customers dataset')
Out[46]: <matplotlib.axes._subplots.AxesSubplot at 0xa1a59860>

我们可以看到,第三个样本对蛋糕和面条的排序较高,对牙膏的排序第三高。样本一在面条、黄油、LED 灯泡和婴儿麦片中含量最高。在记录了三个样本的各种收入后,我们可以继续检查三个样本的平均值和中值。这可以在图 9-2 中看到。

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

图 9-2

平均值和中值的样本比较

# Calculating deviations from Mean and Median
#to check how much the 3 samples deviate from the Center.
delta_mean = samples - data.mean().round()
delta_median = samples - data.median().round()

#display(delta_mean, delta_median)
delta_mean.plot.bar(figsize=(10,4), title='Compared to MEAN', grid=True)
delta_median.plot.bar(figsize=(10,4), title='Compared to MEDIAN', grid=True);

在代码中,我们看到,在第一个样本中,与平均值相比,订购数量最多的商品与洗涤剂有关,这比一般零售店订购的数量要高。同样,黄油也是该样本中订购最多的。从平均值来看,鼻喷剂是该样本零售店订单中最低的一项。同样,尿布也是一种远离平均水平的东西,订购量远低于一般零售店。在第二个样本中,平均值最高的订单是黄油和尿布。最低的订单是面包、蛋糕和包装水。在第三个样本数据中,我们看到了蛋糕、面条和牙膏的最高订单,它们远离平均值。同样,纸尿裤和黄油也是如此,它们的订购量远远低于普通零售店的订购量。既然我们已经了解了比较的含义,那么我们也来看看与中位数的比较。平均值和中位数的趋势没有显著差异。然而,我们确实在中间值图表中发现了一些差异,在样本一中,面包的订购量高于中间值商店。在第二个数据集的情况下,大多数其他项目保持不变;然而,最大的区别是洗发水,它的订单高于商店的中位数。在第三个样本数据集的情况下,平均值和中值几乎相同。

特征工程和选择

现在我们进入下一步,查看每个特征的 R2 分数,以确定其重要性。为此,我们需要一个称为 SCORER()函数的小函数,它将使用决策树回归器来确定特定功能的 R2 分数。我们的要素存储在数据框中,我们将使用 for 循环和 scorer 函数遍历数据框的每一列,以计算其 R2 分数值。

在清单 9-8 中,您可以看到在 dataframe 上运行这个 scorer 函数的输出。

#Importing Libraries
from sklearn.cross_validation import train_test_split
from sklearn.tree import DecisionTreeRegressor

#Broke down the logic into a scoring function and a For loop
def scorer(feature):
    #   Make a copy of the DataFrame, using the 'drop' function to drop the given feature relevant_data = data.drop([feature], axis=1)

    #   Split the data into training and testing sets using the given feature as the target X_train, X_test, y_train, y_test = train_test_split(relevant_data, data[feature], test_size=0.25, random_state=45)

    #   Create a decision tree regressor and fit it to the training set
    regressor = DecisionTreeRegressor(random_state=45).fit(X_train, y_train)

    #   Report the score of the prediction using the testing set
    score = regressor.score(X_test, y_test)

    print("The R2 score for feature {:16} is {:+.5f}".format(feature, score))

for feature in data.columns.values:

    scorer(feature)
The R2 score for feature Bread            is +0.95214
The R2 score for feature Milk             is -0.65329
The R2 score for feature BathSoaps        is +0.93408
The R2 score for feature FrozenFood       is -1.44912
The R2 score for feature Detergents       is +0.73558
The R2 score for feature Chocolates       is -12.74963
The R2 score for feature Shampoo          is -1.06275
The R2 score for feature ReadytoEat       is -0.57883
The R2 score for feature LEDBulbs         is -0.75093
The R2 score for feature PackagedWater    is -1.34695
The R2 score for feature Vitamins         is -0.98001
The R2 score for feature Toothpastes      is -1.26507
The R2 score for feature PainRelievers    is -0.74436
The R2 score for feature FirstAid         is -1.02262
The R2 score for feature Noodles          is -0.73669
The R2 score for feature BabyCereals      is -1.49739
The R2 score for feature Cakes            is -1.12935
The R2 score for feature Sweets           is -1.23246
The R2 score for feature HardwareTools    is -1.44181
The R2 score for feature CannedFoods      is -1.44300
The R2 score for feature FitnessEquipments is -1.51559
The R2 score for feature NasalSpray       is -0.53323
The R2 score for feature Detergents.1     is -1.34752
The R2 score for feature Juices           is -1.14858
The R2 score for feature Butter           is -1.16000
The R2 score for feature Jelly            is -1.04652
The R2 score for feature Diapers          is +0.98407
The R2 score for feature Toasters         is +0.95279
The R2 score for feature Movies           is +0.99948
The R2 score for feature Popcorns         is +0.99792
In [52]:

Listing 9-8Scoring the Features

清单中有两个分数。在清单 9-8 中,我们可以看到面包、香皂、洗涤剂和维生素的 R2 分数为正。其他积极的特征包括尿布、烤面包机、电影和爆米花。负面得分是牛奶、冷冻食品、巧克力(最高为-12)、洗发水、包装水、牙膏、急救用品、面条、婴儿麦片、蛋糕、糖果、五金工具、罐头食品、健身器材、洗涤剂、果汁、黄油和果冻——仅举几例。我不建议我们将具有正分数的特征用于无监督学习的目的,因为这些特征显示了一个特征与另一个正特征之间的某种关系。此外,这些特征提供的信息似乎在很大程度上包含在其他特征中,因此删除它们是合适的,因为它们对于我们的无监督模型来说是多余的。对于负面评分特征,我建议保留这些特征,因为它们不显示与其他特征的关系,因此可以独立于它们来识别客户特定的行为。

在清单 9-9 中,您可以看到删除冗余特性所需的代码。

#Now selecting Only relevant features from the R2 score of each feature
#print(feature)
selected_features=[]
cntftr=0
for feature in data.columns.values:
    scorer(feature)
    if scorer(feature)<=0:
        print("This Feature is fit for selection ", feature)
        print("Counter Feature is: ",cntftr)
        #selected_features[cntftr]=feature
        selected_features.insert(cntftr,feature)
        cntftr=cntftr+1
# Create a data set with only the features with a negative R2 score from above for loop
display(selected_features)
data=data[selected_features]

Listing 9-9Code for Removing the Redundant Features

我在这里没有实现代码来删除这些多余的特性;然而,我肯定会向您展示如何删除冗余特性的代码。这是一个 for 循环,它遍历数据帧的列值,并根据 if 条件创建所有选定要素的列表。if 条件在这里很重要,因为我们使用的是 square 函数,我已经在清单 9-1 中对其进行了概述,我们正在检查该特定特性的值是否小于或等于 0。如果该值为负,那么我们认为该特征适合我们所选的选择。否则,如果该特征的分数大于 0,if 条件将忽略该特征。顺便说一下,你可以根据 R2 分数实现特征选择。

可视化特征关系

接下来,我将使用 Pandas 绘图包为数据中的每对要素绘制散布矩阵。这可以在图 9-3 中详细看到。

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

图 9-3

所有特征的散点图

pd.plotting.scatter_matrix(data, alpha = 0.3, figsize = (24,12), diagonal = 'kde');

在图 9-3 中,虽然特征的散布矩阵很拥挤,但在最左边的图和最上面的图中,我们确实看到了一些具有某些特征的图案,如面包、牛奶、沐浴皂、冷冻食品、洗涤剂、巧克力和洗发水。

data.corr()

为了进一步查看各种特性之间是否存在关系,我在整个数据集上使用了 correlation(输出对于本书来说太长了,所以如果您想详细检查它,可以自己运行命令)。相关表显示,有一些项目或功能之间的相关性很高,如面包和烤面包机、尿布和沐浴露、洗涤剂和尿布、沐浴露和尿布、电影和爆米花。所有这些特征都与相关系数大于 0.9 的值正相关。这意味着人们在这些零售店经常一起购买这些商品。

样本转换

display(log_samples)
      Bread      Milk  BathSoaps  FrozenFood  Detergents  Chocolates  \
0  9.447781  8.084254   8.332549     6.49224    6.634633    6.666957
1  6.542472  9.051696   9.260843     6.09357    8.840291    5.049856
2  8.399760  6.809039   7.121252     8.18200    5.030438    6.921658

    Shampoo  ReadytoEat  LEDBulbs  PackagedWater  ...  FitnessEquipments  \
0  7.604894    6.396930  7.434848      10.507530  ...           1.098612
1  6.735780    5.438079  7.739794       9.829949  ...           2.833213
2  7.566828    7.116394  7.379632      10.168579  ...           2.079442

   NasalSpray  Detergents.1    Juices     Butter     Jelly    Diapers  \
0    7.988882      5.683580  7.385851  10.413463  5.855072   9.718843
1    8.351375      4.927254  7.248504  10.374366  5.774552  10.647138
2    8.677269      5.598422  7.033506   9.206734  4.499810   8.507547

   Toasters    Movies  Popcorns
0  4.844187  3.135494  7.736744
1  1.945910  3.555348  8.157657
2  3.784190  3.135494  7.721349

[3 rows x 30 columns]

Listing 9-10Converting Data to Natural Log

在清单 9-10 中,我使用自然算法缩放数据帧,输出显示在那里。我们这样做是为了进行特征缩放。如果数据不是正态分布,并且平均值和中值变化很大,那么我们可以对搜索数据应用非线性缩放。这里,我没有使用 box Cox 变换测试进行缩放;我使用一种更简单的自然算法。如果您想使用 Python 的 scipy 包,可以对这些数据应用 box Cox 测试。

在图 9-2 中,我们看到了应用自然对数变换后的样本数据的相关矩阵。我们可以看到,就特征之间的相关性而言,有一个显著的变化,我们看到了显著的负相关特征,例如,LED 灯泡与面包的负相关性为-0.87,健身设备与面包的负相关性为-0.9252。这表明我们的日志转换已经成功,我们已经准备好进入下一步识别异常值。尽管为了保持简洁,整个表的输出被截断,但在表 9-2 中,您可以运行图 9-2 中的命令来运行相关表的完整输出。

表 9-2

自然对数变换后的样本相关性

|   |

面包

|

牛奶

|

烤箱

|

电影

|

爆米花

|
| — | — | — | — | — | — |
| 面包 | one | -0.567927 | 0.999984 | -0.934429 | -0.922904 |
| led 灯泡 | -0.874226 | 0.896117 | -0.871473 | 0.98982 | 0.993766 |
| 包装水 | 0.987271 | -0.429787 | 0.988152 | -0.865889 | -0.849917 |
| 维生素 | -0.473998 | -0.455546 | -0.478957 | 0.129318 | 0.098425 |
| 果汁 | 0.235358 | 0.666292 | 0.240837 | 0.12622 | 0.157002 |
| 黄油 | -0.130568 | 0.890186 | -0.124972 | 0.475107 | 0.502236 |
| 果冻 | -0.106274 | 0.878774 | -0.100663 | 0.453439 | 0.480931 |
| 尿布 | -0.570271 | 0.999996 | -0.565627 | 0.825439 | 0.842591 |
| 烤面包机 | 0.999984 | -0.563275 | one | -0.932405 | -0.920717 |
| 电影 | -0.934429 | 0.823827 | -0.932405 | one | 0.999517 |
| 爆米花 | -0.922904 | 0.841053 | -0.920717 | 0.999517 | one |

异常检测和过滤

清单 9-11 显示了异常值检测的代码,然后将其从数据集中过滤出来。

#Identifying Outliers
#Using Counters
from collections import Counter
outliers_counter = Counter()

# For each feature finding out the data points with extremely high or low values - Outliers
outliers_scores = None

for feature in log_data.keys():

    #   Calculate Q1 (25th percentile of the data) for the given feature
    Q1 = np.percentile(log_data[feature], 25)

    #   Calculate Q3 (75th percentile of the data) for the given feature
    Q3 = np.percentile(log_data[feature], 75)

    #   Use the interquartile range to calculate an outlier step (1.5 times the interquartile range) step = 1.5 * (Q3 - Q1)

    empty = np.zeros(len(log_data[feature]))
    aboveQ3 = log_data[feature].values - Q3 - step
    belowQ3 = log_data[feature].values - Q1 + step
    current_outliers_scores = np.array(np.maximum(empty, aboveQ3) - np.minimum(empty, belowQ3)).reshape([-1,1])
    outliers_scores = current_outliers_scores if outliers_scores is None else np.hstack([outliers_scores, current_outliers_scores])

    # Display the outliers
    print("Data points considered outliers for the feature '{}':".format(feature))
    current_outliers = log_data[~((log_data[feature] >= Q1 - step) & (log_data[feature] <= Q3 + step))]
    display(current_outliers)

    outliers_counter.update(current_outliers.index.values)

Data points considered outliers for the feature 'Juices':
        Bread       Milk  BathSoaps  FrozenFood  Detergents  Chocolates  \
64   8.468003   7.112327   8.086410    8.222554    7.128496    7.043160
73   9.898425   8.581482   9.072571    9.003562    6.638568    6.473891
85   9.687630  10.740670  11.437986    6.933423   10.617099    7.987524
123  9.320987   9.284427   9.084097    7.693482    7.588830    4.962845
131  7.650169   6.378426   5.749393    5.846439    4.248495    5.736572
133  9.152075   6.948897   7.118826    6.077642    5.545177    5.981414
134  8.907612   7.540090   7.684324    6.579251    3.850148    6.285998
186  8.009363   6.255750   6.749931    8.151910    6.855409    6.588926
190  9.737197   8.740337   7.591357    8.900004    4.770685    4.158883
193  5.192957   8.156223   9.917982    6.865891    8.633731    6.501290
219  8.332068   5.905362   7.237059    7.743270    4.454347    4.867534
266  6.349139   9.186355  10.007036    7.705713    8.493310    7.848934
267  9.947169   7.108244   7.853993    8.287780    6.602588    8.196437
321  9.122055   7.548029   8.550048    7.906179    5.429346    7.014814
349  8.696343   9.591581   9.929204    7.603399    9.410666    6.098074
371  9.908724   7.542744   7.569928    9.007490    6.573680    6.672033
375  8.672657   7.279319   7.057898    6.391917    6.165418    4.248495
433  7.591862   8.076515   7.308543    7.340187    5.874931    7.278629
...

Listing 9-11Finding Outliers

在清单 9-11 和 9-12 中,我现在开始识别数据集中的异常值。我将使用 collections 包中的计数器库,然后使用 for 循环在每个特性的键之间传递,以确定数据是在四分位数范围内还是在第 75 个百分点到第 25 个百分点之间。Q1(第 25 百分位)和 Q3(第 75 百分位)的 1.5 倍被视为异常值。我们在第三章中也使用了这种方法,所以读者会记得我们使用了同样的方法来寻找异常值。接下来,在确定特征之后,每个特征用它自己的离群值集合来标识,并且结果被显示出来。接下来,我打印出数据点,多个特征被认为是异常值。

min_outliers_count = 2
outliers = [x[0] for x in outliers_counter.items() if x[1] >= min_outliers_count]
print("Data points considered outlier for more than 1 feature: {}".format(outliers))
Data points considered outlier for more than 1 feature: [29, 35, 38, 50, 64, 65, 66, 75, 81, 83, 85, 86, 87, 95, 96, 104, 109, 127, 128, 134, 135, 137, 145, 147, 154, 162, 163, 171, 179, 180, 183, 184, 187, 190, 193, 196, 199, 210, 218, 228, 229, 231, 232, 250, 267, 276, 278, 299, 304, 305, 315, 321, 322, 327, 331, 338, 353, 355, 357, 412, 420, 431, 433]

Listing 9-12Index Values with Outliers in Multiple Features

我们在清单 9-12 中看到,大约有 63 个数据点在不止一个特性中有异常值。在生产环境或商业设置中,您现在需要决定如何处理这些异常值。您可以做出三个决定:一个是不做任何事情,理由是我们将丢失总共 440 行中的 63 行,因此保留它们;第二,你可以删除它们以提高你的模型的准确性;或者最后,您可以用平均值或中值替换这些异常值。在我的例子中,我将把它们从清单 9-13 给出的代码的数据集中删除。

good_data = log_data.drop(log_data.index[outliers]).reset_index(drop = True)

Listing 9-13Getting Good Data by Dropping the Outliers

主成分分析

我现在将应用 PCA,这是一种用于减少特征维数的技术。清单 9-14 给出了应用 PCA 并查看其尺寸值的输出代码。

#   Apply PCA by fitting the good data with the same number of dimensions as features from sklearn.decomposition import PCA
pca = PCA(n_components=len(good_data.columns)).fit(good_data)

#   Transform log_samples using the PCA fit above
pca_samples =pca.transform(log_samples)

# Generate PCA results plot
pcaOutput = pcaOutput(good_data, pca)
# show results
display(pcaOutput)
# Cumulative explained variance should add to 1
display(pcaOutput['Explained Variance'].cumsum())

Dimension 1     0.2925
Dimension 2     0.4495
Dimension 3     0.5200
Dimension 4     0.5760
Dimension 5     0.6255
Dimension 6     0.6706
Dimension 7     0.7132
Dimension 8     0.7528
Dimension 9     0.7900
Dimension 10    0.8237
Dimension 11    0.8566
Dimension 12    0.8853
Dimension 13    0.9108
Dimension 14    0.9266
Dimension 15    0.9416
Dimension 16    0.9546
Dimension 17    0.9662
Dimension 18    0.9739
Dimension 19    0.9811
Dimension 20    0.9867
Dimension 21    0.9897
Dimension 22    0.9924
Dimension 23    0.9947
Dimension 24    0.9969
Dimension 25    0.9980
Dimension 26    0.9989
Dimension 27    0.9998
Dimension 28    0.9998
Dimension 29    0.9998
Dimension 30    0.9998
Name: Explained Variance, dtype: float64

Listing 9-14Applying Explained Variance on PCA

现在,我将通过拟合具有相同维数的良好数据作为特征来应用 PCA,这里我将使用 PCA 输出函数。我从分解库包 sklearn 中导入 PCA,最终结果是 30 个维度中的每一个都有一个解释的方差。如图 9-4 所示。我们可以清楚地看到,解释方差随着维度的增加而增加,维度 1 解释方差最低,维度 30 解释方差最高。

聚类和双标图可视化实现

图 9-4 提供了实现双绘图的代码。

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

图 9-4

尺寸和特征的双标图

在图 9-4 中,我们看到了尺寸和特征的双标图。双标图告诉我们,烤面包机和面包之间有一种关系,可能会经常被这个零售连锁店的顾客一起购买。类似地,面包和牛奶之间也可能有关系,它们一起出现在第 2 维附近。

在代码的最后一部分,我现在在 PCA 上实现聚类,这是一个简化的数据,它用刻度线显示我们选择的样本的输出。我使用 GMM 聚类和轮廓评分库从一个标量矩阵。在代码清单 9-15 中,我们看到了集群的实现。

#Import GMM and silhouette score library
from sklearn.mixture import GMM
from sklearn.metrics import silhouette_score

#Divided the logic into Clustering and Scoring functions
#Then Iterated through the clusters in the identified range

#This function creates Cluster using GMM
def clusterCreator(data, n_clusters):
    clusterer = GMM(n_components=n_clusters, covariance_type="full", random_state=45).fit(data)
    preds = clusterer.predict(data)
    centers = clusterer.means_
    sample_preds = clusterer.predict(pca_samples)
    return preds, centers, sample_preds

#Scoring after creating Clusters
def scorer(data, n_clusters):
    preds, _, _  = clusterCreator(data, n_clusters)
    score = silhouette_score(data, preds)
    return score

Listing 9-15Implementing Clustering

这里我使用了集群创建函数,它初始化 GMM 或者高斯混合模型来创建集群。聚类项目基于来自零售领域的数据集,并使用 PCA 样本在学校函数中进行样本预测。我在通过调用分类创建函数并返回数据和预测的轮廓分数来创建分类后进行评分。在 for 循环中,我在 2 到 10 维的范围内运行集群,并通过创建集群输出对它们进行评分。在这之后,我现在用减少的数据拟合高斯混合模型,然后进行预测并找出每个维度的中心。有了数据后,我将简化的数据传递给聚类输出函数,以生成预测中心和 PCA 样本,这是我们之前看到的,目的是打印聚类维度数据。现在我们来看看基于图 9-5 中“渠道”数据的聚类结果。

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

图 9-5

打印群维度

#Iterate in the clusters and Print silhouette score
for n_clusters in range(2,10):
    score = scorer(reduced_data, n_clusters)
    print "For n_clusters = {}. The average silhouette_score is : {}".format(n_clusters, score)

n_clusters=0

# Resetting as due to loop run before we need to reset values again with 2 cluster components
clusterer = GMM(n_components=2).fit(reduced_data)
predictions = clusterer.predict(reduced_data)
centers = clusterer.means_
sample_preds = clusterer.predict(pca_samples)
# Display the results of the clustering from implementation
clusterOutput(reduced_data, predictions, centers, pca_samples)

现在我们需要开发通道输出,通过调用 channel output 函数清楚地了解数据是如何转换的。在代码清单 9-6 中,我们可以看到基于“通道”数据的聚类结果。

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

图 9-6

基于“渠道”数据的聚类结果

log_centers = pca.inverse_transform(centers)

#   Exponentiate the centers
true_centers = np.exp(log_centers)

# Display the true centers
segments = ['Segment {}'.format(i) for i in range(0,len(centers))]
true_centers = pd.DataFrame(np.round(true_centers), columns = data.keys())
true_centers.index = segments
display(true_centers)
#Compare the True Centers from the Central values Mean and Median
#display(true_centers - data.mean().round())
delta_mean=true_centers - data.mean().round()
#display(true_centers - data.median().round())
delta_median=true_centers - data.median().round()
delta_mean.plot.bar(figsize=(10,4), title='Compared to MEAN', grid=True)
delta_median.plot.bar(figsize=(10,4), title='Compared to MEDIAN', grid=True);

# Display the predictions
for i, pred in enumerate(sample_preds):
    print "Sample point", i, "predicted to be in Cluster", pred
samples

# Display the clustering results based on 'Channel' data
redData=reduced_data
channelOutput(redData, outliers, pca_samples)

我在这个例子中使用了 GMM,但是我也可以使用 K-Means 算法。与 K-Means 相比,GMM 有许多可以调整的参数。这是一种期望最大化算法。与 K-Means 相比,这是一种快速算法,可以用于小样本数据集。它使用马氏距离来计算聚类 [2 ]。选择 GMM 作为样本数据集并不大,GMM 会工作得很好 [2 ]。您是否注意到图 9-6 中的红点表示可能与另一个零售客户链相关的各个细分市场?你能想出他们之间有什么不同的方式吗,比如细分市场 1、细分市场 2 或细分市场 3 的客户是什么样的?它们会是基于地理位置的差异吗?这是你需要与客户管理部门一起坐下来研究的事情,看看这些客户群对企业意味着什么。至此,我结束了机器学习在零售业中的示例实现。在下一章中,我们将看到机器学习在零售运营中的两个案例研究实现。

尾注

  1. 泰迪·罗兰https://github.com/teddyroland/python-biplotGitHub 上的脚本中的双标

  2. 高斯混合, http://scikit-learn.org/stable/modules/mixture.html#mixture

十、零售人工智能案例研究

**免责声明:**本书中的案例研究取自现实生活中的组织。已经注意确保组织的名称及其员工的姓名被更改,并且不与我的客户有任何相似之处。熟悉医疗保健行业的读者肯定会发现这些情况非常实用和有见地。

什么是推荐系统?

推荐系统被在线零售商用来向人们推荐产品。这种实现的好例子包括 Amazon.com 的“推荐给你”、“买了 X 的人也买了”、“你可能喜欢。”我们在其他网站上看到了这种实现,如 Netflix.com 和 Walmart.com,它们有自己的推荐系统,如“客户也考虑过”,“客户也购买了这些产品”,“客户也查看了这些产品。”这是机器学习技术的直接实现——更具体地说,是一种被称为协作过滤的技术。简单来说,这意味着我们正在使用机器学习技术来学习一组客户基于产品或用户信息采取的行动。它也可以被称为分组过滤,我们试图看到用户集体做了什么动作和行为。一旦机器学习算法看到一些模式,就会围绕它建立一个算法,以便观察你的购买行为,并给出类似的建议。基本假设是人们表现出相似的购买行为;例如,如果一个人购买了电视和通用遥控器,那么正在购买电视的第二个人也可能购买通用遥控器。这个例子很好,因为它没有谈论群体行为,但我们可以扩展它,说我们的机器学习算法发现 70%购买电视的用户可能会购买通用遥控器。搜索模式可以由推荐系统算法创建,并且可以用于给出最可能的购买行为模式。使用协同过滤的机器学习的应用需要跨越客户购买行为的各种类别的大型数据集的可用性。这项技术的使用范围没有限制。例如,消费品零售商、高端时尚网上商店、金融产品零售商或在线网站上矿产勘探产品的批发商都可以使用它。协同过滤的目的是找到有相似兴趣的人群,并在此基础上进行推荐。通过购买行为、评级、反馈等来捕捉用户的行为和购买行为。协同过滤用于项目、产品和基于用户的推荐系统。零售店提供的项目或产品形成了创建基于项目的推荐系统的基础,并且用户的行为和偏好被用作基于用户的推荐系统的基础。通常,在实践中,基于项目或产品的协同过滤被发现比基于用户的协同过滤更准确,因为基于用户的方法的主要缺点是人们的口味会随着时间而改变,他们可能不喜欢过去喜欢的东西。考虑这个例子:一个人几个月前买了三本科幻小说,我们选择这个模式推荐给其他正在购买科幻小说的用户。假设我们挑选的第一个购买模式的用户在购买科幻小说 3 个月后突然改变了购买行为,转而购买浪漫小说。如果系统发现了这种模式,并在用户选择科幻小说时推荐浪漫小说,那么推荐就会完全出错。在本章的案例研究中,我将给你一个基于项目的协同过滤的例子。我相信你会喜欢这个案例研究,因为它涉及到一个在线零售商店的内部,以及他们是如何在残酷的竞争中生存和扩大业务的。

案例研究 1:为在线零售市场创建推荐引擎

Aystsaga 是欧洲的一家零售连锁店,为中产阶级的各种客户提供服务。它在苏黎世、巴黎等欧洲主要城市拥有 250 多家零售店。它的零售业务年收入超过 3000 亿美元。这家大型非公开上市公司面临着来自网上零售店的激烈竞争,这些零售店在互联网上如雨后春笋般涌现。为了保持其在零售领域的第四名地位并增加收入,Aystsaga 实现了一个在线零售商城。

Zacky Johannsen 先生是该公司互联网业务的负责人兼首席执行官。他想出了一个想法,即成立一个在线零售部门,并向在线客户宣布建立互联网零售店。虽然自 2014 年在线商店推出以来,在线销售一直在增长,但其他在线零售商店一直在通过提供更好的价格和其他对客户友好的功能,如推荐引擎,来蚕食竞争对手在线销售的收入份额,类似于 Amazon.com 等网站上显示的推荐。扎克先生要求其竞争情报官就今年销售额下降的原因提交一份报告,并质疑 Aystsaga 的竞争对手如何比 Aystsaga 做得更好。Zacky 要求与 Aystsaga 在线零售部门的负责人 Arnold Zaine 进行讨论,并要求他准备好以下议程:

  1. Aystsaga 在线销售的现状

  2. 竞争状态

  3. 促进在线零售销售需要解决的关键问题

Arnold 带着一份报告来参加会议,事实记录在表 10-1 中。Aystsaga 的在线销售数据显示有所增长,但收入一直在下降。

表 10-1

艾斯特萨加的销售数字

|

描述

|

Two thousand and fourteen

美元(百万)

|

Two thousand and fifteen

美元(百万)

|

Two thousand and sixteen

美元(百万)

|

计划

Two thousand and seventeen

美元(百万)

|
| — | — | — | — | — |
| 总数销售 | Four hundred and fifty-one | Six hundred and ninety-four | Seven hundred and twelve | Seven hundred and twenty-six point two four |
| 收入 | One hundred and thirty-two point three | One hundred and sixty-five point five | One hundred and thirty-five point two | One hundred and eight point nine |
| 收入百分比年龄 | 29.3% | 23.8% | 19% | 15% |

Arnold 解释说,虽然他们可以从网上销售逐年增长的事实中得到安慰,但与销售额相比,收入份额一直在急剧下降。他将竞争对手在线商店的激进竞争策略归因于收入下降的主要原因,因为当竞争对手削减利润率以增加销售额时,Aystsaga 不得不降价提供产品。他还指出,竞争对手的商店有更好的程序来保持客户忠诚度,并推动重复订单,或者通过推荐客户可能在他们的网站上购买的产品来增加他们的销售额。例如,Aystsaga 的主要竞争对手能够通过其网站上基于机器学习的在线推荐引擎增加其客户推荐,该引擎是在一年前部署的。阿诺德指出,这是 Aystsaga 网站上没有的东西,Aystsaga 迫切需要建立一个推荐引擎来帮助增加销售。看一下表 10-2 中的重复订单数据,就知道我们在这方面需要帮助。

表 10-2

Aystsaga 在线零售的平均销售数据

|

描述

|

Two thousand and fourteen

美元(百万)

|

Two thousand and fifteen

美元(百万)

|

Two thousand and sixteen

美元(百万)

|
| — | — | — | — |
| 总数销售 | Four hundred and fifty-one | Six hundred and ninety-four | Seven hundred and twelve |
| 每张发票的平均销售额(美元) | One hundred and fifty-six | One hundred and fourteen | Eighty-three |

阿诺德进一步提到,从 2014 年到 2015 年,平均销售额下降了 27%,从 2015 年到 2016 年,平均销售额下降了 27.2%。每张发票平均销售额的下降意味着每位客户的订单都比前一年少。这不仅是一个令人担忧的原因,也意味着需要更仔细地研究这种下降的原因。为了了解客户订购量减少的原因,我们在网上进行了一项客户反馈调查,询问网站的各种功能和客户体验。反馈在圣诞节期间持续了 3 个月,当时销售额非常高。调查结果如表 10-3 所示。

表 10-3

Aystsaga 的调查结果

|

调查结果

|
| — |
| 用户总数 | Five hundred and fifty-one |
| 产品总数 | Thirty-nine |

从调查结果表中,我们可以看到它被呈现给了 551 个用户,他们对总共 39 个产品进行了评级,评级大小为 1719 个评级。阿诺德表示,他们已经收集了调查数据,并需要机器学习工程师的帮助,为他们的在线零售店构建推荐引擎。他们确定了以下需要回答的问题:

  • 调查中哪些产品的评分最高?

  • 用户是否表现出任何品牌忠诚行为?如果是,那么哪个是最顶级的品牌?

  • 能否从数据中构建推荐引擎算法,对同类产品进行精准推荐?如果有,那么解决方案是什么?

  • 调查中最受欢迎的产品是什么?

  • 调查中最受欢迎的产品的相似性得分是多少?(以图形表示的方式给出可视化。)

现在,我将继续为 Arnold 在他们组织的案例研究中提出的问题提供 Python 代码。请注意,我使用 aystsaga.csv 作为数据集,可以从网站 http://www.puneetmathur.me/Book9/aystsaga.csv 访问。Python 代码也可以从 http://www.puneetmathur.me/Book9/aystsaga.py 下载。

在开始回答调查中的问题之前,让我们先用 Python 加载数据(参见清单 10-1 )。

# -*- coding: utf-8 -*-
"""
Created on Sat Jun 30 13:30:46 2018

@author: PUNEETMATHUR
"""
#Loading libraries
import pandas as pd

#Loading the retail dataset
survey=pd.read_csv("aystsaga.csv")

#Looking at the dataset one row
print(survey.head(1))
#Shape of the dataset Rows and Columns
print(survey.shape)

   product_id           product_name  user_id  rating
0          16  Dalmere Chocolate cup      894       3
(1719, 4)

#Looking at the columns in the dataset
print(survey.columns)
Index([u'product_id', u'product_name', u'user_id', u'rating'], dtype="object")

Listing 10-1Loading and Fetching Data

Python 代码首先从 aystsaga.csv 加载数据,然后显示第一行数据,这是 16 product _ name“dal mere Chocolate cup”的 product_id,由 user_id 894 评分,评分为 3。survey.shape 命令显示总共有 1719 行评级和 4 列。接下来,代码 survey.columns 向我们显示了 4 列:product_id、product_name、user_id 和用户在调查中给出的产品评级。请注意,用户购买的数量没有包含在这个数据集中,因为我想保持简单;然而,在零售店中,你会有几千个列,给出更多的数据,如位置、数量、使用的信用卡等。,其中一些是非常敏感的信息。由于您所在国家的数据隐私法,如 GDPR(一般数据保护法规),类似于欧盟的法规,您可能需要就使用此类数据咨询法律专家。接下来让我们看看数据类型,并看看我们是否有任何丢失的值(参见清单 10-2 )。

print(survey.dtypes)
#Are there any Null values in the dataset
print(survey.isnull().any())
product_id       int64
product_name    object
user_id          int64
rating           int64
dtype: object
product_id      False
product_name    False
user_id         False
rating          False
dtype: bool

Listing 10-2Data Set Datatypes and Missing Values Check

从清单 10-2 中我们可以看到,除了保存产品简短描述的 product_name 之外,所有的列都是 int64 或 numerical。我们还看到使用 isnull()。any()函数表示该数据集中没有缺失值。我必须再次告诉你,这在现实世界中很少发生。当数据从一个系统迁移到另一个系统时,比如从 Oracle 迁移到 hadoop 或者从 csv 迁移到 xml,您通常会得到许多垃圾数据和缺失值。在继续下一步之前,您需要像我处理缺失值一样处理它们。由于我们的数据是干净的,现在让我们在表 10-4 中创建一个数据透视表。

表 10-4

创建数据透视表

|

产品名称

|

Aeso 餐巾纸 10 包

|

Aeso 餐巾纸 20 包

|

Aeso 餐巾纸 40 包

|

Aeso 餐巾纸 50 包

|

阿金薄荷卷 10

|

阿金薄荷卷 5

|

阿金薄荷卷 50

|

阿金薄荷卷单份

|

阿金薄荷卷单肉桂

|

阿鲁特涅夫海盐

|

|
| — | — | — | — | — | — | — | — | — | — | — | — |
| 用户标识 1 | 圆盘烤饼 | 圆盘烤饼 | 圆盘烤饼 | 圆盘烤饼 | 圆盘烤饼 | 圆盘烤饼 | 圆盘烤饼 | Four | 圆盘烤饼 | 圆盘烤饼 | … |
| 产品名称 | Mudlok 小麦面包 | Neek 玉米片 | Noit 房屋清洁工 | 皮特雷兹甜蛋糕 | 重磨牙膏 | Serut 鼻巾 | Sirp 马苏里拉奶酪 | Spets 去污剂 | 泰国浓缩果汁 | y sbol 杂志 |   |
| 用户标识 1 | 圆盘烤饼 | 圆盘烤饼 | 圆盘烤饼 | Four | 圆盘烤饼 | 圆盘烤饼 | 圆盘烤饼 | One | 圆盘烤饼 | 圆盘烤饼 |   |

#Creating a pivot table for product ratings
productRatings = survey.pivot_table(index=['user_id'],columns=['product_name'],values='rating')
#Peeking into the pivot table
productRatings.head(1)

在这里的数据透视表中,您会注意到来自 id 为 1 的用户的一行反馈,她对三种产品 Ajnin peppermint rolls SINGLE、Pitrez sweet cake 和 Spets stain remover 的评分分别为 4、4 和 1。但是,您会注意到,对于那些用户没有评级的产品列,存在 NaN 值。这将在解释我们的结果时产生问题,所以让我们在代码的下一部分中消除它们。在下一节中,我实现了以下用例:

作为 Aystsaga 网站的客户,我应该能够根据我目前的购买情况获得推荐,以便我能够再次购买。

为了实现这个用例,重要的是假设客户已经选择了特定的产品,然后查看系统给出了什么建议。所以让我们开始实现清单 10-3 中的下一段代码。

##===========================Customer chooses a product======================================================
#Sample Product rating view assume here that a customer selected the product 'Dalmere Chocolate cup'
#What recommendation are you going to give based on this selection
#Users who bought 'Dalmere Chocolate cup' also bought:
dalmereRatings = productRatings['Dalmere Chocolate cup']
dalmereRatings.head()
Out[233]:
user_id
1    5.0
3    NaN
4    NaN
6    NaN
7    NaN
Name: Dalmere Chocolate cup, dtype: float64

In [234]:
similarProducts = productRatings.corrwith(dalmereRatings)
#Dropping the NA values to get more meaningful data
similarProducts = similarProducts.dropna()
df = pd.DataFrame(similarProducts)
df.head(10)
Out[234]:
                                       0
product_name
Aeso napkins 10 PACK            1.000000
Ajnin peppermint rolls SINGLE   0.021653
Condsi Pen                      1.000000
Dalmere Chocolate cup           1.000000
Deur masscara                   0.188982
Dostixee potato chips           0.476342
Dothis Pins                     0.563854
Ega hair remover               -1.000000
Erutan shampoo                  1.000000
Evol paper cups                -0.228218

Listing 10-3Choosing a Product and Showing Similar Products

在清单 10-3 中,我首先假设顾客选择的产品是 Dalmere 巧克力杯。在这个选择之后,在后台中,为特定产品选择评级,在我们的例子中,显示了来自前七个用户中,用户 ID 给出的评级为 5。对于其他四个用户,给出的评级为 NaN,这意味着用户没有给出该产品的任何评级。在下一段代码中,我现在在产品评级之间建立关联,这是我们的数据透视表,由索引用户 id、列产品名称和值作为评级组成。产品评分和 dalMere 评分之间的相关性,这是我们对 Dalmere 巧克力杯的数据框架,我们假设它是用户选择的产品。在使用相似产品的数据框中,我们获得了相关性,现在我从相似产品数据框中删除 NaN 值。在下一行代码中完成后,我查看数据帧的前 10 个值。我们可以看到,产品 Aeso 餐巾 10 包与 Dalmere 巧克力杯的相关性最高,为 1。同样,我们有产品 Condsi Pen,它与 Dalmere 巧克力杯的相关性也为 1。还可以看到琼脂脱毛仪和达尔米尔巧克力杯呈-1 的负相关。虽然这些结果很好,但是它们没有被排序,所以在下一段代码中,我求解这些乘积。这可以从清单 10-4 中看出。

similarProducts.sort_values(ascending=False)
Out[235]:
product_name
Aeso napkins 10 PACK              1.000000
Thygie fruit juice concentrate    1.000000
Dalmere Chocolate cup             1.000000
Condsi Pen                        1.000000
Erutan shampoo                    1.000000
Pitrez sweet cake                 0.798935
Dothis Pins                       0.563854
Yssbol Magazine                   0.500000
Dostixee potato chips             0.476342
Getty plastic cutlery set         0.335047
Fitre friendship band             0.272375
Deur masscara                     0.188982
Spets stain remover               0.076743
Ajnin peppermint rolls SINGLE     0.021653
Evol paper cups                  -0.228218
Rewop toothpaste                 -0.845154
Neek corn chips                  -1.000000
Ega hair remover                 -1.000000
dtype: float64

Listing 10-4Sorted Values of the Similar Products

如果你仔细观察清单 10-4 中的结果,你会发现其中也有一些虚假的相关性,比如 Condsi Pen 和 Everton 洗发水的高度相关性——仅举几例。这告诉我们,尽管我们进行关联的方法有效,但我们无法从类似的产品中获得 100%准确的结果。您会发现,在为生产环境构建搜索产品时,您的方法可能会给出结果,但它们可能无法令人满意地给出任何有意义的业务建议。在这种情况下,您可能需要采取一种替代方法,例如聚合产品名称和评级,然后尝试实现并查看不同产品之间的相似性。所以为了改进我们的结果,我现在将实现从清单 10-5 开始的代码来移除虚假的结果。

#Now let us get rid of spurious results in the similarities
import numpy as np
productStats = survey.groupby('product_name').agg({'rating': [np.size, np.mean]})
productStats.head()

productStats.sort_values([('rating', 'mean')], ascending=False)[:15]

#I am now getting rid of ratings size greater than 50 to create meaning results which matter to the business
popularProducts = productStats['rating']['size'] >= 50
productStats[popularProducts].sort_values([('rating', 'mean')], ascending=False)[:15]
df = productStats[popularProducts].join(pd.DataFrame(similarProducts, columns=['similarity']))
df.head(15)
df.sort_values(['similarity'], ascending=False)[:15]
Out[241]:
                                (rating, size)  (rating, mean)  similarity
product_name
Aeso napkins 10 PACK                        64        3.468750    1.000000
Dothis Pins                                175        3.645714    0.563854
Dostixee potato chips                      208        3.817308    0.476342
Getty plastic cutlery set                  246        4.077236    0.335047
Fitre friendship band                      198        4.292929    0.272375
Spets stain remover                        127        2.574803    0.076743
Ajnin peppermint rolls SINGLE              256        3.875000    0.021653
Evol paper cups                             90        3.888889   -0.228218

Listing 10-5
Removing Spurious Correlation

从消除虚假关联的结果中可以清楚地看到,我们现在获得的结果比之前获得的产品列表更好。这里我们有评级类似于和评级大小的产品。在这段代码中,对于产品统计数据框中的变量,有一个大于 50 的大小。简单地说,我只选择了那些调查对象或用户 id 数量超过 50 的产品。我还对值进行了升序排序,然后将流行产品的产品统计数据与相似产品的数据框连接起来,以创建一个名为 similarity 的新列,它只不过是每个产品与所选产品的相关值。在图示案例中,我们看到了 Aeso 片装餐巾纸、Dostixee 薯片、Getty 塑料餐具套装、Ajnin 薄荷单层卷、Evol 纸杯、Dothis 别针和 Spets 去污剂等产品,它们有助于对我们选择的产品进行相关性或相似性评分。就网上商店的任何用户的购买行为而言,您能想到这些产品之间的任何关联吗?他们为什么会一起购买这些产品?

如果你看看产品的性质,你就会明白,人们通常在家里聚会时会购买塑料餐具、餐巾、薯片、薄荷卷、纸杯、别针和去污剂等物品。从这个角度来看,这些产品之间的相似性是有道理的。我们也可以在图 10-1 中看到相似性的柱状图。

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

图 10-1

用产品 Dalmere 巧克力杯购买的产品的相似性得分

df['similarity'].plot(kind='bar')
ax = df['similarity'].plot(kind='bar')
x_offset = -0.03
y_offset = 0.02
for p in ax.patches:
    b = p.get_bbox()
    val = "{:+.2f}".format(b.y1 + b.y0)
    ax.annotate(val, ((b.x0 + b.x1)/2 + x_offset, b.y1 + y_offset))

我在代码中使用了一个条形图,通过使用 plot 函数参数 equal bar,使用 x 偏移设置为-0.3,y 偏移设置为 0.2,从该图中详细描述访问对象。最相似的是 Aeso 餐巾 10 包和 Dothis 别针和 Dostixee 薯片。因此,我们看到用户选择的初始 Dalmere 巧克力杯取得了良好的结果。

现在让我们运行另一个产品的这组代码:Aeso 餐巾 10 包。我们可以在图 10-2 中看到选择相似产品的所有结果。与我们在早期 Python 代码集中看到的代码相比,没有任何变化。唯一的变化是产品名称和代码的后续结果:

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

图 10-2

与 Aeso 餐巾纸相似的产品 10 包

#2nd Sample Product rating view
aesoRatings = productRatings['Aeso napkins 10 PACK']
aesoRatings.head()

#Now finding products with similar ratings
similarProducts = productRatings.corrwith(aesoRatings)
similarProducts = similarProducts.dropna()
df = pd.DataFrame(similarProducts)
df.head(10)

similarProducts.sort_values(ascending=False)

#Now let us get rid of spurious results in the similarities
import numpy as np
productStats = survey.groupby('product_name').agg({'rating': [np.size, np.mean]})
productStats.head()

productStats.sort_values([('rating', 'mean')], ascending=False)[:15]

#I am now getting rid of ratings size greater than 20 to create meaning results which matter to the business
popularProducts = productStats['rating']['size'] >= 50
productStats[popularProducts].sort_values([('rating', 'mean')], ascending=False)[:15]
df = productStats[popularProducts].join(pd.DataFrame(similarProducts, columns=['similarity']))
df.head(15)
df.sort_values(['similarity'], ascending=False)[:15]

#Visualization of similarities
df['similarity'].plot(kind='bar')
ax = df['similarity'].plot(kind='bar')
x_offset = -0.03
y_offset = 0.02
for p in ax.patches:
    b = p.get_bbox()
    val = "{:+.2f}".format(b.y1 + b.y0)
    ax.annotate(val, ((b.x0 + b.x1)/2 + x_offset, b.y1 + y_offset))

现在我们来看看结果,我们发现没有任何产品像我们在巧克力杯产品类别中看到的那样具有非常高的相似性得分。这里相似度最高的是盖蒂塑料餐具套装和图钉。虽然这些产品的相似性得分不高,但它们仍然有意义,因为它们都是客户用来满足单一需求的,即购买聚会产品。在部署到产品中之前,需要对这些代码进行现场测试。可以对数百名客户进行一项简短的调查,以了解这些产品的选择以及代码中的建议是否对客户购买相关产品有意义。至此,我总结了第一个案例研究的解决方案。

第二个案例研究是一个基于讨论的案例研究,它讲述了一个为东南亚的零售连锁集团实现会说话的机器人的场景。基于讨论的案例研究是提出问题和数据,但只讨论解决方案而不实现代码。给出一个基于讨论的案例研究的目的是帮助你,读者,发展一种为不同的商业问题提供解决方案的商业思维。您可以参考我在医疗保健部分给出的 birds 的案例研究实现,以实现您的代码解决方案。

案例研究 AMDAP 零售集团的会说话的机器人

AMDAP 集团在东南亚、澳大利亚和新西兰都有商店。这是该地区最大的零售概念店之一。其创始人 Hun Hun Makawaki 先生用了近 20 年的时间,才使该集团达到今天的地位。AMDAP 集团的概念零售店是独一无二的,通过他们的商店向当地人出售异国情调的国际商品来区分自己。例如:在泰国,商店出售来自世界各地的异国水果,如猕猴桃,这些水果在当地市场很难买到;在澳大利亚和新西兰,他们出售来自泰国、印度尼西亚、马来西亚以及其他国家的商品。他们的产品范围从水果和蔬菜到衣服都有,他们还出售异国情调的包装产品,如奶酪、酱料、熟食肉、鲜花、家具等。数字说明了该集团的成功,因为它已从 1998 年在泰国开设的 2 家不起眼的商店发展到 137 家。它现在的年销售额为 12.6 亿美元。

自 2014 年以来,该集团的销售额增长缓慢。该公司实现了一项试点计划,在其商店周围引入销售亭来促进销售;然而,正如我们在表 10-5 中看到的,这并没有给出任何重要的结果。

表 10-5

试点实现前后的销售

|

试点前的商店销售

|

试点后的商店销售

|
| — | — |
| 2.16 亿美元 | 2.07 亿美元 |

顾客可以走到信息亭,查找他们想要搜索的产品或物品。然后,自动售货亭将显示该特定商店中的区域、价格和可供选择的产品。这要求客户正确输入关键字,以便搜索产品。这个信息亭由一个中央商店网络管理,它会通知顾客某个产品是否有货。它还会给顾客一个产品缺货时的日期。这是一个经过精心规划和充分利用技术构建的智能系统,但该实验悲惨地失败了,因为它没有导致实现该系统的商店的销售额上升。在此之后,该公司做了另一个试点,它买了一个会说话的机器人,清单上有无限多的产品。顾客会走上前询问产品的可用性,机器人会在屏幕上显示其状态,并与顾客进行对话。这个实验为商店创造了奇迹,销售额显著增加(35%)。机器人驾驶员的这些号码在表 10-6 中给出。

表 10-6

引入会说话的机器人后商店的销售额

|

试点前的商店销售

|

试点后的商店销售

|
| — | — |
| 2.31 亿美元 | 3.11 亿美元 |

这就是我对这一章案例研究的全部内容。我希望您喜欢浏览案例研究,就像我喜欢向您展示它们一样。试点成功后,Makawaki 先生召集了一次与商店负责人、技术负责人、首席技术官和客户管理负责人的会议。目的是找出为什么这次机器人试验比他们之前试验的售货亭更成功。aMDaP 零售集团客户管理部门负责人 Hun Hun Magawaki 先生说,他的团队对两个试点项目的客户进行了调查,调查结果不言自明。在调查中,客户收到了口头和书面形式的问卷,并被要求阅读他们的体验,并解释他们喜欢和不喜欢正在实现的技术。结果如表 10-7 所示。

表 10-7

客户调查反馈

|

热门调查问题

|

电子信息亭

|

会说话的机器人

|
| — | — | — |
| 你喜欢这项技术的什么? | 轻松找到缺货商品 | 口头回应 |
| 您不喜欢这项技术的哪一点? | 需要打字 | 不是人类的反应 |

Hun Hun Magawaki 先生解释说,接受调查的顾客中有 84%的人表示他们喜欢电子售货亭的功能,因为它可以很容易地找到缺货的商品,而顾客则认为会说话的机器人的口头反应对这项技术非常感兴趣。他们不喜欢电子信息亭的技术实现是因为需要打字,因为他们发现这很费力,多达 84%的受访者说他们不喜欢这项技术。然而,对于会说话的机器人,34%的受访者表示,机器人不会做出类似人类的反应。Hun Hun Makawaki 先生向该组织的创始人建议,该公司引进类似于会说话的机器人的技术,因为人们说话比打字更舒服。

财务主管 Gin Gin Nuchigiwa 先生随后简要报告了每个试点项目的相对实现成本。这在表 10-8 中给出。

表 10-8

飞行员之间的成本比较

|

电子信息亭试点的成本(每单位)

|

会说话的机器人飞行员的成本(每单位)

|
| — | — |
| $70,000 | $250,000 |

我们可以看到,电子信息亭的试点单位成本远远低于一个会说话的机器人的单位实现成本。看到这里,创始人 Hun Hun Makawaki 先生评论说,实现会说话的机器人成本太高;然而,他问技术总部组织是否有可能引入说话亭,因为它们的成本相对较低,并且会给客户提供与会说话的机器人相同的说话体验。当然,不同之处在于,一个会说话的机器人会有一个外观,可以走到顾客面前,但在电子说话亭的情况下,顾客必须走向它。但他说,考虑到电子信息亭的成本优势,如果有可能建造的话,他愿意选择这一方案。

你的主要任务如下:

  • 你认为实现会说话的机器人的第二个试点的销售额增加的原因是什么?你认为飞行员成功的主要原因是什么?是这个想法的新颖性,还是科技像人类一样说话的能力?为什么商店的顾客更喜欢会说话的机器人而不是电子售货亭?

  • 你认为在引进会说话的电子机器人后,一旦这个想法的新鲜感消失,商店里的顾客销售额会再次下降吗?给出你的观点的理由。

  • 您是否同意 Hun Hun Makawaki 先生的观点,即在这种情况下,实现会说话的电子亭是最佳解决方案?

  • 对于带有以下菜单的语音信息亭,您的 Python 实现代码是什么?

    • 搜索产品

    • 提出客户投诉

    • 给你的建议

    • 新优惠

现在我讨论这四个问题的答案。请记住,在案例研究方法中,没有单一的正确或错误答案;但是,您需要给出一个企业可以接受的方案。

在我看来,关于会说话的机器人的第二个试点销售增长的原因的第一个问题是,人类发现说话更容易,因为在零售商店环境中,人们通常会随身携带一些物品或包或其他东西,不允许他们放下这些东西,然后开始打字。此外,说话可以不用手,也不需要手的任何物理参与。所以在店里,通过技术实现客服的最好方式就是直接和他们对话。

关于第二个问题,在我看来,由于会说话的机器人的出现,销售肯定会增加,因为当人们听到这个消息时,他们会去商店购物。然而,我不认为新鲜感的消退会导致销量大幅下降,因为这项技术正在帮助客户,并通过与他们对话来提供更好的服务。因此,我不认为在引入会说话的机器人或售货亭后,销量会大幅下降。如果会说话的机器人不能帮助顾客识别和解决他们的问题,那么这个想法的新颖性肯定会消失。在这种情况下,这个零售团队应该不断听取反馈,改进谈话技术。

这家商店的创始人不想花钱买一个会说话的机器人,并且发现在他的组织中实现起来成本太高,所以他选择了一条中间道路,在这条道路上,他可以让顾客体验到电子亭中会说话的机器人的体验,相比之下,成本要低得多。在我看来,采取中间路线是一个明智的决定,这样可以为企业节省资源。当他们有资金实现时,他们可以考虑实现会说话的机器人。

我告诉过你,对于第四个问题,我不会给你实现这个案例研究的 Python 代码。但是,您可以从医疗保健部分的案例研究中获取 Python 代码,并使用 Pi audio 等 Python 库添加交谈功能,实现语音到文本和文本到语音,以便与客户交谈。您可以直接从我们刚刚完成的本书第十章的案例研究中获取针对您所在部分的建议,并通过文本到语音的实现来实现答案。同样可以搜索产品,这些产品给出库存中可用项目的输出,以及它们的库存状态和数量。您可以首先实现语音到文本,以获取要搜索的产品名称,然后实现文本到语音,以给出关于项目状态的响应。要进行客户投诉,您可以创建一个预建菜单,在该菜单中询问客户的产品名称、账单号和其他类似的详细信息,然后记录客户通过麦克风向电子信息亭说出的投诉。这个简单的实现可以帮助您了解如何实现音频,与客户交谈,并向他们解释主要产品的当前报价。通过这种方式,您可以实现一个简单的解决方案,并了解如何处理零售环境中遇到的情况。我将在本书金融的第三部分通过 Python 库实现音频功能。在案例研究章节 3 中,你可以查阅 Python 库是如何被用来赋予程序音频功能的。

尾注

  1. 泰迪·罗兰https://github.com/teddyroland/python-biplotgithub 上的脚本中的双标

  2. 高斯混合, http://scikit-learn.org/stable/modules/mixture.html#mixture

十一、零售业机器学习要避免的陷阱

这一章是关于零售业的想法,使用机器学习技术将有助于组织将其货币化。我只向大家介绍三个想法,根据我在零售行业的研究,并在咨询了零售领域的专家后,我得出的结论是,这些想法不仅需要更多的关注,而且将成为零售业未来的焦点。我在这一章中告诉你的一些事情可能听起来很牵强,离现实很远,但随着我们的进步,你会意识到这些想法肯定会成形,并会在零售业中实现。当然,这些想法对任何创业公司来说都是不错的选择。这并不是说没有创业公司致力于这些想法,但我会向你展示这些想法的新观点,以及就机器学习而言如何将它们货币化。第一个想法是关于供应链管理,第二个是关于客户管理,第三个是关于物联网在零售中的应用。当我告诉你这些想法的时候,我也会告诉你这些想法目前所处的状态中存在的一些陷阱和危险。

供应链管理和物流

重要的是要明白,在零售领域,机器学习最未充分利用的领域是供应链管理;因此,它有很大的实现空间。它未被充分利用,因为它涉及物流或货物或产品的物理移动。这是机器学习实现的关键领域,不仅落后,而且需要大量的关注,以便从 GPS 跟踪商品或服务等事情中获得优势。为什么只跟踪和报告重新计划和计划失误?为什么不用机器学习来预测呢?这是一个组织在实现他们的机器学习应用程序时应该避免的陷阱。如果你从零售的角度来看,那么特定商品的到达是与这些商品的及时销售联系在一起的。如果 GPS 传统跟踪系统只是报告,然后零售组织的团队继续采取纠正措施带回错过的计划货物,那么它会花费更多的钱。他们不应该采用这种方法,而是应该变得更加积极主动,预测可能错过时间表的商品,并采取规范措施,使企业能够按时交付物流,从而在时间和错过的销售方面节省大量成本。为了创建这样的预测模型,需要大量的供应链管理数据,以及大量的历史背景。该模型需要了解是什么导致了错过的时间表,哪些类型的货物容易出现错过的时间表,是否有一种模式?有时,错过交付时间表的原因超出了零售组织的界限,是由于外部各方。即使在这种情况下,也应该有从外部组织收集的关于失败交付的数据,并对其进行分析,以找出其中是否存在模式。来自采购或采购部门的数据有助于所有这些分析和模型构建。例如,我为一个客户工作,由于供应商延迟交货,该客户每年损失 5%的收入。在分析数据后,我发现大多数供应都是从该国境内的某个特定位置发生故障的,因为该地区的所有供应商都在超过 50%的时间里在预定交付期后交付关键产品进行销售。在对供应商进行进一步调查后,零售组织发现这是由于高速公路上的交通拥堵,因为交付是通过世界上最著名的国家高速公路之一进行的。这导致平均延迟 2.6 天。然后,零售组织开始探索不经过高流量区域并且能够更快到达仓库目的地的替代递送路线。找到了一条替代路线,需要 7 个多小时才能到达目的地,而且不像高速公路那样拥堵。这为他们节省了 14 个小时的单边交付延迟。有了这一新的安排,货物准时交付,因错过时间表而造成的损失大大减少。当你开始看到问题的模式时,有时你需要对调查结果持怀疑态度。

供应链管理的另一个领域是成本控制。这对供应链经理有效控制成本是一个持续的挑战,因为由于燃料/货运成本的上升,以及 GPS 跟踪等新技术的使用,成本不断上升。这又是一个需要避免的陷阱,因为这会增加产品处理和运输成本。供应链管理的一个关键部分在于处理库存和与之相关的成本效率。应用机器学习来提高库存管理效率,降低处理库存的成本应该是最重要的任务。虽然这个主题是一个很好的案例研究,可以让您更好地理解,但我会尝试给你一些提示,告诉你我是如何为我的一些客户实现这个主题的。图 11-1 给出了一个简单的库存流程

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

图 11-1

库存流程

存货管理

在我们开始研究库存管理之前,我将向您展示一个图表,该图表显示了货物移动到零售商仓库的场景。在第一种情况下,货物直接从制造商转移到零售商的仓库;在第二种情况下,货物从制造商转移到分销商,然后进入零售商的仓库。在图中,为了简化,商品从制造商到零售商仓库的移动过程是供应链管理库存控制的主要理论。如果从制造商到分销商的交货延迟,也会导致零售商的延迟。为了弥补这些延误,零售商在合同中加入了违约金。虽然这可以限制零售商的收入损失,但它不能补偿零售商在顾客面前的商誉损失。商誉不是有形的。在一段时间内,零售商延迟供货会导致长期收入损失。

进入零售商仓库的供应品构成了零售商的库存。如果库存与产品的销售不匹配,那么就会因为产品缺货而导致不满。为了提高效率和降低库存成本而需要建立的任何机器学习模型都必须考虑成本和时间变量。成本变量包括价格、他们订购的产品、捐赠、单位管道成本和单位惩罚成本。销售和时间变量包括特定库存项目的预计销售单位、库存审核间隔、产品的平均运输时间以及产品在仓库中的平均存储时间。库存模型应尝试根据数据预测到货时间间隔的预计目标,并根据产品的运输时间推荐需要订购的库存单位。一些公司遵循库存原则,比如准时制库存管理。所有这些原则都可以纳入这一模式。该模型的目的应该是减少供应商增加的惩罚成本,并最终减少库存控制系统中发生的延迟交货。为了建立这样一个模型,你不仅需要来自零售组织的大量数据,还需要来自外部供应商的大量数据。可能还需要来自外部方的一些信息,如运输商、清算代理和其他此类机构。

客户管理

现在让我们看看客户管理。客户管理包括创建以客户为中心的流程。它从获得一个新客户开始,到衡量他们的需求并迎合他们。它还包括诸如客户关怀、倾听客户抱怨、为有缺陷的产品退款、发放促销产品或为已购买产品的客户换货等活动。

如果招聘涉及到任何一类客户,客户管理都是极其重要的。我想给你另一个例子,从我的客户经营的就业安置服务,处理销售他们的招聘服务,通过他们的网站。公司管理层希望整个招聘过程自动化。自动化将取代所有的人类活动,方法是给那些在网上购买服务的人打电话。从客户购买招聘服务到获得工作机会,一切都是自动进行的,无需任何人工干预。当这种自动化推出时,它显示了由于其广告活动,该公司零售收入的初步增长;然而,上线几周后,该网站的整体收入开始急剧下降。即使增加广告活动也没有带来任何显著的好处。我回顾了他们的整个过程,看看在线服务在自动化前后是如何工作的。机器学习被大量使用,因为需要自然语言处理来理解候选人的简历并将其与职位描述相匹配。一旦他们找到工作列表,就会被发送到候选人的电子邮件 ID。几天后,自动系统会给候选人打电话,要求他们查看电子邮件。然后,客户将呼叫自动 IVR 系统,并对转发的列表给出反馈。候选人的偏好将被存储和分析,以便系统更好地学习。这种发送工作列表的循环将继续下去,直到候选人选择了他们想要申请的工作列表。然后,系统会向公司招聘人员发送一封自动电子邮件,通知他们一名潜在候选人。系统还会每周给招聘人员打电话,通知他们有关工作列表的电子邮件。

整个过程在理论上看起来很奇妙;然而,一个重要的教训是,人类喜欢以自然的方式与人交谈。

在我的坚持下,公司对新的自动化系统进行了一次客户反馈调查。顾客们清楚地指出竞争对手公司的服务要好得多,因为有人打电话给他们,了解他们的偏好。

在从客户那里得到明确的信息后,我要求客户将自动化从一些流程中移除。现在我们让人类和机器一起工作,从顾客那里获得反馈。这个故事的寓意是,人类还没有准备好 100%的自动化。在整个机器学习实现中,人类更喜欢与人类进行一些交互。在向客户介绍了人际互动之后,我们进行了另一项调查,结果要好得多。该公司的收入也出现了惊人的增长。任何组织都应该在不导致不满的情况下实现机器学习。顾客是任何生意的关键,这句话不能忘记。

现在让我们看一下另一个客户场景,他们的客户管理部门有以客户为中心的流程。每一家直接面对消费者销售产品的公司都需要某种反馈或调查,以衡量消费者对其流程的反应或感受。你可以通过该公司网站上的在线调查表或发给客户的电子邮件来了解这种情况。在某些情况下,反馈和调查也是通过聊天机器人完成的。您熟悉一些大公司所做的一些自动化反馈实现,并且在体验过他们的客户服务自动化后,您会发现有时这非常令人恼火。例如,当您开始通过电子邮件与零售组织的客户服务部门进行交互时,您会收到一个自动回复,声明您的请求已被注册,并且您将在一定时间内收到回复。

你希望在此之后听到有人会对你的问题做出回应,这种回应可能会也可能不会解决你的问题。现在,您会注意到,在您发送电子邮件后,会立即有一封自动反馈电子邮件返回给您,询问您对所提供的解决方案的反馈。如果客户服务主管的回复没有解决您的问题,那么反馈电子邮件也会发送给您,要求您做出回应。这被称为机器学习的哑实现,在这种情况下,机器自动从客户那里获取反馈,而不检查给出的响应是否足够。理想情况下,应该有足够智能的机器学习应用程序来理解客户服务主管给出的回复电子邮件是否会真正解决客户的问题。如果客户的问题没有得到解决,那么就不应该发送电子邮件来获得反馈。想象一下,作为一名客户,当您已经对公司的产品或服务问题感到沮丧时,除此之外,您还收到了一封来自客户经理的电子邮件,这封邮件并没有解决您的问题,但随后您又收到了一封要求您提供反馈的电子邮件。这将导致更加沮丧和激动的客户在您的处理器中实现更低的自动化水平。这就是为什么我邀请人们实现真正的智能自动化系统,而不仅仅是愚蠢的自动化。

这种愚蠢的自动化不但不能提高客户满意度,反而会导致客户不满。因此,在零售行业实现机器学习时,我们需要认识到这一缺陷。我想让你看看在表 11-1 中机器学习自动化的愚蠢和智能使用之间的区别。该图显示,愚蠢的机器学习实现只使用基于事件的自动化,就像我们看到自动反馈电子邮件生成被盲目地发送给客户一样。然而,智能机器学习实现将基于正在制定的某些规则来做到这一点,例如客户解决方案是否已经由客户经理适当地给出。哑实现是盲目的,在实现之前不做任何分析。然而,智能实现在其实现之前使用分析。在实现中,在事件被触发之前没有预检查;然而,在智能机器学习实现中,在一些事情发生之前有大量的预先检查。术语实现在不到 50%的时间里对愚蠢的自动化有意义,而本质上智能的实现在超过 50%的时间里有意义。该实现使用低水平的智能;然而,智能实现模仿人类的智能和分析来执行任何种类的自动化。表 11-1 将指导你在你的组织或机器学习项目中实现机器学习。

表 11-1

哑与智能机器学习实现

|

哑机器学习实现

|

智能机器学习实现

|
| — | — |
| 基于事件的自动化 | 基于规则的自动化 |
| 盲目自动化 | 基于分析的自动化 |
| 自动化前无预检 | 自动化前的大量预检 |
| 有意义的时间少于 50% | 50%以上的时间有意义 |
| 智力水平低 | 模拟人类智能分析来执行 |

物联网

我们现在进入下一个话题,就是 IoT(物联网)。通过提供智能设备和服务,这种技术进步与机器学习的使用一起得到了快速实现。沃尔玛(Walmart)等公司很早就在零售业采用了物联网,他们在商店的冷藏单元中使用 RFID 来提醒主动维护的需求,并在这些单元中放置温度传感器。然而,这种实现并不成功。零售物联网的实现发生了巨大的转变,先是以客户服务为目标,然后着眼于提高运营效率 [1 ]。

主要实现是提升线上或店内的客户体验。一个实现示例是通过创建智能手推车来使用物联网,这些手推车可以跟踪购物者或客户在商店内的客流量,并传达客户已经停止的位置以及客户在商店内客流量最大的区域。这种数据收集有助于使用机器学习来了解顾客如何在商店内移动,并增强顾客最受欢迎的商品的展示和促销优惠。顾客客流量数据不仅有助于创建最佳展示,而且有助于找出顾客经常光顾某个促销优惠的原因,并将其与产品促销的成功和失败相关联。如果智能购物车提供的促销活动有最大客流量,则表明客户对该产品感兴趣。如果在进行促销的产品区域没有或只有轻微的脚步声,那么这意味着提供给顾客的产品不能吸引他们停下来看一看。这是智能地使用机器学习和物联网来提升客户体验。1 对我的大多数客户说,任何使用物联网来增强业务的零售组织都应该考虑它提供的投资回报。例如,如果你有一项技术用于一个种植园组织,通过在树木内部放置传感器来监控树木,并将数据集中收集到云存储中,该组织将不得不考虑是否值得在树木监控方面投入如此多的技术投资。这项投资是否带来了成本效益或收入增加?

在零售业,物联网与机器学习的智能应用可以是,每个商店位置的物联网设备跟踪受欢迎产品附近的人的移动,并在产品附近弹出显示屏,以折扣优惠迎合特定客户。这不需要使用任何移动设备或任何应用程序来与用户交互。物联网设备与云存储通信,并使用机器学习来找出客户在商店内的位置是否是热门的促销区域。如果是热门促销区域,则在屏幕上显示促销优惠视频,使客户能够购买产品。物联网的这种使用需要零售组织的巨大投资。投资将集中在位于每个关键商店位置的物联网设备上,然后是从商店每个位置内部收集数据并将其传输到中央云存储的收集设备上。在接收到来自机器学习应用的分析和模式时,智能显示设备将需要打开并显示特定的促销报价,因此这种设置需要在技术上的巨大投资。如果我们忽略创建这样一个智能推广网络的投资回报率,那么过一段时间后,这种投资就会被管理层抛弃。并且需要对由于实现智能促销网络而导致的销售增长进行准确的估计和监控以及跟踪,以将其分类为成功或失败。这是零售组织在零售商店中实现机器学习时应该避免的一个陷阱。

零售组织中还有一种趋势,即跟踪其员工的移动以及他们对增强客户体验的利用。在一个案例中,有一个零售组织使用员工 ID 卡上的跟踪设备来跟踪他们在商店内的活动,并报告他们当前的位置。科技让我们现在就可以做到这一点。该组织的动机是将顾客的活动和雇员的活动联系起来,以发现雇员是否真正在零售店内为顾客服务。初步看这并不使它看起来很糟糕;然而,跟踪员工的活动,然后将其与他们的绩效评估联系起来,可能会使这项技术的使用有点过火。当然,这有助于提高员工的利用率和生产率,但如果员工认为他们受到监控,他们的工资将取决于他们在商店内的位置,这也会让他们士气低落。我们需要避免这一陷阱,即我们让技术与人类互动,因为他们对技术如何被用来跟踪和监控他们很敏感。

我们在本章中看到了三种不同的场景及其在零售行业的实现,我们还讨论了阻碍组织发展的主要陷阱以及技术在组织中的正确实现。我相信这些场景也会帮助你决定在你的项目中改进机器学习的实现。

尾注

  1. 尼基·贝尔德,2017 年 4 月 24 日,上午 10:46 零售物联网: https://www.forbes.com/sites/nikkibaird/2017/04/24/five-retail-iot-use-cases-when-retailers-finally-get-around-to-iot/#65bf88226255?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值