Python-机器学习应用教程-全-

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

原文:Machine Learning Applications Using Python

协议:CC BY-NC-SA 4.0

一、医疗保健中的机器学习概述

2018 年 1 月下旬,我坐在班加罗尔市中心的一家豪华酒店里,与医疗保健领域的一位精英,以及一位著名的国际医生和一位 Python 程序员在一起。讨论围绕如何在医疗保健和金融领域应用机器学习展开。作为我的客户之一,他不仅想获得想法,还想从 Python 代码的实用角度了解如何将数据用于他的大型连锁医院的一些工作,以及他在股票市场、商品投资等领域的投资。在为期 4 天的会议中,我的讨论不仅激烈,而且深入到了医疗保健行业的商业领域。在与我的客户一起研究了我的许多医疗保健项目中的类似模式后,在本书中,我向您展示了一些很好的实现实例,这些实例不仅可行,而且具有很大的商业意义。虽然我所做的大部分工作都属于保密协议的范畴,因此不允许我泄露机密,但在这本书里,你会发现许多来自现实世界的想法的实现的例子。真实的数据没有被使用。我在本书中展示的大部分数据来自公共领域。在本书中,我将使用 Python 版兼容代码。

注意

Python 3 . x 版贯穿全书。如果您有一个旧版本的 Python,代码示例可能无法工作。您需要 Python 3.x 或更高版本才能成功运行它们。

为练习安装 Python

要运行本书中的练习,您需要 Python 3.x。为此,我建议您使用 WinPython。WinPython 是一个简单的 Python 发行版,它不需要像 Anaconda 那样的任何安装。你可以把它复制到 Windows 的一个文件夹里,把你的$PYTHONPATH 改成你复制 WinPython 的文件夹,就大功告成了。WinPython 已经预装了我们在本书中需要的所有主要包。所以如果你使用 WinPython,你会节省时间。你可以从 github 上的 https://winpython.github.io/ 下载 WinPython。根据您的计算机需求,选择 64 位或 32 位版本的发行版。在撰写本书时,WinPython 网站发布了 WinPython 3 . 5 . 4 1gt-64 bit。本书中的所有代码练习都适用于这个版本的 WinPython。然而,如果你想在 Windows 上工作,我会推荐你在 Linux 上安装 Anaconda for Python,这里给出: https://anaconda.org/anaconda/python

技术采用过程

在我们开始看机器学习如何改变医疗保健之前,让我们看看机器学习技术及其采用的过程。这个过程是所有部门和行业共有的。我还将举例说明在医疗保健、零售和金融等领域的采用过程。

根据机器学习的定义,它是计算机科学的一个领域,赋予计算机系统利用数据进行“学习”(即逐步提高特定任务的性能)的能力,而无需显式编程 5 。该定义的后半部分“没有被显式编程”是有争议的,因为几乎没有任何计算机不需要编程来学习。但这对于在商业中应用机器学习来说意味着使用监督和非监督的机器学习技术。监督学习技术是指计算机需要参考过去的数据,并从中对模式、趋势和事实进行明确的分类和解释。然而,对于无监督学习,这不是必需的;我们让计算机自己学习去发现模式、趋势和事实。这也称为自动发现或自动数据挖掘。

所以当我们使用无监督学习时,你可以说计算机程序没有被明确地编程来学习。它通过发现事实、模式和趋势来进行自我学习。但是我们确实通过选择它将用来发现它们的算法来给它编程。它不会自己选择算法。为了给你一个这是如何发生的例子,让我们说我们想要开发一个机器学习算法,用于开发和发现医院消费者数据是否有任何给定的模式来预测特定的门诊病人是否会被医院接纳。简单来说,数据中有没有隐藏的模式可以找出一个病人的侧写?这可以通过两种方式完成:第一种是使用人类机器学习工程师,他可以开始查看医院门诊和住院数据集,然后查看是否有任何模式;第二种方法使用无监督学习,并让计算机选择聚类算法来找出门诊和住院数据集中是否存在任何聚类。我们将在第三章中用代码以及如何实现来看这个例子。现在我们看下图 1-1 机器学习技术采用流程。

现在,让我们看看机器学习技术在行业中是如何采用的。我在这里概述了所有部门共有的流程,不管它们的技术复杂程度如何。在图 1-1 中的技术采用图中,你会发现任何行业都会出现技术采用的四个阶段。第一阶段是快速应用。这个阶段具有某些特征。这是企业试图将机器学习技术应用于低挂果实的阶段。例如,一家公司可能希望自动化其社交媒体分析或情感分析。它还将寻求自动化一些由员工执行的不到 1 分钟的任务。这项任务的技术复杂度将会很低。它还希望其员工列出重复性任务,并针对业务系统中的任何故障或问题进行类似根本原因分析的工作。这里的重点是事后诸葛亮。这意味着企业正在努力关注此类问题,并努力解决那些在过去导致失败的问题。作为该技术的早期采用者,企业仍在试图理解机器学习将如何帮助他们推进其业务增长的应用

img/464968_1_En_1_Fig1_HTML.jpg

图 1-1

机器学习技术采用流程

下一个阶段是机器学习的早期应用,企业将尝试创建学习操作。这意味着他们试图查看过去的数据,并从中找出可以学习的内容。该企业还试图解决低效率测试问题,以便在运营中进行效率审计,帮助找出可以学习和提高业务运营效率的领域。在机器学习的早期应用中,企业也可以考虑降低现有运营的成本。在这方面,它还可以对其雇员进行的各种业务活动进行成本审计。作为早期采用者,它可以瞄准那些高成本、高增长的业务。这也是为了清楚地诊断业务,这将着眼于业务问题和它所面临的问题的原因,并侧重于如何在未来避免它们。企业还会考虑建立问题检测系统,比如建立信用卡欺诈检测系统。在这种情况下,以及在早期的应用程序中,企业试图集中精力并获得后见之明。

现在我转到技术采用的第三阶段,这里有机器学习的辅助应用。这里应用低级智能来帮助专家完成高技能任务。这里自动化的焦点是增强人的能力以促进业务增长和发展。这里的工作是从数据中预测业务需求,并利用这种预测来增强业务。在这里,业务的重点是获得洞察力,而不仅仅是自动化其操作,还包括从隐藏在数据中的隐藏模式、事实或趋势中获益。在这一阶段,组织正在发现其客户、员工和运营,并因此试图了解以业务问题或难题的形式困扰它的事情。这实际上是商业组织开始寻求将机器学习监督技术与非监督技术相结合的地方。

现在,我们进入技术采用的第四个也是最后一个阶段,即使用机器学习的独立操作应用。这是一个公司自动化达到最大能力的阶段。它的大部分操作本质上都是机器人操作。这也是有一个专家人类替换发生的阶段。在这一阶段,对于特定的商业战略或愿景或使命,还存在对未来行动过程的预见和规定。正如我之前所说的,这是人类专家在高水平上被取代或协助的阶段。所以在这里,机器学习被用在机器学习最充分的水平上。机器能够从商业运作中产生的大量数据中学习。它还开发了找出隐藏的模式、事实和趋势的技能,以向其业务领导指明未来的方向修正或行动,以便业务增长。这种机器学习能力还可以用于避免任何种类的灾难,例如可能在未来发生的或者可能反映在商业组织的当前数据中的金融危机或诈骗。在这个阶段,业务正在使用预见,而正是这种预见实际上赋予了其运营的航向修正能力。这是商业运作可以使用机器学习的最大限度,以使在市场中获得相对于竞争对手的优势。我并不是建议整个公司的运作都以自动模式运行。这不是这个阶段所代表的。这种状态是一个拥有智能自动化的组织的状态。通过智能自动化,我的意思是关键的业务功能,比如财务、营销和采购,已经足够自动化,可以提供对业务运营的预见。该公司还能够从其业务环境中收集数据,并避免任何不是由于公司的过错而是由于业务环境的性质(如经济衰退、市场崩溃等)而可能发生的悲剧事件。

我现在以表格的形式呈现每个阶段的特征,以便你对整个过程有一个清楚的了解。

表 1-1

技术采用和进步的阶段

|

阶段

|

特征

|

焦点

|

使用的分析

|

预测水平

|

技术复杂性

|
| --- | --- | --- | --- | --- | --- |
| 快速应用 | 1)技术复杂性低 2)重复和平凡任务的替代 3)常见问题的解决方案 | 解决运营中面临的日常问题 | 描述性分析 | 后见之明 | 低的 |
| 早期应用 | 1)提高效率和生产力 2)降低运营成本 3)诊断业务问题和过去面临的问题 4)构建问题检测系统 | 从其业务中面临的问题中吸取教训 | 诊断分析 | 后见之明 | 中等 |
| 辅助应用 | 1)在业务运营中协助高技能专业人员 2)增强人类专家能力 3)预测业务需求 | 自动化 | 预测分析 | 见识 | 中等至复杂 |
| 独立运营 | 1)机器人操作 2)机器人在向人类专家学习后获得专家能力。3)对未来事件的预测和提前纠正过程的能力 4)认知能力建设 | 认识 | 规定性分析 | 深谋远虑 | 高度复杂 |

从表 1-1 中,我们可以清楚地看到我在图 1-1 中描述的内容,也可以了解技术采用过程的更多方面。我还将通过医疗保健行业中一些组织使用这些功能的例子来详细解释这个表。我在表 1-1 中添加了分析的方面,到目前为止我还没有在本书中讨论过,所以让我们看看这些分析形式是什么,以及它们如何被医疗保健组织所使用。

我已经在我的书《预测项目经理》第 1 卷(第二章,第 17 页)中解释了这些分析类型,我从那里得到了分析的定义 [6 ]。

描述性分析:这个分析领域被调用来了解已经发生的项目的问题的答案,例如“X 项目的状态如何?”

诊断分析:该分析领域用于了解现象的根本原因,如项目的成功或失败。X 项目为什么会失败?我们可以从这个项目的成功中学到什么积极的经验?所有这些问题都可以用诊断分析来回答。

预测分析:这种类型的分析用于确定未来事件的结果,如项目成功或失败、项目预算超支或正在进行的项目的进度延误。

规定分析:在这一分析领域,分析的最大价值是在基于预测分析的预测基础上实现的,它规定了未来应采取的行动。

我曾为美国的一个客户使用描述性分析来检测一家医疗机构在其运营中是否存在种族歧视行为。我得到了病人记录及其背景的数据。患者数据按其种族取向给出,如亚洲人、美洲土著人等。,以及入住 ICU、手术和入住医院病房和私人病房的数据。我必须使用统计技术来分析并给出确凿的证据,证明是否存在种族偏见。通过使用描述性分析和查看患者记录,我可以自信地说,在数据中没有太多这种行为的证据。我的发现后来也被用作法律诉讼的证据。所以我必须小心翼翼地从各个角度分析数据,以确认数据集中不存在这种模式。

每个医疗保健专业人员的生活中都会用到诊断分析。该行业是非常诊断驱动的,因为它试图根据症状来诊断疾病。因此,构建诊断问题的系统并不困难。基因组学是 IBM Watson 项目进行大量诊断研究的领域,因为基因组学处于此类研究的最前沿。IBM Watson 是由 IBM 构建的用于机器学习和人工智能的分析引擎。机器学习引擎 IBM Watson 正在使用其由医学文献、临床研究结果、药典等组成的庞大数据集,帮助找到癌症患者个体化治疗的解决方案。为癌症患者寻找治疗方法。这是一项面向全球肿瘤学家的公共研究,有助于发掘各种癌症的新疗法 [1 ]。

预测分析是机器学习在医疗保健行业的下一个实现阶段。例如,在这样的实现中,重点将是预测可能患癌症的人群。如此开发的系统将能够准确预测可能患某种特定类型癌症的人的年龄和类型。它将有能力创建癌症患者的档案,当这样的人接触到这种类型的分析系统时,它将对可能发生的癌症病例发出警报。

IBM Watson 的基因组学项目正在使用规范分析,它不仅可以诊断疾病,还可以通过查看临床药物试验及其结果来预测癌症类型,然后给出可能的处方。虽然该系统正在接受严格的测试,但当它能够提高其预测和规定的准确性时,它将产生重大的结果。

机器学习如何改变医疗保健

现在让我们看看机器学习正在改变医疗保健行业的一些方式。医疗保健行业是全球劳动密集型行业之一。它需要人类的存在来照顾处于不同疾病阶段的人们。我参加了亚马逊 2017 年在班加罗尔举行的人工智能秘密会议,惊讶地看到一直困扰英国医疗保健行业的员工短缺这一严重问题是如何通过创建人工桌面机器人来解决的,这些机器人将照顾老年患者的需求 (1) 。人工桌面机器人提醒老年患者吃药,跟踪他们的处方,并跟踪和建议唤醒程序。Echo Alexa(众所周知)的核心是亚马逊团队使用其云基础设施亚马逊网络服务(AWS)开发的机器学习。Alexa 的核心是 Python 机器学习代码,通过反馈机制帮助它执行任务并从中学习。这项服务的精彩之处在于,一个普通的 Python 开发者可以使用 Echo Alexa 来使用和开发他们自己的基于亚马逊基础设施的程序和产品。

在 2017 年的另一次 DataHack 峰会上,我有机会看到了 IBM Watson 用于医疗保健服务的演示。开发人员在这个基础分析引擎的基础上构建了自己的应用程序。IBM 已经证明了其分析引擎在基因结果测试、药物发现、肿瘤学和护理管理等应用中的应用。不仅仅是 IBM,其他分析引擎也在另一个领域取得进展,那就是利用成像技术诊断疾病。在医疗保健成像中,如 X 射线图像或 CAT 扫描图像,传统上都是由人类来解释的。然而,我们需要机器来更有效地完成这项工作是有原因的:

  • 随着患者数量的增加,成像数据量增加。

  • 高容量给医生带来的压力使他们更容易出错。机器可以以较低的错误率处理大量成像数据。

  • 医疗保健专业人员无法从成像数据中联系和了解全局。例如,机器可以通过评估大量图像数据集来帮助他们,并确定患者群体或地点群体之间是否存在任何模式或任何联系。

  • 在医生或专家不在时代替他们。这是一个机器可以完成的关键操作——当专家不在时,它可以代替人类专家,甚至在危急情况下提供诊断。在我看来,机器的这一功能将会越来越多地被使用,并且整个图像诊断领域将由机器在没有人工干预的情况下完成的日子不远了。

  • 药物研发是医疗保健行业的一个非常关键的领域。制药公司对癌症或艾滋病毒等疾病的研究正在持续进行。机器学习正在通过分析医学数据和提供药物反应的预测模型来帮助加快药物发现,甚至在药物被注射到受控环境中的受试者之前。这节省了时间和金钱,因为药物反应的模拟给出了可能的治疗模式和对药物的反应的估计。

  • 癌症等困难领域的患者研究。在这一领域,有大量数据可用于药物的患者和临床试验。临床试验非常耗时,需要收集人体反应的受试者数据。这或者是侵入性的,例如通过血液测试,或者是非侵入性的,例如通过尿液测试或者将探针放在受试者的某些身体部位。

我从医疗保健专业人士那里听到的一个普遍担忧是,他们担心人工智能会取代他们。这些机器可能会使他们的工作变得多余。这种担心是有根据的,也不是没有证据的。这篇报道来自中国,一个名叫“萧艺”的机器人成功地通过了中国国家医师资格考试,并获得了行医的所有技能。有人说这是一个可怕的趋势。有人说这是机器人将统治人类的一个明显迹象。然而,我说这只是冰山一角。就机器而言,以下是我们在医疗保健领域可能会看到的一些趋势:

  • 机器人首先取代了低收入工作的工人,在这些工作中,人类不想做平凡的工作,例如亚马逊的 Echo Alexa 因员工短缺而取代了老年医疗保健。

  • 机器人成为高级专家的助手,如神经外科医生,并学习诊断和手术技能。

  • 机器人将取代高级专家进行诊断,因为这需要更多的分析和处理。人类无法处理大量信息,也无法发现大数据集中的模式。在这一点上,机器人的诊断准确率要比人类专家高得多。

  • 手术将由人类在机器人的协助下完成。牛津大学外科医生已经证明了这一点。因此,在我看来,随着越来越多的机器人被制造出来为人类做精确的手术并获得成功,它们将与人类专家共同工作,进行复杂的、基于精度的手术,这是可能的。这一趋势将在未来 2 到 3 年内开始显现。他们可以被称为自动医生和引导医生

自动医生将使用无监督学习技术来治疗新发现疾病的患者。

被指导的医生会使用监督学习技术。他们将致力于已知疾病的已知治疗。在第 3 “如何在医疗保健中实现机器学习”一章中,我们将深入探讨一个用于监督学习的 Python 程序的例子

尾注

  1. IBM 沃森基因组, https://www.mskcc.org/ibm-watson-and-quest-diagnostics-launch-genomic-sequencing-service-using-data-msk

  2. https://www.portsmouth.co.uk/news/hampshire-council-to-use-amazon-echo-technology-for-elderly-social-care-patients-1-8122146

  3. 第一次,一个机器人通过了医生执照考试,Dom Galeon, https://futurism.com/first-time-robot-passed-medical-licensing-exam/

  4. 机器人通过了医师执照考试: https://www.thesun.co.uk/tech/4943624/robot-doctor-medical-exam-china-beijing/

  5. https://en.wikipedia.org/wiki/Machine_learning 机器学习的定义

  6. 第 17 页,第二章,预测程序管理器第 1 卷,Puneet Mathur

  7. http://www.ox.ac.uk/news/2016-09-12-world-first-robot-eye-operation# 世界上第一个进行机器眼手术的人

二、医疗保健领域的关键技术进步

情景 2025

在不太遥远的 2025 年,一个晴朗的早晨,一位老太太在她的个人家庭管理设备上收到一个警报,她将在不久的将来患上癌症。这份报告是她的机器人医生在她上周去做检查后发来的。听到这样的消息,她有点震惊。然后,她决定从人类医生那里获得第二种意见。在她的城市里,人类医生的数量很少,而且比机器人医生更贵。所以她决定去看离她家最近的人类医生。她去看医生,并给他看了她的报告,这是机器人医生今天早上发给她的。人类医生仔细看了这份报告,发现机器人提到了 2019 年完成的一项临床研究,该研究证明,连续睡眠障碍超过 3 周的人有 90%的机会患某种癌症。使用安装在患者家中的探针传感器,机器人医生已经检测到她连续 6 周以上的睡眠模式受到干扰。基于这一事实,机器人医生查看了她的生命统计数据,如她的心率、血压、呼吸模式等。,并得出结论,她是在获得癌症的道路上。另一方面,人类医生再次检查她的生命统计数据,并要求她进行一些血液测试和其他必要的测试,以确定她当前的医疗状况。几天后,当她的医疗报告到达时,人类医生宣布她没有任何癌症的迹象。

这是不是听起来有些牵强,有些太遥远了?

这不是不可能的场景,而是一旦机器人医生成为现实,我们可能会目睹的事情。我们在第一章已经看到,中国有一个机器人已经顺利通过体检,取得了医生的医学学位。当你看到这种情况时,你会想到什么问题?如果这样的事情发生在你身上,你会怎么做?你会相信机器人医生吗?你会更信任人类医生吗?在人类医生给了你一份关于你目前医疗状况的干净的账单后,你会认为机器人医生的报告是假的而不予理会吗?一旦我们接受机器人作为医疗保健行业的专家,未来社会将不得不处理这些问题。

如果你注意到了,这是一个人类专家没有能力根据在人类身上观察到的模式开出任何药物的场景。在这种情况下,机器人医生可以根据从其连接的探针或传感器获得的数据,更好地预测和给人类开出纠正疗程的药物。

医疗保健行业尤其关注人类及其生活。这是一个简单的判断错误可能导致病人死亡的行业之一。然而,当我们谈论基于机器学习(ML)建立预测模型时,机器学习是任何机器人背后的大脑,我们知道无论选择什么算法来预测任何数据集的结果,模型的最终预测都会有一定比例的误差。在人类的情况下,人类或人类医生或保健专业人员也容易出错。这就是我们所知的人为错误。霍普金斯医学组织或约翰霍普金斯医学组织最近的一项研究表明,美国所有州的 10%是由于医生的医疗错误而发生的,这是美国第三大死亡原因。因此,如果我们要为人类医生制造一个替代品或竞争对手,我们知道它必须比这个错误率做得更好。只有当它以比人类医生更低的错误率给出预测诊断时,它才能生存。由于我们在医疗保健行业处理人类生活,我们需要一种渐进和谨慎的方式来采用技术,因为很多事情都处于危险之中。要求是建立具有更高精度水平的预测模型的稳健算法。

狭义与广义机器学习

现在让我们来了解机器人背后的大脑,也就是 ML。有两种类型的 ML 应用:一种是狭义的,第二种是广义的。狭义 ML 处理创建程序、算法和机器人软件,以满足一组狭义的活动或技能。在这里,狭义的意思是应用的领域是一种专门的技能。它与专家有关,其目的是在专业技能上模仿并超越人类专家。当有专家可以学习和复制时,狭义的 ML 效果最好。窄 ML 机器人的一个例子是用于心脏手术的机械臂带,例如从动脉中移除血凝块。这个例子是一个机器人,它需要人类的帮助来完成它的操作。我们可以在图 2-1 中看到这一点。

img/464968_1_En_2_Fig1_HTML.jpg

图 2-1

窄 ML 与宽 ML

在图 2-1 中,我们可以清楚地看到狭义 ML 集中在医疗保健、金融和零售等领域。相比之下,广义 ML 是关于建立一个人形机器人,赋予它人工智能(AI)的认知能力和模仿人类身体特征的能力。

现在让我们来看看广义的 ML 应用。在这里,我们谈论的是创造程序、算法和机器人软件来迎合一般技能而不是专业技能。它模拟人类的一般行为,目的是证明机器人的能力等同于人类。最近一个广泛应用人工智能的例子是名为索菲亚的机器人,由于其被证明具有模仿人类对话的能力,该机器人已经获得了沙特阿拉伯王国的公民身份。随着技术的进步,我们将会看到更多的机器人在广泛的 ML 应用中被开发出来。然而,医疗保健行业目前的趋势是狭义地采用机器人及其应用,并帮助模仿或取代新药和其他类似领域的疾病诊断研究专家。我们可以看看表 2-1 的区别。

表 2-1

狭义与广义的机器学习应用

|

应用机器学习

|

应用领域

|

焦点

|

目的

|
| --- | --- | --- | --- |
| 狭窄的 | 专业技能 | 专家能力 | 模仿并超越专家的表现 |
| 辽阔的 | 通用技能 | 一般人类行为能力 | 证明类似人类的能力 |

世界各地医疗保健机构的现状

现在,我想看看全球医疗保健行业的现状。图 2-2 描绘了医疗保健领域正在发生的动荡。

请注意两种对立的力量:一种是传统的医疗保健机构,通常由健康诊所、医生诊所和医院组成。另一组新出现的机构是基于机器人人工智能的。在我参加的 2018 年 3 月在班加罗尔举行的 XIME 医疗保健管理最佳实践国际会议上,这一趋势被清楚地提了出来。您可以通过以下网址了解更多关于大会的信息: http://xime.org/Health%20care%20conference%20report

传统的医疗保健系统从医生的同情心、人情味和治疗中获得价值。与此相反,另一组机构正在迅速崛起。这些机构带来的价值是医疗保健运作的效率和准确性,更好的资源管理,以及避免传染病传播的最少人力接触。这两个系统的目标都是为病人提供更好的护理。在传统观点中,医生是不可替代的,是医疗机构的中心。然而,新的现代观点是,医生的分析能力有限,无法分析大局——因此,这样的机器算法和机器人可以做得更好。我已经在这一章讨论了狭义和广义的 ML 应用。读者应该注意到,基于机器人人工智能和人工智能的机构正试图通过首先瞄准狭窄的人工智能应用来取代传统的医疗保健系统。这里的尝试不是取代医生作为一个整体,而是取代或模仿,然后取代医生或医疗保健专业人员的某些专门功能。

img/464968_1_En_2_Fig2_HTML.jpg

图 2-2

全球医疗保健行业的对立力量

一个用于狭义医疗任务的 ML 的例子来自西门子公司医疗工程部门。他们在计算机断层扫描上进行计算机视觉成像,并通过核磁共振扫描来观察大脑线路的样子。他们有被称为特斯拉机器的大脑解剖机器,我用它来完成这项任务。同一公司的 ML 的另一个应用是 CT 扫描仪,用于参数成像或分子成像,医疗保健工作者已经应用它来显示肿瘤是良性还是恶性。这项研究是基于将人工智能应用于 path lab 机器的 250 幅精选图像而完成的。他们开发了精确的算法,使用特斯拉机器内部的 3D 相机来定位患者,因为这曾经是一项人工辅助的任务,每个人都有自己不同的方法来定位机器内部的患者,有时会导致图像质量差。ML 算法现在能够尽可能快地定位患者,以获得更好的图像。他们还开发了深度学习算法,用于读取胸部 x 光片,并检测 x 光机中的异常。这是一种尝试,用所有摆在他们面前的 X 射线,包括核磁共振成像和 CT 扫描,来取代拥有大量专业知识的放射科医生的专业角色。在同一条线上,西门子开发了一种 MRI 图像指纹技术,使用深度学习来模仿放射科医生的工作。它也是实验室机器人自动化领域的先驱,使用了一种电磁悬浮技术,这种技术被用于世界各地的高速列车。

我现在向读者展示另一个例子,一个组织使用 ML 应用程序开发一个解决方案,以创新的方式克服社会障碍。这家公司是印度的一家初创公司,名为尼拉迈4;这个概念是由两位女性 Geetha Manjunath 和 Nidhi Mathur 提出的,她们创建了这个创业公司。Nidhi 在 XIME Healthcare conference 上展示了其公司开发的用于识别女性乳腺癌的所有解决方案。在像印度这样的国家,传统观念在农村地区盛行,检测乳腺癌的主要障碍是传统系统需要医生触摸患者的乳房来检测可能癌变的肿块。甚至今天使用的主要方法是医生用他/她的手来感觉和查看身体区域是否存在肿块。为了克服这一缺点,Manjunath 和 Nidhi 研究了如何利用技术来帮助诊断乳腺癌,而不使用触摸或侵入性程序或通过乳房 x 线照相术施加压力,这是很痛苦的。因此,他们寻找一种解决方案,通过使用高分辨率、全感知的 ML 热成像,并使用图像来检测癌症的患病率。通过使用高分辨率的热传感设备和人工智能以及 ML,他们能够开发 API,这是非侵入性的,不需要任何测试,也不会给患者带来任何痛苦。他们要求在机器检测癌症患病率以及癌症是恶性还是良性时,脱掉病人的衣服,这与任何人工进行的乳房 x 光检查相匹配。随着时间的推移,我确信算法会自己学习和改进。这种专注于克服医疗保健中的社会问题的创新技术将在人口众多的国家更快地被采用,这些国家存在反对医疗帮助的社会污名,这阻止了医疗帮助作为一种治疗方法在普通人群中的传播。****

****### 机器学习在医疗保健中的重要性

将医疗保健与金融和零售等其他领域区分开来的事实是,医疗保健涉及人类生活,当我们应用 ML 时,我们需要以渐进和谨慎的方式采用技术,因为这里有很多风险。需要具有更高精度水平的预测模型的稳健算法。这可以从一个非常简单的例子中改变,我们建立了一个预测模型,以 95%的准确率预测特定类型的癌症。在这种情况下,预测模型将对 25 名患者进行准确预测,而对另外 5 名患者进行不正确预测。所以被错误预测的病人仍然会认为他们没有患癌症。这就是为什么在医疗保健中应用 ML 需要在生产中部署模型之前进行更多测试的原因。

医疗保健应用机器学习的一些关键领域是:

  1. 疾病识别

  2. 个性化医疗

  3. 药物发现

  4. 药品制造

  5. 临床试验研究

  6. 放射科

  7. 数字健康记录

  8. 疫情爆发预测

  9. 外科机器人

医疗保健的所有这些领域都是医疗保健行业的核心。现在,我们将关注医疗行业的上述领域,并执行我在第一章图 1-1 中讨论的 ML 技术采用过程。这种映射将有助于我们理解这些领域在当前场景中的技术采用过程中所处的位置。通过这样做,我们可以进一步了解在这些特定领域中的每一个领域中会发生什么样的进步。关于如何使用该映射信息的示例,假设您的医院已在心脏外科领域实现了手术机器人。通过从该图表中了解机器人手术在技术采用过程方面的先进程度,我们可以了解该手术应用在未来可能会有什么样的技术进步。

为了对 2018 年的全球医疗保健行业有一个当前的看法,我使用德尔菲法对 18 名医疗保健专业人员进行了一项研究。这是我做的独立研究,没有任何机构赞助。我也没有定期与任何医疗机构直接联系,以便从更独立的角度进行研究。这项研究的目的是听取专家的意见,并找出医疗保健行业中人工智能和 ML 的现状。我在研究中使用了德尔菲法。我们需要了解什么是德尔菲法,以及它如何在这项研究中帮助我们。让我们先来看看这项研究中使用的研究方法。

研究目标 : 本研究的主要目标是利用专家意见找出并绘制人工智能和人工智能的两个参数:(1)人工智能和人工智能在医疗保健行业关键领域的当前技术成熟度水平,以及(2)医疗保健行业内部技术采用流程的参数。

在第一次迭代中,专家组最初确定了 12 个关键领域。然后,专家组重申了这些领域,以找出未来将会发展的最重要的领域。专家组确定了对医疗保健行业进一步发展至关重要的九个医疗保健领域。调查研究不提供关键领域的迭代选择结果,但它从专家选择这九个关键领域的点开始。我已经在本章讨论了这九个领域,从疾病识别到手术机器人。

研究样本:从总共 232 名专家中选出一组专家。专家组由在医疗保健行业工作超过 20 年的医疗保健专业人员组成,他们的工作岗位包括患者护理、医疗保健机构的管理专家、大型医疗保健机构的董事和首席执行官,以及从事医疗保健行业研究并发表论文的学术教授。我涵盖了医疗保健各个领域的所有专家,例如患者管理、药物研究、外科医生、首席执行官和人工智能专家——仅举几例。共有 18 名这样的专业人士被列入本次研究的候选名单。在这项研究中没有缺席或流失。

所需信息:为了做出决策并支持决策,我们提供了各种辅助数据,如关于医疗保健中 ML 和 AI 状态的已发表论文。西门子医疗工程师艾玛·沃森在基因组研究和癌症检测方面的研究就是一个例子。在前面提到的两个参数之间建立映射所需的信息是基于专家对九个领域技术实现现状的理解,从疾病诊断到临床试验研究。向他们提供了关于技术成熟度水平和技术分阶段识别的专家解释的决策。除此之外,没有提供其他信息,所以要小心不要在专家的头脑中产生偏见。这项研究需要的信息包括背景知识、理论知识和专家知识。这项研究还要求专家们运用他们的隐性或固有知识,这些知识是他们长期从事医疗保健行业所积累的。

研究设计概述:

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

  1. 定义研究的目标。

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

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

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

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

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

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

  8. 分析并创建 AI 和 ML 采用的技术成熟度级别和阶段图。

数据收集方式:

关于医疗保健的文献不是本研究要收集的数据。我之前提到的测试研究是在专家的帮助下,将对医疗保健行业的未来至关重要的 12 个关键领域缩小到 8 个。这一点很重要,因为在我们的研究中,我们根据专家过去的经验,对医疗保健行业的发展重点做出了判断。我们使用了 Chittu Okoli 和 Suzanne De Poweski 的一篇名为“德尔菲法”的论文中的德尔菲法作为研究工具和设计考虑和应用的示例 [6 。

问卷调查法用于通过电子邮件在线管理调查和以纸质方式亲自发放问卷向专家收集数据。

数据分析:

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

道德考量:

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

研究的局限性:

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

从第一章中的图 1-1 我们已经知道技术采用有四个阶段。在图 2-3 中,我们看到了这个映射。

img/464968_1_En_2_Fig3_HTML.jpg

图 2-3

医疗保健行业技术采用阶段

在图 2-3 中有两个轴。x 轴代表技术采用阶段,如图 1-1 所示,y 轴显示技术成熟度。技术成熟度应用级别。成熟度应用程序级别分为低、中和高。低表示该技术处于研究阶段,尚未投入生产。中等意味着该技术已经在生产中实现,有些成功和失败,需要更多的研究来推动主流生产。高意味着该技术已经过充分研究,准备投入生产或正在生产环境中使用,如医院等。

表 2-2 和图 2-4 展示了根据德尔菲研究法分析的数据。

表 2-2

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

|

主题

|

保健专家人数

|

迭代次数

|
| --- | --- | --- |
| 德尔菲法 | 邀请 | 入围的 |   |
| 人工智能和人工智能在医疗保健中的应用现状 | Two hundred and thirty-two | Eighteen | four |

我们已经在本章的方法一节中讨论了这些数据。现在,我们来看看医疗保健中人工智能和人工智能的第一参数技术成熟度的数据及其图形表示。

img/464968_1_En_2_Fig4_HTML.jpg

图 2-4

AI 和 ML 在疾病诊断中的地位

在疾病诊断领域,关于医疗保健行业人工智能和人工智能技术成熟度水平的第一个参数,56%的专家认为疾病诊断具有中等成熟度水平。将疾病诊断识别为中等成熟度意味着该技术已经在生产中的疾病诊断领域中实现,但是存在成功和失败,并且需要更多的研究才能进入主流生产。这个领域的一个很好的例子是谷歌用于检测糖尿病眼病的深度学习 [5 ]。

在以传统方式使用人工智能进行疾病检测的过程中,眼科医生使用眼睛后部的照片以及计算机视觉视网膜病(CVR)来检测是否有糖尿病眼病的迹象。CVR 确定图像中存在的损伤类型,其显示眼睛中是否有任何液体渗漏或是否有出血。在眼科医生对视网膜病变进行的如此复杂的分析中,谷歌的糖尿病眼睛检测器能够通过使用 327 名眼科医生提供的 100 和 28,000 张图像的开发数据集来创建一个基于人工智能的系统。深度神经网络对这些糖尿病视网膜病变图像进行了训练,当它应用于超过 12,000 张图像时,它能够与 728 名美国委员会认证眼科医生的大多数决定相匹配。该算法的 AP 分数与眼科医生手动进行的疾病检测分数相比是相同的,都是 9.5 分。

img/464968_1_En_2_Fig5_HTML.jpg

图 2-5

数字健康记录中 AI 和 ML 的状态

现在让我们看看另一个领域:数字健康记录。我们的专家得出结论,这是一个中等水平的技术成熟度,61%的专家同意这一观点。我们可以在图 2-5 中看到,他们中的一部分人(约 28%)也觉得成熟度水平处于较低水平。中等意味着该技术没有进入主流生产,在这里和那里有一些成功和失败。然而,低状态意味着研究还没有进入生产。给你一个在电子健康记录中使用人工智能的应用,有一家名为 Savana(西班牙马德里)的公司已经成功开发了一个使用人工智能 [7 ]重新使用电子健康记录的应用。

该系统最显著的特征是,它使用由医疗从业者在电子健康记录或数字健康记录中书写的自由文本形式的自然语言来分析由医生生成的实时信息。Savannah 系统对其软件记录中的所有患者进行即时统计分析,并提供与用户提供的输入变量相关的结果。它使用自然语言处理在后台完成这一目标。它使用监督 ML 将医生的书面文本分类为背景信息或诊断信息。无监督 ML 技术使用案例来确定单词的语义内容,因为算法在没有任何预定义的语义或语法关系的情况下自主学习。例如,工程师和帕金森有相似或不同的含义,例如萘普生和布洛芬或不对称类似,只是给你一个实际操作的想法。现在让我们看一下图 2-6AI&ML 在数字个性化医疗中的状态。

img/464968_1_En_2_Fig6_HTML.png

图 2-6

人工智能和人工智能在个性化医疗中的现状

现在我们来看看人工智能和人工智能在个性化医疗领域的现状。在四次迭代之后,我们的专家告诉我们,技术采用成熟度处于非常低的水平。我们 83%的专家肯定地告诉我们是这样的。个性化医疗领域也被称为精准医疗。在这里,对疾病的治疗和对病人的预防是基于他们个人的基因变异、他们生活的环境和每个人遵循的生活方式。这就像建立你自己的定制治疗。很明显,如果不使用人工智能,这个职业是不可能的,人工智能运行在超级计算机上,以便使用深度学习进行学习,并开发认知能力。这类似于医生的工作——计算机需要高处理能力。他们使用深度学习算法,并且他们需要他们希望进行诊断的领域的专业诊断知识,例如心脏病科、皮肤科和肿瘤科的医生,等等。

现在我们来看另一个关键领域,即图 2-7 中的流行病爆发预测。

img/464968_1_En_2_Fig7_HTML.jpg

图 2-7

AI 和 ML 在疫情预测中的地位

在图 2-7 中,我们可以清楚地看到,我们的专家告诉我们,技术成熟度处于较低水平。我们的专家中有 67%的人在三轮迭代后有这种感觉,当时达成了共识。一个很好的例子是谷歌流感趋势 [2 ],谷歌能够预测流感在许多国家的传播;然而,它不再公布结果。它过去的工作方式是,谷歌将分析搜索查询,以确定如此大量的查询来自世界哪些地区,它将自动预测这些地区将受到流感的影响。这个项目始于 2008 年,由于各种机构对隐私问题的担忧而被关闭。然而,在后台,谷歌将向不同的公共卫生机构提供这些数据,以帮助他们了解和分析趋势。这种技术是存在的,但在成为主流之前,它需要解决隐私问题。

在图 2-8 中,我们现在来看看人工智能和人工智能在放射学领域的有趣应用。

img/464968_1_En_2_Fig8_HTML.jpg

图 2-8

放射学中人工智能和人工免疫的现状

我们的专家告诉我们,经过四次迭代后,这一领域的技术成熟度很高,72%的专家得出了这一结论。西门子医疗团队的一项显著成就是将神经网络应用于 X 射线等成像,并将这些图像转换为数据,然后像放射科医生一样进行分析。这使用了深度学习,更具体地说,是复制人类神经元的人工神经网络(ann)。据报道,他们以 97%的灵敏度通过胸部 x 光片检测,并以 100%的特异性检测肺结核病例 [3 ] ( https://www.healthcare.siemens.com/magazine/mso-artificial-intelligence-in-radiology.html )。

越来越多的此类应用将会出现,它们可能会集成到医疗设备中,使它们具有自动化的独立机器人功能。这是当今放射学的未来。我们现在来看看图 2-9 中 AI & ML 在下面手术中的状态。

img/464968_1_En_2_Fig9_HTML.jpg

图 2-9

AI 和 ML 在外科中的地位

正如我们在图 2-9 中看到的,在外科领域,我们的专家看到人工智能和人工智能的使用处于非常高的成熟水平,在我们的迭代之后,56%的专家同意这一观点。在割肉这一外科医生的基本技能中,与人类外科医生相比,机器人能够进行精确的切割,对组织的损伤要小得多[8; https://spectrum.ieee.org/the-human-os/biomedical/devices/in-fleshcutting-task-autonomous-robot-surgeon-beats-human-surgeons

有一个名为 STAR(智能组织自主机器人)的机器人,它悬停在患者上方,然后根据算法,进行专家外科医生进行的精确切割,但 STAR 通过包围肌肉造成的伤害较小。这种 STAR 系统能够缝合手术中切下的肉,而且这种缝合比有经验的外科医生的缝合更规则,更防漏。所以这清楚地表明,机器人在外科领域的使用确实处于先进阶段。在图 2-10 中,我们看到了 AI & ML 在药物发现中的状态。

img/464968_1_En_2_Fig10_HTML.jpg

图 2-10

人工智能和人工智能在药物开发中的地位

我们的专家告诉我们,人工智能和人工智能在药物发现领域的应用处于中等技术成熟度水平,这意味着尽管有技术,但仍有许多成功和失败,因此该技术尚未进入主流生产。整个药物发现领域与临床试验密切相关,但实际上,药物发现发生在任何药物的临床试验发生之前很久。药物发现过程需要许多药物测试来检查,并且它是在许多不同的药物化合物上进行的,这可能有助于消除或限制特定疾病的传播。因此,这一发现表明,一种特定的化合物在实验室中对这种疾病起作用,用于毒性测试和其他测试,如人体吸收、运动代谢率等。一旦这些化合物在这些早期实验室测试中显示出结果,它们就会被转移到临床试验中,以获得政府的批准。最大的制药公司正在使用人工智能。像 50 Shades SK 这样的公司正在使用人工智能和 ML 来寻找潜在药物的新化合物。他们还建立模型来预测潜在药物在测试阶段的表现。发现药物及其组合正在使用人工智能开发,用于组合治疗,人工智能正在根据患者的遗传密码创造个性化的药物[9; https://emerj.com/ai-sector-overviews/machine-learning-drug-discovery-applications-pfizer-roche-gsk/ 。在下图 2-11 中,我们看到了 AI & ML 在药品生产中的状态。

img/464968_1_En_2_Fig11_HTML.jpg

图 2-11

AI 和 ML 在药品生产中的地位

现在我们来看看 AI 和 ML 在药物制造领域的状态。这是一个有趣的案例,在四次迭代结束时,我们的专家能够最终告诉我们,药物制造处于所有三个成熟度水平(即低、中和高)。因此,这意味着在药物制造领域,这项技术还处于研究阶段,其中一些还没有投入生产。还有一些技术已经在生产中进行了测试,但尚未进入主流生产环境,如医院。专家们还告诉我们,在药物制造领域,有一些技术已经过充分研究,可以投入生产,或者已经在生产环境中使用。在卡车制造中,机器人和人工智能正被用于制药厂的自动化检测和包装,从而提高效率,并将工人从危险和重复的任务中解救出来。医药制造设施中使用的机器人为笛卡尔并联和选择性柔顺装配机械臂(SCARA)[10; http://www.pharmtech.com/using-robotics-pharmaceutical-manufacturing

默克公司正在其装瓶生产线上使用一个机器人来将配药盖放在瓶装过敏药物上,这提高了其运营效率。Enclave 的机器人越来越多地用于药瓶灌装应用、检查和包装,以及各种药品装配检查——仅举几例。

现在我们来看最后一个也是第九个领域,即下图 2-12 中的临床试验研究。

img/464968_1_En_2_Fig12_HTML.jpg

图 2-12

AI 和 ML 在临床试验研究中的地位

从图 2-12 中,我们可以看到我们的专家告诉我们,它处于中等技术成熟度的阶段,AI 和 ML 状态处于那个水平。经过四次反复,这个小组中 67%的专家能够得出这个结论。这意味着在这个领域有很多研究在进行。然而,有成功也有失败,它需要更仔细的研究,以便将技术转移到主流生产中。麻省理工学院机器人实验室在 2014 年 9 月进行了一项研究[11; https://news.mit.edu/2014/mit-robot-may-accelerate-trials-for-stroke-medications-0211

也有毕马威之声在 2016 年做的研究[12; https://www.forbes.com/sites/kpmg/2016/12/21/using-smart-robots-to-run-clinical-drug-trials/#749ef31f36d2

这有望实现自动化临床试验,以便在数百名患者中证明药物治疗的有效性。由于实验室仍在研究这项技术,它在现实世界中的应用很少,但有很多实验正在进行,以了解它如何帮助最大限度地减少药物发现的临床试验阶段。如果这项技术进入生产,那么它将降低药物发现和临床试验的成本,这可能需要高达 200 万美元,是一件极其昂贵和耗时的事情。

img/464968_1_En_2_Fig13_HTML.png

图 2-13

《医疗保健行业技术采用的阶段,2018》让我们快速了解了本书中医疗保健调查报告的技术采用流程。

现在我们继续我们研究的第二个参数,即医疗保健中技术采用的阶段,我们已经在第一章图 1-1 机器学习技术采用流程中讨论过。正如您在上一章中所回忆的,有四个阶段:阶段 1:快速申请阶段,阶段 2:早期申请阶段,阶段 3:辅助申请阶段,阶段 4:独立运营。这里我们有第二阶段的快速应用,第四阶段分析的独立操作。从图 2-13 中我们可以看到,正如我们的专家组告诉我们的,疾病诊断处于早期应用阶段 2 的状态。数字健康记录处于第二阶段,56%的专家在三次迭代后得出结论。个性化医疗处于第一阶段,即快速应用阶段,我们 83%的专家在四次迭代后得出了这一结论。流行病爆发预测领域处于人工智能和人工智能应用的第 2 阶段,这是我们 67%的专家得出的结论。我们的专家还得出结论,56%的人认为放射学处于第 3 阶段辅助应用阶段,我们已经看到在技术成熟度水平上,西门子等公司在其特斯拉机器中使用了各种应用。对于外科手术,我们的专家在三次迭代后得出结论,50%的人认为 AI 和 ML 在第三阶段为 50%,这是辅助应用阶段。我已经看到机器人手术在主流应用中的应用,如矫正心脏病的手术;这是个陷阱。在药物发现方面,我们的专家得出结论,人工智能和人工智能的应用处于初级阶段,其中 56%的专家得出结论,人工智能和人工智能处于 2 期早期应用水平。对于药物制造,56%的专家得出结论,人工智能和人工智能的使用处于第 3 阶段水平。对于临床试验研究,我们的专家认为 AI 和 ML 的使用处于 2 期早期应用水平。

至此,我们结束了这项研究的演示,我和医疗保健行业的专家花了 3 个多月的时间来实现这项研究。我真的希望它能为读者提供一个简明的观点,让读者了解医疗保健行业在人工智能和人工智能的应用和适应方面的情况。

尾注

  1. 研究提示医疗差错现为美国第三大死亡原因,2016 年 5 月 3 日, https://www.hopkinsmedicine.org/news/media/releases/study_suggests_medical_errors_now_third_leading_cause_of_death_in_the_us

  2. 谷歌流感公开数据: https://www.google.com/publicdata/explore?ds=z3bsqef7ki44ac_#!ctype=m&strail=false&bcs=d&nselm=s&met_s=flu_index&scale_s=lin&ind_s=false&ifdim=region&hl=en_US&dl=en_US&ind=false

  3. 西门子医疗团队: https://www.healthcare.siemens.com/about

  4. 尼拉姆斯: ・T1️ ・T0️ ・T2️

  5. “谷歌的人工智能程序可以检测糖尿病眼病”,2017 年 7 月 17 日, https://research.googleblog.com/2016/11/deep-learningfor-detection-of-diabetic.html 。第二章医疗保健领域的关键技术进步 35

  6. https://www.academia.edu/399894/The_Delphi_Method_As_a_Research_Tool_An_Example_Design_Considerations_and_Applications 德尔菲法

  7. Medrano,I. H .,J. T. Guijarro,C. Belda,A. Ureñ,I. Salcedo,L. Espinosa-Anke 和 h . sag gion“Savana:使用人工智能重新使用电子健康记录”,2017 年 3 月 27 日,国际交互式多媒体和人工智能杂志 4(7):8-12。http://www.ijimai.org/journal/sites/default/files/files/2017/03/ijimai_4_7_1_pdf_22755.pdf

  8. 伊莱扎·斯特里克兰,2017 年 10 月 13 日格林尼治时间 19:30,机器人命名为 STAR(智能组织自主机器人), https://spectrum.ieee.org/the-human-os/biomedical/devices/in-fleshcutting-task-autonomous-robot-surgeon-beats-human-surgeons

  9. 机器学习药物发现应用——辉瑞、罗氏、葛兰素史克等等,最后更新于 2018 年 11 月 29 日,发表于 2017 年 10 月 12 日作者:乔恩·沃克, https://emerj.com/ai-sector-overviews/machine-learning-drug-discovery-applications-pfizer-roche-gsk/

  10. 笛卡尔平行和选择性柔顺装配机械臂(SCARA),詹妮弗·马卡里安,2014 年 11 月 19 日, http://www.pharmtech.com/using-robotics-pharmaceutical-manufacturing

  11. https://news.mit.edu/2014/mit-robot-may-accelerate-trials-for-strokemedications-0211

  12. 使用智能机器人进行临床药物试验,阿什拉夫·谢哈塔,2016 年 12 月 21 日上午 11:45, https://www.forbes.com/sites/kpmg/2016/12/21/using-smart-robots-to-run-clinical-drug-trials/#3d61d05336d2****

三、如何在医疗保健中实现机器学习

我们现在着眼于拥有巨大潜力的医疗保健领域。为此,我们需要仔细检查第二章图 2-2 中的技术映射图。图中的某些区域处于阶段 1,技术成熟度较低。虽然这些都有潜力,但它们并没有给我们带来巨大的机会,因为技术目前还不能支持这些领域的发展。例如,个性化医疗是非常新的,必须进行大量的研究,包括使用人工智能,以使其进入下一阶段。这种研究必须与医疗保健行业紧密联系,以便更快地被采用。接下来是流行病爆发预测的第 2 阶段,该阶段有一些成功和失败,需要解决隐私问题才能进入第 3 阶段。真正的潜力在于第三阶段的领域,该技术已经进入辅助应用阶段。

潜力巨大的医疗保健研究领域

我不会讨论图 2-2 的第三阶段专栏中使用的所有技术,但我会讨论那些拥有巨大潜力的技术。医疗保健中最有前途的三个领域是:

  1. 数字健康记录

  2. 疾病诊断

  3. 放射科

数字健康记录拥有巨大的潜力,原因有三:首先,随着世界人口的增加,医生的病人数量也在增加;第二,每个病人的数据量也会增加。最后,医生只有掌握了患者的完整病历,才能做出正确的治疗决定。数字健康记录拥有巨大潜力还有另一个原因。机器学习和人工智能的进步允许以快速有效的方式分析数据。未来的医院或医疗保健机构将访问数字健康记录或患者记录,当患者授权医疗保健机构查看其记录时,这些记录将被数字化并可供所有医疗保健机构访问。本质上,我们将有个联网的医院,个除了存储病人的私人数据之外,还能访问普通的电子病人健康记录。在美国,任何执业医生都必须保留电子病历。然而,这些数据在医院、政府或任何其他想要治疗患者的机构或个人之间是不可用和不共享的。因此,在未来,将会有一个通用的患者数据库的变化,这将使任何由患者和该国政府授权的医疗机构能够访问共同的病例记录。可能阻碍这种数据共享机制的主要挑战涉及对数据隐私的担忧。然而,如果中央节点机构和政府能够保证数据的适当授权和安全,那么很快就有可能建立这样一个病历数据库,并可能导致建立全球数字健康记录系统。

在不久的将来,我们可以看到技术领域正在开发更好的记录共享机制,将数据隐私和安全等问题抛在脑后。因此,医院不再各自为政,而是开始以相互联系的方式工作。在一个假设的场景中,可能有一个患者,他在接受了特定医院的治疗后,对所给予的治疗线不满意,想要改变他们的医院或医疗保健机构。在这种情况下,他们只需同意与新医院共享所有医疗诊断报告,一旦完成,患者即将入住的新医院将自动访问这些数据。另一个挑战是目前不允许互联医院的概念,那就是不相连的诊断中心。诊断中心是实验室,满足病人的需要,完成他们的实验室测试,如血液或尿液测试。他们根据实验室测试的结果给出报告。因此,在实验室测试完成后,他们会生成大量数据,以测量值的形式显示在报告中。为患者生成的每个报告中的数据目前是通过以 PDF 文件的形式打印报告或通过在纸上打印报告来完成的。没有诊断中心可以上传患者报告的中央机制,并且在医疗保健行业中没有当前的基准可以使他们使用相同的标准来发布他们的报告。所有这些都必须标准化,包括实验室测试报告的格式和中央数据库,患者的电子记录将在那里得到更新。为了从阶段 3 过渡到阶段 4,或者甚至从中等技术成熟度过渡到高技术成熟度,数字健康记录将需要标准化所有上述内容。

现在让我们看看疾病诊断。这一领域有巨大的潜力,因为我们有医生,但在某些地区医生的数量很少。一些人认为医疗保健领域聊天机器人的发展不同于疾病诊断。然而,当我与我们的专家交谈时,他们证实了聊天机器人将成为疾病诊断和病人护理系统的一部分。

任何使用机器学习或人工智能开发的疾病诊断系统都需要具有与人类医生相同的能力。这是技术的狭义应用,也是速赢。我现在引用 Devi Shetty 博士的话,他是班加罗尔 Narayana Health 的主席,来自我在本书前面提到的 XIME Bangalore 会议,“智能软件比医生更聪明。只有 6000 种疾病,其中 1000 种是常见的。这些疾病有大约 50,000 种症状和体征。有十万种化验报告。任何软件都可以很容易地将这些匹配起来以诊断疾病,这需要医生多年的练习。“除了 Devi Shetty 博士所说的,任何机器人软件都需要理解医生是如何工作的。它也可以包括研究外科医生的日志,等等。,才能获得这样的专业知识。我们需要机器进行疾病诊断的主要原因是:

  1. 美国每年有 19.5 万名病人死于医疗诊断错误。

  2. 人类无法处理大量信息,分析这些信息,并将其应用于特定的疾病诊断

  3. 与医生相比,克隆一个专家机器人既便宜又快捷,而克隆专家人类医生在许多国家是被法律禁止的。

  4. 诊断的准确性至关重要,因为错误的诊断会增加患者的医疗成本。使用机器学习,我们可以根据机器人或机器对诊断准确性的反馈进行跟踪、测量、优化、学习和改进。

  5. 为了增加医疗保健对患者的价值,降低患者的诊断成本是绝对必要的。

  6. 价值=在治疗上花费的每一美元的患者健康结果。

如果由于错误的诊断导致病人健康状况不佳,那么医疗保健的价值就会下降。如果病人的健康结果是好的,那么所提供的医疗保健的价值就会上升。因此,我们使用机器学习来增加患者医疗保健的价值是极其重要的。

现在让我们看看放射学及其在医疗保健发展中的潜力。

放射学中常见的机器学习应用

下面是一个列表:

  1. 医学图像分割

  2. 登记

  3. 计算机辅助检测和诊断

  4. 大脑功能或活动分析

  5. 来自 FMR 图像的神经疾病诊断

  6. 使用 自然语言处理(NLP) 的基于内容的图像检索系统,用于 CT 或 MRI 图像和放射学报告的文本分析

机器学习的主要目的是帮助放射科医生对放射学数据做出智能决策,如传统的射线照片、CT、MRI 和 PET 图像以及放射学报告

在我看来,我们即将看到应用机器学习和人工智能第四阶段的出现。基于机器学习的自动放射学疾病检测 和诊断系统将会有快速的进步。这项技术存在于实验室中,并显示出与训练有素、经验丰富的放射科医生相当的测试结果,因此这项技术进入生产应该只需要几年时间,就可以创造出机器人放射科医生[1]。

使用医疗保健数据集

现在,我们将研究一个带有医疗数据集的非常小的 python 代码实现。这将使读者能够理解机器学习在医疗保健领域的实际应用。我已经使用 Python 3.x 运行了这段代码,安装一些必需的 Python 库的过程在下面的练习中给出。我在这里展示的所有练习都是使用 spyder 3.x IDE 运行的,并且经过测试可以在 iPython 内核上运行,所有源代码都可以从我的 github 配置文件( https://github.com/puneetmathurDS/ )中下载。

在我们开始研究机器学习并将预测模型应用于各种数据集之前,我想提醒读者注意,练习中使用的数据不属于我的任何客户,也不来自现实世界中的真实患者。与世界上任何数据集的任何相似之处都仅仅是巧合。本书的作者或出版商对该数据集的真实性或隐私不承担任何责任。发布这个医疗数据集的目的是让读者了解如何在生产环境中对医疗数据集应用机器学习。此数据集不能用于任何其他目的,如临床试验或任何生产或商业相关的电子或其他活动。

机器学习发展的生命周期

在继续查看数据集和构建机器学习模型之前,让我们首先看看什么是典型的机器学习生命周期,并了解它在我们的短应用程序中的实现。这是我向读者展示的一个通用生命周期模型;这可以应用于任何机器学习应用程序的开发,不仅是在医疗保健行业,也可以在零售,金融或其他部门。遵循一步一步的方法可以确保在应用程序中执行机器学习的人不会迷路或错过过程的任何重要部分,并且能够按照专业标准完成他们的应用程序。这种模式没有任何参考价值;因为它是基于我多年来为客户开发机器学习应用程序的经验知识,所以我给出了这个生命周期过程。

在图 3-1 中,我们可以看到机器学习的生命周期从识别业务需求开始。这种业务需求是任何机器学习应用程序的关键,因为它为生命周期开发期间的资源需求提供了理由。业务需求也是我们在生命周期的不同阶段回顾的东西,以便实现项目的团队不会忘记最初的目标。

img/464968_1_En_3_Fig1_HTML.png

图 3-1

机器学习生命周期通用框架

下一步是创建机器学习解决方案架构。在此过程中,机器学习工程师和数据科学团队着手创建一个模板,基于该模板将创建机器学习应用程序。正是在这个阶段,业务需求的概念化和业务需求到技术架构的转换发生了。这也是生命周期的一部分,机器学习应用程序的架构师会回到业务中,以便更好地了解他们的需求,并开始将其转化为可实现的解决方案。

下一个阶段是数据准备阶段,这是一个非常重要的阶段,因为我们需要从数据中确定需要什么样的数据,以确定数据的来源。一旦我们知道构建这个机器学习解决方案需要什么数据,我们就可以知道这样的数据是否存在于构建应用的组织内部,或者它需要来自组织外部。数据准备的下一个阶段是获取数据,构建机器学习解决方案的团队需要获取数据。如果整个数据集很大,那么至少可以使用一个样本数据集,在此基础上构建解决方案。需要从内部和外部来源获取数据。这里最重要的任务是确定数据可用的格式,比如 csv、XML、JSON、Oracle 数据库或 DB2 数据库等平面文件。实现团队根据什么是结构化数据的来源,什么是非结构化数据的来源进行分类。机器学习中对非结构化数据和结构化数据的处理是非常不同的,因此其识别同样重要。在数据准备的下一步中,我们执行数据争论,这主要涉及清理数据。在这里,所有对我们的业务解决方案需求没有任何价值的数据都被删除,只有解决业务需求所需的数据被保留。

数据清理完成后,我们进行机器学习周期的下一步,即探索性数据分析。在探索性数据分析中,我们查看数据的基本统计数据,如平均值、中值和众数,以及不同标签之间的相关性,并确定数据是由数字变量还是分类变量组成,等等。这种探索性的数据分析为模型构建提供了方向。例如,算法的选择取决于变量的种类。在样本中,我们可能有带有分类变量的数据集,如基于其他标签预测的性别(男性或女性)。在这种情况下,我们可能必须使用非定量算法来建立模型。下一步是建立模型,它与探索性数据分析密切相关。在这个过程中,我们进行描述性统计分析,确定我们将使用哪种建模技术,然后建立一个基准预测模型。我们对数据集使用其他方法和算法,并尝试解释和找到创建预测模型的最佳算法。一旦模型的识别完成,下一步就是创建模型验证。我们使用更接近生产的阶段数据集,并观察我们的模型如何表现;如果它给出了好的结果,那么这个模型就被部署和实现了。在这之后,反馈被用来查看它是否满足了它被构建的业务需求。如果有新的业务需求或模型需要处理业务要求的一些事情,那么我们再次回到解决方案架构数据准备、EDA 模型和构建模型的流程,然后我们进行模型验证。本质上,这是一个循环过程,一直持续到机器学习应用程序终止。

实现患者电子健康记录数据集

我们已经查看了整个机器学习应用程序开发生命周期,现在让我们在患者电子健康记录数据集中实现它。该数据集是平面文件的形式,可从以下 URL 获得: http://www.PuneetMathur.me/Book009/Diabetes_Dataset.csv 。我们现在来看看清单 3-1 中的代码,这些代码是关于加载和分析电子健康记录数据集的 python 代码。

# -*- coding: utf-8 -*-
"""
Created on Thu Mar 15 23:46:06 2018

@author: PUNEETMATHUR
"""
#Importing python libraries
import pandas as pd
import os
os.getcwd()

#Reading dataset from flat file
fname="Diabetes_Dataset.csv"
patients= pd.read_csv(fname, low_memory=False)
df= pd.DataFrame(patients)

#Look at the first record
print(df.head(1))

Listing 3-1Code for Loading Electornic Health Record Data Set

在清单 3-1 给出的 Python 代码中,我已经加载了所需的 Python 库。首先,我已经加载了 Pandas 库来加载 csv 平面文件。这是处理 csv 和 JSON 平面文件最有效的库。接下来,我加载了操作系统库来识别当前的工作目录。如果您已经从数据集和 Python 脚本 ElectronicHealthRecord.py 所在的目录启动了 Python,那么您不需要更改目录;否则,您可以使用操作系统包中的 curdir()函数来更改它。你可以从我的 github 档案( http://www.PuneetMathur.me/Book009/ )下载这个。

表 3-1

探索数据集

|

患者 ID

|

性别

|

年龄

|

糖尿病类型

|

糖尿病状况

|

a1c 测试

|

收缩压

|

心脏舒张期

|
| --- | --- | --- | --- | --- | --- | --- | --- |
| 5.557686412 | 女性的 | Twenty-nine | 类型 2 | one | Eight point eight one | One hundred and forty-seven | Ninety-three |

现在我们进入下一步:数据准备。为此,我们需要探究并查看下图 3-2 中数据的形状和大小()。

print(df.size)
8632
print(df.shape)
(664, 13)
print(df.columns)
Index(['Patient ID', 'Gender', 'Age', 'Type of diabetes', 'Diabetes status',
       'A1cTEST', 'BPSystolic', 'BPDiastolic', 'HeartRateBPM', 'BMI',
       'FrozenShoulder', 'CarpalTunnelSynd', 'DupuytrensCont'],
      dtype='object')

Listing 3-2Exploring the Shape and Size of Data Set

在清单 3-2 中,我们可以看到 df.size 语句给出的数据集中总共有 8632 个单元格。我们总共有 664 行和 13 列由 df.shape 语句给出。按 df.columns 语句列出,我们看到从性别、年龄、糖尿病类型、糖尿病状态、糖化试验等开始的各种列。现在让我们看一下数据字典,它描述了每一列及其值。

“患者 ID”:这是唯一的患者 ide,由十进制值表示。

'性别':男性或女性。

“年龄”:以年为单位,给出了患者开始治疗时的总年龄。

“糖尿病类型”:1 型或 2 型是我们正在追踪的两种类型的糖尿病。

“糖尿病状态”:这是宣布一个人是否患有糖尿病的预测值列。0 表示没有糖尿病,1 表示患者有糖尿病。

' A1cTEST ':测试结果以百分比表示。正常:血红蛋白 A1c 水平的正常范围在 4%到 5.6%之间。糖尿病前期:血红蛋白 A1c 水平在 5.7%到 6.4%之间意味着你患糖尿病的几率更高。糖尿病:6.5%或更高的水平意味着你有糖尿病。

“收缩压”:成年人的正常血压收缩压低于 140 毫米汞柱,舒张压低于 90 毫米汞柱。

“舒张压”:成年人的正常血压收缩压低于 140 毫米汞柱,舒张压低于 90 毫米汞柱。

“心率 BPM”:成年人的正常静息心率范围是每分钟 60 到 100 次。

身体质量指数:身体质量指数低于 18.5 公斤/平方米表明你体重过轻。你可能需要增加体重。如果你的身体质量指数是 19 到 24.9 公斤/平方米,你是一个健康的体重,应该努力保持下去。25 到 29 公斤/平方米的身体质量指数被定义为超重。为了你的健康着想,减肥是个好主意,或者至少是为了防止体重进一步增加。身体质量指数超过 30 公斤/平方米被定义为肥胖,意味着你的健康处于危险之中。减肥会改善你的健康。

“FrozenShoulder”:是/否由医生根据对患者的身体检查来决定。

“腕管综合症”:在体检医生确定结果后是/否。谷歌 [1 ]字典对腕管综合征的定义是:

腕管综合征

名词

由于通过手腕前部通道穿过腕骨的主要神经受压而引起的手和手指疼痛。它可能是由持续的重复运动或液体潴留引起的。

DupuytrensCont ':是/否医生在体检和测试结果后决定。

受影响的手指无法完全伸直,这可能会使日常活动变得复杂,例如将手放入口袋、戴上手套或握手。杜普伊特伦挛缩主要影响无名指和小指,最常发生在北欧血统的老年男性 [2 ]。

既然我们已经理解了这个数据集的数据字典,现在让我们仔细看看这个数据,清理它,然后在下面的清单 3-3 中探索它。为此,我们将使用 Python 库和函数。这些通常与机器学习算法一起使用,所以你必须熟悉它们并更详细地理解它们。

#You can use the Describe method to see; however, since our columns are more
#We will use individual functions to do EDA
print(dfworking.describe)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 664 entries, 0 to 663
Data columns (total 13 columns):
Patient ID          664 non-null float64
Gender              664 non-null object
Age                 664 non-null int64
Type of diabetes    664 non-null object
Diabetes status     664 non-null int64
A1cTEST             664 non-null float64
BPSystolic          663 non-null float64
BPDiastolic         663 non-null float64
HeartRateBPM        663 non-null float64
BMI                 663 non-null float64
FrozenShoulder      664 non-null object
CarpalTunnelSynd    664 non-null object
DupuytrensCont       664 non-null object
dtypes: float64(6), int64(2), object(5)
memory usage: 67.5+ KB

Listing 3-3Code for Checking Missing Values

我们注意到在清单 3-3 中没有一列有 null 或空值。然而,在现实世界中,你可能很少会发现这是真的。肯定需要清理数据。对于每个列空值,您可以做三件事。第一种方法是删除整行。数字 2 是用平均值替换行。第三是保持行不变。无论您如何决定您的数据,您都需要仔细分析,看看它将如何影响您的整体结果。删除行或列会导致丢失没有缺失值的列中的宝贵信息。它还有助于了解给定列中丢失的值的百分比。这有助于我们做出深思熟虑的决定。我们现在将进入探索性数据分析的下一步。你会注意到我已经通过删除清单 3-4 中的 PatientID 列使用了 df.working dataframe。这是一个很好的做法,因为它保留了原始的 Pandas 数据帧,而不是删除它。例如,您可以将这些行写成:df- df.drop("Patiend ID ",axis=1)。更容易实现;然而,当您在代码执行过程中发现您采用的代码执行路径不起作用或没有给出任何有意义的结果时,您将需要返回并采用原始数据帧 df,然后进行另一轮代码执行。但是您可能已经丢失了 df.dataframe 中的原始值。因此,我建议您使用另一个数据帧,该数据帧将是工作数据帧,并且作为机器学习应用程序中的编码最佳实践,不要接触原始数据帧。事实上,您应该在您的代码中使用一个替代的 dataframe 名称,只要您可能需要返回到 dataframe 状态,以便查看结果对于满足业务目标是否有意义。现在让我们对数据集做一些探索性的数据分析,如下面的代码清单 3-4 所示。

#Now using a dfworking dataframe to maintain original data in df pandas dataframe
dfworking=df.drop('Patient ID',axis=1)
dfworking.mean()
Out[146]:
Age                 38.899096
Diabetes status      0.240964
A1cTEST              5.890858
BPSystolic         116.278522
BPDiastolic         93.130680
HeartRateBPM        91.812971
BMI                 23.870348
dfworking.median()
Out[148]:
Age                 30.000000
Diabetes status      0.000000
A1cTEST              5.600000
BPSystolic         100.720000
BPDiastolic         91.539001
HeartRateBPM        91.000000
BMI                 24.000000

Listing 3-4Code and Results of EDA

现在我们有了 EDA 的代码和结果,我们需要解释并看看我们的数据告诉我们什么。在我们的数据集中,一个人的平均年龄是 39 岁。普通患者的 A1ac 测试百分比为5.89%,这意味着患者样本处于糖尿病前期。平均收缩压是 116。8,也就是说一般患者血压正常。舒张压是 93。平均而言,这意味着它略高于我们数据集中舒张压标准的基准血压舒张压水平约 90 mmHG。平均每分钟心率(bpm)为 91.8,在 60 至 100 bpm 标准范围内。平均身体质量指数是 23 岁。这表明普通患者具有健康的体重。所以这些是从研究我们数据集的统计矩中得到的重要发现。在查看了数据集中的统计数据之后,我们现在来看另一个定义数据集中变量之间关系的统计度量。请注意,我们的预测指标是糖尿病状态,即 0 表示无糖尿病,1 表示患者有糖尿病。中位数也是一个要寻找的重要状态,通常在数据中有异常值时使用。如果一列或变量的中值和平均值之间存在巨大差异,则表明数据中存在异常值。然而,在我们的数据集中,当我们比较列表 3-5 中给出的平均值和中值之间的变量值时,我们发现年龄与 30 岁的平均值有差异,对于其余的列,差异可以忽略。

现在,我们将检查数据集是否存在异常值。我们将首先看看这些列中的数据是如何分布的。这将使我们对数据的传播有所了解。在代码清单 3-5 中,我现在使用标准差向您展示数据的分布。

dfworking.std()
Out[160]:
Age                19.109127
Diabetes status     0.427991
A1cTEST             1.833379
BPSystolic         27.826840
BPDiastolic         5.112349
HeartRateBPM        3.649444
BMI                 1.990809

Listing 3-5
Spread of Data

我们知道标准差是每个观察值与平均值 [3 ]的差异的汇总度量。

在我们的数据中,我们可以看到 19 岁年龄的标准偏差,这意味着从 39 岁的平均年龄有大约 19 年的差距。我们将忽略糖尿病状态数,因为它没有任何意义,因为它是 0 或 1 的二进制值,并且该值是 0.4,介于 0 和 1 之间。我们将查看 A1c 测试标准偏差,它与平均值相差 1.8%。同样的,收缩压是 27。这意味着高血压有更多的变异,这就是我们样本患者的问题所在。血压舒张压的标准差为 5,当我们将其与血压收缩压的标准差相比时,这似乎不是很高。心率 bpm 标准差为 3.64,也可以忽略不计,身体质量指数为 2 值得关注,这也意味着我们有体重指数变异较高的患者。现在让我们更深入地研究我们的数据,更仔细地观察它是如何传播的,以及我们可以从中解读什么。为此,我们将使用最大值/最小值、分位数峰度和偏度函数,它们是 pandas 数据框的一部分。在代码清单 3-6 中,我们查看数据集中数值变量的最大值。

dfworking.max()
Out[167]:
Gender                 Male
Age                      79
Type of diabetes     Type 2
Diabetes status           1
A1cTEST               10.99
BPSystolic              212
BPDiastolic             126
HeartRateBPM            113
BMI                 30.9951
FrozenShoulder          Yes
CarpalTunnelSynd        Yes
DupuytrensCont          Yes
dtype: object
dfworking.min()
Out[168]:
Gender               Female
Age                      10
Type of diabetes       None
Diabetes status           0
A1cTEST                2.02
BPSystolic           100.01
BPDiastolic              87
HeartRateBPM             88
BMI                 17.1278
FrozenShoulder           No
CarpalTunnelSynd         No
DupuytrensCont           No

Listing 3-6Checking Spread of Variables in Data Set

年龄的最大值是 79,这意味着该样本中年龄最大的患者是 79 岁。最常见的糖尿病类型是 1 型,糖尿病状态是 1,a1c 测试百分比最大值是 10,这是非常高的。血压收缩压值 212,也很高,舒张压值 126,也很高。心率 bpm 最大值 113,也偏高。身体质量指数最大值是 31,这是超重,其余项目有分类值。与最大值类似,我们也有最小值。在这个样本数据集中,患者的最小年龄是 10 岁。最低糖尿病状态为 0,这意味着患者没有糖尿病。100 测试的最小值是 2。这低于正常的血红蛋白 A1c 水平。血压收缩压的最小值是 100。这低于 140 毫米汞柱,对成年人来说是正常的。血压舒张最小值为 87,如果患者的血压低于 90 mmHg,也认为是正常的。如果心率 bpm 在 60 到 100 bpm 的范围内,则认为它是正常的,这里我们有最小值 88,这在正常范围内。身体质量指数最小值是 17。这意味着患者体重过轻,因为低于 18.4。其余的列值是分类的。

检测异常值

现在我们进入检测异常值的任务。除非我们知道每个变量或列在数据集中是否有异常值,否则任何严肃的数据分析都无法进行。为了检测异常值,我们需要首先定义它是什么。这是一个关于离群值计算方法的争论问题;然而,我采用常用的 1.5 倍四分位距的截止值。通过使用熊猫数据框中的最大值和最小值函数,可以知道任何列的数据集范围。为了计算异常值,我将首先取下面清单 3-7 和 3-8 中数字列的最大值和最小值。

dfworking.max()
Out[203]:
Gender                 Male
Age                      79
Type of diabetes     Type 2
Diabetes status           1
A1cTEST               10.99
BPSystolic              212
BPDiastolic             126
HeartRateBPM            113
BMI                 30.9951
FrozenShoulder          Yes
CarpalTunnelSynd        Yes
DupuytrensCont          Yes
dtype: object

Listing 3-7Calculating Maximum Values

我们在清单 3-7 中看到,年龄的最大值是 79,100 测试的最大百分比是 10.9,收缩压是 212,舒张压是 126,心率 bpm 是 113,身体质量指数是 30.99。类似地,我们在清单 3-8 中看到年龄的最小值是 10,对于 100%的测试百分比是 2.2。收缩压为 100.0,舒张压为 87,心率 bpm 为 88,身体质量指数为 17.12。

dfworking.min()
Gender               Female
Age                      10
Type of diabetes       None
Diabetes status           0
A1cTEST                2.02
BPSystolic           100.01
BPDiastolic              87
HeartRateBPM             88
BMI                 17.1278
FrozenShoulder           No
CarpalTunnelSynd         No
DupuytrensCont           No

Listing 3-8Calculating Minimum Values

让我们拿起年龄栏来帮助理解这一栏的范围。我们已经看到,对于年龄,最大值是 79,最小值是 10。所以在我们的患者中,最小的 10 岁,最大的 79 岁。所以我们的区间是 79 减 10,也就是 69 年。因此,我们正在测量年龄范围为 69 岁的患者的健康记录。

现在我们知道了最大值和最小值,并且计算了数据的范围,我们需要查看这个年龄列的四分位数范围。四分位数间距是数据集的第一个四分位数和第三个四分位数之间的差值。它用于描述数据集 [4 ]内数据的分布情况。在代码清单 3-9 中,我们现在来看数值数据集的第一个四分位数。

dfworking.quantile(0.25)
Out[206]:
Age                 29.000000
Diabetes status      0.000000
A1cTEST              5.177500
BPSystolic         100.375000
BPDiastolic         91.107946
HeartRateBPM        91.000000
BMI                 23.000000

Listing 3-9Measuring 1st Quartile of Our Data Set

清单 3-9 和 3-10 向您展示了一种快速计算我们数据集中第一个四分位数和第三个四分位数的方法。我们看到,在第一个四分位数中,年龄为 29,A1c 试验为 5.1,收缩压为 100,舒张压为 91.2,心率 bpm 为 91,身体质量指数为 23。在清单 3-10 中,我们现在来看看数据集的第三个四分位数。

dfworking.quantile(0.75)
Out[210]:
Age                 49.000000
Diabetes status      0.000000
A1cTEST              6.000000
BPSystolic         122.355000
BPDiastolic         92.070602
HeartRateBPM        92.000000
BMI                 24.441247

Listing 3-10Measuring 3rd Quartile of Our Data Set

为了确定数据集中每个变量的异常值的阈值,在清单 3-11 中,我展示了计算这些阈值的代码。

dfworking.quantile(0.25)*1.5
Out[214]:
Age                 43.500000
Diabetes status      0.000000
A1cTEST              7.766250
BPSystolic         150.562500
BPDiastolic        136.661919
HeartRateBPM       136.500000
BMI                 34.500000
Name: 0.25, dtype: float64

dfworking.quantile(0.75)*1.5
Out[215]:
Age                 73.500000
Diabetes status      0.000000
A1cTEST              9.000000
BPSystolic         183.532500
BPDiastolic        138.105902
HeartRateBPM       138.000000
BMI                 36.661871

Listing 3-11Measuring Outlier Threshold Values of Our Data Set

在清单 3-11 中,给出了每列的第一个分位数乘以 1.5 个阈值。对于年龄列,下限是 43.5,第三个分位数是 73.5。我们可以看到,数据实际上向我们表明,任何低于年龄 43.5 的第一个分位数值的年龄都是异常值。类似地,年龄列中任何大于 73.5 的值也是异常值。类似地,对于 A1c 测试,异常值的阈值下限是 7.7,A1c 测试的阈值上限是 9。样本中任何低于下阈值 7.7 或高于上阈值 9.4 的值都是异常值。同样,对于收缩压,任何低于 150.5 而高于 183 的值都是异常值。对于舒张压,我们知道这个范围远小于下限(136 点)和上限(138 点)。类似地,我们有心率 bpm,其下限为 136.5,上限为 138。即使对于身体质量指数来说,该值也遵循舒张压和心率 bpm,具有其阈值之间的较低范围,因为较低阈值是 34,而身体质量指数的较高阈值是 36.6。为了更好地理解数据集中的这种分布,我现在向您展示一个图表,使用箱线图来表示清单 3-12 中的变量。在代码清单 3-12 中,我现在向您展示如何查看我们 6 列中每一列的数据分布的可视化。

#Horizontal default boxplot chart
dfworking.boxplot(figsize=(10, 6))
#Vertical Boxplot chart
dfworking.plot.box(vert=False)
#Boxplot by selecting only the required columns
dfworking.boxplot(column=['A1cTEST','BPSystolic','BPDiastolic','HeartRateBPM','BMI','Age'],figsize=(10, 6))

Listing 3-12Visualization of the spread of data for each of our 6 columns.

图 3-2 直观地向我们展示了变量的方框图。年龄显示了均匀的分布,并且在视觉上没有显示任何异常值;然而,对于 A1c 测试,我们可以看到该百分比位于非常窄的范围内。在下限阈值和上限阈值上,我们可以看到一些异常值散落在图上。对于 BP 收缩压,我们可以看到异常值位于 150+的范围内。对于血压舒张期,我们可以看到一些阈值下限范围内的异常值,但大多数位于阈值上限范围内。这与心率 bpm 和身体质量指数列类似。从视觉上可以看出,舒张压和心率 bpm 与身体质量指数之间的共同差异表明它们的范围很窄。然而,对于 BP 收缩压,该范围非常高,因此在用于计算四分位数范围然后计算异常阈值的函数分位数中是明显的。我决定保留异常值是基于这样一个事实,即在像 BP systolic 这样的列变量中,这是本研究中的关键变量之一,如果我删除异常值以上的值,那么我将剩下更少有意义的数据来分析。通过使用代码 dfworking['BPSystolic']。loc[df[' BP systolic ']>= 183.562500。count(),我们得到的值是 35,这表明在这个列变量中有 5.3%的异常值,这是非常显著的。因此,我们将保留异常数据进行分析。然而,我们需要选择一个对异常值稳健的分类算法,比如决策树 [5 ]。

img/464968_1_En_3_Fig2_HTML.jpg

图 3-2

电子患者健康记录数据集的箱线图

现在,我们了解了数据的分布情况,并通过命令直观地看到了数据的分布情况。让我们看看我们的列变量的另外两个度量:偏斜度和峰度。这将为我们提供关于数据曲线的形状和大小的具体信息。在清单 3-13 中,我们可以看到偏斜度和峰度的值。

dfworking.skew()
Age                0.878405
A1cTEST            0.344770
BPSystolic         1.720338
BPDiastolic        3.693222
HeartRateBPM       3.327100
BMI                1.098987
dfworking.kurtosis()
Age                -0.286342
A1cTEST             0.461561
BPSystolic          1.948725
BPDiastolic        15.712615
HeartRateBPM       13.172057
BMI                 5.468543

Listing 3-13Skew and Kurtosis Values of Our Variables in Our Data Set

在我们研究偏斜度和峰度之前,我想提醒读者正态分布曲线具有均值=众数=中位数的性质。然而,通过观察数据集变量的偏斜度和峰度,我们试图了解它们与正态曲线有多接近或有多不同。这也可以通过情节直观地看到,我们将在后面做;然而,偏斜度和峰度数值也有助于我们理解数据集的分布。我不会深入讨论计算偏斜度和峰度的公式,因为我希望读者了解这一点,或者参考互联网上的一些好的参考资料。偏斜度(或偏斜度)是通过数学方法计算的,是我们首先得到的数字的结果。如果偏斜度大于 0,那么我们说分布是正偏斜的;然而,如果我们计算的偏斜数小于 0,那么我们说分布是负偏斜的。如果偏斜的数量等于 0,则称该分布是对称的。负偏态分布有一个长的左尾巴,正偏态分布有一个长的右尾巴。有了这些知识,我们现在开始解释数据集中每一列的结果。年龄列的值为 0.8,这意味着这个可变年龄是正偏的,并且沿着右尾分布。稍后,我们将通过可视化来验证我们对变量的数字数据分析。对于 A1c 测试偏度,我们的值为 0.34,这意味着它更接近于正态曲线;然而,它稍微有点偏正。对于收缩压,我们的值为 1.2,这显然意味着数据是正偏的。舒张压也具有非常高的正值 3.9,这表明它也是高度正偏的。心率 bpm 的值也是 3.3,这也意味着它是高度正偏的。身体质量指数也是正面倾斜的。

接下来我们转向峰度,它显示了分布的厚度。如果一个数据分布有更多的峰值,则称之为左分布或薄分布,称之为厚尾分布。在这样的分布中,与正态分布相比,出现极端结果的可能性更大。峰度公式计算值等于 3 的正态分布的邪恶程度。过多的峰度意味着变量的分布值将高于 3,而较少的峰度意味着它将低于 3。如果峰度值小于 3,那么它也表示一种称为中峰度的分布类型;然而,中峰度分布的范围是介于 0 和 3 之间的峰度值。如果峰度值小于 0,则称之为扁峰度。平顶分布的故事更短更薄,中央峰更低更宽。年龄的峰度是负值 0.2。A1c 测试是 0.4 的正值,但低于 3 的值。血压收缩压值为 1.9,但低于 3 且大于 0。血压舒张压 15.1,心率 BPM 13.1。身体质量指数是 5.4。我们已经注意到,如果峰度数值小于 0,那么这样的分布是平峰度的,这意味着它的尾部更短更细,并且它的中心峰值通常更低更宽。我们有介于 0 和 3 之间的变量 A1c 测试和 BP 收缩压,表明这些变量的分布是中等的。我们数据集中的三个变量,舒张压、心率 bpm 和身体质量指数,具有超过 3 的峰度值,表明这些变量的数据分布是尖峰的。尾巴更长更粗,中央的峰更高更尖。

在图 3-3 中,您可以看到使用 Pandas dataframe 的最高方法的数据集中变量的可视化输出。

img/464968_1_En_3_Fig3_HTML.jpg

图 3-3

可视化数据集中变量的分布

dfworking.hist(figsize=(10, 6))

我们可以通过图 3-3 中的可视化来确认偏度和峰度的数值解释。在下面的代码清单 3-14 中,我们使用 dataframe dfworking 的 corr()函数查看相关系数结果。

dfworking.corr()

                     Age   Diabetes status   A1cTEST  BPSystolic  BPDiastolic \
Age            1.000000        -0.006059  0.011436   0.013097      0.028190
Diabetes status -0.006059         1.000000  0.816808   0.902857      0.560962
A1cTEST        0.011436         0.816808  1.000000   0.827919      0.591827
BPSystolic     0.013097         0.902857  0.827919   1.000000      0.735363
BPDiastolic    0.028190         0.560962  0.591827   0.735363      1.000000
HeartRateBPM  -0.052383         0.151831  0.147737   0.168413      0.058129
BMI            0.027911         0.181897  0.167908   0.181927      0.130275

                 HeartRateBPM       BMI
Age                 -0.052383  0.027911
Diabetes status      0.151831  0.181897
A1cTEST              0.147737  0.167908
BPSystolic           0.168413  0.181927
BPDiastolic          0.058129  0.130275
HeartRateBPM         1.000000  0.107147
BMI                  0.107147  1.000000

Listing 3-14
Correlation Coefficient Results

接下来是计算,看看变量之间是否有某种关系。为此,我们将使用 Pandas dataframe 的 corr()函数,这将使我们能够查看这些变量之间的相关性。为了提醒读者如何解释相关结果,两个变量之间的相关值等于 1 意味着完美的线性正关系,如果它是负的,则意味着变量之间的负线性关系。如果相关系数值等于 0,那么就说两个变量之间没有真正的线性关系。从 0 到 1 或-1 交错在 0.34 到 0.3 之间的值被称为具有弱线性关系。介于 0.5 和-0.5 之间的值被称为具有适度的正或负线性关系。介于-0.7 和+0.7 之间的值被认为与我们的数据集 [6 ]有很强的正或负线性关系。有了这些信息,我们现在可以快速分析对数据集应用相关函数的结果。

当我们查看清单 3-14 时,我们的主要动机是取出那些至少具有中等或强的变量,如果可能的话,还有一个完美的线性关系。因此,我们在寻找相关系数从正负 0.5 到 0.12 尽可能接近 1 或 1 的变量。我们可以看到,年龄变量与其他变量没有任何显著的线性关系;然而,当我们观察糖尿病状态的预测变量时,它似乎与 A1c 试验呈 0.8 的正相关,与收缩压呈 0.9 的正相关。与血压舒张压(0.5)有中度关系。可以理解,A1c 试验与预测变量糖尿病状态(0.8)、收缩压(0.83)和舒张压(0.59)有很强的关系。收缩压和舒张压的正相关系数为 0.74。舒张压与糖尿病状态呈中度正相关,预测变量为 0.5。心率 bpm 似乎与我们数据集中的任何变量都没有任何显著的相关性。身体质量指数的情况也是如此,它似乎与我们的任何数据集都没有任何关联。

现在,我们能够看到那些看起来有某种关系的重要变量,直观地观察它们,并理解它们是如何放置的。举例来说,在图 3-4 中,散点图显示了列变量 A1c 测试和 BP 收缩压之间的直观关系。

img/464968_1_En_3_Fig4_HTML.jpg

图 3-4

A1cTest 和 BP 收缩压变量之间的散点图

dfworking.plot.scatter(x='A1cTEST', y="BPSystolic",s=dfworking['A1cTEST']*2)

在图 3-4 中,我们看到了两个变量之间的某种模式。我们看到有几组群集被放置用于 A1c 测试;随着结果的上升,患者被分组到特定的聚类模式中,这些模式显示出阶梯状的上升趋势。它从 100 BP 的收缩压开始,超过 200 BP 的收缩压,并从 A1c 测试值的 2%以上开始。通过可视化早期检测这种模式在机器学习中非常重要。我们可以尝试实现某些分类技术,将患者分为视觉上对我们有吸引力的这几组。

探索性数据分析的最后一步是查看包含分类变量(包括预测变量糖尿病状态)的列。我们的数据集中有六个分类变量列。第一个是性别,将我们的数据集分为男性或女性。下一个分类栏是糖尿病的类型。在我们的数据集中,没有 1 型糖尿病患者;然而,我们也有没有糖尿病或二型糖尿病的病人。糖尿病状态列是预测变量,其值也是分类的,其中 0 表示没有糖尿病,1 表示患者有糖尿病。肩周炎由医生通过人工检查确定,有“是”或“否”的值:“是”表示患者有肩周炎,“否”表示患者没有肩周炎。在腕管综合征中,它与冻结肩相同,其中 yes 表示患者患有腕管综合征,no 表示患者没有这种疾病。对于袢掌腱膜挛缩症,也有“是”和“否”两栏,其中“是”表示患者患有该疾病,“否”表示患者没有该疾病。现在,我将使用基于这些分类变量的交叉列表,来看看我们的数据集是如何针对这些列进行分类的。在代码清单 3-15 中,我们查看了数据集中的性别分类。

my_tab = pd.crosstab(index=df["Gender"], columns="Count")      # Name the count column

my_tab=my_tab.sort_values('Count', ascending=[False])
print(my_tab)
col_0   Count
Gender
Female    351
Male      313

Listing 3-15Gender Classification in the Data Set

在清单 3-15 中,我们可以看到,在我们的数据集中,总共 664 名患者中有 351 名女性,男性患者有 313 名,因此按性别划分,53%的患者为女性。这也可以在图 3-5 给出的图表中直观地看到。

img/464968_1_En_3_Fig5_HTML.jpg

图 3-5

性别分类数据可视化

data_counts = pd.DataFrame(my_tab)
pd.DataFrame(data_counts).transpose().plot(kind='bar', stacked=False)

现在我们来看下一列,即清单 3-16 中的糖尿病类型。

my_tab = pd.crosstab(index=df["Type of diabetes"], columns="Count")      # Name the count column

my_tab=my_tab.sort_values('Count', ascending=[False])
print(my_tab)
col_0             Count
Type of diabetes
None                504
Type 2              160

Listing 3-16Type of Diabetes Classification

我们可以看到数据集中 24%的患者患有二型糖尿病,504 名患者没有糖尿病。计算百分比的原因对于任何分类列都很重要,因为我们需要确定我们是否正在处理一个罕见的事件。如果我们正在处理一个罕见的事件,我们需要使用单变量分析来处理模型的建立。图 3-6 给出了糖尿病类型栏的直观表示。

img/464968_1_En_3_Fig6_HTML.jpg

图 3-6

糖尿病类型分类可视化

接下来,我们来看看清单 3-17 中的列冻结肩。

my_tab = pd.crosstab(index=df["FrozenShoulder"], columns="Count")      # Name the count column

my_tab=my_tab.sort_values('Count', ascending=[False])
print(my_tab)
col_0           Count
FrozenShoulder
No                533
Yes               131

Listing 3-17Classification of Frozen Shoulder Disease in Our Data Set

在列表 3-17 中,我们可以看到我们数据集中 19.1%的患者患有肩周炎,533 名患者没有肩周炎。由于这个百分比高于 10 %,我们现在可以确定肩周炎不是我们预测的罕见事件。冻结肩的数据可视化如图 3-7 所示。

img/464968_1_En_3_Fig7_HTML.jpg

图 3-7

冻结肩疾病分类可视化

data_counts = pd.DataFrame(my_tab)
pd.DataFrame(data_counts).transpose().plot(kind='bar', stacked=False)
Out[316]: <matplotlib.axes._subplots.AxesSubplot at 0x243ae851278>

my_tab = pd.crosstab(index=df["CarpalTunnelSynd"], columns="Count")      # Name the count column

my_tab=my_tab.sort_values('Count', ascending=[False])
print(my_tab)
col_0             Count
CarpalTunnelSynd
No                  546
Yes                 118

Listing 3-18Carpal Tunnel Syndrome Classification

现在让我们看看腕管综合症。在图 3-8 中,我们可以看到交叉列表的代码,以及自称患有腕管综合征的人数和未被诊断为腕管综合征的人数。我们的样本中有 17%被诊断患有这种疾病。总共有 118 人,其中 546 人没有这种症状。

img/464968_1_En_3_Fig8_HTML.jpg

图 3-8

腕管综合征可视化

data_counts = pd.DataFrame(my_tab)
pd.DataFrame(data_counts).transpose().plot(kind='bar', stacked=False)
Out[319]: <matplotlib.axes._subplots.AxesSubplot at 0x243ae6a45c0>

这种分类的可视化如图 3-8 所示。

现在让我们来看看掌腱膜挛缩症及其分类,如图 3-8 所示。在代码列表 3-19 中,我们使用交叉列表来查看杜普伊特伦挛缩症患者的分类。

my_tab = pd.crosstab(index=df["DupuytrensCont"], columns="Count")      # Name the count column

my_tab=my_tab.sort_values('Count', ascending=[False])
print(my_tab)
col_0          Count
DupuytrensCont
No               544
Yes              120

Listing 3-19Dupuytren’s Contracture Classification

被诊断患有掌腱膜挛缩症的患者占我们数据集的 18 %, 544 名患者没有这种疾病。我结束了对所有分类列的分析,因为我们已经探索了我们的数据集,并对其进行了充分的分析,以开始构建预测模型。

数据准备

现在,我们已经完成了探索性的数据分析,并在构建模型之前继续实际的数据准备工作。我在表格 3-2 中给出了我们需要做的一些步骤及其目的。我们在表中看到有四个步骤。首先是将数据划分为目标变量和特征;我们这样做是为了避免计算带有特征的目标变量。这在机器学习中很常见,需要避免。第二步是标准化数据,这样做是为了建立一致性或标准化尺度来衡量我们数据集中的所有变量。下一步是创建虚拟变量,主要目的是将所有分类变量转换成虚拟变量,比如性别(男性或女性)。我们可以说性别 0 等于男性,性别 1 等于女性。20 代表男性,1 代表女性,因此数字编码是我们在这一特定步骤中需要做的。数据准备的最后一步是数据的混洗和分割,这两个步骤都是为了增加一定程度的随机性并删除数据中的任何病毒。一旦我们完成了这四个步骤,我们将能够开始建立我们的预测模型。对于每个步骤,我将向您展示我们数据集的代码和结果,以及如何进行数据准备。

表 3-2

数据准备步骤

|

数据准备步骤

|
| --- |
|

没有#

|

工作

|

描述

|
| --- | --- | --- |
| one | 将数据分为目标变量和特征。 | 我们需要将数据分为特征和目标变量,以确保我们不会将目标变量算作特征;否则,我们的预测模型会给出错误的结果。 |
| Two | 标准化数据。 | 我们需要将数据标准化,因为这将所有的变量带到一个共同的尺度上。俗话说,你不能把橘子和苹果相提并论。我们的变量也是如此。它们是具有不同测量尺度的不同测量,例如血压收缩压不同于心率 bpm 的尺度。 |
| three | 虚拟变量 | Python 中的 Scikit 库的一个局限性是它只能处理数值数据,而不能处理分类数据。消除这种限制的一种方法是将数据集中的分类变量(如冻结肩列)转换为数字编码格式。 |
| four | 洗牌和分割数据。 | 我们现在打乱数据以引入随机因素,然后将其分为训练和测试,以消除数据中的偏差。 |

清单 3-20 中给出了步骤 1 的代码。

#Data Preparation Steps
#Step 1 Split data into features and target variable
# Split the data into features and target label
diabetics = pd.DataFrame(dfworking['Diabetes status'])
features = pd.DataFrame(dfworking.drop('Diabetes status', axis = 1))
diabetics.columns
features.columns
features.columns
Out[352]:
Index(['Gender', 'Age', 'Type of diabetes', 'A1cTEST', 'BPSystolic',
       'BPDiastolic', 'HeartRateBPM', 'BMI', 'FrozenShoulder',
       'CarpalTunnelSynd', 'DupuytrensCont'],
      dtype='object')

Listing 3-20Step 1 of Data Preparation

在清单 3-20 中,在实现步骤 1 的代码时,我们看到 features dataframe 没有列 diabetes status,这是我们的目标变量。我创建了两个数据框:糖尿病数据框,它是预测值或目标变量熊猫数据框;特征数据框,它没有糖尿病状态列。我使用了熊猫数据框的拖放方法来删除糖尿病状态列。现在我们进入第二步:标准化数据。这可以从清单 3-22 中看出。为了实现这一点,我将使用 sklearn.preprocessing 库并从中导入 MinMaxScaler 来标准化我们的数据集。请注意,这种标准化只适用于数字变量,而不适用于分类变量或虚拟变量。

dfworking.dtypes
dfworking.dtypes
Out[355]:
Gender               object

Age                   int64

Type of diabetes     object
Diabetes status       int64

A1cTEST             float64

BPSystolic          float64

BPDiastolic         float64

HeartRateBPM          int64

BMI                 float64

FrozenShoulder       object
CarpalTunnelSynd     object
DupuytrensCont       object

Listing 3-21Numerical Columns in Our Working Data Set

我们可以在清单 3-21 中看到,年龄 A1c 测试、收缩压、舒张压、心率 bpm 和身体质量指数列是数字。我们将忽略糖尿病状态列,因为它是患者的分类变量,其中 0 表示没有糖尿病,1 表示患者患有糖尿病。在清单 3-22 中,我提供了提取这些数字特征的代码,然后对它们应用标准化标量。

# Import sklearn.preprocessing.StandardScaler
from sklearn.preprocessing import MinMaxScaler

# Initialize a scaler, then apply it to the features
scaler = MinMaxScaler()
numerical = ['age', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week']
features_raw[numerical] = scaler.fit_transform(dfworking[numerical])

# Show an example of a record with scaling applied
display(features_raw[numerical].head(n = 1))
        Age   A1cTEST  BPSystolic  BPDiastolic  HeartRateBPM           BMI
0  0.275362  0.756968    0.419591     0.153846      0.028571   0.545713 No Yes           Yes

Listing 3-22Step 2 of Data Preparation

在清单 3-22 中,我们可以看到一个已经被缩放的特征的示例记录。请注意,我还没有将分类变量转换成虚拟变量,这是清单 3-23 中给出的下一步。

# Step 3 One-hot encode the 'features_raw' data using pandas.get_dummies()
features = pd.get_dummies(features_raw)

#Checking output
display(features.head(1),diabetics.head(1))

# Print the number of features after one-hot encoding
encoded = list(features.columns)
print("{} total features after one-hot encoding.".format(len(encoded)))

# See the encoded feature names
print(encoded)
display(features.head(1),diabetics.head(1))
        Age   A1cTEST  BPSystolic  BPDiastolic  HeartRateBPM        BMI  \
0  0.275362  0.756968    0.419591     0.153846      0.028571   0.545713

   Gender_Female  Gender_Male  Type of diabetes_None  Type of diabetes_Type 2  \
0             1           0                     0                       1

   FrozenShoulder_No     FrozenShoulder_Yes  CarpalTunnelSynd_No  \
0                  1                      0                    0

   CarpalTunnelSynd_Yes  DupuytrensCont_No     DupuytrensCont_YEs  \
0                     1                  0                      0

   DupuytrensCont_Yes
0                  1
   Diabetes status
0                1
encoding.".format(len(encoded)))
17 total features after one-hot encoding.
print(encoded)
['Age', 'A1cTEST', 'BPSystolic', 'BPDiastolic', 'HeartRateBPM', 'BMI', 'Gender_Female', 'Gender_Male', 'Type of diabetes_None', 'Type of diabetes_Type 2', 'FrozenShoulder_No', 'FrozenShoulder_Yes', 'CarpalTunnelSynd_No', 'CarpalTunnelSynd_Yes', 'DupuytrensCont_No', 'DupuytrensCont_YEs', 'DupuytrensCont_Yes']

Listing 3-23Step 3: Dummy variables

从图 3-3 我们可以看到热编码的代码。我已经使用了熊猫库中的 get_dummies()函数将原始特征转换成最终的基于虚拟的特征。然后,您可以看到 get_dummies 函数如何自动创建虚拟变量的输出;例如,它创建了一个性别为女性的和一个性别为男性的。完成后,我们查看总共有多少个特性被热编码,发现共有 17 个。最后,打印编码后,我们看一下数据集中的所有列。下一步和第四步也是最后一步是洗牌和分割数据。在清单 3-24 中,我们可以看到生成第一次洗牌和拆分,然后是训练和测试拆分的代码。

#Step 4 Shuffle & Split Final Dataset
# Import train_test_split
from sklearn.cross_validation import train_test_split
from sklearn.utils import shuffle

# Shuffle and split the data into training and testing subsets
features=shuffle(features,  random_state=0)
diabetics=shuffle(diabetics,  random_state=0)
# Split the 'features' and 'income' data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(features, diabetics, test_size = 0.2, random_state = 0)
print("Training set has {} samples.".format(X_train.shape[0]))
print("Testing set has {} samples.".format(X_test.shape[0]))
Training set has 531 samples.
Testing set has 133 samples.

Listing 3-24Step 4 of Data Preparation

清单 3-24 显示了代码和结果,首先随机改组特性和目标变量,然后将其分成训练和测试数据集。我们可以看到,为训练集创建了 531 个,为测试集创建了 133 个,总共 664 个。至此,我们的数据准备步骤就完成了。我们现在进入机器学习生命周期的模型构建验证和实现阶段。在代码清单 3-25 中,我现在向你展示如何使用 7 种分类算法来构建一个模型。

#Loading model Libraries
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier

# prepare models
#Using seed to maintain reproducability and consistent results
seed = 7
models = []
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC()))
models.append(('RFC', RandomForestClassifier()))

Listing 3-25Model Building Initializing the Classifier Algorithms

清单 3-25 显示了分类器建模初始化的算法。我已经初始化了七个公共类。我将使用逻辑回归、决策树分类器、k 近邻分类器、线性判别分析原因、朴素贝叶斯分类器、SVC 和随机森林分类器。在清单 3-26 中,你可以看到我已经从 Python 库 SKlearn 加载了这些算法,然后我通过逐个初始化它们来准备这些模型。现在,下一步是为所有模型的字典运行一个循环,运行 kfold 交叉验证,然后将结果加载到结果数据字典中,并显示每个算法或分类器的平均值和标准偏差。接下来,我以图形的形式展示了每种算法的算法比较结果。这是使用 matplot 库显示的。

表 3-3

分类器算法准确性

|

分类器算法

|

准确

|

神学博士。

|
| --- | --- | --- |
| 实验室反应堆 | One | Zero |
| 皱胃向左移 | One | Zero |
| 近邻算法 | One | Zero |
| 手推车 | Zero point nine nine eight | Zero point zero zero six |
| 铌 | Zero point nine nine eight | Zero point zero zero six |
| 支撑向量机 | One | Zero |
| 请求评论 | Zero point nine nine eight | Zero point zero zero six |

# evaluate each model in turn
results = []
names = []
scoring = 'accuracy'

import warnings
warnings.filterwarnings("ignore")

for name, model in models:
    kfold = model_selection.KFold(n_splits=10, random_state=seed)
    cv_results = model_selection.cross_val_score(model, X_train, y_train, cv=kfold, scoring=scoring)
    results.append(cv_results)
    names.append(name)
    msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())
    print(msg)

Listing 3-26. Model Evaluation

在表 3-3 中,我们可以从“精确度”一栏中查看分类器算法的精确度,我们可以看到,对于朴素贝叶斯和随机森林分类器,与精确度分数小于 1 的其他算法相比,有三种算法表现不佳。至此,我结束了关于如何在医疗保健中实现机器学习的章节。我曾尝试收集一个与医疗保健电子病历相关的数据集,在我看来,这在医疗保健领域非常常见。我敢肯定,当你试图实现代码及其结果时,读者会发现本章中的完整应用程序非常有用。您还可以使用 AUC 值或 RoC 指标对算法进行比较,这项任务我留给读者来计算和验证。您可以从以下网址了解有关 Scikit learn libraries auc metrics 的更多信息:sklearn.metrics.auc(x,y,reorder=False [8 ])。您也可以从官方 Scikit learn library 网址 [9 ]查看计算 AUC 和 RoC 评分指标的快速方法。

尾注

  1. ShijunWangRonald M . Summe,医学图像分析,第 16 卷,第 5 期,2012 年 7 月,第 933-951 页 https://www.sciencedirect.com/science/article/pii/S1361841512000333

  2. 杜普伊特挛缩症,由梅奥诊所工作人员, https://www.mayoclinic.org/diseases-conditions/dupuytrens-contracture/symptoms-causes/syc-20371943

  3. 平均值和标准偏差。http://www.bmj.com/about-bmj/resources-readers/publications/statistics-square-one/2-mean-and-standard-deviation

  4. 四分位距 IQR http://www.mathwords.com/i/interquartile_range.htm

  5. 为什么基于树的模型对异常值具有鲁棒性?https://www.quora.com/Why-are-tree-based-models-robust-to-outliers

  6. www . dummies . com/education/math/statistics/how-to-interpret-a-correlation-coefficient-r/

  7. https://www.medicalnewstoday.com/releases/11856.php

  8. Scikit 了解 Auc 指标: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.auc.html

  9. Scikit 学库 RoC 和 AUC 评分: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html

四、医疗保健人工智能案例研究

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

在我们开始看案例研究之前,让我们先看看案例研究方法及其优势。有人可能会说,案例研究方法主要用于 MBA 项目,尤其是这种方法的发源地哈佛商学院[ https://www.hbs.edu/mba/blog/post/3-benefits-of-the-case-method ]。在这里,我们将讨论使用 Python 的机器学习应用程序,以及如何将这种方法用于涉及编程代码的解决方案。在我回答这个具体问题之前,让我们先来看看案例研究方法今天带来的三个优势,以及我们在商业环境中通过使用案例研究获得的其他好处。

我们从案例研究方法中得到的第一个好处是,为案例研究提供解决方案的人不仅要阅读案例和案例研究提出的问题,还要对手头的业务问题做一些背景工作,供问题解决者用来解决问题。在案例研究解决方案完成后,这些信息会留在当事人那里,并以非正式的方式继续学习。没有必要为回答案例研究而填充任何网状课程,因为它们是独特的业务情况,并且不一定有支持其解决方案的理论。

使用案例研究方法的第二个好处是,在给出案例研究业务问题的解决方案时,人们应该对案例问题提出自己的独立观点。这是将机器学习和 Python 代码应用于业务情况的实践,然后当你仔细观察它并试图通过编写解决特定业务问题的代码来为它们提供解决方案做准备。值得注意的是,在案例研究方法中,没有绝对的对错,因为一个特定的业务问题可以通过多种方式解决。这里的实践是尽可能多地提出商业问题的解决方案,并在给定的情况下探索最有价值的方案。因此,使用案例研究方法解决问题的第三个优势是,它在商业环境中很重要,并且是应用机器学习工程师最受欢迎的技能。

我从现实生活的例子中仔细选择了这些案例研究,我很确定读者会发现它们很有用。我建议你在回答每个案例研究中的问题之前至少阅读两遍案例研究。在我看来,你应该做的是,先把案例研究文中给出的业务情况读一遍,理解一遍,然后看每一个问题再回到案例研究文中,把情况再理解一遍。一旦你看了关于每个问题的案例研究,你应该开始在你的头脑中制定解决方案,如果你在医疗保健行业面临这种情况,你会怎么做。回想一下我在第三章给大家展示的机器学习应用的过程。在制定解决方案时,注意不要错过任何步骤。

一旦您有了一个您认为在给定的业务情况下最合适的解决方案的草图,那么您应该继续查看所提议的解决方案以及给定案例研究的代码。请记住,在案例研究法中,不同的人可以提出不同的解决方案,解决方案没有对错之分。然而,它遵循的标准是,解决方案应该满足业务问题的所有需求,并且应该是业务可以接受的。在本书给出的案例研究解决方案中,我给出了企业可以接受的解决方案,因此读者可以将其作为基准来判断他们为案例研究提出的解决方案。目标是首先创建您自己的解决方案,而不看我在本书中给出的解决方案,以使您开始独立思考,并开始在医疗保健业务场景中应用机器学习。

案例研究 1:实验室协调员问题

周一早上,Deshmukh 博士坐在办公室里,他面前的笔记本电脑屏幕上显示着一份财务部门的报告,内容是关于他的医疗保健组织 DIRECTPyth 诊断中心全球连锁的财务状况,该组织由全球 250 多个诊断中心组成。

DIRECTPyth 的核心业务是糖尿病诊断中心。DIRECTPyth 诊断中心的突然增长发生在过去的 5 年里。DIRECTPyth 最初是一家本土诊断公司,在印度只有四个中心。在过去 10 年的运营中,它将其诊断中心扩展到了印度以及东南亚、中东和加拿大的所有主要城市。大多数海外中心是在过去 5 年中出现的,因为诊断公司看到人们对糖尿病诊断的需求迅速增长。

世界卫生组织关于糖尿病的报告( http://www.who.int/diabetes/global-report/en/ )显示,糖尿病现在已经成为世界范围内的流行病。2012 年,糖尿病导致 150 万人因心脏病发作、中风、失明、肾衰竭和下肢截肢而死亡。世界各国政府已经通过在媒体上运行关于糖尿病流行的信息程序来传播意识。德里·福特还强调,自 1980 年以来,二型糖尿病患者的数量一直在增加,到那时已经翻了两番。为了控制这种流行病,世界各国政府在过去 5 年中加强了预防和治疗糖尿病的计划。DIRECTPyth 糖尿病诊断医疗保健链正处于这场流行病的中间,为任何人提供测试,以诊断他们是否患有糖尿病。

德什穆克博士正在看的报告指出,在过去的两年里,经济损失高达 2 亿美元。公司的财务状况如表 4-1 所示。

表 4-1

两年期财务概要报告

|

财务概要

(百万美元)

|

2015-2016 财年

|

2016-2017 财年

|
| --- | --- | --- |
| 诊断收入 | Nine hundred and thirty | One thousand two hundred and twenty-one |
| 运营成本 | One thousand and thirty-one | One thousand three hundred and fifty-four |
| 诊断中心的平均运营天数 | One hundred and eighteen | One hundred and six |
| 非经营损失 | One hundred and one | One hundred and thirty-three |

我来简单解释一下表 4-1 。给出了两个财政年度的财务数据:2015-2016 年和 2016-2017 年。第 2 列和第 3 列中给出的状态是财务部门提供的诊断收入,您可以看到 DIRECTPyth 组织的收入每年都在增长。第一年和第二年的运营成本都高于诊断收入。最后一行给出了非手术造成的损失,这是从诊断收入中直接减去手术成本。这两年的总损失为 2 . 34 亿美元。第三行提供了全世界所有 DIRECTPyth 诊断中心的平均运行天数。DIRECTPyth 的平均运行天数为 118 天,远远低于 DIRECTPyth 内部衡量其性能的基准数 200。我们还可以看到,在 2016 年和 2017 年,诊断中心的平均运营天数下降到了 106 天。非操作性损失也从第一年的 1.01 亿美元上升到第二年的 1.33 亿美元。

为了让 DIRECTPyth 在市场上保持竞争力,它需要降低运营成本和非运营损失,现在就需要采取切实措施。

该报告清楚地表明了由于人力资源的限制而造成的损失。德什穆克博士要求与 DIRECTPyth 的人力资源经理进行一次晨会。目的是讨论经济损失并找出这个问题的最主要原因。人力资源经理是 Abbey 女士,她将向 Deshmukh 博士介绍直接造成财务损失的原因以及今后如何防止这些损失。然后,德什穆克博士起床,为上午 10 点的会议做好了充分准备。艾比女士和她的工作人员一起到达会场。问候结束后,她开始介绍两年的财务概要。她向德什穆克博士指出,手术费用在几年间上涨了 131%。这一损失也是同样的百分比,因为它是从业务成本中得出的。她解释说,诊断中心的平均运营天数是根据诊断中心在全年任何给定工作日保持开放的天数计算的。DIRECTPyth 的目标平均运营天数是 200 天。她展示了表 4-2 中给出的平均运行诊断中心数据的细分。

表 4-2

平均运营天数细分(AOD)数据

|

平均运营天数

|

达到 AOD 基准的中心数量

|

未达到 AOD 基准的中心数量

|
| --- | --- | --- |
| 印度 | Thirty-two | Two hundred and thirty-four |
| 海外的 | Thirteen | Ninety-eight |
| 加固的 | Forty-five | Three hundred and thirty-two |
| %年龄 | Eleven point nine | Eighty-eight |

平均运行天数的细分数据显示,在全球范围内,DIRECTPyth 的诊断中心达到 200 天基准的百分比仅为 11.9%,未达到 AOD 基准的中心百分比为 88%。这显示了 DIRECTPyth 问题的严重性和范围。它还表明,由于这些中心没有达到 AOD 基准,收入损失严重。为了进一步深入研究这个问题,Abbey 女士展示了与 DIRECTPyth 组织的实验室诊断设施的人力资源相关的数据。该数据在表 4-3 中给出。

表 4-3

DIRECTPyth 实验室的人力资源数据

|

DIRECTPyth 实验室的人力资源

|

实验室协调员

|

实验室技术员

|

实验室正在等待

|
| --- | --- | --- | --- |
| 平均当前天数 | Eighty-eight | Ninety-seven | One hundred and ninety-four |
| 平均缺勤天数 | Twenty-six | Fifteen | eight |
| 损耗率(%) | 12% | 9% | 6% |

我们可以从表 4-3 中看到,最高的缺勤发生在实验室协调员和实验室技术员角色。实验室服务员平均缺勤率最高,缺勤率最低。最好的数据来自 DIRECTPyth 实验室的工资系统,记录了实验室每个人力资源的每日出勤情况。目前的总天数被视为 220 个生产工作日的基准值。实验室协调员的角色是与走进诊断实验室的客户进行互动,带他们了解实验室中可用的各种诊断选项,然后帮助他们找到最适合其糖尿病状况的测试。实验室协调员检查患者是否已经在诊断中心注册,然后调出计算机记录并请求新的测试。DIRECTPyth 的技术人员实际上是为排队等候的病人进行实验室测试的人。实验室服务员是从实验室技术人员那里获取特定患者的数据,将数据输入计算机,然后生成报告提交给患者的人。这三个关键职位对于 DIRECTPyth 诊断中心的业务运营非常重要。Abbey 女士在会上表示,实验室协调员和实验室技术员的高缺勤率导致了 DIRECTPyth 的收入损失。本组织迫切需要找到如何提高生产率和减少这一角色的缺勤率。我们还可以看到,实验室协调员的流失率最高(12%),其次是实验室技术员(9%)。最低的流失率(6%)表明 DIRECTPyth 需要找到一种方法来降低实验室协调员的缺勤率和流失率。最重要的是实验室协调员的角色,那里的缺勤率和自然减员率非常高。人力资源部应该想办法降低缺勤率和离职率。在过去的三年里,他们尝试了五种方法,但在寻找解决方案方面收效甚微。因此,很明显,如果 DIRECTPyth 想要提高其盈利能力并减少损失,它需要紧急解决实验室协调员角色的缺勤和流失问题。

需要立即实现的解决方案应该是使用技术来模拟实验室协调员的角色。DIRECTPyth 获得了外国投资者的资助,能够投资于技术,以提高效率,从而增加收入。你需要使用基于 Python 的机器学习来解决和回答本案例研究中给出的问题。

  1. 你认为 DIRECTPyth 诊断中心亏损的原因是什么?

  2. 我们正在处理什么样的人类问题,你认为如何解决这些问题?

  3. 你认为技术能帮助解决你在问题 2 中发现的问题吗?

  4. 基于 Python 的机器学习解决方案能够解决 DIRECTPyth 的这些问题吗?

  5. 你提议的基于 Python 的机器学习解决方案是什么?请为您的解决方案使用 Python 3.x 源代码。

  6. 你对你的解决方案给出了什么样的商业理由,你认为它会被 DIRECTPyth 的商业领袖所接受?

我建议你先试着独立回答这些问题,然后看看这本书给出的解决方案。请注意,我给出的解决方案是这个业务场景中可以给出的众多解决方案之一。最终决定您的解决方案是否好,是否能够解决他们的业务问题的是业务所有者。

亲提示

在应用机器学习中,我们机器学习顾问与一个组织的业务领导密切合作,以确定什么对他们有效。永远记得和他们一起讨论,提出哪怕是一个不完整的小计划,并在将其转化为成熟的解决方案之前对其进行审查。这样可以节省你很多浪费的会议和精力。

现在让我试着用我自己的方式回答这些问题,给出我提出的解决方案,该方案已被组织接受。

  1. 你认为 DIRECTPyth 诊断中心亏损的原因是什么?

DIRECTPyth 诊断中心损失的原因是高运营损失,大约 88%的诊断中心没有达到平均运营基准。造成这种情况的真正原因是组织中实验室协调员的高缺勤率和损耗率。实验室协调员的缺勤率非常高,为 26%,自然减员率为 12%,而实验室技术员的缺勤率为 15%,自然减员率为 9%。人力资源部想出了五种不同的方法来阻止自然减员和旷工,但收效甚微。

  1. 我们正在处理什么样的人类问题,你认为如何解决这些问题?

我认为我们面对的是士气低落的员工,这就是我们看到高缺勤率和离职率的原因。

  1. 你认为技术能帮助解决你在问题 2 中发现的问题吗?

在我看来,在人类无法以业务所需的最佳水平执行的领域使用技术是引入自动化、机器学习和人工智能的合适场景。技术的好处在于它可以重复做任何给定的任务,而不会感到无聊或疲劳。它还可以使用数据智能,并经过训练非常容易地执行专家任务。在 DIRECTPyth 诊断中心的情况下,我们可以使用技术来取代实验室协调员的任务,将自动化实验室机器放在它的前提下,从而让客户选择他们想要执行的实验室测试。自动化实验室机器可以运行基于 Python 的机器学习程序,帮助客户选择适合其场景的最佳诊断测试。

  1. 基于 Python 的机器学习解决方案能够解决 DIRECTPyth 的这些问题吗?

是的,基于 Python 的机器学习系统可用于自动化实验室中的整个过程,从客户进来并选择诊断包以生成实验室测试,到生成报告并为客户提供有意义的解释的下一阶段。基于 Python 的机器学习系统可以连接到任何现代自动化实验室测试机器,以从中获得输出。

  1. 你提议的基于 Python 的机器学习解决方案是什么?请为您的解决方案使用 Python 3.x 源代码。

在本书中,我将给出一个简短的解决方案;但是,它将模拟我在客户的生产环境中提供给客户的真实解决方案。读者可以在现实世界中类似的情况下使用自己的想法来构建这个解决方案。给读者一个警告:这是我用来创建聊天机器人的一个非常简单的方法;然而,它并不限制用户通过使用本书中给出的代码来扩展其功能。现实生活中的聊天机器人比我在这里给出的代码更复杂,因为它涉及到使用 nltk . corpora nltk 知识库的情感分析。它还将使用词汇化自然语言处理技术,为 Python 程序的用户提供最佳响应。这个解决方案是并且应该被认为是一个模板代码,而不是最终的解决方案,因为不可能在一本书里写一个完整的生产聊天机器人的源代码,因为它会运行成数百万行代码。我将带您浏览代码,让您了解为什么要编写代码的每个部分,包括它的意图和功能,以及如何在生产中应用它的一些技巧。

  • 业务需求:该解决方案的业务需求是模拟实验室协调员的工作,并通过聊天界面与用户进行交互。我将向您展示一些适用于此案例研究场景的用例。

亲提示

甚至在你开始编码之前,将你的工作划分成简短的用例,并得到系统实际用户的认可,因为你将为他们开发。如果您跳过这一步,很可能您将开发一个用户可能拒绝的产品,因为您可能误解了一些需求。

  • 用例:作为一个用于糖尿病诊断的自动聊天机器人的用户,我应该能够知道我过去的测试数据记录,以便我检查我的历史。

  • 用例:作为一个用于糖尿病诊断的自动聊天机器人的用户,我应该能够知道该中心进行的测试类型及其目的,以便我的医生和我可以决定进行测试。

  • 用例:作为一个用于糖尿病诊断的自动聊天机器人的用户,我应该能够得到我的测试结果,这样我就可以得到一份报告。

  • 用例:作为一个用于糖尿病诊断的自动聊天机器人的用户,我应该能够得到关于我的测试结果的建议,以便我能够知道未来的行动过程。

对于 DIRECTPyth 诊断中心,有比这里给出的更多的可用用例。然而,为了简化流程,我们将只考虑我们的解决方案的这四个用例。

现在我们来看看图 4-1 中的流程图,它应用了其他聊天机器人在与客户交互时将遵循的流程。请记住,我对这个解决方案使用了极简的方法,因为它不是一个生产代码;这是给你一个想法,如何应用机器学习领域的模拟实验室协调员在医疗保健部分。

img/464968_1_En_4_Fig1_HTML.jpg

图 4-1

客户和实验室协调员聊天机器人之间的交互过程

在图 4-1 中,我们可以看到,当客户走进并与实验室协调员中的聊天机器人会面时,该流程就开始了,因此在该流程中没有人工交互或人工监督。这个售货亭有传感器,可以检测附近是否有人,并向顾客发出问候。在该过程的下一部分,如果是现有客户,聊天机器人会要求客户提供会员 ID。现在,如果在数据库中找到了客户提供的会员 id,实验室协调员 chatbot 必须根据提供的输入做出决定;然后,它向客户显示最后的测试记录结果。如果它不是现有客户,那么聊天机器人会显示糖尿病测试——许多列出了实验室可用的整套测试。一旦客户从列表中选择了测试,实验室协调员将进行测试,然后生成报告。在我们的例子中,在 Python 程序中。机器人要求客户坐在自动测试机旁边进行糖尿病诊断的部分已经被我标记了,我会在标记发生的代码中指明这一点。我这样做的原因是因为 Python 程序会为报告生成随机结果;然而,在生产环境中,该数据将来自承担测试的实验室技术人员机器。在现实世界中,通过内部医疗记录与医生共享报告的过程中会有其他步骤;然而,为了保持简单,我在这个解决方案中跳过了所有这些过程。

现在我们已经定义了聊天机器人的流程图,我们可以进入 Python 代码来实现简单的聊天机器人了。

小费

在您的机器上运行这个例子之前,加载 wordnet lemmatizer 和 punkt 包。

Install using the following commands:
import nltk

nltk.download('wordnet')
[nltk_data] Downloading package wordnet to
[nltk_data]     C:\Users\PMAUTHOR\AppData\Roaming\nltk_data...
[nltk_data]   Unzipping corpora\wordnet.zip.
Out[4]: True
import nltk
nltk.download('punkt')

清单 4-1 展示了我们聊天机器人的初始化代码,其中第一行声明我们的代码遵循 UTF 8 编码。在这之后我们有下一组语句,它们导入 GUI 库 tkinter 及其组件,如潦草的文本图像和图像 TK,以及时间包(用于配置睡眠功能)。我还引入了 random 函数,因为它可以帮助我们的聊天机器人从我们的答案中随机选择,这一点我们稍后会讲到。

# -*- coding: utf-8 -*-
"""
Created on Sat Mar 24 10:20:18 2018

@author: PUNEETMATHUR
"""
#Loading tkinter libraries which will be used in the UI of chatbots
import tkinter
from tkinter import *
from tkinter.scrolledtext import *
from tkinter import ttk
import time
from PIL import ImageTk, Image
import tkinter

#Loading random for random choices in our chat program
import random

Listing 4-1Loading chatbot User Interface

清单 4-1 显示了我们聊天机器人的初始代码。在清单 4-2 中,我们看到了使用 tkinter 包实现闪屏的 Python 代码。为了做到这一点,我们首先创建一个名为 tkinter window TK 对象的 Splash 的新对象,然后我给它一个欢迎用户进入 Splash 屏幕的标题。然后,我使用飞溅的对象给高度和重量使用几何函数。我正在创建一个 1000×100 像素高和重的飞溅窗口,所以我在几何函数的参数中使用了 1000×100。接下来,我用参数 background 等于绿色的配置函数给 Splash 窗口设置了一个背景色。为了在程序加载时显示要求用户等待的文本,我使用了中央库中 label 对象的 label 小部件,名为 w,在初始化 w 时,我将它链接到 Splash 对象,这是将要创建标签的窗口。因此,第一个参数是标签与闪屏窗口的连接位置。接下来的第二个参数是你输入你想要标签显示的文本,我已经输入了一个字符串。我输入的第三个参数是字体,为了显示文本,我使用了 26 号 Helvetica 字体。下一个参数是 FG,它代表窗口的前景色,前景色是标签的文本和它将被显示的颜色。在我的例子中,我使用了白色。在下一个参数中,我使用了 BG,它代表背景颜色,我给了它一个绿色的值。在下一条语句中,我修改了标签,以便它可以显示在启动窗口上。完成后,我使用 Splash 的 update 方法,以便标签在 Windows 屏幕上更新。一旦屏幕出现,我们希望它在用户面前出现一段时间,您可以通过让程序休眠 X 秒来指定时间。我在下一个代码语句中使用了 time to sleep,参数为 6,表示程序将休眠 6 秒。您可以尝试这样做,看看什么适合您的闪屏,您可以相应地修改秒数。在闪屏显示 6 秒钟后,我希望它消失,因此我会识别该屏幕,然后在接下来的两个语句中销毁它。

#Splash Screen
splash = tkinter.Tk()

splash.title("Welcome to Applications of Machine Learning in Healthcare, Retail & Finance")
splash.geometry("1000x100")
splash.configure(background='green')
w = Label(splash, text="DIRECTPyth Diabetes Diagnostics Chabot by Puneet Mathur\nLoading...",font=("Helvetica", 26),fg="white",bg="green")
w.pack()

splash.update()
time.sleep(6)
splash.deiconify()
splash.destroy()

Listing 4-2Splash Screen

现在是时候加载我们的聊天机器人应用程序的主聊天窗口了,因此在清单 4-3 中,您可以看到加载聊天窗口所需的代码。在清单 4-3 的第一条语句中,我在 tkinter 包中创建了一个 TK 类的窗口对象。然后,我使用滚动条类中的实例化 nS 对象将滚动条添加到窗口中,并使用 window 实例化滚动条类,使其与 window 对象相关联。如果你有滚动条而没有文本,那么它将变得无用,所以在下一个语句中,我用窗口对象实例化了一个文本框。这个文本框被称为聊天消息,我们将在以后的程序中广泛使用它,因为用户的所有输入和输出都将通过这个文本框。在下一个语句中,我使用 focus set 对象来设置文本框上的焦点。在下一个语句中,我打包了滚动条,并使用第一个参数将滚动条固定在窗口的右侧,并使用 y 轴作为滚动条。在下一条语句中,我将文本框 chat MSG 移动到窗口的顶部,并在 y 轴上填充它。在下一个语句中,我使用滚动条的 config 方法来配置从聊天消息评论中获取 nd。我还将 chatmsg 文本框与滚动条相链接,以设置–s.config 方法和 yscrollcommand 函数,然后与 s . config 的值相链接。现在,下一步是通过创建 stringware 类的对象来为输入用户和输入字段创建一个条目,然后通过实例化 entry 类并将其附加到第一个参数中的窗口以及第二个参数中的文本创建的 stringware 对象来将其与输入字段相链接。如果您不这样做,那么您的文本框将无法获取文本和回复文本。在下一条语句中,我将输入字段附加到底部,并沿 x 轴填充它。这是用户将要输入所有数据并与我们的聊天机器人进行交互的地方。在下一条语句中,我创建了一个可变的下划线文本,欢迎用户访问诊断中心。请记住,这将作为一个自动化程序在 kiosk 中运行,因此在客户到达时,kiosk 上会连接传感器,DIRECTPyth 将装配该程序。然而,在这个代码实现中,所有这些都被删除了,因为不可能在这样一本简短的书中展示完整的产品代码。在下一个语句中,我们使用 chat MSG,这是我们的文本框,并插入文本的值,这是我们的变量。在下一条语句中,我们将焦点转移到文本框。

#Initializing tkinter library for UI window show up
window = tkinter.Tk()
s = tkinter.Scrollbar(window)
chatmsg = tkinter.Text(window)
chatmsg.focus_set()
s.pack(side=tkinter.RIGHT, fill=tkinter.Y)
chatmsg.pack(side=tkinter.TOP, fill=tkinter.Y)
s.config(command=chatmsg.yview)
chatmsg.config(yscrollcommand=s.set)
input_user = StringVar()
input_field = Entry(window, text=input_user)
input_field.pack(side=tkinter.BOTTOM, fill=tkinter.X)
bot_text="Welcome to DIRECTPythPyth Diagnostic Center\n"
chatmsg.insert(INSERT, 'Bot:%s\n' % bot_text)
bot_text = "Press enter to continue "
chatmsg.insert(INSERT, 'Bot:%s\n' % bot_text)
chatmsg.focus()

Listing 4-3Creating the Chatbots Window and Welcoming the User

在现实世界中,使用 NLP 的机器学习的生产级应用程序中,您需要首先花时间与业务人员在一起,并开发一个语料库,它只不过是业务词典或组织日常生活中使用的术语。由于这个实现很短,我只给你一个关于如何在清单 4-4 中构建语料库的想法。您将看到,我已经使用 Python 变量类型的列表创建了我们的诊断语料库。第一张单子很棒;这只不过是我们的聊天机器人在新用户到来时给他们的各种问候的列表。下一个列表是添加确认,是,耶,耶,哟。你可以添加更多的确认,这个列表可能会很大,这样你才能理解用户想说什么。该列表的重要部分是该列表正在为我们的聊天机器人学习,我们提供了一些现成的答案以及客户可以在该语料库中提出的问题。在下一个列表中,我使用成员 ID,我已经使用了五个成员 ID,因为这只是一个原型应用程序。然而,在现实世界中,您可能有数百甚至数千个成员 id,这些数据可能来自一些平面文件或数据库,比如 mongo DB。在下一个列表中,我使用 customer 来捕捉这样的反应,并帮助我们的机器人识别它们,这是他们说 hello,hi 或 hey 的输入。在下一个列表答案中,我只给出了两个陈述:第一个是肯定的陈述,第二个是否定的陈述。我们将在后面查看我们的程序,看看这在实践中是如何使用的。在接下来的列表中,我使用了一些简单的问题及其回答;然而,它们可能没有被使用过。但是如果聊天机器人知道问题和回答,它会给你一个如何反应的想法。在下一个列表中,我已经给出了测试,它只是当用户输入他们的成员 ID 时弹出的菜单。我们有五个测试可以进行;然而,请记住,在诊断中心的真实业务中,他们有数百项测试,此外,他们还根据不同的客户要求打包这些测试,例如糖尿病患者概况测试和心脏状况测试,这只是一个例子。在下一组测试响应中,我使用了用户可以在之前的测试列表中输入的选项。例如,在测试响应中,一个对应于测试列表的第一项,HB A1c 测试,等等。

#Diagnostics Corpus for the chatbots
greet=['Hello welcome to DIRECTPythPyth','Hi welcome to DIRECTPythPyth','Hey welcome to DIRECTPythPyth','Good day to you welcome to DIRECTPythPyth']
confirm=['yes','yay','yeah','yo']
memberid=['12345','12346','12347','12348','12349']
customer = ['hello','hi','hey']
answer = ['I understand you feel happy but please stay to the point and select one of the options',"I sympathize with you, However please do not deviate from the topic"]
greetings = ['hola Welcome to DIRECTPythPyth again', 'hello Welcome to DIRECTPythPyth again', 'hi Welcome to DIRECTPythPyth again', 'Hi Welcome to DIRECTPythPyth again', 'hey! Welcome to DIRECTPythPyth again', 'hey Welcome to DIRECTPythPyth again']
question = ['how are you?', 'how are you doing?']
responses = ['Okay', "I'm fine"]
another = "do you want another test?"
tests=['Type 1 for hbA1c test', "Type 2 for Blood Viscosity test","Type 3 for Heart rate test","Type 4 for Blood Oxygen test","Type 5 for Blood Pressure"]
testresponse= ['1','2','3','4','5','6']

Listing 4-4The Diagnostics Corpus

现在我们从聊天机器人的实际程序开始,定义它的程序结构。在清单 4-5 中,我们可以看到这段代码是我们聊天机器人的核心。在代码的第一部分,我初始化了一些全局变量。第一个是第一开关,我给它赋值为 1。这用于确定聊天机器人是否是第一次运行。接下来,我初始化一个新的 ID。对于第一次到达诊断中心的人来说,这只是一个新的会员 ID。接下来,我用值 0 初始化了成员 ID (Mem ID)变量。在代码的下一部分,我使用了一个名为 chat 的函数,它有一个 event 参数,每当一个带电的事件发生时,它就会被触发。在这个函数中,我导入了时间和随机包,并声明了全局成员 id 变量或条件变量以及第一个开关变量。在下一个语句中,有一个 if 条件,我检查第一个 switch 是否等于 1,如果它等于 1,那么它通过从网格列表中选择一个值来对随机选择进行网格划分,我们在前面已经看到过。

它将 bot 文本变量中的值插入到 chat MSG 文本框中,因此当 chatbot 第一次运行时,用户能够看到一个问候语。然后它给出一个声明,如果你是 DIRECTPyth 的现有成员,那么你可以输入你的成员 ID;否则,根据用户输入,如果您不是成员,请输入值“否”。第一个开关变量现在的值为 2,如果用户输入一个值,它将再次触发并进入下一个 if 语句,其中第一个开关不等于 1。因此,这意味着这个特定的 if 条件将只在用户第一次问候之后运行,并且用户输入的这个值是通过输入字段接收的。我们在这里使用 lower 函数,这样我们就不必处理大写和小写,我们把值输入到下划线 get 变量中。检查该值以查看用户输入的成员 ID 是否在成员 ID 列表中找到,如果您还记得,我们有五个 ID,如果找到了,则满足 if 条件,内存函数存储用户在输入下划线 get 变量中输入的任何内容。然后填充机器人文本,感谢用户成为忠诚的成员,并向用户显示一个菜单,告诉用户最后一个退出程序的选项是什么类型的测试。

如果用户输入 no,这意味着它是一个新用户,并且他们没有成员 ID,则生成一个新的成员 ID。请记住,因为我正在创建一个原型程序,所以我不会详细讨论存储这个新 ID 和自动创建这个 ID 的细节。然而,在现实世界中,您将把这个值存储在一个平面文件或一个 mongo DB 数据库中,然后增加这个值以获得新的用户 ID。如果用户在下一个 if 语句中输入 1 到 6 之间的有效值,我会检查用户输入的 get 语句是否在测试响应列表中。如果您还记得的话,测试响应列表有从 1 到 6 的数字,所以这个 if 语句只有在测试响应被满足时才会被触发。一旦收到有效的响应,机器人模拟器会给用户一条消息,让他们将手指放在信息亭的手指面板上进行测试。它等待 10 秒,我在这里放了一个延迟计数器。

然而,在现实世界中,会有一个传感器来检测用户何时将手指放在手指面板上,并自动开始读取数据。在我们的例子中,我使用了一个 for 循环来模拟 10 秒,并使用聊天消息的时间数据表将延迟计数器休眠 1 秒。我将这些值插入聊天机器人,向用户显示我正在读取它们的值。在 for 循环的 10 个步骤完成后,机器人会说,“请等待,正在生成您的报告”,然后它会休眠 2 秒钟。然后,基于用户给出的测试输入,它为每个测试生成随机数。例如,让我向您介绍一下 if 语句,其中用户输入的值为 1,这意味着根据菜单,用户想要进行 HB A1c 测试。在这种情况下,机器人会生成一个介于 4 和 10 之间的随机数,这是 A1c 测试的有效值,并且会类似地向用户显示结果。在它完成之后,我向你展示我们如何给我们的聊天机器人添加智能,它正在模拟一个实验室协调员,而实验室协调员永远不会对报告的结果发表意见。然而,我们增加了第一次测试 HP A1c 的值,我已经向您展示了它如何根据结果智能地告诉用户他们是否患有糖尿病、糖尿病前期或没有糖尿病。在我们的例子中,它在 if 条件下寻找一个值,变量 HB A1c 在 4 到 5.6 之间。如果这个条件被满足,那么它说你没有糖尿病。它再次检查 HB A1c 变量,如果值在 5.7 和 6.4 之间,它说你是糖尿病前期。如果 HB A1c 变量值大于或等于 6.5,则患者被诊断为糖尿病。这种智能还可以添加到其他测试中,如血液粘度测试(范围从 30 到 44 MB)、心率(范围从 60 到 100 次/分钟)、血氧(范围从 95 到 100)以及血压收缩压和舒张压。您可以自己在这些条件下添加这种智能,我将让您来修改代码并更智能地使用它。

#Global variable to check first time greeting
firstswitch=1
newid="12310"
memid=0

def chat(event):
    import time
    import random
    global memid
    condition=""
    #Greet for first time
    global firstswitch

    if (firstswitch==1):
        bot_text = random.choice(greet)
        chatmsg.insert(INSERT, 'Bot:%s\n' % bot_text)
        bot_text = "If you are an existing Member of DIRECTPythPyth please enter your membershipid: or enter no if you are not a member"
        chatmsg.insert(INSERT, 'Bot:%s\n' % bot_text)
        firstswitch=2
    if (firstswitch!=1):
        input_get = input_field.get().lower()
        if any(srchstr in input_get for srchstr  in memberid):
            memid=input_get
            bot_text = "Thank you for being a loyal member of DIRECTPythPyth\n Please choose a test from following menu to continue\nType 1 for hbA1c test\nType 2 for Blood Viscosity test\nType 3 for Heart rate test\nType 4 for Blood Oxygen test\nType 5 for Blood pressure test\nType 6 to exit\n\n"
        elif (input_get=="no"):
            memid=newid
            bot_text = "Your new Memberid is: " + newid + " Please remember this for future reference.\n Please choose a test from following menu to continue\nType 1 for hbA1c test\nType 2 for Blood Viscosity test\nType 3 for Heart rate test\nType 4 for Blood Oxygen test\nType 5 for Blood pressure test\nType 6 to exit\n\n"

        elif any(srchstr in input_get for srchstr  in testresponse):

                bot_text = "Please place any of your finger on the Finger panel above to conduct the test"
                chatmsg.insert(INSERT, 'Bot:%s\n' % bot_text)
                delaycounter=0
                for delaycounter in range(0,10):
                    bot_text = str(delaycounter)
                    time.sleep(1)
                    chatmsg.insert(INSERT, 'Bot:%s\n' % bot_text)
                bot_text = "Please wait generating your report\n"
                chatmsg.insert(INSERT, 'Bot:%s\n' % bot_text)
                time.sleep(2)
                if (input_get=="1"):
                    hba1c=random.randint(4,10)
                    bot_text = "MemberID: " + str(memid) + " Your hbA1c test result is: " + str(hba1c)
                    if(hba1c>=4 and hba1c<=5.6):
                        condition="You don't have diabetes"
                    elif(hba1c>=5.7 and hba1c<=6.4):
                        condition="You are Prediabetic"
                    elif(hba1c>=6.5):
                        condition="You are Diabetic"
                    bot_text=bot_text +  " Your condition is: " + condition    

                    chatmsg.insert(INSERT, 'Bot:%s\n' % bot_text)
                elif (input_get=="2"):
                    viscosity=random.randint(20,60)
                    bot_text = "MemberID: " + str(memid) + " Your Blood Viscosity level test result is: " + str(viscosity)
                elif (input_get=="3"):
                    heartrate=random.randint(40,150)
                    bot_text = "MemberID: " + str(memid) + " Your Heart rate test result is: " + str(heartrate)
                elif (input_get=="4"):
                    oxygen=random.randint(90,100)
                    bot_text = "MemberID: " + str(memid) + " Your Blood Oxygen level test result is: " + str(oxygen)
                elif (input_get=="5"):
                    systolic=random.randint(80,200)
                    diastolic=random.randint(80,110)
                    bot_text = "MemberID: " + str(memid) + " Your Blood Pressure test result is: Systolic: " + str(systolic) + " Diastolic: " + str(diastolic)
                elif (input_get=="6"):
                    import sys
                    window.deiconify()
                    window.destroy()
                    sys.exit(0)
        else:
         from nltk.stem import WordNetLemmatizer
         import nltk
         if((not input_get) or (int(input_get)<=0)):
                        print("did you just press Enter?") #print some info
         else:
             lemmatizer = WordNetLemmatizer()
             input_get = input_field.get().lower()
             lemvalue=lemmatizer.lemmatize(input_get)
             whatsentiment=getSentiment(lemvalue)
             if (whatsentiment=="pos"):
                 bot_text = answer[0]
                 #print("Positive Sentiment")
             elif (whatsentiment=="neg"):
                 bot_text = answer[1]
             #print("Negative Sentiment")
             chatmsg.insert(INSERT, '%s\n' % lemvalue)
             #bot_text = "I did not understand what you said !"

    chatmsg.insert(INSERT, 'Bot:%s\n' % bot_text)
    #label = Label(window, text=input_get)
    input_user.set(“)
    #label.pack()
    return "break"

Listing 4-5Chatbot Code

在这个聊天机器人中,我用 NLP 展示了如何在这样的应用程序中进行情感分析。但是,请记住,我使用的 NLP 是有限制的,因为我无法编写数百万行代码来模拟现实世界的聊天应用程序。我简单地使用了一个小的训练集作为列表,但是在真实的场景中,您将使用一个文件,该文件可能会有来自客户的反馈,并且会包含积极和消极情绪的分类。让我们浏览一下代码,以便简单地理解我是如何在获取情感函数中进行情感分析的。你可以参考图 4-6 中的代码,我在那里导入了 nltk 库,然后从 nltk 中导入了 tokenize 和 word tokenize 以便进一步分析。在这个例子中,我只使用了三个步骤来执行情感分析;但是,请记住,要进行全面的情感分析,还需要遵循更多的步骤。

在第一步中,我使用训练数据来建立糖尿病语料库,这可能只是客户对响应的积极和消极反馈分类。积极情绪被归类为 POS,消极情绪被归类为 energy。完成这些后,我创建了一个字典,并通过将每个单词转换成小写来标记它。在这之后,我为我们必须组织的每个单词创建一个字典,并通过我们一直在跟踪的训练数据集运行它。完成此操作后,我们已经创建了在训练数据中定位单词的步骤 3,现在我转到步骤 4 来训练分类器,在我们的示例中,是对样本数据进行朴素贝叶斯训练,因此我调用了朴素贝叶斯分类器,并对已定位的世界进行了训练。然后我得到新的数据,这被称为测试数据;例如,这里是“哦,我的上帝”,但是你可以用这个函数的文本变量替换它,以便创建你的测试数据。一旦创建了测试数据,我们需要为字典中标记的每个单词创建特征,这是我们在前面的步骤 3 中创建的。一旦完成,我们现在就可以告诉我们的数据特征是如何被分类的了。有没有被归类为能源或者 POS?该函数返回分类器点分类测试数据特征的值。如果你回到图 4-1 中,我在条件中定义了聊天功能。

在 else 语句的最后一个条件中,我使用了一个 wordnet lemmatizer,并检查了数据用户给出的输入是否不是一个条目。

然后,它使用单词 net lemmatizer,并获取用户以小写形式输入的值。它对值进行了引理。词汇化是将一个较大的单词转换成它的词根的过程。举个例子,cars 有一个词根词 car。在下一个语句中,我使用 get 情感函数并给出值,这是用户给定的 lemmatize 输入,作为回报,我从函数中获得 neg 能量或 POS 负面或正面情感。在下一个条件中,我检查值是否是 POS 则机器人回答 0 的肯定响应回答,或者,如果是否定情绪,则机器人回答否定响应。因此,您已经以非常简单的方式了解了如何实现聊天机器人应用程序并将其用于商业用途。

#Sentiment Analyzer using NLP
def getSentiment(text):
    import nltk
    from nltk.tokenize import word_tokenize

    #nltk.download('punkt')
    # Step 1 – Training data building the Diabetes corpus
    train = [("Thanks for an excellent report", "pos"),
    ("Your service is very quick and fast", "pos"),
    ("I am pleased with your service", "pos"),
    ("I did not know i was diabetic until you gave me this report", "neg"),
    ("Service - Little slow, probably because too many people.", "neg"),
    ("The place is not easy to locate", "neg"),
    ("The place is very easy to locate", "pos"),
    ("Not satisfied will take a second opinion", "neg"),
    ("No human contact everything is so robotic here", "neg"),
    ("can i talk to a human not convinced with your report", "neg"),
    ("good results", "pos"),
    ("good service", "pos"),
    ("great service", "pos"),
    ("excellent service", "pos"),
    ("amazing technology", "pos"),
    ("fast service and satisfying report", "pos"),
    ("your report sucks", "neg"),
    ("this report will cost me a fortune", "neg"),
    ("I have diabetes", "neg"),
    ("this report will cost me a fortune", "neg"),
    ("this report means i have a dreadful disease", "neg"),

    ("will i need to take new medication", "neg"),
    ("i need to take my insulin injections regularly", "neg"),
    ("my lipids are getting worst need to talk to the doctor", "neg"),
    ("oh my god very bad results", "neg"),
    ("bad service", "neg"),
    ("very bad service", "neg"),
    ("poor service", "neg"),
    ("very bad service", "neg"),
    ("slow service", "neg"),
    ("very slow service", "neg"),
    ("diabetes got worst is this report accurate", "neg"),
    ("i dont believe this report", "neg"),
    ("i dont like this report", "neg"),
    ("i am in a diabetic hell", "neg"),
    ]
    # Step 2 Tokenize the words to dictionary
    dictionary = set(word.lower() for passage in train for word in word_tokenize(passage[0]))
    # Step 3 Locate the word in training data
    t = [({word: (word in word_tokenize(x[0])) for word in dictionary}, x[1]) for x in train]
    # Step 4 – the classifier is trained with sample data
    classifier = nltk.NaiveBayesClassifier.train(t)
    test_data = "oh my god what is this"
    test_data_features = {word.lower(): (word in word_tokenize(test_data.lower())) for word in dictionary}
    print (classifier.classify(test_data_features))
    return classifier.classify(test_data_features)

#Start the program chat and put in loop
input_field.bind("<Return>", chat)
tkinter.mainloop()

Listing 4-6Sentiment Analysis

案例研究 2:医院食物浪费问题

在这个案例研究中,我们要看一个非常普遍的医院现象:食物浪费。我们要应用机器学习的方法来解决这个商业问题。

Acadecia 医院是美国领先的国际连锁医院之一。它成立于 1986 年,位于加利福尼亚州的一个小镇欧康。刚开始的时候很小;然而,创始人 Jack Juice 博士的愿景是让小镇居民能够负担得起并轻松获得医疗保健。这家连锁医院最引人注目的事实是,它能够保持医院的低运营成本,以便为小镇居民提供负担得起的医疗保健。2017 年,它在全球拥有 120 多家医院,其中 70%位于人口不到 100 万的小城镇。

Twin Burger 博士正在啜饮他的早餐咖啡,并仔细阅读他从财务部收到的关于其医院网络运营成本的报告。他是 Acadecia 医院的负责人,带领连锁医院实现 Juice 博士的愿景,让全世界人民都能负担得起医疗保健。在图 4-2 中,你会看到 Burger 博士那天早上收到的报告。

img/464968_1_En_4_Fig2_HTML.jpg

图 4-2

Acadecia 医院的食品成本报告

在图 4-2 中,我们可以在 Burger 医生面前看到过去 3 年(2014-2016)每份医院报告的成本参数。报告显示,Acadecia 的医院数量稳步增长;员工人数也增加了,医院的平均床位也增加了。然而,对于我们的案例研究,相关数据在最后三行,第一行是医院每天的总食品订单,以千克为单位。随着医院的增多,这个数字也上去了。倒数第二行显示了食品通胀的上升,这是以美元计算的每公斤食品的平均成本,从 2.35 美元到 2.56 美元不等。以千克为单位的粮食浪费也从 2014 年的 74.9 千克下降到 109.8 千克。在 Acadecia 的所有医院中,食物浪费从 2014 年的 42%上升到 2015 年的 47 %,平均占食物订购总量的 55%。因此,很明显,正如报告中概述的那样,伯格医生正在考虑他的医院由于食物浪费增加而导致的成本上升。

在看完报告后,Burger 博士意识到问题正在失控,需要一些有针对性的解决方案。他记得在周末遇到了他的老朋友,他现在是一名机器学习顾问,他说他可以帮助伯格博士解决任何需要使用技术的问题。他向机器学习顾问发送了一封电子邮件,预约讨论问题并利用技术找到解决方案。

他见了机器学习顾问,和他签了协议后给他看了数据。他问机器学习是否可以帮助解决这个问题,并提出一个适当的解决方案来降低他的组织因食物浪费而产生的成本。

该顾问要求提供更多的数据,以便他找出原因,然后找到解决问题的可能办法。Acadecia 计算机部门的人给了他数据访问权,让他查看中央数据库中全球服务器上的数据存储。

有趣的是,我不打算讨论数据集成和数据争论的部分,因为我们在前面的案例研究中已经讨论过了。但是,请记住,在真实的生产环境中,您很难获得本案例研究中的现成数据。您需要从平面文件、Excel 表、Word 文档、PowerPoint 演示文稿、专有数据库(如 Oracle、sQL server 和 dB2)等来源中集成数据并将其收集到一个单一来源中,如 Hadoop 或 mongo DB 或 Cassandra。

现在我们来看看 Acadecia 的综合数据集,我们将在此基础上建立我们的机器学习模型。

img/464968_1_En_4_Fig3_HTML.jpg

图 4-3

样本数据集

在图 4-3 中,我们查看了 Acadecia 医院的样本数据集。这是三家医院的数据,为了保密,我特意去掉了名字。为了保持客户的匿名性,还对其原始来源进行了充分的修改。从 Acadecia 的 125 家医院收集的数据包括医院订购的食物总量、医院浪费的食物总量、提供的住院病人膳食数量、住院病人的客人数量以及医院的类型。所有这些信息是 2014 年至 2016 年所有 3 年的平均值。

在接下来的步骤中,我们将在 Python 中加载这个数据集,并开始应用机器学习的过程,我在本书的前几章中概述了这一过程。

import pandas as pd
import os
os.getcwd()

fname="Food_Raw_Data.csv"
hospitals= pd.read_csv(fname, low_memory=False, index_col=False)
df= pd.DataFrame(hospitals)
print(df.head(1))

Listing 4-7Loading the Data Set

最初在清单 4-7 中,我加载所需的 Python 库 Pandas os,然后打开文件 food raw data。csv 文件从本地 DIRECTPyth 导入到医院的 Pandas 数据帧中,然后通过 head 函数从数据帧中读取第一条记录。加载完数据集后,我们现在将查看数据集的形状、列和数据类型,以便进一步研究它。我还查看了清单 4-8 中数据框的列及其数据类型,该数据框的形状由 125 行 8 列组成。通过给定 from,我们可以看到所有 8 列,从订购的食物总数、浪费的食物总数、住院病人数、提供的膳食数、住院病人的客人数、反馈、医院类型和病床总数开始。在这之后,我们查看每一列的数据类型;数字列是特定医院订购的食物总量、特定医院浪费的食物总量、医院接收的住院病人数量、医院一天供应的膳食数量、医院住院病人的客人数量以及医院的病床总数。非数字列是医院名称和反馈,这是患者和客人对医院食品质量的评级,但我们不打算在我们的模型中使用它。

print(df.shape)
(125, 8)

print(df.columns)
Index(['Total Food ordered', 'Total Food Wasted', 'No of Inpatients',
       'No of Meals served', 'No of Guests with Inpatient', 'Feedback',
       'Type of Hospital', 'Total No of beds'],
      dtype='object')

df.dtypes
Out[72]:
Total Food ordered              int64
Total Food Wasted               int64
No of Inpatients                int64
No of Meals served              int64
No of Guests with Inpatient     int64
Feedback                       object
Type of Hospital               object
Total No of beds                int64
dtype: object

Listing 4-8Looking at the Shape and Size of the Data Set and Its Structure

在清单 4-9 中,我们可以通过 df.org 空值看到没有空值,我们用 bf.in 验证了这一点,对于每种数据类型,所有的值都是非空的。通过这种方式,我们可以确保数据集中的每一列和每一行都被填充,因此没有丢失的值。

#Check if there are any columns with empty/null dataset
df.isnull().any()
#Checking how many columns have null values
df.info()
df.isnull().any()
#Checking how many columns have null values
df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 125 entries, Hospital 1 to Hospital 99
Data columns (total 8 columns):
Total Food ordered             125 non-null int64
Total Food Wasted              125 non-null int64
No of Inpatients               125 non-null int64
No of Meals served             125 non-null int64
No of Guests with Inpatient    125 non-null int64
Feedback                       125 non-null object
Type of Hospital               125 non-null object
Total No of beds               125 non-null int64
dtypes: int64(6), object(2)
memory usage: 13.8+ KB

Listing 4-9Checking for Missing Values

既然我们已经检查了丢失的值,让我们继续探索性的数据分析,查看我们的数据集的数字列的平均值、中值和众数,并通过未定义的 df.com 众数查看清单 4-10 。为了从均值函数简单地理解我们的结果,总的食物订购平均值为 319.18,医院浪费的食物平均值为 54.68 千克。人数为 33 人,医院平均提供 140 顿饭。住院客人的平均人数为 8 人。医院平均共有 64 张床位。如果我们查看相同列的中值,我们会发现中值为 255 的总订购量和 23 的总浪费量之间存在巨大差异。住院病人人数为 26 人,提供的膳食数量为 113 份。住院客人数为 7 人,总床位数接近平均值 66 张。如果中值和平均值足够接近,则意味着我们的数据集是正态的或接近正态的,其特征是,如果数据集具有正态分布,则平均值、中值和众数的每一列的值将接近相等。但是,我们可以清楚地看到,我们的数据集并不是正态分布的。均值和中值之间的差异告诉我们的另一件事是,我们正在处理异常值,在总食物浪费、用餐次数和总食物订购列中有更多的异常值。其余的列彼此接近,因此其中可能没有很多异常值。

#How is the data distributed and detecting Outliers
df.std()
df.max()
df.min()
df.quantile(0.25)*1.5
df.quantile(0.75)*1.5
df.std()
Out[79]:
Total Food ordered             220.918186
Total Food Wasted               81.394658
No of Inpatients                22.565266
No of Meals served              97.742244
No of Guests with Inpatient      8.358886
Total No of beds                20.279047
dtype: float64

df.max()
Out[80]:
Total Food ordered               921
Total Food Wasted                454
No of Inpatients                  91
No of Meals served               407
No of Guests with Inpatient       38
Feedback                           C
Type of Hospital               Urban
Total No of beds                 100
dtype: object

df.min()
Out[81]:
Total Food ordered                 2
Total Food Wasted                  0
No of Inpatients                   0
No of Meals served                 1
No of Guests with Inpatient        0
Feedback                           A
Type of Hospital               Rural
Total No of beds                  30
dtype: object

df.quantile(0.25)*1.5
Out[82]:
Total Food ordered             238.5
Total Food Wasted                7.5
No of Inpatients                25.5
No of Meals served             105.0
No of Guests with Inpatient      3.0
Total No of beds                66.0
Name: 0.25, dtype: float64

df.quantile(0.75)*1.5
Out[83]:
Total Food ordered             679.5
Total Food Wasted               87.0
No of Inpatients                70.5
No of Meals served             300.0
No of Guests with Inpatient     18.0
Total No of beds               123.0
Name: 0.75, dtype: float64

Listing 4-11Exploratory Data Analysis

df.mean()
Out[75]:
Total Food ordered             319.184
Total Food Wasted               54.680
No of Inpatients                32.952
No of Meals served             141.224
No of Guests with Inpatient      8.800
Total No of beds                64.776
dtype: float64

df.median()
Out[76]:
Total Food ordered             255.0
Total Food Wasted               23.0
No of Inpatients                26.0
No of Meals served             113.0
No of Guests with Inpatient      7.0
Total No of beds                66.0
dtype: float64

df.mode()
Out[77]:
   Total Food ordered  Total Food Wasted  No of Inpatients  \
0               110.0                0.0                23
1                 NaN                NaN                25

   No of Meals served  No of Guests with Inpatient Feedback Type of Hospital  \
0                97.0                          2.0        B            Urban
1                 NaN                          NaN      NaN              NaN

   Total No of beds
0              44.0
1               NaN

Listing 4-10
Detecting Outliers

在清单 4-11 中,我们转到检测异常值,以检测我们首先查看标准偏差,它告诉我们数据在每一列中的离差,然后我们查看最大值和最小值,以找出数据集中每一列的范围。然后,我们使用分位数函数,使用第 25 个百分点和第 75 个百分点,并乘以 1,以获得下限异常值和上限异常值。例如,从分位数 0.2 中,我们可以看到,订购的食物总量的异常值下限为 238.5,而第 75 个百分位 X 1.5 的“订购的食物总量”列的值为 679。实际上,对于“订购的食物总量”列,任何低于 38.5 的值和任何高于 679 的值都将被视为异常值。你同样可以查看其他栏,如浪费的食物总量、住院病人数量、提供的餐饮数量等。

#How many Outliers in the BPSystolic column
df.columns
df.dtypes
df.set_index(['Hospital Name'])
df['Total Food ordered'].loc[df['Total Food ordered'] <=238.5].count()
Out[84]: 55

df['Total Food ordered'].loc[df['Total Food ordered'] >=679.5].count()
Out[85]: 11

Listing 4-12How Many Outliers in Any Particular Columns

现在我们来看图 4-3 ,在图中,我给出了一个示例,说明如何计算特定列中有多少值(如总点餐数)不符合异常值的下限和上限。我们可以看到,对于订购的总食物,异常值下限为 38.5,有 55 个值小于这个数字。类似地,对于异常值上限 679,“订购的食物总数”列有 11 个值超出了该阈值限制。

为什么我们需要知道这些?首先,任何机器学习顾问都会考虑这个值,因为他们需要决定是丢弃、保留还是修改离群值。在这种情况下,我决定保留离群值,因为如果我删除它们,我将丢失数据集的很大一部分(125 行中的 66 行将丢失),并且这些行可以带来的学习也将随之丢失。然而,这并不是您在每次建模练习中都必须遵循的规则。您应该独立思考什么是相关的,什么对您的数据集和您正在构建的模型是有益的。

img/464968_1_En_4_Fig4_HTML.jpg

图 4-4

可视化数据集的结构

#Visualizing the dataset
df.boxplot(figsize=(10, 6))
df.plot.box(vert=False)
df.kurtosis()
df.skew()
import scipy.stats as sp
sp.skew(df['Total Food ordered'])

在图 4-4 中,我们试图通过绘制盒状图的水平和垂直方向来可视化我们的数据集,从图中可以非常清楚地看出,订购的食物总量更加分散,并且在尾部末端有异常值。相比之下,浪费的食物总量要少得多;然而,它在尾部有更多的异常值。

类似地,读者会从第三章中回忆起峰度显示了我们数据集分布的厚度。这意味着厚度,如果峰向左,那么它被称为薄峰。如果分布是厚尾,那么这样的分布与正态分布比较,峰度值等于 3。过度峰度意味着峰度值将大于 3,而较少峰度意味着峰度值将小于 3。如果峰度值小于 0,则称之为平峰分布。记住这一点,现在让我们研究清单 4-13 中给出的四个变量。总食物顺序的峰度值是负的(0.1),所以它是平峰度。浪费的食物总量在 3 以上,价值 7。这意味着在数据中有更多的峰值和过度峰度,并且分布是中等峰度的。住院病人数和提供的膳食数列是 platykurtic,因为它们小于 0;同样,床位总数也小于 0。有住院病人的客人的列数是 2,这意味着它不是更小的峰度,因为该值小于 3。

df.kurtosis()
Out[91]:
Total Food ordered            -0.150535
Total Food Wasted              7.432315
No of Inpatients              -0.299269
No of Meals served            -0.155185
No of Guests with Inpatient    2.008910
Total No of beds              -1.224649
dtype: float64

df.skew()
Out[92]:
Total Food ordered             0.756837
Total Food Wasted              2.570979
No of Inpatients               0.712854
No of Meals served             0.754662
No of Guests with Inpatient    1.476908
Total No of beds              -0.028728
dtype: float64

Listing 4-13Looking at Skew and Kurtosis

在清单 4-13 中,我们查看了每一列的偏斜度和峰度,您会从第三章中回忆起,如果偏斜度小于 0,那么我们说分布是负偏斜的;如果偏斜度等于 0,则称该分布是对称的;如果偏斜值大于 0,那么我们说分布是正偏斜的。偏斜告诉我们尾巴向哪个方向偏斜。负偏差的结果有一个长的左尾巴,正偏差的结果有一个长的右尾巴。从清单 4-13 中,我们可以看到,总点餐数为正值 0.7,总浪费食物数也正偏于 2。住院病人数正偏于 0.71,提供的餐饮数也正偏于 0.7,有住院病人的客人数高度偏于 1.4,总床位数略微负偏,但在 0.02 更接近于 0。

df.hist(figsize=(10, 6))
Out[95]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000019D18C1F940>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000019D18F2CB70>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000019D18F64B70>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000019D18F9FC50>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000019D18FDAC50>,
<matplotlib.axes._subplots.AxesSubplot object at 0x0000019D18FDAC88>]], dtype=object)

在图 4-5 中,我们可以清楚地看到数据集中的列是如何分布的。这表明列中的数据都不符合正态曲线。

img/464968_1_En_4_Fig5_HTML.jpg

图 4-5

可视化数据分布

现在我们进入下一步,识别数据之间的任何关系,因为我们在建模练习中讨论的是数字数据。在图 4-6 中,我们可以看到各列相关值的结果,我们案例研究的主要重点是基于总食物浪费值创建一个模型,这需要根据其他数据进行预测。其他数据是可用的,所以看相关值,我选择的最重要的是,浪费的食物总量与病人数量的相关值为 0.7;浪费的食物总量与用餐次数呈正相关,相关系数为 0.7;浪费的食物总量与有住院病人的客人数量呈非常高的正相关,为 0.9;与总食物订单相关的总食物浪费是 0.7。我提议基于这四个输入建立一个总食物浪费的预测模型。我们可以看到,住院病人的客人数量与总食物浪费的比例可能为 0.9,因此 Acadecia 医院可能需要研究住院病人数量增加导致医院设施食物浪费的原因。这一最重要的决定因素可以为他们节省大量的食物浪费。

img/464968_1_En_4_Fig6_HTML.jpg

图 4-6

用散点图可视化相关性

df.corr()
Out[96]:
                             Total Food ordered  Total Food Wasted  \
Total Food ordered                     1.000000           0.770522
Total Food Wasted                      0.770522           1.000000
No of Inpatients                       0.998059           0.765459
No of Meals served                     0.999994           0.770236
No of Guests with Inpatient            0.696581           0.934847
Total No of beds                       0.410256           0.357904

                             No of Inpatients  No of Meals served  \
Total Food ordered                   0.998059            0.999994
Total Food Wasted                    0.765459            0.770236
No of Inpatients                     1.000000            0.998056
No of Meals served                   0.998056            1.000000
No of Guests with Inpatient          0.697330            0.696443
Total No of beds                     0.411096            0.409509

                             No of Guests with Inpatient  Total No of beds
Total Food ordered                              0.696581          0.410256
Total Food Wasted                               0.934847          0.357904
No of Inpatients                                0.697330          0.411096
No of Meals served                              0.696443          0.409509
No of Guests with Inpatient                     1.000000          0.296937
Total No of beds                                0.296937          1.000000
Figure 4.22 Correlation for all the numeric column variables
df.plot.scatter(x='Total Food Wasted', y='No of Guests with Inpatient',s=df['Total Food Wasted']*2)
Out[98]: <matplotlib.axes._subplots.AxesSubplot at 0x19d190eec50>

现在,图 4-6 向您展示了一种观察这种相关性的方法,并创建了一个散点图,清楚地显示了总食物浪费量和住院客人数量之间的联系。我们可以在图表中清楚地看到一种模式。虽然我们有两个分类列,反馈和医院类型,但因为我们的案例研究不需要对它们进行任何计算或理解,所以在我们的模型构建练习中,我们将忽略它们。接下来,我进入数据准备步骤,将数据分为特性集和目标集。第一个数据框是浪费,这是我们的目标数据集,我们需要根据其他列来预测浪费的食物总量。为了创建要素数据框,我从数据框中删除了浪费的食物总量,这是我们的目标列、反馈列、医院类型列和床位总数列。这在清单 4-14 中进行了描述。

wastage = pd.DataFrame(df['Total Food Wasted'])

dropp=df[['Total Food Wasted','Feedback','Type of Hospital','Total No of beds']]
features= df.drop(dropp, axis=1)
wastage.columns
features.columns
Out[102]:
Index(['Total Food ordered', 'No of Inpatients', 'No of Meals served',
       'No of Guests with Inpatient'],
      dtype='object')

Listing 4-14Preparing Features and Target Data Sets

接下来,我们继续洗牌,并按照 80%比 20%的比例将数据分成训练集和测试集。这可以在清单 4-15 中看到。

from sklearn.cross_validation import train_test_split
from sklearn.utils import shuffle

# Shuffle and split the data into training and testing subsets
features=shuffle(features,  random_state=0)
wastage=shuffle(wastage,  random_state=0)
# Split the 'features' and 'income' data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(features, wastage, test_size = 0.2, random_state = 0)

# Show the results of the split
print("Training set has {} samples.".format(X_train.shape[0]))
print("Testing set has {} samples.".format(X_test.shape[0]))
Training set has 100 samples.
Testing set has 25 samples.

Listing 4-15Shuffling and Splitting the Data

接下来,我继续构建和评估模型。我将使用两个回归变量:一个是线性回归模型,另一个是线性 SVC(支持向量机)。您可以在清单 4-16 中看到库导入及其初始化。

import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.svm import LinearSVC

#Creating Linear Regression object
regr = linear_model.LinearRegression()
linear_svm = LinearSVC().fit(X_train,y_train)
Figure 4.26  Model Evaluation and Initializing

regr.fit(X_train,y_train)
y_pred= regr.predict(X_test)
yy_pred= linear_svm.predict(X_test)
#Printing Codfficients
print('Coefficients: \n',regr.coef_)
print(LinearSVC().fit(X_train,y_train).coef_)
Coefficients:
 [[ 3.84820846 -4.81910798 -7.39895629  7.71902335]]
[[ -3.53041635e-02   5.09097801e-02   3.14979916e-02  -3.88312025e-01]
 [ -2.32668818e-02  -1.42174073e-01   7.43984582e-02  -1.16573785e-02]
 [  4.72789182e-02   1.47150837e-01  -1.36891194e-01  -5.32241337e-02]
 [  2.93890989e-02  -1.19191185e-01  -2.58725709e-02  -3.82878378e-02]
 [  4.11308074e-02   2.64727641e-02  -9.78443211e-02  -5.51862063e-02]
 [  7.00718282e-02  -8.10166533e-02  -1.22951514e-01   1.71447192e-01]
 [  3.42043753e-02  -2.05910747e-02  -6.20141160e-02  -9.89629458e-02]
 [  2.77961883e-02  -4.46751024e-02  -4.37038593e-02   2.66465015e-01]
 [  1.13547353e-02  -2.71632958e-02  -2.08526490e-03   1.70754244e-01]
 [  3.32914578e-02  -1.67505293e-02  -5.77349454e-02   2.09845962e-03]
 [  4.77186007e-02  -8.23837686e-02  -9.30268666e-02   3.78425737e-02]
 [  3.41540305e-02  -7.34444501e-02  -6.46481812e-02   3.54015691e-02]
 [  3.84521437e-02  -6.41689817e-02  -7.31629621e-02   2.70787385e-01]
 [  4.87625884e-02  -6.84474198e-02  -8.67811679e-02  -5.64164062e-02]
 [  1.49537087e-02  -3.77585007e-02  -1.36249294e-02   7.99620681e-02]
 [  4.89155675e-02  -9.21493872e-02  -8.01503822e-02   1.77140915e-01]
 [  4.24949470e-02  -4.87499272e-02  -7.78022864e-02   1.34518802e-01]
 [  3.50542029e-02  -3.54090045e-02  -6.63975873e-02   1.09584692e-03]
 [  9.38169848e-03  -3.67554573e-02  -1.71349625e-02   2.41221242e-01]
 [  1.00033106e-02  -4.53600521e-02  -6.24499229e-03   1.58324477e-01]
 [  1.41868325e-02  -3.95136457e-02  -1.76177176e-02   2.42552491e-02]
 [  2.67055967e-02  -3.86757704e-02  -5.58150253e-02   2.54908921e-01]
 [  4.79369084e-02  -6.20604669e-02  -8.98633410e-02  -7.57650121e-03]
 [  3.08510176e-02  -8.53705374e-02  -5.20465381e-02   2.20385612e-01]
 [  1.73454354e-02   1.98721103e-02  -4.24878889e-02   9.81570693e-02]
 [  1.24536489e-02  -4.20971569e-02  -1.23960336e-02   3.52634992e-02]
 [  2.57398024e-02  -9.16159713e-02  -4.47215477e-02   2.19305087e-01]
 [  4.23505923e-03   6.72353051e-04  -6.50834658e-03   1.49214594e-01]
 [  2.53837094e-02  -6.98875557e-02  -4.85734903e-02   2.22530149e-01]
 [  1.43908959e-02  -4.75516908e-02  -1.95433533e-02   1.51543940e-01]
 [  2.74067987e-02  -7.52560330e-02  -4.01603079e-02   1.10143783e-01]
 [  4.64045608e-02  -4.05773937e-02  -8.79857548e-02   1.03748880e-02]
 [  1.90491415e-02  -4.10809528e-02  -3.62574033e-02  -1.81196597e-02]
 [  2.22912356e-02  -2.72874169e-02  -4.39681811e-02   1.09394978e-01]
 [  4.20384279e-02  -3.25727010e-02  -8.51492094e-02  -6.37752010e-03]
 [  2.61534393e-02  -2.94261743e-02  -5.41846630e-02  -2.75644483e-02]
 [  2.45319444e-02  -5.09991059e-02  -5.06126410e-02   2.02505939e-01]
 [  2.61919602e-03  -1.25839053e-02  -6.30409084e-03   1.80773339e-01]
 [  2.74789306e-03  -2.73580886e-02  -6.50473121e-03   2.01205405e-01]
 [  2.44669007e-02  -7.03696516e-03  -4.64750958e-02   2.60881871e-02]
 [  1.51200603e-02  -6.89484027e-02  -8.71324723e-03  -8.82744952e-02]
 [  2.65609136e-02  -4.97286727e-02  -5.75957648e-02   3.38979678e-02]
 [  7.11056619e-03  -3.27401201e-02  -1.46946498e-02   1.84639962e-01]
 [ -3.19488770e-03  -1.29730299e-02  -6.65748840e-03   2.30931190e-01]
 [  2.39725322e-02  -4.20831865e-02  -5.23242642e-02   6.14469586e-02]
 [  6.08374964e-03  -3.24197530e-02  -1.01534653e-02   1.56827822e-01]
 [  6.69569094e-03   4.31666176e-03  -3.94068509e-02   1.51761293e-01]
 [  4.25886521e-04  -2.49710716e-02  -1.34306904e-02   2.29936692e-01]
 [ -1.00182507e-03  -2.39362307e-02  -8.88224128e-03   2.23843885e-01]
 [  1.51225156e-02  -4.74318832e-02  -3.73751734e-02   1.50716919e-01]
 [  2.45229013e-02  -5.96876827e-02  -5.15767695e-02   1.86736550e-02]
 [  1.13573008e-02  -2.92617710e-02  -3.19670746e-02   1.29940982e-01]
 [  1.33635906e-02  -3.62729876e-02  -2.39250008e-02   1.03188376e-01]
 [  1.22517696e-02  -4.33917684e-02  -1.70961907e-02   8.42211744e-02]
 [  7.24558495e-03  -3.29668719e-02  -1.44697007e-02   1.50876782e-01]
 [  9.93726094e-04  -3.39403174e-02  -9.35154827e-03   2.01139275e-01]
 [  4.76853411e-03  -1.52811320e-02  -2.65559075e-02   1.66170095e-01]
 [  3.07916719e-03   3.05077312e-05  -2.62159469e-02   1.62382755e-01]
 [  1.07347039e-02  -4.44424820e-02  -3.08244532e-02   1.32283650e-01]
 [  1.24123818e-02  -4.00221036e-02  -3.10893289e-02   1.28289289e-01]]
print('Coefficients: \n',regr.coef_)
Coefficients:
 [[ 3.84820846 -4.81910798 -7.39895629  7.71902335]]

plt.plot(X_test, y_pred, linewidth=3)
plt.show()

Listing 4-16Results of Regressors

img/464968_1_En_4_Figa_HTML.jpg

img/464968_1_En_4_Fig7_HTML.jpg

图 4-7

线性回归与线性 SVM 可视化

line = np.linspace(-15, 15)
for coef, intercept in zip(linear_svm.coef_, linear_svm.intercept_):
    plt.plot(line, -(line * coef[0] + intercept) / coef[1])  #HOW DO WE KNOW

plt.ylim(-10, 15)
plt.xlim(-10, 8)
plt.show()

在图 4-7 中,我们看到线性回归的结果以及来自线性 SVC 的系数,同时我们看到来自线性回归的系数有四个参数,正如预期的那样。然而,在这种特殊情况下,线性 SVC 是一种不好的方法,因为为了预测解,它给了我们更多的划分。为了让你理解这个概念,我将在清单 4-17 中列出线性回归的结果,以及在线性 SVM 中使用的预测和图形表示。当我们比较线性回归和线性 SVM 的图形时,我们看到线性 SVM 中有更多的边界,而线性回归中只有四个边界。所以我们应该使用线性回归来建立我们的模型。

predicted= regr.predict([[820,81,363,35]])
print(predicted)
[[ 312.23258101]]

Listing 4-17Predict Using Linear Regression Using Our Model on the Amount of Wasted Food Based on Four Parameters

我使用清单 4-17 中的最后一步,通过给定我们的因变量和自变量的四个值来随机预测,以获得特定医院的总食物浪费。

这就是我对这一章案例研究的全部内容。我希望您能像我有幸向您展示案例一样,喜欢阅读这些案例。

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

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

img/464968_1_En_6_Fig1_HTML.jpg

图 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 这样的商店供应办公用品;同样,也有像巴诺书店&这样的连锁书店,还有像美泰书店这样的儿童用品连锁店。这些商店迎合购买者的特殊需求,如儿童、书籍、办公用品。

img/464968_1_En_7_Fig1_HTML.jpg

图 7-1

零售细分市场

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

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

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

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

零售价值主张

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

img/464968_1_En_7_Fig2_HTML.jpg

图 7-2

零售客户价值主张

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

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

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

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

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

零售行业的技术采用流程

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

img/464968_1_En_7_Fig3_HTML.jpg

图 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 中,我们看到了这个映射。

img/464968_1_En_8_Fig1_HTML.png

图 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 中零售部门的人工智能和人工智能在商店管理中的状态。

img/464968_1_En_8_Fig2_HTML.jpg

图 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 中的数字健康记录。

img/464968_1_En_8_Fig3_HTML.jpg

图 8-3

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

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

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

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

img/464968_1_En_8_Fig4_HTML.jpg

图 8-4

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

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

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

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

img/464968_1_En_8_Fig5_HTML.jpg

图 8-5

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

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

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

img/464968_1_En_8_Fig6_HTML.jpg

图 8-6

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

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

2018 年零售业技术采用阶段

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

img/464968_1_En_8_Fig7_HTML.png

图 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 中,我们看到了可视化样本数据集的代码。

img/464968_1_En_9_Fig1_HTML.jpg

图 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 中看到。

img/464968_1_En_9_Fig2_HTML.jpg

图 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 中详细看到。

img/464968_1_En_9_Fig3_HTML.jpg

图 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 提供了实现双绘图的代码。

img/464968_1_En_9_Fig4_HTML.jpg

图 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 中“渠道”数据的聚类结果。

img/464968_1_En_9_Fig5_HTML.jpg

图 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 中,我们可以看到基于“通道”数据的聚类结果。

img/464968_1_En_9_Fig6_HTML.jpg

图 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 中看到相似性的柱状图。

img/464968_1_En_10_Fig1_HTML.jpg

图 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 代码集中看到的代码相比,没有任何变化。唯一的变化是产品名称和代码的后续结果:

img/464968_1_En_10_Fig2_HTML.jpg

图 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 给出了一个简单的库存流程

img/464968_1_En_11_Fig1_HTML.png

图 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?

十二、将零售机器学习货币化

在这一章中,我将提出一些创新的想法,这些想法可以利用机器学习来实现货币化。我还将向您展示一些使用类似方法并取得成功的例子。

货币化的三个领域如下:

  • 互联零售店

  • 相连的仓库

  • 协作社区移动商店

在某种程度上,正如我将进一步解释的那样,互联零售店和互联仓库的概念是相互联系的。但是,我们将分别研究它们,以便更详细地理解它们,然后看看它们如何协同工作。

互联零售店

为了让我们理解我所说的互联零售店是什么意思,让我们先了解一下什么是互联零售店。我也看到许多大公司有这种误解。

  • 互联零售店不仅仅是将数字功能扩展到您现有的实体店。

  • 互联零售店不仅仅是给你的产品添加 RFID 标签,并对消费者行为进行分析。

  • 互联零售店不使用蓝牙或在线方式向购物的顾客发送产品和优惠。

  • 互联零售店不会在顾客在店内购物时使用电话向顾客提供优惠。

在了解了什么是互联零售店之后,现在让我们来看看什么是互联零售店,以及我们是否有任何可以效仿或学习的例子。让我们来看看图 12-1 中一个真正互联商店的示意图。

img/464968_1_En_12_Fig1_HTML.jpg

图 12-1

关联商店图

在这个示例图中,我向您展示了一组五个相连的零售商店,它们属于任意一个城市中的一个零售组织。红线表示城市范围,蓝线表示同一社区或地区的商店。“互联商店”主题的核心概念是,每家零售店每天都有大量的商品和服务流动。

顾客走进一个城市不同地区的任何或所有这些商店。如果你熟悉零售业,那么你会知道不是所有的商店对任何给定的产品都有相同的销售额。例如,在图 12-1 中,我们可以让商店 A 比商店 E 销售更多的冷冻产品,商店 B 比商店 c 销售更多的牛奶和面包,也可能出现这样的情况,例如,在某些季节性周期中,商店 D 开始比任何一家商店销售更多的糖果和巧克力。某些地区对某些产品的需求突然激增,导致该特定商店的存货下架。为了照顾消费者的这些突然需求,我们可以有预测模型;然而,由于互联商店这一新概念,将商品从仓库运送到商店的物流(这是目前世界上所有主要商店的运营模式)将会发生变化。

现在让我们举一个联网商店系统如何工作的例子。假设在节日期间,两家商店(商店 E 和商店 A)的巧克力和糖果的货架销售水平较低。商店 E 知道,在过去的一周里,对巧克力和糖果的需求很大,因此在接下来的一周里,它很可能会缺货。在连接商店的情况下,商店经理自动向中央零售商店系统提出请求,以根据下周的预测需求获得更多的糖果和巧克力。在传统的零售商店组织中,这种需求将被送到中央仓储系统,然后中央仓储系统将在库存到达时慢慢满足各个商店的需求。考虑到整个城市中只有两家商店对巧克力和糖果的需求增加了。还有三家商店,它们的货架上有过多的存货,而消费者目前并不购买。现在,商店经理可以申请中央零售商店系统,并立即从商店 B、C 和 d 获得下周的库存。

然而,在不同地点的不同商店之间移动货物会有物流方面的挑战,因此可以开发一种机器学习算法,该算法可以根据商店的地理位置查看商店之间的距离,然后计算最近的商店,该商店具有超过申请商店经理所要求的特定产品的货架容量。在我们的例子中,在图 12-1 中,我们可以看到商店 B 离商店 A 最近。因此,通过将一些多余的产品从商店 B 转移到商店 A 来满足商店 B 和商店 A 之间的巧克力和糖果需求是有意义的。由本地商店算法来确定商店 B 中有多少多余的库存,在确定了多余的数量后,它接受来自商店 A 的征用请求,并准备好其送货无人机来将多余的产品从商店货架上推出。这只是这个系统如何运作的一个例子。然而,一旦这个系统实现自动化并建立起来,它将为在城市中拥有多个商店的组织节省数百万美元。商品将根据算法序列和机器学习模型从一家商店转移到另一家商店,这些模型预测需要保留在特定商店的最有效数量。拥有这种连接的商店系统的主要优点是减少商店货架上的过期或即将过期的商品。另一个优势是及时满足需求,从而增加顾客对商店的信心,并提高收入和顾客忠诚度。该系统还将降低产品在组织仓库和零售店的仓储成本。

这些是互联商店系统通过实现最新技术(如机器学习和人工智能)可以实现的一些巨大优势。我在沃尔玛、梅西百货或其他零售连锁店中找不到这种联网商店的伟大实现。一家正在使用无人机、机器学习和人工智能的公司是亚马逊,过去几年开设的亚马逊 go 商店 [1 ]确实使用无人机送货;然而,在公共领域,尚不清楚他们是否通过利用无人机的力量在各个零售店之间移动产品。我所说的联网商店和 Amazon go [1 ]实现的商店之间的区别是商店的前端和后端。Amazon go 讲的是不排队,不结账;但是,我说的不是那种客户体验。我说的是商店的后端运营,以创造当前零售商店运营的效率和可预测性,从而降低成本并增加长期收入。

相连的仓库

现在我们来看下一个概念:互联仓库。这种连接仓库的概念也是零售店运营后端系统的一部分。我这里要给出的思路,也和之前的互联商店的思路有关;然而,这里我谈论的是连接任何组织的零售商店操作的不同仓库。在这个机器学习和 AI 操作中,我正在展示一个公司的不同仓库如何根据一定的标准进行内部连接。让我们以任何一家大型零售公司为例,比如塔吉特或沃尔玛;他们在一个城市里有不同的商店,为了服务这些商店,有一个对顾客不可见的仓库网络。一些仓库位于零售店的后面,一些仓库位于市区或郊区之外。这种仓库网络的目的是能够为特定城市范围内的零售店提供服务。任何给定的公司都可以在城市范围之外建立仓库,因为那里满足了对廉价土地的需求;然而,在后端运营中,我们知道如果我们不管理存储在各自仓库中的商品和服务的数量,那么整个零售系统将变得低效,并将花费公司大量的美元来维护。大多数这种规模的组织都有内部库存管理系统;这不是我在这里谈论的。我说的是连接同一家公司在一个城市或多个城市的不同仓库,以某种方式,基于机器学习和基于人工智能的系统根据季节性需求或特定商品和服务需求的任何随机峰值,预测城市每个地方对特定商品和服务的需求。现在请看图 12-2 来理解连接仓库图。

img/464968_1_En_12_Fig2_HTML.jpg

图 12-2

关联仓库图

为了更好地理解这个系统,我现在将借助一个例子来解释整个系统是如何工作的。让我们假设在图 12-2 中,一个给定的组织在城市的郊区有两个仓库。在一号仓库中,对冷冻产品的需求预计在下个月会大幅增加。在另一个仓库中,有一个对家庭清洁用品的预测需求,该需求预计在下个月会上升。机器学习和人工智能系统会查看这两个仓库中每个仓库的当前库存水平,然后查看这些仓库中每个仓库下个月的预测需求,然后拟定那里的多余物品数量,并传输到各自的位置。如果它发现仓库位置 2 的数量比冻结商品所需的数量多,那么它将命令系统将商品从位置 2 移动到位置 1,以获得过量的产品。同样,运输方式可以基于使用能够运载大量货物的大型无人机。同样,我没有看到这个概念直接用于仓库的实际应用。我们知道,亚马逊正在利用这一点进行从仓库向消费者交付商品的操作。我看到的一个技术限制是大型无人机的可用性,以及公司为使其具有商业可行性所需的法律手续。但这种程度的运营将不得不开始,因为世界各地的道路正被交通堵塞,零售业务需要在仓库地点之间送货,这种方式通过航空比通过公路更快。从长远来看,这种投资将在降低成本和增加收入方面产生巨大的效果。存储低需求产品的成本下降,将需求产品转移到需求最大的仓库会提高客户忠诚度,因为他们看到需求最大的产品的等待时间减少了。我在这次行动中没有讨论的一个方面是行动的供应方面,我假设货物的供应可以根据需要从制造商那里获得。

协作社区移动商店

技术将使现在创造飞入式零售店的概念成为可能,我现在就要谈到这一点。这家商店将是一个自动化系统,将由零售商店组织使用两种技术进行监督:一种是小型飞行汽车,另一种是自动飞行或自动驾驶技术。当这两种技术结合在一起时,将会给我们带来我称之为飞行商店的东西。

在我开始列举和讨论你如何将这个概念货币化之前,我们先来看看这个概念本身的必要性。我们知道在今天的现代社会中有三个主要问题,人们必须在工作场所工作更长的时间,并且这种趋势在全世界范围内每天都在增长。另一个趋势是道路上的交通,在高峰时间和其他时间,交通也在增加并堵塞道路,使人们外出购物成为一场噩梦。第三个问题是,在特定的社区或地区,商店没有与居住在那里的居民合作。

让我们看看飞行商店如何帮助大型零售组织解决消费者的所有这三个经常导致销售额下降的问题。

人们越来越忙,他们需要在工作场所或家庭附近购物,因为他们在那里度过了大部分的工作或个人生活。在工作日,他们没有时间经常去商场或其他零售商店;因此,他们需要在离工作场所或家很近的地方购物。飞行商店肯定有助于解决这个问题,因为它可以自己飞到任何人集中的地方,如大型办公大楼或大型公寓大楼。商店的这种能力,其中消费者不去商店,而是商店来找消费者,实际上是要通过它的实现来扭转零售游戏。这是一个等待实现的想法,首先实现它的零售链将获得主要的收入销售增长。

飞行商店能够解决的第二个问题是,由于道路上的交通流量大,人们不会来商店。飞来商店搬到指定的社区,当地人可以在方便的时候来购物,这对他们来说是一大优势。想象一下,如果一个人来上班,迎接他的是一家飞来商店,里面有他们一直想从公寓附近的当地杂货店或时装店购买的产品。这家商店还可以飞到当地的大型公园,停在那里,让附近的市民来购物。这种就近购物的额外便利将使这个想法获得巨大成功。因此,我们将交通堵塞带来的街道堵塞问题转化为零售店的优势,因为零售店现在更贴近消费者,能够在他们更方便的时候送货。这种飞行商店的另一个优点是,汽车也可以在主要的商业中心附近停下来,这些商业中心集中了在其中工作的员工。在空闲时间(例如,午餐休息和咖啡休息),这种商务中心的员工可以在他们方便的时候购物。这里的优点是他们不必为了给家里买东西而在车流中等待。当然,这可能不适用于像家用电器这样的大件物品,但肯定适用于家庭杂货等物品。

我们已经知道美国的购物中心正在关闭,这一趋势的主要原因之一是人们没有时间去购物。随着飞入商店的实现,商店走向人民,而不是人民来商店。为了顺利实现这项技术,我们需要小型自动驾驶或飞行汽车,它们可以避开交通,进入任何地方,正如零售组织的中心主题所要求的那样。

这家自动驾驶的飞来零售店要解决的第三个问题是基于社区的合作。让我进一步解释一下我所说的基于社区或基于地区的协作。我们主要讨论两个实体,一个是零售商店组织,另一个是当地的居住社区。住所可以属于任何城市的任何主要社区;然而,如果你去任何一个购物中心或零售商店,他们很少与当地居民互动,也不会与他们或他们的当地需求进行交流。

我强调这种当地社区合作,因为我从零售数据中看到,当地社区或当地居民在不同时间对产品的需求通常不同于城市其他地区。例如,与位于不太富裕地区的商店相比,位于更富裕地区的商店可能需要存储不同类型的高端产品,甚至外来类型的产品。每家零售店都明白这种差异,并相应地花费时间进行销售。这只是一个基于经济标准划分的例子;然而,这种消费者和地区的划分不仅仅局限于他们的财务背景,还可以细分为季节性需求,例如由于天气条件的变化,在特定季节对特定种类的物品的高需求。这就是我们需要机器学习和人工智能的帮助,根据消费者的本地需求挖掘数据,并在这种模式再次出现时预测他们对某些商品的需求。需要对这些数据进行深入研究,并提供给城市中每个地区的零售组织。当然,零售店可能不会将目标锁定在一个城市的所有地区,而是可以选择在他们发现对其产品的需求将会很高的特定地区锁定和销售他们的产品。

大型零售组织目前缺少的地区或社区协作的另一个方面是利用基于地区的产品需求数据的能力。让我举一个例子来进一步解释我的意思。比方说,美国的一家大型零售店希望向马里布的居民销售其产品,马里布是洛杉矶最高档的社区之一,有许多名人居住在那里,该商店需要利用该社区名人居民需求的主要商品的数据,而不仅仅是该社区特有的季节性或任何基于模式的需求。为了找到关于一个地方或一个社区中人们的好恶的信息,数据将需要利用该地方居民的本地社交媒体数据。一旦它有了关于这个社区的居民的好恶的反馈,数据现在就可以寻找目标,并为它希望在这个社区进行的即将到来的零售销售活动做广告。同样,社交媒体广告可以用来让市民意识到并产生对事件的认识。正是零售组织未来销售产品方式的这种变化,将带来高收入方面的重大红利,目标需求将得到目标供应的满足。商店可能不再出售“所有的东西”,而只出售特定社区居民所需要的东西。零售店现在正与当地社区合作,关注他们的当地需求,并通过频繁的飞临零售活动满足他们的需求。

当然,当零售商店组织将其销售集中在它认为适合举办飞行活动的特定社区时,它还必须通过当地社区广告牌广告或向各种社区中心派遣社区工作人员来与当地居民互动,居民聚集在社区中心参加活动,以便让他们知道未来将发生的任何活动。这还不包括针对居民的社交媒体活动,当飞行活动启动时,这将有助于他们取得巨大成功。

这并不局限于飞行汽车;我们还可以拥有自动驾驶的移动巴士零售店,这些零售店经过改装后可以为消费者提供环境零售体验。这种技术实现的一个例子是 Robomart [2 ],它正在等待法律障碍的消除,然后才能投入运营。

尾注

  1. 亚马逊 Go 商店: https://www.amazon.com/b?ie=UTF8&node=16008589011

  2. Robomart-自驾零售店: https://www.youtube.com/watch?v=FJMC40vkTTQ

十三、金融中的机器学习综述

几年前,一位来自东南亚地区的金融客户找到我,希望我能帮助他们进行机器学习,因为他们刚刚在自己的行业中实现了机器学习,而他们已经陷入了在金融咨询服务领域中实际实现机器学习算法的困境。在实现过程中,我研究了世界各地的金融行业,以便更好地掌握实现这项任务所需的条件。

即使在今天,机器学习和人工智能在金融行业领域的实现仍有很大的空间。

在非常广泛的意义上,金融服务[1; https://en.m.wikipedia.org/wiki/Financial_services 】根据维基百科的定义,由管理资金的企业组成。这些机构包括信用合作社、银行、信用卡公司、保险公司、会计公司、消费金融公司、股票经纪公司、投资基金和个人基金经理。当然,在我们的讨论中,我不会谈论与政府有关的金融服务。

就金融服务市场的细分而言,我将使用表 13-1 中描述的以下广泛细分。

从表 13-1 中可以看出业务方法的明显差异。

表 13-1

金融业的不同领域,广泛分类

|

类型

|

焦点

|

服务和差异化

|
| --- | --- | --- |
| 消费金融 | 提供个人贷款、间接融资,包括租赁和销售融资、信用卡发行商、典当行和发薪日贷款提供商 | 为商业和个人目的向个人提供无担保贷款。他们经营次级贷款,向有不良信用记录的个人提供贷款 |
| 资本市场 | 开展活动,包括交易、经纪、战略咨询、投资组合管理、资产管理和投资建议 | 主要充当中介,提供或管理资本,从而满足机构和个人的财务目标 |
| 多元化金融服务 | 提供金融服务,如金融咨询公司、投资研究公司、证券交易所和信用评级公司 | 他们的大部分收入来自某一特定领域的专业知识和专门活动 |

表 13-1 中金融服务业的市场细分 2;CFA 资深行业分析师兼编辑约翰·w·莫尔卡三世(John w . Molka III)2008 年版的一份报告称,金融服务业、次贷和信贷危机的影响很大。我们首先来看消费者金融部门,这是一组提供个人贷款的公司、间接信用卡发行商、典当行和发薪日贷款提供商。这份名单不包括抵押贷款和贷款公司。这些公司处理的主要项目是个人无担保贷款。当然,报告中给出的所有统计数据都是基于美国的;然而,这些百分比适用于所有发达国家。例如,截至 2007 年,消费金融公司持有 23%的消费信贷,这也适用于其他发达经济体。虽然这一统计数据看起来是 10 多年前的,但它让我们了解了消费金融公司在一个国家经济中的消费信贷中所占的份额。

下一个细分市场是资本市场,由从事股票交易经纪业务、战略财务顾问投资组合管理、资产管理和专业投资建议的机构组成。这些公司是中介,他们为其他金融机构或个人的目标而工作。这些公司包括投资银行以及股票、债券、衍生品和大宗商品交易。它还包括为全球个人和机构管理大量基金的资产管理公司。该部门的增长趋势是投资银行和证券交易以及证券经纪业务的增长。最大的服务类别是投资银行和证券交易,占总业务的 41%。该领域的一个日益增长的趋势是共同基金和投资的兴起,这一趋势在发达市场和新兴市场都可以看到。

这些公司主要从事金融咨询、投资研究、股票交易、评级和信用评级。这是一个有十大玩家的市场,像花旗集团、伯克希尔哈撒韦、高盛、摩根士丹利、摩根大通和美林。接下来是多元化金融服务部门。

既然我们已经了解了金融行业的广泛细分[2],我们现在将了解一些关键细分市场及其提供的价值主张。

金融分部

在图 13-1 的向下钻取财务报表图中,我们可以看到金融行业分为银行和非银行部门。

img/464968_1_En_13_Fig1_HTML.jpg

图 13-1

金融分部

银行业务由消费者贷款组成,这是一种非常结构化的业务形式,通过创建消费者的信用档案来确定消费者的信誉。如果发现信用状况有风险,则确定救助级别,只有这样才有可能在该部分进行贷款。接下来是商业贷款,这也是一种非常结构化的贷款形式,用于商业机构的投资和发展。虽然这种类型的商业贷款也有很多变化,我现在不打算进入它们。银行细分的第三种类型是电子支付。消费者和企业都通过电子支付银行系统进行电子支付,这些系统在每个国家都是本地的。消费贷款可以进一步分为信用卡贷款和担保贷款贷款。只有当一个人的信誉被确定后,银行才能发行信用卡,这样他们就可以永远使用信用卡,然后在规定的期限内修复信用卡。只有在确定了个人所持资产的信誉以及他们对过去可能获得的各种贷款的负债后,才能发放担保贷款。

在非银行领域,我们将细分市场分为咨询服务和股票市场。在咨询服务方面,我们再次将我们的细分市场分为信用咨询服务和投资咨询服务。信用咨询服务与机构、银行、国家和公司的信用评级有关。世界各地有各种各样的信用评级机构,它们都属于这一类别。投资咨询涉及对各种个人和组织持有的基金的管理和建议。这包括各种机构提供的投资组合管理服务和其他此类金融建议。股票市场涉及投资组合管理服务和经纪业务的一部分,可以是受监管的股票交易所和不受监管的股票交易所,就像区块链科技(如比特币)所使用的那样。在这本书的金融部分,我们将引用我们对金融行业细分的深入版本。

财务价值主张

根据谷歌词典的定义,价值主张是旨在使公司或产品吸引客户的营销和创新、服务和功能。

img/464968_1_En_13_Fig2_HTML.png

图 13-2

金融客户价值主张

组织提供的基于金融的服务对于银行和金融服务的消费者和企业具有不同的价值主张。这如图 13-2 所示。

在典型的财务组织结构中,有一些常见的部门,如消费者服务部、商业和投资服务部。特别是在消费者服务部门,进一步分为普通消费者和优质客户或特权客户。银行、金融咨询公司或投资组合管理公司等金融机构以这种方式区分消费者,并相应地提供不同级别的服务。我们现在将看看机器学习是如何在这些部门中应用的。需要注意的一点是,客户一般只面对营销部门或者客户支持部门,其余部门在后端工作。然而,在金融服务行业,有一种日益增长的趋势是为特权或高级服务客户配备专门的关系经理。

在图 13-1 中,我们已经看到了非银行细分市场下的服务类型,主要包括咨询服务(信贷和投资)以及与股票市场资本相关的服务。重要的是要明白,信贷和投资咨询服务既可以面向个人,也可以面向其他公司、组织或机构。基于消费者的是为个人提供的咨询服务,这些服务是根据个人的需求定制的。这些类型的信用咨询服务是优质服务,旨在为社会的特权人士。重点是提供信用信息,如评级,破产状况,财务分析,欺诈警报,以及其他此类服务。投资咨询服务以投资组合管理、资产管理服务和个人基金管理服务的形式提供。个人可以向该特定提供商购买咨询和管理服务,也可以从一家提供商购买咨询服务,从另一家提供商购买投资管理服务。通常,拥有高净值的消费者或个人通常更喜欢从同一家金融服务提供商那里获得投资咨询和管理服务。

金融服务的另一个细分市场或类别的价值主张属于电子支付类别。这些服务是通过互联网在各种网站上提供的在线服务,也是通过 Android 或 iPhone 等手机以基于应用程序的服务形式提供的。本类别所提供的电子支付或在线支付金融服务提供商[3; https://en.wikipedia.org/wiki/List_of_online_payment_service_providers 】更倾向于基于国家的提供商,真正能称自己为全球的提供商少之又少。这一类别中突出的是 Paypal、Payoneer、Apple Pay、Amazon Pay 和 Google Pay 等提供商,它们来自美国,但在全球范围内都有重要的业务。PayU 是另一个在全球有良好表现的公司;不过我们有一些区域性的,比如欧盟的信任,中国的支付宝。这份清单并不详尽;然而,还有更多在区域和地方有很深的存在。

这一领域的全球参与者增长如此之少的原因是,金融服务是一个受到高度监管的行业。世界各地的主要中央银行监管并提出规范、指导方针和法律提案来监管这些类型的服务。任何希望成为全球运营商的大型运营商,不仅必须了解,而且必须有能力在它希望运营的全球主要国家执行法规。我列出的全球参与者能够满足这些规范,因此他们能够建立一个全球基础。

有一些服务提供商只有在线存在;然而,也有一些基于应用的移动业务,比如中国的支付宝,它同时拥有移动和在线支付平台。Payoneer 提供电子钱包服务或数字支付服务,允许客户向其银行账户发送和接收资金,或将资金充值到预付费借记卡中。这家公司更关注全球的 B2B 支付。它现在被称为全球企业对企业数字交易系统的骨干。与 Payoneer 类似的是 PayPal,它允许在线转账,以取代支票和汇票。然而,Paypal 不仅关注企业对企业,也关注企业对消费者的交易。

在结束价值主张部分之前,我想提一下电子支付领域最近的发展,即区块链技术的出现,它带来了比特币和以太坊等虚拟货币。这些货币尚未被主要国家及其中央银行接受为支付方式,在韩国和印度等一些国家已被禁止。我不想深入讨论这些电子支付服务的争议;然而,你应该知道,世界上有很多新兴公司也在提供这些区块链货币的数字支付服务。其中最突出的是 Payza,它允许通过比特币或 altcoin 进行比特币汇票和向信用卡或借记卡转账。在我看来,这种认为大量非法交易是通过区块链类型的货币进行的看法将在不久的将来得到缓和,并将受到世界主要国家的监管。点对点或消费者对消费者的区块链技术更受用户信任,因为没有中央服务器或中央机构控制整个系统。在我看来,一旦世界各地的监管机构对技术的理解加深,人们不顾各国政府的监管和警告而采用技术,分散化的金融框架就是一个等待发生的未来。

金融领域的技术采用流程

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

img/464968_1_En_13_Fig3_HTML.jpg

图 13-3

技术采用过程

  • 描述性分析 : 调用该分析字段以了解过去已经发生的项目问题的答案,例如 X 财务交易在过去处于什么状态?

传统上,金融部门一直使用描述性分析来为任何给定的服务类别生成有关其客户的报告,这在高层管理人员做出各种决策时产生了很大的影响,例如任何新的金融产品的目标客户是谁,我们如何针对竞争对手做出战略改变决策,以及最终客户如何看待我们的服务?所有这些问题都通过描述性分析得到了很好的回答。这与向管理层提供五位数摘要的趋势背道而驰[4; https://en.wikipedia.org/wiki/Five-number_summary 。例如,为了比较千禧一代和婴儿潮一代的消费模式之间的财务数据集,五位数摘要可以告诉我们这几代人的最低消费模式和最高消费模式有何不同。然后,高层管理人员就可以很容易地专门为他们定制金融服务产品。除非使用描述性分析,否则不可能提取此类信息。

产品销售报告、产品折扣报告、商店和产品销售报告是传统上使用描述性分析的一些例子。这种趋势不会消失。我们将看到描述性分析在零售领域的应用。然而,我们还将看到其他分析方法的出现,我将在下一节中讨论这些方法。在清单 13-1 中的简短示例 Python 代码中,我给出了一个如何使用财务数据五点汇总的示例。由于这是一个例子,我将采取不超过 10 行的数据;然而,在现实世界中,这将包含数百万用户的数据。所有消费价值均以美元和年值表示。

import numpy as np
bboomers = np.array([14230, 345, 1912, 472, 63, 861, 270, 713])
fivepoints= [np.min(bboomers), np.percentile(bboomers, 25, interpolation="midpoint"), np.median(bboomers),np.percentile(bboomers, 75, interpolation="midpoint"),np.max(bboomers)]
for fivepointsummary in fivepoints:
print(fivepointsummary)

Output:
63
307.5
592.5
1386.5
14230

import numpy as np
millennials  = np.array([12519, 845, 912, 72, 93, 615, 70, 538])
fivepoints= [np.min(millennials ), np.percentile(millennials , 25, interpolation="midpoint"), np.median(millennials ),np.percentile(millennials , 75, interpolation="midpoint"),np.max(millennials)]
for fivepointsummary in fivepoints:
    print(fivepointsummary)
Output:
70
82.5
576.5
878.5
12519

Listing 13-1Python Code for Five-Points Summary

在运行清单 13-1 中的 Python 代码后,我们看到的输出是,在我们的数据集中,婴儿潮一代的最低平均年支出是 63,第 25 百分位是 307.5,中位数是 592.5,第 75 百分位是 1386.5,在我们的数据集中,婴儿潮一代的最高年支出是 14,230 美元。在清单 13-1 的第二段代码中,我们看到千禧一代的最低消费是 70 美元,第 25 百分位是 82.5 美元,中位数是 576.5 美元,第 75 百分位是 878 美元,最高消费是每年 12,519 美元。在这样一个简单的比较中,一个确定谁花费更多的很好的指南例如,在我们的数据集中,婴儿潮一代花费最高;然而,他们的支出也是最低的,因此婴儿潮一代的离差高于千禧一代。婴儿潮一代的支出出现在清单 13-1 的最大和最小函数中。你会在实际数据集中发现这种情况。关键是要懂得解读和分析。中值在很大程度上说明了我们的数据集中婴儿潮一代和千禧一代的支出结构,与婴儿潮一代的 307.5 相比,婴儿潮一代的中值非常低,为 82.5。这意味着婴儿潮一代确实是更高的消费者,在我们的数据集中,中点线要高得多。

  • 诊断分析 : 我们知道,这种类型的分析用于了解现象的根本原因,例如项目成功或失败。X 诈骗为什么会发生?在我们的金融系统中发生这种欺诈的根本原因是什么?我们的金融系统没有抓住洗钱交易的根本原因是什么?所有这些问题都可以用诊断分析来回答。所有形式的金融风险评估都属于诊断分析。一个实际的实现是 Pricewaterhouse Cooper 的工具 Halo[5; http://halo.pwc.com/ 。该工具适用于会计日记账和分类账,能够标记高风险交易。当然,这不是一个在线实时解决方案,因为这只是为了诊断和指出金融风险。会计是关于旧的交易记录,这就是像 halo 这样的工具试图从客户的系统中提取信息并发现高风险交易及其模式和趋势的原因。它还提供了有关会计流程中流程效率低下的信息,如消除重复的会计日记帐分录等。这对于大型金融机构尤其有用,因为在特定时期内,各个部门会发生大量的交易。

  • 预测分析 : 我们在本书的医疗保健和零售部分已经看到,这种类型的分析用于确定未来事件的结果,例如金融交易成功或失败、财务预算超支或银行或公司等组织的预算下滑。这种分析带来了避免未来情况的实际能力,例如,通过使用预测分析,我们可以预测特定类型的金融交易是成功还是失败。在得出这样的结论之前,机器学习模型代码可以考虑各种参数来进行分析。然而,整个目的是让高层管理人员了解企业财务方面的发展方向。即使这样也不能解决问题,而仅仅是告诉或充当一个失败的警告信号,或与财务相关的未来偏离计划。当我们应用预测分析时,我们会有更多的金融领域发挥作用,如成本会计、管理经济学和决策支持系统。给出基于过去成本会计数据的预测成本报告是我为我的一个客户实现的。这有助于大型金融企业跟踪其成本预算,并确保在机器学习模型预测实际成本增加时发出正确的信号。在管理会计或经济学中,正如学术界所知,重点是假设情景,如投资于 pqr 和 abc 项目的 x 百万美元以及哪个更好。为什么呢?如果我们投资 x 百万美元收购一家创业公司会怎么样?与投入上述两个项目相比,该项投资的投资回报率是多少?通过基于过去的数据建立机器学习模型,并基于管理会计的原则应用它们,所有这些复杂的决策问题都可以非常容易地得到回答。

  • 规定分析 : 我们现在知道,在这个分析领域,分析的最大价值是在基于预测分析的预测基础上实现的,它规定了未来应该采取的行动。在规定分析中,它使用机器学习来建立未来的行动计划,该计划基于类似情况下金融交易的过去失败,例如失败的金融交易,并且它给出了为了使金融交易成功而需要执行的特定活动。在金融领域,规范分析现在真的能够在失败发生之前进行路线修正。世界各地的每个金融组织都在努力在这一分析领域取得突破;然而,在撰写本书的时候,很少有成功的例子。我这样说是因为,如果你以商业周期为例,尽管从宏观经济学领域来看,它们大约发生 8 到 10 年,但没有人能够预测它们何时会再次发生。当做出准确的预测时,说明性部分开始;然后,即使在这种情况发生之前,也需要采取行动。例如,一家全球金融集团银行创建了一个机器学习模型,以 92%的准确率预测下一次全球金融衰退的开始;然而,这还不够。最高管理层需要知道他们需要采取什么步骤,以便对组织的影响几乎最小。建立和创造这样一个系统将需要大量的数据和多年的模型建立-测试-反馈周期,以达到生产。有些组织试图建立模型来预测资本市场的崩溃和繁荣周期;然而,由于涉及如此大量的数据和环境变量,目前还没有突破。

尾注

  1. 金融服务。https://en.m.wikipedia.org/wiki/Financial_services

  2. 约翰·w·莫尔卡三世,CFA 资深行业分析师兼编辑 212-984-2753,金融服务业次贷与信用危机重, http://media.lockelord.com/files/upload/advisenIndustryReportDivFinConsFinCapMrkt.pdf

  3. 在线支付服务提供商列表, https://en.wikipedia.org/wiki/List_of_online_payment_service_providers

  4. https://en.wikipedia.org/wiki/Five-number_summary 五个数字汇总

  5. 光环软件由普华永道, http://halo.pwc.com/

十四、金融领域的关键技术进步

场景 2027

在不久的 2027 年,27 岁的龙芯正在他家附近的社区办公室工作。这是专用办公空间的概念让位给社区办公室的时代。这些是十年前开始流行的合作空间的高级版本。人们不再需要去专门的办公室,而只需要去离他们最近的社区办公室工作。龙芯是企业家,有自己的投资公司。当他走进办公室时,他的无人驾驶私人助理机器人向他打招呼,告知他当天的优先事项。龙芯让无人机 PA 拿出他的股市月报。无人机 PA 与龙芯的 TradeBot 相连,trade bot 是负责所有金融交易的投资机器人。TradeBot 通过可信的链接技术将报告发送给中央无人机 PA。报告显示,由于市场崩盘,龙芯上个月在股市的投资暴跌了 5.2%。TradeBot 在报告中告诉龙芯,由于他对所有股票设置了止损限制,这一损失有所减少,如果他没有在系统中设置这些限制,他今天的损失将达到 12.8%。TradeBot 建议龙芯改变其股票市场投资组合,增加和减少一些股票,根据 TradeBot 的预测系统,这些股票将在未来 3 个月内上涨 25%。机器人通过分析来自各种渠道的新闻以及它们将对这一新建议的投资组合产生的影响来给出其原因。TradeBot 是完全自动化的,不需要任何人工干预就可以在股票市场上进行交易。然而,对于某些事情,如股票选择和分配投资限额和百分比,系统中有一个手动覆盖,允许它从龙芯获得人工输入。TradeBot 由龙芯的股票经纪人所有,他从龙芯股票交易中赚取的佣金中给 TradeBot 一笔薪水。

这是金融的未来,它将从算法交易转向基于 bot 的自动化交易。你觉得未来有可能吗?

今天,这听起来可能有些牵强,但在不久的将来,这将成为现实。看一看已经取得的创新进展的一部分,这将向你保证,未来将使我们能够利用类似于人造智能机器学习和机器人的创新来更有成效地做事。场景 2027 中给出的智能交易机器人不仅可以使用算法交易,还可以通过创建一个简单的基于机器学习的深度神经网络来建立股票交易模型,以识别投资组合中的股票是否接近预期的盈利能力或失去价值。它还可以拥有算法,根据任何给定的消息来确定股票可能的涨跌。机器人交易机器人将帮助持有股票,直到达到理想的盈利水平。

我们看到的另一个应用是机器人通过一些链接安全技术相互交谈。这将是未来的一个重大挑战,因为每一家创建机器人的公司都是在各自为政。一旦机器人技术成为主流,人们开始采用它们,就迫切需要让机器人彼此交谈。因此,需要一个有自己标准和基准的通用接口和语言。任何打算开发机器人的公司都必须遵守这些标准,就像我们有每个浏览器都遵循的 HTML 协议一样,以便提供相似的用户体验。这些机器人协议将为“机器人世界”做同样的事情交易机器人在没有人类干预的情况下进行交易的能力将在未来让人们感到惊讶。我们已经有了 algo 交易软件,在很大程度上实现了股票交易的自动化。然而,它不是完全自动的服务。在当前的系统中,人为控制非常普遍。基于新闻报道提前预测市场运动程度的机器学习模型将成为未来交易机器人的现实。

金融领域的狭义与广义机器学习

正如我们在医疗保健领域发现的那样,有一种模式是,相对于广泛的应用,有限的机器学习技术突然之间出现了巨大的发展,这种模式在金融领域也同样存在。

在 2017 年一项涵盖全球金融消费者的研究中[1; https://www.accenture.com/in-en/insight-financial-services-distribution-marketing-consumer-study

我们可以清楚地看到新金融消费者的轮廓。出现了三种不同的消费者形象或角色:1)游牧者;2)猎人;3)质量追求者。游牧者是在数字领域活跃的人,但他们为自己的数据定价,并将数据视为货币。我们所说的数据是他们自己的个人数据。这些流浪者意识到他们的数据的价值,他们希望金融机构为他们提供个性化服务,以换取他们的数据。猎人是那些金融消费者,他们总是在寻找金融服务的最佳价格。他们是一种混合型客户,既在传统的提供商环境中运营,如传统的银行、信用卡等。,它们在数字环境中也同样运行良好。追求质量的人是金融服务提供商的忠实传统客户,如果某个品牌有价值,他们会选择留下来,他们寻求卓越的服务。这个消费者对价格不敏感;然而,他们重视自己的数据,因此数据隐私对他们来说非常重要。该研究还表明,每个国家都有这三种金融消费者的不同概况;例如,在美国,游牧民占 46%,猎人占 14%,优秀人才占 40%,而在新加坡这样的小国,游牧民占 41%,猎人占 16%,优秀人才占 43%。在巴西,游牧民占 62 %,猎人占 9 %,追求高质量的人占 29%。就游牧民族的金融消费者而言,巴西是领先的。加拿大拥有最少的游牧民和最少的猎人,拥有最高价值的优质搜索者,游牧民占 20%,猎人占 23%,优质搜索者占 55%。这也指出了一个事实,即加拿大有一个老龄化的人口问题,这就是为什么很少有游牧民和更多的传统品牌忠诚的质量寻求者。这项研究不仅指出了金融消费者的细分,还指出了整个社会的变化趋势。游牧者代表着新一代,他们或多或少是流动人口,愿意从一个地方搬到另一个地方,寻找在线和离线的自由职业工作。猎人是中年人,他们正在见证传统金融服务向数字金融服务的转变。追求品质的是老一辈人,他们希望坚持使用他们了解并信任的品牌,因为他们的老关系和良好的客户服务水平。这是一个打算长期坚持一个品牌的客户。

全球金融机构的现状

在图 13-1 中,你可以看到我们有三种类型的财务部门。首先是消费金融,其重点是提供个人服务,如贷款、间接融资、租赁、自我融资、信用卡、典当行和发薪日贷款提供商。向有不良信用记录的个人提供贷款是不允许的,因此它们可能不会在全球范围内存在。消费金融服务于任何国家的大部分人口。

这里的重点是为客户及其资产(投资组合管理)提供与股票市场交易咨询相关的活动,并给出各种投资建议(资产管理服务)。股票经纪业务是一项非常本地化的活动,我们还没有看到任何全球性的股票经纪人在主要的资本市场开展业务。其次是多元化金融服务,主要为公司、股票交易所和信用评级机构提供公司金融咨询和投资研究。这种多元化的金融服务提供商是一个利基市场,他们专注于向优质企业和个人客户提供咨询服务和金融服务。

机器学习在金融中的重要性

金融部门不同于大多数其他部门,因为它依赖于人及其行为。金融部门向客户提供服务,因此它不同于提供零售等产品的其他部门。从批准贷款到监督资产和资源,机器学习在金融体系的许多时期都扮演了必要的角色。机器学习被广泛使用的一个主要领域是欺诈检测。整合更多可用的处理能力、web 使用变得更加普遍,以及不断扩大的将盈利组织信息放在 web 上的措施,产生了信息安全危害的“完美风暴”。虽然过去与金钱相关的虚假陈述定位框架强烈依赖于不可预测和衷心的原则安排,但当前的欺诈检测遵循风险因素议程-它有效地学习并适应新的潜在(或真正的)安全危险。机器学习在欺诈检测中被广泛使用,但类似的标准在其他信息安全问题上保持不变。机器学习框架可以识别独一无二的练习或实践(“异常”),并禁止它们进入安全组。对这些框架的测试是远离误报——在这种情况下,“危险”被欢呼,但在任何情况下都不是危险。

机器学习的另一个重要用途是在贷款和保险承保业务中。贷款和保险承销可以被描述为金融领域机器学习的理想职业,事实上,该行业有很多压力,机器将取代当今存在的大量担保职位。特别是在大型银行和传统开放市场保护公司等组织中,机器学习计算可以根据大量购物者信息(年龄、工作、婚姻状况等)进行准备。)和货币贷款或保护结果(这个个人有没有违约,有没有按时偿还预付款,有没有陷入堆积等等。?).所有这些问题都可以通过机器学习的应用来回答。

隐藏的模式可以通过计算进行评估,并持续分解以识别可能影响贷款和保证未来的模式(特定状态下越来越多的年轻人发生汽车碰撞吗?在最近的 15 年中,特定统计人群中的违约率是否在不断上升?)是从贷款和保险数据中提取结果的热门话题。这些成果对组织来说有巨大的收益;然而,对于拥有雇佣信息研究人员的资产和在很长一段时间内准备计算的巨大信息量的大型组织来说,从一开始就从根本上节省了成本。

随着资源回到 20 世纪 70 年代,算法交换(这里和那里称为“计算机化的交易系统”,这显然是一个更精确的描述)包括利用复杂的人工智能框架来解决,在很大程度上,快速交换选择。

算法框架每天定期进行大量的交换,这导致了“高递归交换”的表达,这被认为是算法交换的一个子集。大多数共同基金和与货币相关的组织不会直接公布他们处理交易的人工智能方法(根据当前的情况)。然而,人们相信,机器学习和深度学习在调整在线和在线交易决策方面正发挥着不可否认的重要作用。

现在,我将带您浏览一份由金融行业专家在线完成的调查,通过德尔菲法,该调查旨在找出该行业的哪些领域属于技术采用水平。这项调查与本书零售和医疗保健部分的调查非常相似。金融专家在初步调查中确定的主要领域是股票市场投资、银行业务、金融咨询和管理服务、会计和电子支付服务。开展这项调查的目的是让读者清楚地了解金融各个领域的技术采用成熟度。专家分散在实体融资者、在线融资者和混合组织中。

金融应用机器学习的一些关键领域包括:

调查的金融细分:

  1. 股市投资

  2. 银行业

  3. 财务咨询和管理服务

  4. 会计

  5. 电子支付服务

股票市场投资本质上越来越自动化。这些证券交易所公司通常在异常无力的关系上进行交易,这种关系是因为量化调查者(偶尔被称为“量化者”)的研究而被揭露的,量化调查者相信这种关系的合法性。虽然这些关系是无能为力的,但这些量化交易公司的工作规模可以让这些单个系统中的每一个都价值数千、数百万甚至更多。尽管如此,速度最快的公司仍有空间利用这种关系进行交易。通过这种方式,量化公司强烈升级他们的程序以提高速度。由于闲置率低,他们可以在正确的交易中击败任何其他人,因为只有速度最快的玩家才会受益。由于他们的系统在速度和可靠性方面得到了改进,他们使用的机器学习方法通常非常基础。此外,鉴于这种对有利可图的交易所的无情竞争,量化公司对其在算法交易领域受保护的创新守口如瓶。

银行业是一个将机器学习程序应用于丰富的信息数据库的领域,可以帮助打击金融欺诈,为客户节省时间和现金,并使后台能力计算机化。在银行业,机器学习在管理客户账户方面的主要用途之一是打击欺诈和黑客企图,并增强一致性。在一个完美的世界里,这种创新适合这个问题,因为机器学习计算可以搜索巨大的数据库和信息集合,以检测不寻常的金融交易。

金融咨询和管理服务领域 资源和财富管理公司正在研究潜在的人工智能答案,以增强他们的投机选择,并利用他们的历史信息宝库。计算机化资源(如风险投资组合)或专用现代资源(如生产线设备或运输卡车车队)的资源管理是这样的应用,其中关于优势的大量信息(如特定储备的可验证执行或卡车车队的真实维护信息)现在被记录,使它们为通过 AI 实现机器人化做好准备。与货币信息、新闻、现代传感器信息,甚至基于网络的社交网络信息相关的无监督学习方法,保证了以新的、充满活力的方式建议风险选择,可以想象,这给投机公司带来了市场优势。

会计和簿记编程变得越来越智能,它现在可以执行以前需要人工干预的任务。多余的、手工的和枯燥的任务被处理掉,目的是会计师和企业家现在可以投入更少的精力来跟上最新的发展,并有更多的时间来完成其他重要的任务。簿记应用程序学习收据编码实践,并建议交换应该分布在哪里。例如,如果业务助理通常将一个项目分配给一个特定的交易帐户,那么下次业务代表将该项目添加到收据时,簿记应用程序会将它分配到正确的记录。此外,它还需要注意职员和簿记员解决的错误。例如,如果企业家将一些东西分配到离库记录,簿记员解决了错误,簿记应用程序将接受簿记员的确定为正确的。

银行妥协是自动化的。再一次,创新从过去的指定和记录决策中获益,并在此之后为新的银行交易所提出正确的建议。

银行利用人工智能聊天机器人使客户能够确定正常的查询。簿记程序中的聊天机器人,比如 Xero[2; https://www.xero.com/us/why-xero/benefits/online-accounting/ 】,让你质疑最近的货币信息,像银行里有多少现金,什么时候会有具体的账单,谁欠你现金,它甚至可以将客户与 Xero[2; https://www.xero.com/us/why-xero/benefits/online-accounting/ 【谋士出身】他们的登记处。越来越多的会计和簿记应用程序正在开发中,它们不是离线的,而是在线实时审计的。此外,这一创新同样会影响检查员,宜早不宜迟。目前,审查者只是审查交易的精选样本。他们利用庞大的簿记员团队,加班加点在截止日期前完成审计。通过组织处理的大量交易限制了审计人员可以实际评估的交易数量。

机器学习计算将处理和调查信息,感知特性,并汇编例外情况的概要,供评估者检查。审计人员可以运用他们的能力来检查和总结日记账或分类账中记录的异常交易的解释,而不是投入他们大部分的精力检查信息。

最后一个领域是电子支付行业****,它正在颠覆过去与银行传统交易方式的所有概念。全球电子支付公司现在对机器学习感到满意,基本上符合签帐卡交换检查,其中学习计算在密切持续的交换批准中承担必要的部分。鉴于目前信息捕捉和适度精英计算的快速发展,麦肯锡认为有许多近距离和长期的机会来分期增加机器学习的利用。这些包括从利用网络来源的信息到更准确地预见借款人的不法行为,利用虚拟合作伙伴,或提高客户利益的执行。在发卡领域,机器学习正发挥着重要作用。这一点在信用卡收藏中尤为明显,麦肯锡发现信用卡恢复率提高了 10%至 15 %,信用卡累积熟练度提高了 30%至 40%。为了限制不当行为,支持者可以利用单一记录设计确认创新,并为目前被拒绝的帐户创建联系规则和方法。在出现有记录的不当行为后,担保人允许在贴现应收账款并转向外部供应商之前有一个简明的时间窗口(大多数情况下为 90 天)。这段短暂的时间对于担保人来说是一个完美的时间,可以应用大量利用机器学习能力的累积程序。AI 的一个关键优势是,它可以帮助分期付款机构显著提高运营能力;案例包括减少处理时间和人为错误,为客户提供知识和扩大机器人化。从这个意义上说,人工智能正在推动组织重新思考和重建工作模式和程序。例如,它可以支持组织处理大量的信息,以生成财务报告并满足管理和一致性需求,例如经常需要大量个人执行冗余信息准备的表单。说实话,人工智能的变革力量正在对金融管理行业产生如此重大的影响,预计在 15 年内,它将取代与金钱相关的外包管理工作的四分之三(毕马威)。这可能会对希望降低运营成本的组织产生巨大的影响,使他们能够创建和支持不同的业务领域。

**到目前为止,我们已经了解了机器学习应用在每个选定领域的重要性。现在让我们来看看调查及其研究方法。

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

  • 在第一次迭代中,专家组最初确定了 25 个关键领域。然后,专家组重申了这些领域,以找出其中最重要的未来发展领域。专家组将这一范围缩小到对金融业进一步发展至关重要的五个金融领域。调查研究不提供关键领域的迭代选择结果,但它从专家选择这个关键领域的点开始。我已经在本章讨论了这五个领域,从股票市场投资到电子支付服务。

  • 研究样本:从总共 160 名专家中选出一组专家。专家由在该行业工作了 20 多年的金融专业人士组成,他们的职位涉及证券交易所、金融机构的银行专家、金融机构的主管、金融机构的首席执行官,或者从事金融行业研究并发表过论文的学术教授。我已经介绍了来自金融各个领域的所有专家,例如供应链管理、客户服务、销售、首席执行官和人工智能专家——仅举几例。共有 45 名这样的专业人士被列入本次研究的候选名单。在这项研究中没有缺席或流失。

  • 所需信息:为了做出决策并支持决策,需要提供各种二级数据,如关于金融领域机器学习和人工智能状态的已发表论文。一些例子是普华永道或其他金融机构。在前面提到的两个参数之间建立联系所需的信息是基于专家们对从股票市场投资到电子支付服务等五个领域技术实现现状的理解。为协助专家决策,向他们提供了关于技术成熟度和分阶段识别技术的解释;除此之外,没有提供其他信息,所以要小心不要在专家的头脑中产生偏见。这项研究需要的信息是背景知识、理论知识和专家知识。还要求专家利用他们的隐性或固有知识,因为他们与金融行业有着长期的联系。

研究设计概述

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

  1. 定义研究的目标。

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

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

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

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

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

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

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

数据收集方法

关于金融的文献不是这项研究需要收集的数据。我之前已经提到过的测试研究,是在专家的帮助下,将对金融业未来至关重要的 16 个关键领域缩小到 5 个。这是一件重要的事情,因为在我们的研究中,我们根据专家过去的经验,对金融业的关注点做出了判断。我们使用了 Chittu Okoli 和 Suzanne De Poweski 的论文中的德尔菲研究方法(“德尔菲方法”)作为关于设计考虑和应用的研究工具示例[3; www。学术界。edu/399894/The _ Delphi _ Method _ As _ a _ Research _ Tool _ An _ Example _ Design _ consideration _ and _ Applications

问卷调查法用于通过电子邮件在线管理调查向专家收集数据。

数据分析

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

道德考量

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

研究的局限性

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

检查研究

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

img/464968_1_En_14_Fig1_HTML.jpg

图 14-1

金融行业技术采用阶段

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

表 14-1 和图 14-2 到 14-8 呈现了德尔菲法研究分析中的数据。

表 14-1

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

|

主题

|

金融专家人数

|

迭代次数

|
| --- | --- | --- |
| 德尔菲法 | 邀请 | 入围的 |   |
| 人工智能和人工智能在金融中的应用现状 | One hundred and sixty | Forty-five | three |
| 人工智能和人工智能在金融领域的未来应用 | One hundred and sixty | Forty-five | five |

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

img/464968_1_En_14_Fig2_HTML.jpg

图 14-2

股票市场投资中人工智能和人工智能的现状

在股市投资中,金融行业的人工智能和机器学习的参数技术成熟度水平处于高端。这一点得到了我们金融行业专家的认可。这意味着我们的专家说,股票市场投资已经实现了技术,并且它正在被用于主流生产,以至于它可以取代人类专家。这里是股票市场,市场之间的人类,交易者就是经纪人,经纪人的功能已经完全自动化,现在已经在生产了。股票市场的另一个方面是使用买卖信号向股票市场上的交易者和投资者提供建议,甚至这已经通过使用机器学习和人工智能相当自动化了。一个很好的例子是 stocksrank.com 网站。 https://www.stocksrank.com/?gclid=EAIaIQobChMI683Yht-o3QIVipOPCh0M-AfsEAMYAyAAEgKF8fD_BwE 】,由机器人分析师发出交易信号,监控市场,并将趋势呈现给客户。机器学习和人工智能的使用非常重要,因为股票市场在交易时间的每一秒钟都会产生大量的数据。从如此大量的复杂数据中分析和找出趋势,并找出趋势和模式,这不是人力所能做到的。这就是为什么机器学习和人工智能已经成功地为股票提供了建议,而这在以前是任何人都不可能找到的。

img/464968_1_En_14_Fig3_HTML.jpg

图 14-3

银行业人工智能和人工智能的现状

现在让我们看看另一个领域,那就是银行业。我们的专家告诉我们,这里的人工智能和机器学习处于技术成熟的中等阶段,71%的专家同意这一观点。我们可以在图 14-3 中看到,其余的专家说它高(18 %)或低(11%)。中等水平的技术成熟度意味着专家们说这项技术还没有进入主流生产,在这里和那里有一些成功和失败。

麦肯锡报告[5; https://www.mckinsey.com/industries/high-tech/our-insights/an-executives-guide-to-machine-learning 】指出,在欧洲,超过 12 家银行已经用机器学习建模取代了传统的统计建模,这使得新产品销售额增加了 10%,资本支出节省了 20%,现金收款增加了 20%,费用下降了 20%。各银行已经实现了推荐引擎,他们还建立了微观目标模型,预测消费者是否会取消服务或拖欠贷款。他们还在此基础上设计了如何干预的机制。从这份重要报告中,我们可以看到机器学习是如何对欧洲的银行产生商业意义的。有了这样的进步,从长远来看,机器学习确实将在转变银行收入和运营方面发挥核心作用。从银行已经存在的大数据(如客户交易)中学习,不难挖掘和发现客户对他们的好恶和金融行为的隐藏模式和趋势。利用这些数据,任何银行都可以建立消费者的财务档案,并预测他们未来的行为。然而,机器学习和人工智能在银行业的下一个操作层面是,它不仅可以预测,还可以采取具体行动,就像人类专家在从机器学习系统获得报告后所做的那样。这是独立操作的阶段,将使人工智能中的机器学习真正发挥其全部潜力。

img/464968_1_En_14_Fig4_HTML.jpg

图 14-4

财务咨询与管理中人工智能与人工智能的现状

现在我们来看看人工智能和机器学习在金融咨询和管理领域的现状。经过五次迭代,我们的金融专家透露,人工智能和机器学习在这一领域的应用非常低,58%的专家这么说,29%的专家说这是中等水平。我们的大多数专家表示,这一领域的技术还处于研究阶段,尚未投入生产。这个领域有各种各样的公司正在尝试开发用于资产管理和投资咨询服务的机器学习应用程序;然而,有一家名为瑞士金融技术协会的公司利用机器学习和人工智能 [6 等数字技术对财富管理进行了一些研究; https://swissfinte.ch/machine-learning-digital-wealth-management-part-1/

包括使用机器学习和人工智能来增强客户的客户体验,以及专门适合特定客户档案的金融产品的产品加入或匹配。这项技术仍然处于研究阶段,没有投入生产,因此我们的专家正确地将这一领域确定为低技术成熟度水平。

img/464968_1_En_14_Fig5_HTML.jpg

图 14-5

人工智能和人工智能在会计中的地位

现在我们来看看另一个关键领域——会计。在图 14-5 中,我们可以清楚地看到我们的专家处于中低技术成熟度水平之间,47%的专家认为技术成熟度水平处于这两个水平。正如我们已经知道的,技术的低成熟度意味着它处于研究阶段,还没有投入生产。中等水平意味着该技术已经在生产中实现,有些成功和失败,需要更多的研究才能进入主流生产。这项研究的领先者是普华永道[7; https://www.pwc.com/us/en/services/audit-assurance/financial-statement-audit-innovation.html 】或普华永道(Pricewaterhouse Coopers),这是一家基于机器学习开发了名为 hello 的软件的会计公司,该软件可用于技术支持的审计。然而,这不是完全自动化的软件,需要人工干预才能工作。审计不是实时进行的,而是根据客户的决定按月或按年提供数据。

img/464968_1_En_14_Fig6_HTML.jpg

图 14-6

人工智能和人工智能在电子支付服务中的现状

我们研究的最后一个应用是人工智能和机器学习在电子支付服务领域的应用。关于人工智能和机器学习在电子支付服务中的应用,专家的意见是,它已经达到了很高的成熟水平。这意味着该领域的技术已经过充分研究,并准备投入生产,或者已经在生产环境中使用。我们的专家在仅仅 3 次迭代后就很快做出了这个决定,其中 56%的人说它处于高成熟度水平;42%的人认为处于中等水平。在本章中,我已经向您展示了机器学习正被用于打击各种类型的欺诈,在电子支付行业,在线支付交易在打击欺诈和做出实时决策以评估大量在线交易方面有着非常高的机器学习使用率。这里的机器学习应用程序能够提高它们的准确性,能够检测人类的非直觉模式,识别欺诈,并避免误报。这是在签证公司 [8 中告知的; https://usa.visa.com/dam/VCOM/global/support-legal/documents/webinar-machine-learning.pdf 】支付行业机器学习网络研讨会于 2018 年 5 月 24 日召开。我们知道 Visa 是支付行业的主要参与者,它已经开始通过在流程中实现机器学习算法来使用机器学习进行准确的商业决策。

总的来说,这是金融行业所有细分市场在条形图上的叠加情况。

img/464968_1_En_14_Fig7_HTML.jpg

图 14-7

金融领域人工智能和并购的现状

2018 年金融业采用技术的阶段

现在我们继续我们研究的第二个参数,金融领域技术采用的阶段。我已经在第一章中讨论过,从快速应用阶段到独立运营阶段有四个阶段。经过分析,我们可以从图 14-8 中看出这一点。

img/464968_1_En_14_Fig8_HTML.jpg

图 14-8

2018 年金融行业的技术采用阶段

我们可以清楚地看到,股票市场投资被归类为第 3 阶段实现。在这一阶段,我们通过使用辅助应用程序获得洞察力,在这种情况下,低级智能用于评估高技能专业人员,自动化用于增强人的能力和根据数据预测业务需求。像算法交易或机器人辅助交易这样的股票市场应用程序是一个很好的例子,其中熟练的交易者通过在他们的操作中使用机器学习而得到增强。

在下一个银行业领域,我们的专家将阶段实现定为第二阶段,53%的专家这样认为。这是一个早期应用阶段,Lena 操作和低效率产品用于降低运营成本和诊断业务问题,并用于构建问题检测系统。我们知道,全球各大银行都实现了欺诈检测系统,他们通过使用聊天机器人,甚至在银行运营中使用机器人,广泛使用机器学习来降低运营成本。这主要体现在银行面对客户的角色上。

在财务咨询管理的下一个领域,我们的专家表示,该技术处于第三阶段水平,38%的专家这样说,36%的专家还将人工智能和机器学习应用程序放在第二阶段水平。但是,这不是平局,因此我们将进行阶段 3,该阶段我们的专家比例更高。在阶段 3 辅助应用中,咨询和投资管理服务使用机器学习来帮助熟练的专业人员,如关系经理和投资管理专家,确定客户的最佳资产与概况的匹配。他们还使用机器学习来预测个人的投资需求,方法是创建他们的金融档案,然后为他们提供最佳的金融服务。

接下来,我们转向会计,我们的专家非常清楚,62%的人说技术的应用水平处于第二阶段。第二阶段是早期应用,技术用于线性操作,完成低效率的任务,并降低操作成本,如由机器对财务报表进行审计操作。技术还用于找出业务问题及其原因,例如找出财务分类账中与洗钱或高风险项目有关的过去交易,并创建问题检测系统;例如,在公司的日记账或分类账中发现洗钱交易就是使用早期应用程序的一个例子。

最后一个领域是电子支付服务,我们 47%的专家认为它处于运营的第 3 阶段,即辅助应用,在这一阶段,低级智能用于帮助该领域的高技能专业人员,自动化用于增强人类的能力,因为人类不可能扫描支付系统中全球发生的数百万和数十亿笔交易。

就此,我结束了对这项研究的介绍,这项研究花了我 3 个多月的时间与金融行业的专家一起实现,我希望它能为读者提供一个关于金融行业在人工智能和机器学习的应用和适应方面的简明观点。

尾注

  1. 2017 年全球分销与营销消费者研究,埃森哲 LLP 美国,www . Accenture . com/in-en/insight-financial-services-DISTRIBUTION-MARKETING CONSUMER-STUDY

  2. 为什么是 Xero,www . Xero . com/us/why-Xero/benefits/online-accounting/

  3. 德尔菲法作为一种研究工具:一个例子,设计考虑和应用,奇图奥科利*,苏珊娜鲍洛夫斯基约翰莫尔森商学院,肯考迪亚大学,GM 209-23,1455 Boulevard de Maisonneuve Ouest,Montre'al,Que。美国路易斯安那州立大学信息系统与决策科学系。2003 年 11 月 8 日接受。2004 年 3 月 27 日在线提供,www . academia . edu/399894/The _ Delphi _ Method _ As _ a _ Research _ Tool _ An _ Example _ Design _ Considerations _ and _ Applications

  4. Stocksrank.com 网站,www . stocksrank . com/?gclid = eaiaiqbschmi 683y ht-O3 qivipopch 0m-afseayaaegf8fd _ bwe

  5. 多里安·派尔(Dorian Pyle)和克里斯蒂娜·圣何塞(Cristina San José)撰写的《机器学习高管指南》,麦肯锡季刊,2015 年 6 月,www . McKinsey . com/industries/high-tech/our-insights/an-executives-guide-to-machine-learning

  6. 数字财富管理中的机器学习(第一部分)作者 johnhucker,2017 年 12 月 13 日swissfinte . ch/machine-Learning-Digital-Wealth-Management-Part-1/

  7. 财务报表审计技术----实现审计以提高质量和获得更多见解,普华永道美国,www . PwC . com/us/en/services/audit-assurance/financial-statement-audit-innovation . html

  8. 支付行业的机器学习 2018 年 5 月 24 日 John Steensen,USA . visa . com/dam/VCOM/global/support-legal/documents/webinar-machine-Learning . pdf**

十五、如何在金融领域实现机器学习

金融业最有前途的三个领域是:

  • 算法炒股

  • 自动化机器人顾问

  • 欺诈检测和防范

在金融行业,潜力巨大的最重要的项目是将机器学习应用于算法股票交易。虽然算法股票交易是人工股票交易的自动化版本,但我会说它缺乏机器学习可以在预测和预测方面提供的人工智能,而不是以今天的形式进行分析和行动。为了举例说明我的意思,让我们看看一个散户如何在全球股市交易。为了使讨论简单,我说的是现金交易,而不是衍生品期权交易。在任何一个典型的日子里,散户投资者都会研究关于一家公司的新闻,检查其基本面和技术分析头寸,然后做出卖出或买入股票的决定。例如,如果交易者跟踪商品通道指数(CCI)技术指标,那么他们会看 CCI 显示超卖信号开始买入,超买信号开始卖出。

虽然这是一个简单的例子,但有经验的交易者会使用比 CCI 更多的技术指标,比如随机振荡指标和布林线指标。当前形式的算法交易已经成功地自动化了技术指标的使用,并将其整合到自动化交易系统中。然而,这不是人工智能,也不是机器学习。如果我们仔细观察,这里几乎没有任何预测。这只是当市场上涨或下跌时,人类会做的自动化操作,然后根据价格运动采取行动。这里几乎没有任何预测。例如,在该系统中没有构建模型来预测股票在接下来的 1 小时、1 天、1 周、1 个月的价格,或者预测任何其他这样的时间段的股票价格运动。如果围绕这一点建立一个模型,那么将它与算法交易结合起来将会产生奇妙的结果。因此,在股票市场中应用机器学习来预测股票价格或指数增加了一些智能,然后使用前景分析,一个完整的系统给出关于 algo 交易系统要执行的动作的建议,这将使它有足够的智能来利用价格运动。

另一个很有潜力的金融领域是金融和投资顾问。这里有很大的实现空间。让我们举个例子:一个人有一百万美元可以投资。然而,尽管信息普及程度有所提高,但任何投资者都面临的问题是,选择最佳投资选项,让资本随着时间的推移而增值。在这里,投资者利用他们的直觉和朋友网络或人类顾问给他们建议在哪里投资,在哪里不投资。然而,这是一个非常幼稚的大笔投资过程。谁也不知道这些投资中有多少是失败的,有多少是成功的。然而,如果我们使用来自资本市场的关于价格和其他影响它们的因素的现有数据,那么我们可以建立一个预测模型,并确保投资不会随着时间的推移而失败。我指的不是目前的机器人操作,比如亚马逊的 Alexa,它只能告诉你当前的市场情况;我的意思是创造一个机器人顾问,它不仅能创造一个概念上的投资组合,还能根据过去的数据,如股票价格、可收藏的艺术品价格、商品价格、石油价格等,给投资者提供预测。这种机器人财务顾问不仅有能力创建机器学习模型,还能利用它们并对其所有者的投资组合提出建议。根据市场价格的变化,它会提前足够长的时间提醒其所有者对其投资组合的建议变化。

欺诈检测和防范是另一个需要升级的领域。虽然在这一领域有机器学习和人工智能的应用,但它们不足以防止欺诈在全球范围内发生。欺诈检测系统需要通过发现洗钱者和其他黑客滥用系统的模式来使用机器学习。黑客企图存在于网络安全领域;然而,与洗钱和欺诈相关的交易很难被发现。这样做的主要原因是系统将用户识别为合法用户,因此不标记他们。但是,通过使用异常值检测等技术并将其与其他欺诈检测算法相结合,可以构建一个不允许实时进行此类交易的健壮系统。对已经发生的交易发出危险信号,除了对系统用户提出刑事指控(这些用户在欺诈被发现时可能已经逃离)之外,没有任何帮助。然而,通过创建机器学习模型,例如我们在本书第十四章中看到的模型,我们可以很容易地实时检测和阻止这种交易的发生。

在金融领域实现机器学习生命周期

现在,我们将看看机器学习在金融行业的实现。在这里,我将使用监督机器学习技术向您展示如何在会计数据集上实现。本例中使用的数据集是虚构的,但基于任何组织通常使用的电子支付分类账,适合您了解如何在会计领域实现机器学习。

现在让我们看看本章将要用到的数据集,看看数据字典,并在开始处理它之前理解它。这里描述了数据集中的列。

  • 记录号:这是数字支付登记簿中分类账交易的记录号。

  • 交易号:这是支付网关在成功完成支付交易时提供的唯一交易号。

  • 财政年度:这是交易发生的财政年度。

  • 月:该条目给出交易发生的月份。

  • 部门:部门栏目包括公司的财务、人力资源、学习与发展、法律、营销、采购、研究、战略规划和运输部门。

  • 账户:账户列表示公司订单在其分类账中的账号。这是公司内部的事情。

  • 费用类别:费用类别代表公司在向供应商付款时的费用类型。

  • 供应商 ID: 由支付或采购系统签署给接受付款的供应商。

  • 付款方式:这一栏讲述了所使用的付款方式的类型,例如自动票据交换所支票或电汇。

  • 付款状态:付款状态是对已经对账的付款交易的确认,不仅与银行对账,还与内部采购委员会对账。内部支付意味着付款已经得到银行的批准和确认,并且付款已经得到组织内部采购委员会的批准。

  • 付款日期:这是交易发生的实际付款日期。

  • 发票 ID: 这是已经生成的发票的发票 ID,付款交易是根据该发票生成的。

  • 发票日期:表示发票生成的日期。

  • 金额:已发生的支付交易的实际金额。

  • 红色标志:列值 1 表示交易金额低于金额列的第 25 个分位数,支付状态为未对账支付。危险信号交易需要进一步调查。代表交易的值高于第 75 个分位数,并且具有“信任”和“协调”状态。这说明还需要进一步调查。值为 0 表示交易在 1.5 倍的第 25 个分位数内,因此被视为合法。

在这个数据集中,我将使用特定分类器的监督学习技术来对合法的交易进行分类。

该数据集采用平面文件 PaymentsLedger.csv 的形式,可从以下 URL 获得: http://www.PuneetMathur.me/Book009/

启动代码

现在让我们开始在这个数据集上实现无监督学习。

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

在清单 15-1 中,导出 Python 库,如 String IO 和 numpy,以便开始工作。

#Importing python libraries
import pandas as pd
from io import StringIO
import os
import numpy as np
os.getcwd()

Listing 15-1Importing Basic Python Libraries

在清单 15-2 中,我从平面文件中加载数据集,然后查看加载到数据帧中的数据集。

#Reading data set from flat files
fname="C:/PaymentsLedger.csv"
openledger= pd.read_csv(fname, low_memory=False, index_col=False)

#Check the data Loaded into memory
print(openledger.head(1))

   Record No  TransactionNo  Fiscal Year  Month Department  Account  \
0          0        1095300         2018      1    FINANCE    54050

   Expense Category Vendor   ID        Payment Method     Payment Status  \
0  Food And Beverages     59169  Automated Clearing House  Paid-Unreconciled

  Payment Date     Invoice ID Invoice Date  Amount  RedFlag
0   07/21/2017  DDSM100367442   07/19/2017   10.08        1

Listing 15-2Loading and Checking Data Set in Memory

接下来,在清单 15-3 中,我将数据传输到一个标准的 Pandas 数据帧中,然后检查数据集是否正确加载。然后我观察数据集的形状,它告诉我们 7500 行和 13 列。我们还查看列名,这与我们在本节开始时讨论的数据字典相同。我使用 dataframe 的 dtypes 属性来查看已经装载的列的数据类型。

dfworking= pd.DataFrame(openledger)
#Look at the first record
print(dfworking.head(1))
#Check the shape size and columns in the dataset

print(dfworking.shape)
print(dfworking.columns)
dfworking.dtypes
   Record No  TransactionNo  Fiscal Year  Month Department  Account  \
0          0        1095300         2018      1    FINANCE    54050

   Expense Category Vendor   ID        Payment Method      Payment Status \
0  Food And Beverages     59169  Automated Clearing House  Paid-Unreconciled

  Payment Date     Invoice ID Invoice Date  Amount  RedFlag
0   07/21/2017  DDSM100367442   07/19/2017   10.08        1
(7293, 15)
Index([u'Record No', u'TransactionNo', u'Fiscal Year', u'Month', u'Department',
u'Account', u'Expense Category', u'Vendor ID', u'Payment Method',
u'Payment Status', u'Payment Date', u'Invoice ID', u'Invoice Date',
u'Amount', u'RedFlag'],
      dtype='object')
Out[20]:
Record No             int64
TransactionNo         int64
Fiscal Year           int64
Month                 int64
Department           object
Account               int64
Expense Category     object
Vendor ID            object
Payment Method       object
Payment Status       object
Payment Date         object
Invoice ID           object
Invoice Date         object
Amount              float64
RedFlag               int64
dtype: object

Listing 15-3Loading Pandas Dataframe and the Column Datatypes

接下来,在清单 15-4 中,我查看我们是否有任何丢失的数据,以了解我们是否需要在开始预处理数据之前处理它。

dfworking.isnull().any()
#Counting the Number of Null rows in each Column of the dataframe
dfworking.isnull().sum()
Out[21]:
Record No           False
TransactionNo       False
Fiscal Year         False
Month               False
Department          False
Account             False
Expense Category    False
Vendor ID           False
Payment Method      False
Payment Status      False
Payment Date        False
Invoice ID          False
Invoice Date        False
Amount              False
RedFlag             False
dtype: bool

Out[22]:
Record No           0
TransactionNo       0
Fiscal Year         0
Month               0
Department          0
Account             0
Expense Category    0
Vendor ID           0
Payment Method      0
Payment Status      0
Payment Date        0
Invoice ID          0
Invoice Date        0
Amount              0
RedFlag             0
dtype: int64

Listing 15-4Finding Empty Rows in the Dataframe

在检查了数据帧中的空值之后,我们发现没有空列或空列。然而,在现实世界中,情况并非如此,因此您可能需要处理和处理各个列中缺失的值。在我们继续之前,让我向您介绍一下我将在这个机器学习模型构建中使用的一些功能。Python 的第一个功能是分发。我将使用这个函数来创建分布图,以查看和比较它们,并查看算法之间的结果。我还将使用它来建立基准预测算法。让我们看看清单 15-5 中的代码。

Visualization Functions which will be used throughout this model
import matplotlib.pyplot as pl
import matplotlib.patches as mpatches
from time import time
from sklearn.metrics import f1_score, accuracy_score

def distribution(data, transformed = False):
    """
    Visualization code for displaying skewed distributions of features
    """

    # Create figure
    fig = pl.figure(figsize = (11,5));

    # Skewed feature plotting
    for i, feature in enumerate(['Amount','Month', 'Fiscal Year']):
        ax = fig.add_subplot(1, 3, i+1)
        ax.hist(data[feature], bins = 25, color = '#00A0A0')
        ax.set_title("'%s' Feature Distribution"%(feature), fontsize = 14)
        ax.set_xlabel("Value")
        ax.set_ylabel("Number of Records")
        ax.set_ylim((0, 2000))
        ax.set_yticks([0, 500, 1000, 1500, 2000])
        ax.set_yticklabels([0, 500, 1000, 1500, ">2000"])

    # Plot aesthetics

    if transformed:
        fig.suptitle("Log-transformed Distributions of Continuous Census Data Features", \
            fontsize = 16, y = 1.03)
    else:
        fig.suptitle("Skewed Distributions of Continuous Census Data Features", \
            fontsize = 16, y = 1.03)

    fig.tight_layout()
    fig.show()
#End of Distribution Visualization function

Listing 15-5Distribution Function

分布函数输入参数相同,通知第二个参数说明是否需要转换所需的数据帧。这是为了以后应用日志转换。在函数的第一行,我使用 Matlab figure 函数创建了一个图形,图形大小为 11 和 5。之后,我在 for 循环中创建了一个特性图,它枚举了 amount month 和 fiscal year 列。请注意,这些列实际上是数字。之后,我将这些列中的每一列作为子图添加到图中,然后创建一个包含 25 部电影的数据特征的直方图,并为特征分布提供一个标题,将 x 标签和 y 标签值设置为白色 x 值和标签中的 x 刻度。在 for 循环完成创建图形之后,下一步检查第二个输入参数。如果需要进行对数转换,则需要进行确认,然后用对数转换后的分布附加一个单独的图形超级标题;否则就是连续普查数据特征的偏态分布。所以我用这个函数来创建一个对数转换分布和一个偏斜分布。完成后,图形与字体布局一起使用,并显示在屏幕上。一个简单的函数确实可以很好地显示转换分布和偏斜分布的专业成绩。

特征重要性

接下来,我们看看清单 15-6 中称为 feature_plot()的特征重要性函数。

img/464968_1_En_15_Fig1_HTML.jpg

图 15-1

前五个最具预测性特征的归一化权重

# Plotting Feature Importances through this function
def feature_plot(importances, X_train, y_train):

    # Display the five most important features
    indices = np.argsort(importances)[::-1]
    columns = X_train.columns.values[indices[:5]]
    values = importances[indices][:5]

    # Creat the plot
    fig = pl.figure(figsize = (9,5))
    pl.title("Normalized Weights for First Five Most Predictive Features", fontsize = 16)
    pl.bar(np.arange(4), values, width = 0.6, align="center", color = '#00A000', \
          label = "Feature Weight")
    pl.bar(np.arange(4) - 0.3, np.cumsum(values), width = 0.2, align = "center", color = '#00A0A0', \
          label = "Cumulative Feature Weight")
    pl.xticks(np.arange(5), columns)
    pl.xlim((-0.5, 4.5))
    pl.ylabel("Weight", fontsize = 12)
    pl.xlabel("Feature", fontsize = 12)

    pl.legend(loc = 'upper center')

    pl.tight_layout()
    pl.show()
#End of Feature Importances function

Listing 15-6Feature Importances Function

feature_plot函数接受第一个参数作为特征重要性,第二个参数作为X_train和第三个参数y_train。首先,我从 importances 变量的末尾创建了一个所有重要特性的排序,然后我将来自x_train的列名和来自 importance 变量的值放入 values 变量。之后,我创建了一个条形图,其中包含从 importances 变量中提取的值;这只是五个,因为我们想看看这里的前五个重要特性。

观察异常值

我们现在来看看数据集中的异常值。我想提醒来自医疗保健和零售这两个行业的读者,我们已经将异常值定义为小于金额列下分位数的 1.5 倍且大于金额列上分位数的 1.5 倍的值。下四分位数是 0.25,上四分位数是 0.75。

fname="C:/DATASETS/data.ct.gov/PaymentsDataset.csv"
openledger= pd.read_csv(fname, low_memory=False, index_col=False)

#Verify the data Loaded into memory
print(openledger.head(1))
   Unnamed: 0  TransactionNo  Fiscal Year  Month Department  Account  \
0           0        1095300         2018      1    FINANCE    54050

     Expense Category Vendor ID            Payment Method     Payment Status  \
0  Food And Beverages     59169  Automated Clearing House  Paid-Unreconciled

  Payment Date     Invoice ID Invoice Date  Amount  RedFlag
0   07/21/2017  DDSM100367442   07/19/2017   10.08        1

data= pd.DataFrame(openledger)

Listing 15-7Load the Data Set

为了将支付数据集解码成一个数据框架,然后开始研究离群值并探索它,我们不打算研究数据类型并在面积图中研究它们。我们知道我们的数据集是为了增强无空值。在清单 15-8 中,我提供了异常值的计算。

#Total number of records
n_records = len(data.index)

#Number of records where payments are below 1.5 times of upper Quantile- upper Outlier Limit

l=data[data['RedFlag'] == 2].index
n_greater_quantile = len(l)

#Number of records where payments are above 1.5 times of lower Quantile- lower Outlier limit
l=data[data['RedFlag'] == 1].index
n_lower_quantile = len(l)

#Percentage of Payments above Upper Outlier limit
p=float(n_greater_quantile)/n_records*100.0
greater_percent =p

#Percentage of Payments above Lower Outlier limit
p=float(n_lower_quantile)/n_records*100.0
lower_percent =p

# Print the results
print "Total number of records: {}".format(n_records)
print "High value Payments above 1.5 times of 75th Percentile: {}".format(n_greater_quantile)
print "Low value Payments below 1.5 times of 25th Percentile: {}".format(n_lower_quantile)
print "Percentage of high value Payments: {:.2f}%".format(greater_percent)
print "Percentage of low value Payments: {:.2f}%".format(lower_percent)

Total number of records: 7293
High value Payments above 1.5 times of 75th Percentile: 366
Low value Payments below 1.5 times of 25th Percentile: 748
Percentage of high value Payments: 5.02%
Percentage of low value Payments: 10.26%

Listing 15-8Finding the Outliers in the Payments Data Set

在我解释异常值之前,我想告诉您,用于确定欺诈或洗钱交易的异常值只是用于欺诈检测的众多技术之一。我使用非常简单的设置和数据集以及最简单的技术来确定交易是否是欺诈,以便您可以理解我们如何使用和建立机器学习模型来确定此类交易。在 n_ records 变量中,我取数据帧中记录数量的长度。接下来,我设置了离群值的上限和下限。整个想法是列出落在异常值上限或下限内的记录或事务的数量。我们从数据字典描述中知道,红色标记列值为 2 意味着一条记录落在异常值上限内。类似地,红色标志 1 意味着交易量低于穷人最喜欢的变量 n_lower_quantile,该变量用于找出满足下限的行数。类似地,变量 n_lower_quantile 用于确定付款分类帐中有多少付款交易或记录落在异常值下限内。之后,它会计算超出较大异常值限制和较低异常值限制的支付百分比。结果旨在解释使用该变量的语句。您可以看到,有 366 笔高值支付在异常上限附近,740 笔交易在异常下限附近。高于异常值上限的事务约占总事务的 5%,低于异常值下限的事务占事务的 10.26%。

# PREPARING DATA
# Split the data into features and target label
payment_raw = pd.DataFrame(data['RedFlag'])
type(payment_raw)
features_raw = data.drop('RedFlag', axis = 1)
#Removing redundant columns from features_raw dataset
features_raw.dtypes
features_raw=features_raw.drop('TransactionNo', axis=1)
features_raw=features_raw.drop('Department', axis=1)
features_raw=features_raw.drop('Account', axis=1)
features_raw=features_raw.drop('Expense Category', axis=1)
features_raw=features_raw.drop('Vendor ID', axis=1)
features_raw=features_raw.drop('Payment Method', axis=1)
features_raw=features_raw.drop('Payment Date', axis=1)
features_raw=features_raw.drop('Invoice ID', axis=1)
features_raw=features_raw.drop('Invoice Date', axis=1)
features_raw=features_raw.drop('Unnamed: 0', axis=1)
features_raw.dtypes
type(features_raw)
Fiscal Year         int64
Month               int64
Payment Status     object
Amount            float64
dtype: object

Listing 15-9Preparing Data

准备数据集

既然我们已经确定我们的数据集中有很大比例的交易属于欺诈类别或危险信号,我们现在可以通过划分为特征和目标标签来准备我们的数据集。这在图 15-2 中完成。您会注意到,为了只保留那些对我们的模型构建很重要的特性,我去掉了相当多无用的特性,比如部门、账户、类别 ID、付款方式、付款日期、发票日期和发票 ID。这些列在我们的模型构建过程中非常重要。大多数时候,模型构建是一个迭代的过程,因此,如果我后来发现一些特性是必需的,可能被错误地选择了,或者没有给出足够的准确性,那么我可以考虑添加一些列,如 department、expense category 等。

在图 15-2 中,我展示了三列的分布:金额、月份和财政年度。请注意,所有这些列都是数字。分布函数不适用于非数字列。

img/464968_1_En_15_Fig2_HTML.jpg

图 15-2

可视化数字列

# Visualize skewed continuous features of original data
distribution(data)

在图 15-2 中,我使用了分布数据来显示金额、月份和财政年度的分布,我们可以清楚地看到,它们都不在正态分布曲线附近。所以这些是需要被转换的高度偏斜的分布。我将对这些功能应用的第一个转换是对数转换。请记住,与平均值的距离只能发生在数字特征上,因此我们选择了我们在图 15-2 的可视化中看到的三列或特征。应用对数变换后,下一步将是对这些要素应用比例,以便必须移除这些要素中每一个要素的巨大变化-例如,如果金额的变化范围从 0 到大于 2000,但是月最多只有 8000 条记录,财政年度也是如此。此外,金额以美元计量,月份从 0 到 12 计量,财政年度从一年到另一年计量。因此,如果我们不应用缩放器,那么我们将比较或使用不一致的特征,这就像比较苹果和桔子一样。在图 15-3 中,我们将看到我们的数据转换为对数转换,以及在数值数据集上应用最小最大缩放器,因为数据集中的特征具有非常不同的比例,并且包含一些非常大的异常值。这两个特征导致数据可视化困难,更重要的是,它们会降低许多机器学习算法的预测性能。未缩放的数据也会减缓甚至阻止许多基于梯度的估计器的收敛 [1 ]。

img/464968_1_En_15_Fig3_HTML.jpg

图 15-3

在支付数据集上应用对数变换和定标器

# Log-transform the skewed features
#Replacing Null values with zero due to software data entry problem
#Known issue in software user screen takes null values there is no check.
import warnings
warnings.filterwarnings("ignore")
features_raw.isnull().sum()

skewed = ['Amount','Month', 'Fiscal Year']
features_raw[skewed] = data[skewed].apply(lambda x: np.log(x + 1))
features_raw.isnull().sum()
features_raw.fillna(0, inplace=True)
features_raw.dtypes

# Visualize the new log distributions
distribution(features_raw, transformed = True)

#Normalizing Numerical Features
# Import sklearn.preprocessing.StandardScaler
from sklearn.preprocessing import MinMaxScaler

# Initialize a scaler, then apply it to the features
scaler = MinMaxScaler()
numerical = [ 'Amount','Month', 'Fiscal Year']
features_raw[numerical] = scaler.fit_transform(data[numerical])

如果你比较图 15-2 和图 15-3 ,那么这两个图清楚地显示了对数变换和缩放的效果,其中在图 15-3 中,在应用变换之后,金额特征几乎被标准化,月份特征也有一点改变,但是在财政年度特征中可以看到非常小的改变。

编码列

接下来,我将对一个支付状态列进行编码,这样做的原因是 Python scikit 学习库也需要分类变量的数值。在付款状态列中,我们只有两个值:一个是“已付-已对账”,另一个是“已付-未对账”。在清单 15-10 中,我将“已支付-已协调”热编码为值 0,将“已支付-未协调”热编码为值 1。然后我看看编码完成后我们有多少功能。

# Encoding the 'Non-Numeric' data to numerical values
#Payment Status column
d={"Paid-Reconciled": 0, "Paid-Unreconciled": 1}
features_raw['Payment Status'] = features_raw['Payment Status'].map(d)

# Printing the number of features after one-hot encoding
encoded = list(features_raw.columns)
print "{} total features after one-hot encoding.".format(len(encoded))

4 total features after one-hot encoding.

Listing 15-10Applying Hot Encoding

将数据分割成要素

在代码的下一部分(在清单 15-11 中给出),我将使用 SKlearn 包中的 train test split 函数将数据分割成特性和红旗。

# Importing train_test_split
from sklearn.cross_validation import train_test_split
payment_raw.columns
# Splitting the 'features' and 'RedFlags' data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(features_raw, payment_raw, test_size = 0.2, random_state = 0)
X_train.columns
X_test.columns
y_train.columns
y_test.columns
# Showing the results of the split
print "Training set has {} samples.".format(X_train.shape[0])
print "Testing set has {} samples.".format(X_test.shape[0])
Training set has 5834 samples

.
The testing set has 1459 samples.

Listing 15-11Dividing the Data into a Training Set and Test Set

评估模型性能

在此分割之后,我现在将执行模型性能评估,首先使用一个基准分类器 nave-Bayes,然后计算其准确度分数并导入五个其他分类器,比较它们之间的结果。您可以在清单 15-12 和 15-13 中看到结果。

#Evaluating Model Performance
#Establishing Benchmark performance indicator Naive Bayes
#Naive Predictor Performace
from sklearn.naive_bayes import GaussianNB
#from sklearn.metrics import accuracy_score, fbeta_score
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report, confusion_matrix
NB = GaussianNB()
NB.fit(X_train,y_train)
pred = NB.predict(X_test)

#Calculating Accuracy Score
#Calculating Beta Score
accuracy_score(y_test,pred)
print(f1_score(y_test,pred, average="macro"))
print(precision_score(y_test, pred, average="macro"))
print(recall_score(y_test, pred, average="macro"))
0.8064675486756182
0.7243305924520346
0.9656357388316151

Listing 15-12Scoring the Benchmark Predictor

我们看到基准预测器的 F1 分数、精度分数和召回分数都很好,分别为 0.80、0.72 和 0.96。现在我们有了基准预测器或分类器 nave Bayes 的分数,让我们将它应用于其他分类器,如清单 15-13 中给出的代码中的决策树、逻辑回归、SGD(梯度下降)、Extratrees 分类器和随机森林分类器。

img/464968_1_En_15_Fig4_HTML.jpg

图 15-4

比较来自分类器的结果

# I AM GOING TO DO INITIAL MODEL EVALUATION NOW
# Importing the three supervised learning models from sklearn
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.ensemble import RandomForestClassifier

# Initialize the three models
clf_A = GaussianNB()
clf_B = DecisionTreeClassifier(max_features=0.2, max_depth=2, min_samples_split=2,random_state=0)
clf_C = LogisticRegression(random_state=0)
clf_D = SGDClassifier(loss="hinge", penalty="l2")
clf_E = ExtraTreesClassifier(n_estimators=2, max_depth=2,min_samples_split=2, random_state=0)
clf_F = RandomForestClassifier(max_depth=2)

# Calculate the number of samples for 1%, 10%, and 100% of the training data
#Defining function since percent is required 3 times

# Collect results on the learners
learners=["Naive Bayes","Decision Tree","Logistic Regression","SGD Classifier","ExtaTrees Classifier","RandomFores Classifier"]
cnt=0
columns=['learner','train_time','pred_time','acc_train','acc_test','f1_score']
learningresults= pd.DataFrame(columns=columns)
results = {}

for learner in [clf_A, clf_B, clf_C,clf_D,clf_E,clf_F]:
    #print(learners[cnt])
    results['learner']=learners[cnt]
    #Fitting the learner to the training data using slicing with 'sample_size'
    start = time() # Get start time
    learner.fit(X_train, y_train)
    #Calculating the total prediction time
    end = time() # Get end time
    results['train_time'] =  end - start

    start = time() # Get start time
    predictions_test = learner.predict(X_test)
    predictions_train = learner.predict(X_train)
    end = time() # Get end time
    results['pred_time'] = end - start
    results['acc_train'] = accuracy_score(y_train, predictions_train)
    results['acc_test'] = accuracy_score(y_test, predictions_test)
    beta=0.5
    results['f1_score'] = f1_score(y_test,pred, average="macro")
    print(results)
    learningresults.loc[cnt]=results
    cnt=cnt+1

#Looking at the plots to determine the best Classifier for our Dataset
print(learningresults)
learningresults.columns
learningresults.plot(kind='bar', x="learner", legend="reverse",  title='Classifier Algorithms Compared- Accounts Payment Dataset',figsize=(10,10), fontsize=20)

Listing 15-13Initial Model Evaluation

在我们进一步进行模型实现之前,我想讨论学习者数据集的结果,该数据集存储了用于训练时间的 train_time 和用于预测时间的 pred_time、用于训练期间准确性的 acc_train、用于测试期间准确性的 acc_test 以及用于 f1 分数的 f1_score。这些在表 15-1 中给出。

有多种方法可以为您的模型选择最佳的学习器或分类器。不同的数据集和应用模型的不同商业情境可以决定哪个学习者最适合你。例如,仅使用一揽子参数进行模型选择(如最低训练时间)不一定是好的,因为它可能是在测试或 f1 分数期间准确度较低的学习者。此外,如果您为将应用于批量离线流程(如月度报告或其他此类夜间流程)的模型选择学习者,那么您的目标可能不是最低的训练和预测时间。如果业务人员希望在最短的预测时间内获得更高的准确性,那么在我们的例子中,您可以选择 SGD 分类器。应用模型的环境更为重要,它决定了模型的选择标准。

表 15-1

比较学习者或分类器

|

学习者

|

火车时间

|

pred_time

|

acc_train

|

acc _ 测试

|

f1 _ 分数

|
| --- | --- | --- | --- | --- | --- |
| 决策图表 | Zero point zero zero one | Zero point zero zero one | 0.857045 | 0.880055 | 0.806468 |
| 纳伊夫拜厄斯 | Zero point zero zero two | Zero point zero zero two | 0.910525 | 0.910898 | 0.806468 |
| SGD 分类器 | Zero point zero zero nine | Zero | 0.947377 | 0.946539 | 0.806468 |
| 树外分类器 | Zero point zero one | Zero point zero zero two | 0.858759 | 0.867032 | 0.806468 |
| 逻辑回归 | Zero point zero two eight | Zero point zero zero one | 0.96349 | 0.971213 | 0.806468 |
| 随机森林分类器 | Zero point one four six | Zero point zero one one | 0.948234 | 0.956134 | 0.806468 |

在表 15-1 中,所有分类器的 f1 分数都是 0.8064,因此不能考虑进行选择。我使用了逻辑回归,就测试数据集的最少训练时间和最高准确度而言,它是最好的分类器。在清单 15-14 中,让我们使用这个模型通过 GridSearch 交叉验证进行超参数调优。

# Import 'GridSearchCV', 'make_scorer', and any other necessary libraries
from sklearn.metrics import make_scorer
from sklearn.model_selection import GridSearchCV
from IPython.display import display
import pickle, os.path
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import fbeta_score

def getscore(y_true, y_predict):
    return fbeta_score(y_true, y_predict, beta)

best_clf = None
beta=0.5

#Initialize the classifier

clf_C = LogisticRegression(random_state=0)

# Create the parameters list you wish to tune
#parameters = {'n_estimators':range(10,20),'criterion':['gini','entropy'],'max_depth':range(1,5)}
parameters = {'solver':['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],'C':range(1,10),'max_iter':range(50,100)}

# Make an fbeta_score scoring object
scorer = make_scorer(getscore)

# Perform grid search on the classifier using 'scorer' as the scoring method
#grid_obj = GridSearchCV(clf_C, parameters, scoring=scorer)

#do something
grid_obj = GridSearchCV(clf_C, parameters)

#grid_obj = GridSearchCV(clf_C, parameters)

# Fit the grid search object to the training data and find the optimal parameters
from datetime import datetime
startTime = datetime.now()

grid_fit = grid_obj.fit(X_train, y_train)
CV_lr = GridSearchCV(estimator=clf_C, param_grid=parameters, cv= 5)
CV_lr.fit(X_train, y_train)
print(datetime.now() - startTime)

    # Get the estimator
best_clf = grid_fit.best_estimator_

# Make predictions using the unoptimized and model
predictions = (clf_C.fit(X_train, y_train)).predict(X_test)
best_predictions = best_clf.predict(X_test)

# Report the before-and-afterscores
print "Unoptimized model\n------"
print "Accuracy score on testing data: {:.4f}".format(accuracy_score(y_test, predictions))
print "F-score on testing data: {:.4f}".format(fbeta_score(y_test, predictions, beta = 0.5,average='micro'))
print "\nOptimized Model\n------"
print "Final accuracy score on the testing data: {:.4f}".format(accuracy_score(y_test, best_predictions))
print "Final F-score on the testing data: {:.4f}".format(fbeta_score(y_test, best_predictions, beta = 0.5,average='micro'))

0:39:21.351000

Unoptimized model
------
Accuracy score on testing data: 0.9712
F-score on testing data: 0.9712

Optimized Model
------
Final accuracy score on the testing data: 0.9925
Final F-score on the testing data: 0.9925

Listing 15-14Tuning the Model Using GridSearch Cross-Validation Method

如你所见,我对最佳选择的分类器——逻辑回归——实现了 GridSearch 交叉验证,它花了大约 39 分 21 秒得出结果。优化模型的结果非常好,精确度分数和 F 分数为 0.9925,与未优化模型的精确度分数 0.9712 和 F 分数 0.9712 相比有了显著提高。在清单 15-15 中,我现在打印最终调整的参数,这些参数将是我们用于预测模型的参数。

# Print the final parameters
df = pd.DataFrame(grid_fit.grid_scores_).sort_values('mean_validation_score').tail()
display(df)
print "Parameters for the optimal model: {}".format(clf.get_params())
                                             parameters  \
2098      {u'C': 9, u'max_iter': 69, u'solver': u'sag'}
2099     {u'C': 9, u'max_iter': 69, u'solver': u'saga'}
2100  {u'C': 9, u'max_iter': 70, u'solver': u'newton...
2086    {u'C': 9, u'max_iter': 67, u'solver': u'lbfgs'}
2249     {u'C': 9, u'max_iter': 99, u'solver': u'saga'}

    mean_validation_score                             cv_validation_scores
2098            0.985087  [0.9881808838643371, 0.9845758354755784, 0.982...
2099            0.985087  [0.9881808838643371, 0.9845758354755784, 0.982...
2100            0.985087  [0.9881808838643371, 0.9845758354755784, 0.982...
2086            0.985087  [0.9881808838643371, 0.9845758354755784, 0.982...
2249            0.985087  [0.9881808838643371, 0.9845758354755784, 0.982...
Parameters for the optimal model: {'warm_start': False, 'oob_score': False, 'n_jobs': 1, 'min_impurity_decrease': 0.0, 'verbose': 0, 'max_leaf_nodes': None, 'bootstrap': True, 'min_samples_leaf': 1, 'n_estimators': 10, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'criterion': 'gini', 'random_state': None, 'min_impurity_split': None, 'max_features': 'auto', 'max_depth': 2, 'class_weight': None}

Listing 15-15Tuned Parameter for Logistic Regression Prediction Model

我们可以看到,相关的最佳模型参数是 bootstrap:True,这意味着 GridSearch 交叉验证能够在模型上应用 bootstrap,以便获得最佳结果。有关自举如何帮助模型调优的更多信息,请阅读 IEEE 的研究论文( https://ieeexplore.ieee.org/document/6396613/ )。其他重要的参数是 n 估计值:10,最大深度:2。

确定特征

在找出逻辑回归预测模型的调整参数后,我现在将进入前五个功能的重要性,这将帮助我们确定我们的功能如何在预测模型中帮助我们。您可以使用 feature_plot()函数在清单 15-16 中看到这段代码,我们在前面的代码中已经看到过。

img/464968_1_En_15_Fig5_HTML.jpg

图 15-5

使用分类器的特征选择

# Now Extracting Feature Importances
# importing a supervised learning model that has 'feature_importances_'
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.feature_selection import SelectFromModel
from sklearn.metrics import fbeta_score

# Training the supervised model on the training set
model = ExtraTreesClassifier()
model.fit(X_train, y_train)

# TODO: Extract the feature importances

importances = model.feature_importances_

# Plot
feature_plot(importances, X_train, y_train)

Listing 15-16Extracting Feature Importances

正如所料,金额是我们模型中最重要的特征,其次是支付状态。请记住,我们在这个数据集中的欺诈是基于红旗列中的这两列。大于第 75 百分位的 1.5 倍且支付状态为未对账的异常值被视为潜在欺诈或洗钱交易。同样,低于 1.5 倍第 25 百分位的下限和支付状态为未对账的交易被视为潜在欺诈或洗钱支付交易。从图中我们可以看到,财政年度和月份对我们的预测模型没有任何重大影响,并且具有较低的特征权重。现在我们已经看到了最好的两个特性,让我们选择这些特性,以便我们的模型可以最终完成。这是在清单 15-17 中完成的。

# Feature Selection
# Import functionality for cloning a model
from sklearn.base import clone
best_clf= clf_F
# Reduce the feature space
X_train_reduced = X_train[X_train.columns.values[(np.argsort(importances)[::-1])[:5]]]
X_test_reduced = X_test[X_test.columns.values[(np.argsort(importances)[::-1])[:5]]]

# Train on the "best" model found from grid search earlier
clf = (clone(best_clf)).fit(X_train_reduced, y_train)
best_predictions = best_clf.predict(X_test)
# Make new predictions
reduced_predictions = clf.predict(X_test_reduced)

# Report scores from the final model using both versions of data
print "Final Model trained on full data\n------"
print "Accuracy on testing data: {:.4f}".format(accuracy_score(y_test, best_predictions))
print "F-score on testing data: {:.4f}".format(fbeta_score(y_test, best_predictions, average="macro", beta = 0.5))
print "\nFinal Model trained on reduced data\n------"
print "Accuracy on testing data: {:.4f}".format(accuracy_score(y_test, reduced_predictions))
print "F-score on testing data: {:.4f}".format(fbeta_score(y_test, reduced_predictions, beta = 0.5, average="macro"))

Final Model trained on full data

------
Accuracy on testing data: 0.9561
F-score on testing data: 0.6537

Final Model trained on reduced data
------
Accuracy on testing data: 0.9548
F-score on testing data: 0.6523

Listing 15-17Feature Selection and Model Implementation

在最终模型和包括所有四个特征的完整数据之间,以及与简化数据相比,我们没有如此大的结果。因此,在我看来,我们可以保留完整的数据集,没有必要丢弃其他的特性,比如月份和财政年度。

最终参数

我们模型的最终参数在清单 15-18 中给出。

# Print the final parameters

print "Parameters for the optimal model: {}".format(clf.get_params())
Parameters for the optimal model: {'warm_start': False, 'oob_score': False, 'n_jobs': 1, 'min_impurity_decrease': 0.0, 'verbose': 0, 'max_leaf_nodes': None, 'bootstrap': True, 'min_samples_leaf': 1, 'n_estimators': 10, 'min_samples_split': 2, 'min_weight_fraction_leaf': 0.0, 'criterion': 'gini', 'random_state': None, 'min_impurity_split': None, 'max_features': 'auto', 'max_depth': 2, 'class_weight': None}

Listing 15-18Parameters for the Optimized Model

至此,我们完成了机器学习在支付数据集中的实现。该实现非常类似于您在本书的医疗保健和零售部分看到的方法;但是,我们在这里使用了支付交易数据集,这要求我们调整定义洗钱交易的一些方式。请记住,这是一种非常幼稚和简单的欺诈检测方法。在现实世界中,模型和数据变得更加复杂,例如增加国籍、ip 地址或位置等的复杂性。

尾注

  1. 需要应用缩放: http://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html

十六、金融人工智能案例研究

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

案例研究 1:股票市场运动预测

RISEGOINVEST 是一家领先的投资咨询公司和基金管理公司,自 1997 年成立以来,其基金增长了许多倍,当时美国证券市场的表现超过了全球同行十多年,迄今为止表现最好的是道琼斯工业平均指数,增长了 20%。其创始人兼董事长 Jimiki Takasata 成立了这家公司,旨在建立一条通往亚洲、中东和非洲等新兴市场的重要投资渠道。他有远见,知道发达国家将看到增长受阻,新兴市场将看到下一阶段的指数增长,并提供发达经济体没有提供的机会。那时,他是羊群中的独狼,他要求他的投资者开始寻找发展中国家和新兴市场。然而,第一年他就筹集了超过 6 亿美元的资金。这表明人们相信他作为投资者的能力,他的远见在当时得到了很多人的认同。

自早期增长阶段以来,该公司已呈指数增长,2017 年全球投资基金超过 925 亿美元。Takasata 先生建立了一个伟大的投资顾问团队,他们不仅是各自领域的专家,而且是能够发现世界各地将要发生的投资趋势的专业人士。他们在 2000 年初发现了像印度和中国这样的新兴经济体的崛起,并开始为他们的主要客户推动大量投资,给他们带来丰厚的回报,即使是在全球经济衰退的年代。这为该公司赢得了良好的声誉,也是其投资客户群增长的主要原因。随着所有的增长和趋势,risegoeventure 的基金经理和投资顾问错过了一些投资机会。例如,它未能预见到非洲国家投资机会的增加。它还在香港和马来西亚的证券市场为许多客户投资失败,在那里它遭受了严重的损失。

来自更高效管理新兴市场基金的竞争对手的竞争也有所加剧。由于竞争,投资者对新兴市场基金经理和顾问的要求越来越高。鹦鹉先生就是这样一个主要投资者。他将个人资金投资于高田先生的公司,总额达 8.5 亿美元。他是该公司非常重要的客户,因为他从 2003 年开始就和他们一起投资。这是超过十年的关系。高萨塔的投资顾问吉姆·卡特扎特(Jim Catzat)负责管理长尾小鹦鹉的账户,他向高萨塔报告了他所说的与客户的“不同寻常的对话”。在与鹦鹉先生的季度会议上,他要求吉姆给他提供关于新兴国家股票市场的非常准确的报告——特别是印度,他在那里有大量投资。鹦鹉先生希望关于他在印度股票市场投资的每日和每周咨询报告能够准确预测他投资的股票市场和个别股票的价格。吉姆告诉鹦鹉先生,目前的报告对他的股票发出了警告,这是基于他的公司为他做的各种基本面和技术面的分析,并反映在每天和每周发给他的报告中。鹦鹉先生说,“我需要你把你的报告调整到这样一个程度,那就是你向我预测明天或下一个交易日的股票市场运动或股票价格运动。”Jim 说,这是不可能实现的,因为预测股票价格是不可能的,因为股票价格是基于各种因素的,从宏观到微观指标的这些因素本身都是不可预测的。对此,吉姆回答说:“我给你一个月的时间。如果你没有这样的系统,那就开发它,给我一份至少 80%准确的印度股票价格报告,否则我会把我的资金转移到其他公司。”

在被 Jim 告知后,Takasata 先生解释说,这是一个大客户,口碑是非常重要的,所以如果这个客户不满意,口碑也会传给其他客户,他们也可以将他们的资金转移给其他基金经理。他让吉姆向该公司的计算机科学家 Kazy Korone 咨询,看看是否有一种计算机模型可以预测股票市场价格。

吉姆安排了一次与 Kazy 的会面,从她那里了解这样的事情是否有可能在第一时间完成,以及是否可以在 4 周内完成,这是客户给他们的。Kazy 告诉他,利用机器学习,有可能建立这样一个可以预测股票价格的模型。然而,它需要印度股票市场过去 10 年的数据。她要求他给她一周的时间来建立一个原型,以演示根据股票在最后一个交易日的收盘价预测股票价格。

案例研究的问题

  1. 你认为有可能对任何给定的股票建立机器学习预测模型,并预测其第二天的价格吗?

  2. 建立这样一个预测模型需要哪些数据?定义常用的数据特征,如股票名称、收盘价、开盘价等。

  3. 对于像印度这样的新兴市场,什么来源能给你最准确的股市数据?这些数据是免费的还是需要付费的?

  4. 从数据源收集数据后,您会采用什么方法来定义机器学习预测模型?

  5. 使用问题 4 中定义的方法,列出一两个你将在模型中使用的算法。

  6. 你实际的基于 Python 的机器学习解决方案是什么?

案例研究的建议解决方案

这个案例研究的解决方案将尝试以业务人员和机器学习专业人员都可以接受的方式回答每个问题。请记住,对于给定的问题,没有解决方案是最终的解决方案,在这种案例研究方法中,您可能会找到自己独特的解决方案。给出此解决方案的目的是为了让您了解如何为给定的业务问题找到专业的解决方案;重要的是要求给出解决方案的时间框架。但是,为了让您充分理解业务问题,我将要求您使用我在本书的医疗保健和零售部分向您展示的一些流程和原则,为这个案例研究问题开发一个成熟的解决方案。

答案 1

我确实认为有可能开发一个链式模型来预测下一个交易日的股票价格。我确信这一点,因为价格只不过是数字数据,它是在股票市场进行盘点时每分每秒产生的。有各种各样的算法可以用来预测股票市场价格,其中大部分是回归方程。

让我们好好看看一个基本回归器,因为构建原型非常短。然后,当一个成熟的解决方案构建完成后,我们可以考虑对其进行改进。

答案 2

在我看来,除了目标预测值(即价格)之外,还需要以下特征:

  • 日期:股票交易的日期。

  • 开盘价:当日股票的开盘价。

  • 高:当日股票的最高价格。

  • 低:当日股票的最低价格。

  • 最后:当日股票的最后交易价格。

  • 收盘:当日股票的收盘价。

答案 3

截至撰写本书时,目前有以下免费数据源可用于获取国家证券交易所和孟买证券交易所的数据。

Yahoo 使用 Pandas datareader 库:在清单 16-1 中,我给出了一个示例代码,可以使用这个 Python 脚本下载任何股票价格历史值。

# -*- coding: utf-8 -*-
"""
Created on Sun Dec  3 23:32:32 2017

@author: PUNEETMATHUR
"""

import numpy as np
import pandas as pd
#import pandas.io.data as web
from pandas_datareader import data, wb

sp500= data.DataReader('^GSPC', data_source="yahoo", start='1/1/2000', end='1/12/2017')
#sp500= data.DataReader('^GSPC', data_source="yahoo")
sp500.ix['2010-01-04']
sp500.info()
print(sp500)
print(sp500.columns)
print(sp500.shape)

import matplotlib.pyplot as plt
plt.plot(sp500['Close'])

# now calculating the 42nd Days and 252 days trend for the index
sp500['42d']= np.round(pd.rolling_mean(sp500['Close'], window=42),2)
sp500['252d']= np.round(pd.rolling_mean(sp500['Close'], window=252),2)

#Look at the data

sp500[['Close','42d','252d']].tail()
plt.plot(sp500[['Close','42d','252d']])

Listing 16-1Simple Python Script to Get Stock Market Data

例如,这个脚本获取标准普尔 500 指数的数据,然后通过将数据存储在 Pandas dataframe 中来绘制图表。然而,这个数据不是很准确,因为它也包含了节假日和周六的值,而我们确实知道股市是关闭的。所以我们有来自雅虎的数据来源,但是不准确。然后我给你看另一个来源,有免费的准确数据:Quandl.com。这些数据可以免费挖掘,没有很多限制。你需要在他们的网站上注册并获得一个免费的 api 密匙才能在这里工作: https://www.quandl.com/data/NSE-National-Stock-Exchange-of-India

现在,一旦您注册并从 Quandl 获得免费的 api 密钥,您就可以使用他们的 Python api 直接下载数据。

在开始使用清单 16-2 中的脚本之前,您需要使用 pip 安装程序安装 Quandl 包。现在我给你看图 16-1 。使用 quandl 免费 Python 库下载样本股票的数据。

pip install Quandl

# -*- coding: utf-8 -*-
"""
Created on Sat Sep 22 23:43:13 2018

@author: PUNEETMATHUR
"""

import quandl
quandl.ApiConfig.api_key = 'INSERT YOU API KEY HERE'

# get the table for daily stock prices and,
# filter the table for selected tickers, columns within a time range
# set paginate to True because Quandl limits tables API to 10,000 rows per call

data = quandl.get_table('WIKI/PRICES', ticker = ['AAPL', 'MSFT', 'WMT'],
                        qopts = { 'columns': ['ticker', 'date', 'adj_close'] },
                        date = { 'gte': '2015-12-31', 'lte': '2016-12-31' },
                        paginate=True)
data.head()

# create a new dataframe with 'date' column as index
new = data.set_index('date')

# use pandas pivot function to sort adj_close by tickers
clean_data = new.pivot(columns='ticker')

# check the head of the output
clean_data.head()

#Below script gets you Data from National Stock Exchange for a stock known as Oil India Limited
import quandl
quandl.ApiConfig.api_key = 'z1bxBq27SVanESKoLJwa'
quandl.ApiConfig.api_version = '2015-04-09'

import quandl
data = quandl.get('NSE/OIL')
data.head()
data.columns
data.shape

#Storing data in a flat file
data.to_csv("NSE_OIL.csv")
#A basic plot of the stocks data across the years
data['Close'].plot()

Listing 16-2Loading Data from Quandl

img/464968_1_En_16_Fig1_HTML.jpg

图 16-1

使用 quandl 免费 Python 库下载样本股票的数据

你会注意到,在代码的第一部分,我给出了一个例子,说明如何使用 Quandl 库获取苹果、微软和沃尔玛等股票的市场价格。我还向您展示了如何清理数据,并在清理后以可展示的形式显示出来。在引言的第二部分,我将向您展示如何从 Quandl 获取国家证券交易所(NSE)的数据。在这里,我使用的是一家名为印度石油有限公司的股票,我正在搜索它的数据,并将其存储在一个文件中,然后显示它的曲线图。你也会注意到股票有 2009 年到 2018 年的数据。所以这是一个非常好的股票市场免费数据来源。这是我向我所有的读者推荐的资源,为这个案例研究提供一个解决方案。

答案 4

我解决这个问题的方法是,首先通过答案 3 中所示的方法从 Quandl 获取关于一家公司的数据。使用 Python 脚本后,将数据存储在一个平面 csv 文件中,然后清除包含空值的数据。用日期列对数据进行排序。通过查看年和月的可视化数据进行探索性的数据分析。计算股票的简单移动平均线,因为它是衡量股票表现的好指标。我将主要为这个预测模型使用三列:['Date ',' Open ',' Close']。但是,我将从第二天的开盘价创建一个派生值列,并将其添加到前一天的价格中。所以我创建了一个新特性['NextDayOpen']。让我用清单 16-3 中的例子来说明这一点。

           Date    Open   Close
5909 1991-02-08   60.00   60.00
5908 1991-03-15   65.00   75.00
5907 1991-03-18   65.00   70.00

           Date    Open   Close  NextDayOpen
5909 1991-02-08   60.00   60.00            0
5908 1991-03-15   65.00   75.00           60
5907 1991-03-18   65.00   70.00           65
5906 1991-03-20   67.50   72.50           65

Listing 16-3Example of Adding Next Day Open Column Values

我们可以从清单 16-3 中看到,原来只有三列(日期、打开和关闭特性)的 dataframe 现在也增加了一个 NextDayOpen 特性。这只不过是前一天的开盘价结转到第二天开盘的功能。第一个是空的,因为它没有以前的开放值。实际上,现在 NextDayOpen 列成为我们的目标变量或预测值。这是我们第二天要预测的。这个概念是理解这个预测模型如何工作的基础和关键。

完成这些后,创建一个基于线性回归的模型来预测下一个交易日的股价。尽管这是一个简单的预测原型模型,但是当它投入生产时,我们需要尝试一些其他的回归模型,比如决策树等等。我让您自己尝试,选择最适合您的生产环境的型号。

答案 5

我会使用线性回归来建立一个原型模型。这样做的原因是因为在案例研究中,很少有时间来建立一个给定的模型,而线性回归技术提供了最快的实现和获得结果的方法。唯一可能做得不好的部分是预测模型的准确性水平;然而,如果你很着急,那么就要做出权衡。

答案 6

现在,我向您展示我在本案例研究的答案 5 中讨论过的解决方案。您将看到清单 16-4 中的代码。我假设你已经使用图 16-1 中给出的 Python 脚本加载了数据,并将其存储在一个 csv 文件中。

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 17 20:30:01 2017
@author: PUNEETMATHUR
I am creating this script to predict next day Opening Price based on
Today's Closing Price for any given stock
"""
import numpy as np
import pandas as pd
import os

#Change your directory to wherever your dataset is stored
os.chdir("E:\\") # Change this to your directory or path where you have downloaded the dataset

.
#Loading the dataset of the company for which prediction is required
df=pd.read_csv("BalmerLawrieColtd.csv",parse_dates=['Date'])
print(df.head(1))
print(df.columns)

Out[*]:
   Unnamed: 0       Date    Open    High    Low   Close    WAP  No. of Shares  \
0           1 2017-12-29  278.85  279.15  272.6  274.55  276.1          19372
   No. of Trades  Total Turnover  Deliverable Quantity  \
0            504       5348670.0               10024.0

   % Deli. Qty to Traded Qty  Spread H-L  Spread C-O
0                      51.74        6.55        -4.3
Index([u'Unnamed: 0', u'Date', u'Open', u'High', u'Low', u'Close', u'WAP',
       u'No. of Shares', u'No. of Trades', u'Total Turnover',
       u'Deliverable Quantity', u'% Deli. Qty to Traded Qty', u'Spread H-L',
       u'Spread C-O'],
      dtype='object')
df.shape
Out[91]: (5911, 14)

Listing 16-4Loading Data

到目前为止,我已经加载了数据并查看了它的形状,它由 5911 行和 14 列组成。有很多额外的数据是我们在构建原型模型时不需要的,因此我将删除它们,只选择清单 16-5 中模型构建练习所需的那些特性。

#Selecting only relevant columns required for prediction
cols=['Date','Open','Close']
df=df[cols]

print(df.columns)
print(df.head(5))
Index([u'Date', u'Open', u'Close'], dtype="object")
Date Open Close
0 2017-12-29 278.85 274.55
1 2017-12-28 276.75 276.15
2 2017-12-27 276.40 275.45
3 2017-12-26 269.00 268.10
4 2017-12-22 269.60 270.10

Listing 16-5Selecting Only the Relevant Columns for Our Prototype Model

我们可以从清单 16-5 中的代码结果看到,它只有我们想要的相关数据。现在让我们进入下一步,检查清单 16-6 中数据集中的空行。

# Checking data if Cleaning up data is required
df.isnull().any()
#df=df.dropna()
#df=df.replace("NA",0)
df.dtypes
Out[96]:
Date datetime64[ns]
Open float64
Close float64
dtype: object

Listing 16-6Checking for Data Clean-Up

从清单 16-6 中可以看出,我们没有任何清理工作要做,因为没有空行。这就是为数据集选择好的数据源的好处。Quandl.com 是全球股市数据的良好来源。现在让我们通过将数据绘制在清单 16-7 中来快速可视化数据。我们将数据可视化在下图 16-2 中。

#Sorting up data to plot historically ascending values in graph
df = df.sort_values(by='Date',ascending=True)

#Plotting the price of stock over the years
#What story does it tell?
import matplotlib.pyplot as plt
plt.plot(df['Date'],df['Close'])

Listing 16-7Plotting the data

img/464968_1_En_16_Fig2_HTML.jpg

图 16-2

可视化数据

我们看到这只特殊的股票 Balmer Lawrie Co. Ltd .在 2016 年见顶,在跌至低点之前是其有史以来的最高价格。接下来,我们绘制图表来检查去年和上个月的数据,看看我们是否注意到清单 16-8 和图 16-3 中给出的价格变动的一些不寻常之处。

#Now plot only for last one year and last 1 month
df['Date'].dt.year==2017
mask=(df['Date'] > '2017-1-1') & (df['Date'] <= '2017-12-31')
print(df.loc[mask])
df2017=df.loc[mask]
print(df2017.head(5))
plt.plot(df2017['Date'],df2017['Close'])

Listing 16-8Plotting data for last year and a month

img/464968_1_En_16_Fig3_HTML.jpg

图 16-3

可视化一年的数据

我们可以看到,这只股票在 11 月和 12 月左右见顶,然后在 2018 年 1 月略有上涨。此外,我们会在 2017 年 3 月至 6 月以及 8 月至 9 月看到一些季度业绩峰值。

现在让我们来看看这 1 个月的数据,看看它是否显示了我们的任何特点(列表 16-9 和图 16-4 )。

img/464968_1_En_16_Fig4_HTML.jpg

图 16-4

可视化 1 个月的股票数据

#Plotting last 1 month data on stock
mask=(df['Date'] > '2017-11-17') & (df['Date'] <= '2017-12-26')
print(df.loc[mask])
dfnovdec2017=df.loc[mask]
print(dfnovdec2017.head(5))
plt.plot(dfnovdec2017['Date'],dfnovdec2017['Close'])

Listing 16-9Plotting 1 month stock data

我们可以在图表中看到,该股票在 2017 年 11 月 26 日之后达到顶峰,在 2017 年 12 月 10 日至 2017 年 12 月 17 日期间处于最低点。而我们可以通过搜索有关股票分红的新闻、季度业绩、股票回购新闻或股票分割新闻等来找出股票下跌的原因。这是你在向客户展示结果时可以做的事情,客户肯定会有兴趣知道这种高峰和低谷的原因。然而,在本解决方案中,我将跳过这一步,直接进入下一步,计算清单 16-10 和图 16-5 中股票 1 年的简单移动平均线。

img/464968_1_En_16_Fig5_HTML.jpg

图 16-5

用简单移动平均线绘制股票价格

#Now calculating the Simple Moving Average of the Stock
#Simple Moving Average One Year
df2017['SMA'] = df2017['Close'].rolling(window=20).mean()
df2017.head(25)
df2017[['SMA','Close']].plot().

Listing 16-10Calculating Simple Moving Average of the Stock

你会注意到简单移动平均线非常仔细地跟踪股票,有时与价格运动曲线不太吻合。例如,在 x 轴上的点 0 和 50 之间,SMA 的蓝线远低于实际价格线。在 x 轴点 100 和 150 之间,以及 x 轴点 150 和 200 之间,也可以看到这种情况。SMA 也被称为技术指标,我用过 20 天的滚动窗口,它是在代码 df2017['SMA'] = df2017['Close']的部分定义的。滚动(窗口=20 )。mean()定义收盘价的平均值。现在我们来到这个模型建筑的中心部分,在这里我问开盘价和收盘价是否彼此跟随得很好。如图 16-6 所示。

img/464968_1_En_16_Fig6_HTML.jpg

图 16-6

股票的开盘价和收盘价是否相互一致?

#Does the Open and Closing price of the stock follow very well?
df2017[['Open','Close']].plot()

是的,目测所选股票 Balmer Lawries Co. Ltd .的开盘价和收盘价之间似乎有非常好的关系,但在 x 轴分笔成交点 50 附近以及 x 轴分笔成交点 100 和 150 之间的少数地方,我们发现开盘价和收盘价之间有差距,它们在 2017 年并没有非常紧密地跟随自己。让我们通过在表 16-1 中建立它们之间的关联来检查这一点。

表 16-1

检查列之间的相关性

|   |

打开

|

关闭

|

主题区(subject matter area 的缩写)

|
| --- | --- | --- | --- |
| 打开 | 1 | 0.962507 | 0.799758 |
| 关闭 | 0.962507 | 1 | 0.788695 |
| 高中 | 0.799758 | 0.788695 | 1 |

df2017.corr()
Out[104]:

In [105]:

我们可以看到开盘价和收盘价之间的相关性很强,为 0.96。所以是的,有一个很大的可能性,就是做一个预测股价的模型。SMA 的相关性在这里是不相关的,因为它是一个派生列,而不是我们可以用于预测目的的东西。这也体现在开盘价和 SMA 的相关性为 0.79,收盘价和 SMA 的相关性为 0.788。

现在,在我们继续创建新的列来进行图 16-7 中的预测之前,让我们也看一个月的 SMA。想象 SMA 一个月。

#Simple Moving Average One Month
dfnovdec2017['SMA'] = dfnovdec2017['Close'].rolling(window=2).mean()
dfnovdec2017.head(25)
dfnovdec2017[['SMA','Close']].plot()

Listing 16-11Calculating Moving Average for One Month

img/464968_1_En_16_Fig7_HTML.jpg

图 16-7

想象 SMA 一个月

滚动窗口为 2 的 1 个月的 SMA 给出了 1 个月的平均值。

dfnovdec 2017[' SMA ']= dfnovdec 2017[' Close ']。滚动(窗口=2)。平均值()。正是这种设置使我们能够获得 2017 年 11 月和 12 月的数据-大约 30 天的数据。现在,在清单 16-12 中,我将向您展示一种在 NextDayOpen 中创建列的方法,我们在前面的答案 5 中看到了这种方法。

#Now creating NextDayOpen column for prediction
ln=len(df)
lnop=len(df['Open'])
print(lnop)
ii=0
df['NextDayOpen']=df['Open']
df['NextDayOpen']=0
for i in range(0,ln-1):
    print("Open Price: ",df['Open'][i])
    if i!=0:
        ii=i-1
    df['NextDayOpen'][ii]=df['Open'][i]
    print(df['NextDayOpen'][ii])

Listing 16-12Creating NextDayOpen column for Prediction

您会注意到,我使用了一个 for 循环来遍历数据帧中的每一行,然后它进入一个 for 循环,其中 NextDayOpen 列从以前的开盘价更新。这是模型的实际逻辑工作的地方。您可以通过 apply()函数或 lambda 函数实现同样的功能;然而,我的其他语言的根使我这样做。我认为使用 apply()和 lambda()函数更有效、更快。所以如果你想使用这些函数,你可以在这里创建你自己的代码。这需要一段时间来完成,所以在新列更新后,我们可以看到清单 16-13 中的数据。

 ('Open Price: ', 70.0)
70
('Open Price: ', 65.0)
65
('Open Price: ', 67.5)
67
('Open Price: ', 65.0)
65
('Open Price: ', 65.0)
65
('Open Price: ', 60.0)
60
rint(df['NextDayOpen'].head())
5910 0
5909 0
5908 60
5907 65
5906 65
Name: NextDayOpen, dtype: int64

Listing 16-13Looking at the New Column Data.

我们看到数据已经在 NextDayOpen 列中更新,并为我们构建回归模型做好了准备。

现在,我们检查收盘价和 NextDayOpen 之间的相关性,看看是否有任何关系来构建我们的模型。

#Now checking if there is any correlation
dfnew=df[['Close','NextDayOpen']]
print(dfnew.head(5))
dfnew.corr()
Out[110]:

Listing 16-14Checking Correlation between columns

In [111]:

表 16-2

NextDayOpen 和 Close 列之间的相关性

|   |

关闭

|

下一天开放

|
| --- | --- | --- |
| 关闭 | one | 0.997021 |
| 下一天开放 | Nine hundred and ninety-seven thousand and twenty-one | 1.000000 |

正如我们所看到的,这支股票的第二天开盘价和收盘价之间肯定有很好的相关性。因此,让我们继续使用清单 16-15 中的线性回归方法构建一个预测模型。

#Now Creating the Prediction model as correlation is very high
#Importing the libraries
from sklearn import cross_validation
from sklearn.utils import shuffle
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score

#Creating the features and target dataframes
price=dfnew['Close']
print(price)
print(dfnew.columns)
features=dfnew[['NextDayOpen']]
#Shuffling the data
price=shuffle(price, random_state=0)
features=shuffle(features,random_state=0)

#Dividing data into Train and Test
X_train, X_test, y_train, y_test= cross_validation.train_test_split(features,price,test_size=0.2, random_state=0)

#Linear Regression on Sensex data

reg= linear_model.LinearRegression()
X_train.shape
reg.fit(X_train, y_train)
regDT.fit(X_train, y_train)
y_pred= reg.predict(X_test)
y_pred= regDT.predict(X_test)

print("Coefficients: ", reg.coef_)

#Mean squared error
print("mean squared error:  ",mean_squared_error(y_test,y_pred))

#Variance score
print("Variance score: ",   r2_score(y_test, y_pred))

#STANDARD DEVIATION
standarddev=price.std()

#Predict based on Opening BSE Sensex Index and Opening Volume
#In the predict function below enter the first parameter Open for BSE and 2nd Volume in Crores
sensexClosePredict=reg.predict([[269.05]])
#175 is the standard deviation of the Diff between Open and Close of sensex so this range

print("Stock Likely to Open at: ",sensexClosePredict , "(+-11)")
print("Stock Open between: ",sensexClosePredict+standarddev , " & " , sensexClosePredict-standarddev)

5910 55.00
5909 60.00
5908 75.00
5907 70.00
5906 72.50
5905 75.00
5904 74.00
5903 75.00
5902 74.00
5901 72.50
5900 72.50
5899 72.50
5898 72.50
5897 72.50
5896 72.50
5895 72.50
5894 67.00
5893 72.50
5892 74.00
5891 75.00
5890 75.00
5889 75.00
5888 75.00
5887 75.00
5886 75.00
5885 75.00
5884 75.00
5883 72.50
5882 75.00
5881 75.00
...
29 262.95
28 264.95
27 264.95
26 262.45
25 280.85
24 279.30
23 280.65
22 283.15
21 283.70
20 279.35
19 271.75
18 277.35
17 263.05
16 260.50
15 264.70
14 264.60
13 258.65
12 257.00
11 252.40
10 247.65
9 247.55
8 252.95
7 269.90
6 267.95
5 270.85
4 270.10
3 268.10
2 275.45
1 276.15
0 274.55

Name: Close, Length: 5911, dtype: float64
Index([u'Close', u'NextDayOpen'], dtype="object")
('Coefficients: ', array([0.98986882]))
('mean squared error: ', 313.02619408516466)
('Variance score: ', 0.994126802384695)
('Stock Likely to Open at: ', array([269.34940985]), '(+-11)')
('Stock Open between: ', array([500.67339591]), ' & ', array([38.02542379]))

Listing 16-15Linear Regression Model Creation and Stock Price Prediction

在第一部分中,像往常一样,我引入了通用的比例和洗牌线性模型、均方误差和 R2 分数。之后,我创建特征和目标数据框架——目标数据框架是包含股票收盘价的价格。features dataframe 包含股票后第二天开盘的栏目。完成之后,我将数据放入价格和功能数据框中,在下一步中,我将数据分成训练和测试数据集。在此之后,我实例化线性回归模型,然后拟合 x 系列和 y 系列,然后使用 predict 方法基于 x 测试进行 Sensex 预测。现在我们有了基于线性回归技术的模型预测,接下来我们可以查看回归系数,我们得到的回归系数为 0.989 ('Coefficients:',array([0.98986882]))。在此之后,我查看均方差,然后查看方差得分,然后查看该数据集的标准差。之所以要看标准差,是因为在股票市场价格数据集中,标准差是用来衡量股票的波动性的。这是一个使用正负标准差范围的注释,标准差应用于我们的模型给出的预测。那么,一旦我们准备好了模型,你如何预测呢?很简单——使用 predict 方法,我输入股票前一天的最后收盘价,然后模型会给出第二天可能出现的开盘情况。请记住,使用这种方法我们不能太确定或准确,因此我们将使用标准差来预测股票可能的波动范围。所以在最后一行,预测股价会在正负标准之间开市就是我们基于这个模型做预测的方法。这就是本案例研究的解决方案。现在让我们进入下一个案例研究。

案例研究 2:发现财务报表欺诈

这本书的最后一个案例研究是基于讨论的案例研究,因此我将讨论这里讨论的问题的可能解决方案。然而,我将敦促您应用我在本书中讨论的技术和过程来开发一个完整的解决方案。这将有助于你为金融领域的实际应用做好准备。这个案例研究是根据几年前我在一个项目中从一个客户那里得到的一个实际问题模拟的。然而,该数据集是虚构的,并非来自任何组织或机构。

在拜访完一个客户后,我正从印多尔飞往孟买,坐在乘客休息室里,突然接到一位老客户 Goriz 先生打来的疯狂电话,他在电话里似乎很不安,他向我解释说,由于他的基金经理错误地选择了一家被称为中盘多袋股但却变成了海龟的公司,他在股市上损失了很多钱。他问我是否有可能通过查看一家公司的财务报表来预测和发现该公司是否是一家欺诈公司。我向他解释这是可能的;然而,这需要更多的详细讨论,不能通过电话进行。因此,我们安排在接下来的一个月里,在戈里兹位于孟买的办公室与他会面。

这次谈话后,我做了一些研究,发现了更多关于这家公司的信息,并注意到直到几个月前,市场上还没有这家公司走向破产的迹象。有一些关于该公司债务增加的坏消息,但除此之外,当该公司倒闭并申请破产时,市场受到了冲击。后来证明,创始人大量挪用资金,这是发生这种情况的主要原因。

戈里兹是一名国际投资者,他依靠自己的基金经理对印度等新兴经济体的公司进行投资。这就是他对这家失败公司的投资所做的。

当我第二次见到他时,戈里兹向我解释说,他在这只所谓的中型多袋股票上损失了近 5900 万美元的个人资金。他问我,是否有可能根据一家公司以前的财务数据来预测该公司是否在进行欺诈活动,这些数据是他们使用机器学习技术为像他这样的投资者提交给交易所的。我向他解释说,在这方面有各种各样的研究工作,有一些博士论文是为了开发这方面的公式而完成的;然而,还没有一个模型投入生产。此外,还有一家像 LexusNexus 这样的公司使用自己的专利技术来检测欺诈。然而,从我自己的消息来源来看,我确信这不是机器学习。戈里兹说,他在非洲和中东等其他经济体有大量投资,并希望我为他开发一个通用模型,帮助他在全球范围内发现此类欺诈公司。

这些要求确实非常明确,我被安排去做一些在使用机器学习之前没有做过的事情。

案例研究的问题

  • 问题 1:

  • 你认为这个案例研究的中心问题是什么?

  • 问题 2:

  • 你认为利用过去的财务报表建立一个机器学习系统来预测一个公司是否要破产是可行的吗?

  • 问题 3:

  • 如果你要建立这个模型,你会用什么方法利用过去的财务报表数据预测破产?

  • 问题 4:

  • 构建这个模型需要什么数据集?

  • 问题 5:

  • 对于构建这个模型,你推荐的基于 Python 的解决方案是什么?

讨论案例研究的解决方案:

现在让我们更详细地讨论这个案例研究的问题。本次讨论的目的是让您深入了解手头的问题以及解决该问题的各种可用选项。请再次记住,这是我认为最好的解决方案;但是,您可能会提出一个更好、更有效的方法来解决这个问题,这完全没问题,因为这就是提出这些案例研究的目的。

答案 1

在这种情况下,投资者根据第三方基金经理的建议投资于一家公司,而第三方基金经理并没有对该公司及其创始人的运作进行太多研究,因此投资者陷入了发起人将资金转移到其他海外业务或账户的行为中。

答案 2

是的,在我看来,根据公司过去的财务报表建立一个模型是非常可能的。有足够的研究可用,如 Johan Perols (2010)在财务报表欺诈检测:统计和机器学习算法的分析。审计实践杂志&理论。另一项有助于解释这一点的研究是由 R. Meenatkshi 和 K. Sivaranjani 在使用数据挖掘技术对财务报表中的欺诈检测进行的比较研究,摘自 https://www.ijcsmc.com/docs/papers/July2016/V5I7201659.pdf

这项研究足以开始建立一个机器学习系统来检测财务报表欺诈。

问题 3

我的方法,就像建立任何预测模型一样,将从查看数据源获取财务报表开始。网上有许多这样的资源;然而,如果在选择数据来源时没有处理好,像侵犯版权这样的问题可能会悄悄出现。Quandl.com 上有付费服务,是收费的高级服务,但它们承诺更好的准确性。因此,必须做出决定,是从 Quandl.com 这样的来源购买公司数据,还是通过网络搜集免费获取,这可能需要仔细评估是否存在侵犯版权的情况。

一旦使用适合项目的任何来源获得数据,我们就进入数据清理阶段,寻找数据的准确性和可能存在的任何缺失值。高级付费服务最有可能拥有干净的数据,不需要太多的操作,如丢失值处理等。

之后,我们需要为我们的预测模型选择特征和目标变量。在我们的例子中,我们需要一个字段来告诉机器一个财务报表行是否是欺诈——类似于 1 表示欺诈,0 表示没有欺诈。一旦我们有了这种监督学习数据,我们就可以将它分成训练和测试数据集,并使用分类器算法来建立预测模型。由于我们的目标变量分别是欺诈或无欺诈的 1 或 0,这种情况使得使用分类器算法更容易,如朴素贝叶斯、逻辑回归或决策树分类器等。

问题 4

我需要一个样本数据集,例如表 16-3 中给定的像 Balmer Lawrie 有限公司这样的公司的数据集。

表 16-3

公司资产负债表样本

|

巴尔莫·劳里公司的资产负债表

|

-卢比。Cr。-

|   |   |   |   |
| --- | --- | --- | --- | --- | --- |
|   | 3 月 18 日 | 3 月 17 日 | 3 月 16 日 | 3 月 15 日 | 3 月 14 日 |
|   | 12 mths | 12 mths | 12 mths | 12 mths | 12 mths |
| 股票和负债 |   |   |   |   |
| 股东资金 |   |   |   |   |
| 权益股本 | One hundred and fourteen | One hundred and fourteen | Twenty-eight point five | Twenty-eight point five | Twenty-eight point five |
| 总股本 | One hundred and fourteen | One hundred and fourteen | Twenty-eight point five | Twenty-eight point five | Twenty-eight point five |
| 准备金和盈余 | One thousand one hundred and forty-one point eight six | One thousand and fifty-one point nine nine | One thousand and thirty-six point four four | Eight hundred and seventy-four point five six | Seven hundred and ninety-one point one four |
| 总准备金和盈余 | One thousand one hundred and forty-one point eight six | One thousand and fifty-one point nine nine | One thousand and thirty-six point four four | Eight hundred and seventy-four point five six | Seven hundred and ninety-one point one four |
| 股东资金合计 | One thousand two hundred and fifty-five point eight six | One thousand one hundred and sixty-five point nine nine | One thousand and sixty-four point nine four | Nine hundred and three point zero six | Eight hundred and nineteen point six four |
| 非流动负债 |   |   |   |   |
| 长期借款 | Eleven point one six | Zero | Zero | Zero | Zero |
| 递延税款负债[净额] | Eight point one nine | Zero | Zero | Zero | Zero |
| 其他长期负债 | Zero point five seven | Zero point two six | Zero point two seven | Forty-one point nine one | Thirty-four point one eight |
| 长期准备金 | Thirty-seven point seven seven | Fifty-five point seven nine | Sixty-five point four two | Zero point zero one | Zero point zero four |
| 非流动负债总额 | Fifty-seven point six nine | Fifty-six point zero five | Sixty-five point six nine | Forty-one point nine two | Thirty-four point two two |
| 流动负债 |   |   |   |   |
| 短期借款 | Three point seven four | Zero | Zero | Zero | Zero |
| 贸易应付款 | Three hundred and twenty-two point seven nine | Three hundred and seven point one two | Two hundred and twenty-four point two nine | Two hundred and seventeen point seven one | Two hundred and sixty-four point five seven |
| 其他流动负债 | Two hundred and six point seven two | Two hundred and forty-four point four six | Two hundred and thirty point zero six | One hundred and seventy-four point six | Two hundred and one point nine |
| 短期准备金 | Five point zero four | Nineteen point nine one | Seven point nine three | One hundred and twelve point two seven | One hundred and eighteen point zero five |
| 流动负债总额 | Five hundred and thirty-eight point three | Five hundred and seventy-one point four eight | Four hundred and sixty-two point two eight | Five hundred and four point five eight | Five hundred and eighty-four point five three |
| 资本和负债总额 | One thousand eight hundred and fifty-one point eight five | One thousand seven hundred and ninety-three point five two | One thousand five hundred and ninety-two point nine one | One thousand four hundred and forty-nine point five six | One thousand four hundred and thirty-eight point four |
| 资产 |   |   |   |   |
| 非流动资产 |   |   |   |   |
| 有形资产 | Three hundred and ninety-four point eight | Three hundred and eighty-two point six seven | Three hundred and seventy-nine point one six | Three hundred and ninety-three point one seven | Two hundred and seventy-three point two eight |
| 无形资产 | Five point two seven | Thirteen point one nine | Fourteen point one | Thirteen point six seven | Seventeen point zero one |
| 资本在建工程 | Thirteen point two five | Twenty-three point three one | Seven point two six | Four point three | Seventy-three point seven nine |
| 开发中的无形资产 | Zero | Zero | Zero | Zero point one seven | Zero |
| 其他资产 | One point one four | Zero point six two | Zero point nine five | Zero | Zero |
| 固定资产 | Four hundred and fourteen point four five | Four hundred and nineteen point seven nine | Four hundred and one point four seven | Four hundred and eleven point three two | Three hundred and sixty-four point zero nine |
| 非流动投资 | One hundred and thirty-eight point four one | Eighty-seven point three eight | Fifty-seven point five | Fifty-seven point four | Fifty-seven point three nine |
| 递延税款资产[净额] | Zero | Eight point zero two | Four point nine six | One point seven one | Four point three five |
| 长期贷款和预付款 | Four point two eight | Four point eight five | Five point zero seven | Fifteen point zero nine | Fourteen point two seven |
| 其他非流动资产 | Forty point three five | Forty-two point one six | Thirty-nine point five two | Zero | Zero |
| 非流动资产总额 | Five hundred and ninety-seven point four nine | Five hundred and sixty-two point two | Five hundred and eight point five two | Four hundred and eighty-five point five three | Four hundred and forty point one |
| 流动资产 |   |   |   |   |
| 存货 | One hundred and thirty-six point six three | One hundred and fifty-one point seven | One hundred and nineteen point seven six | One hundred and thirty point one | One hundred and forty-one point seven two |
| 交易应收帐 | Two hundred and seventy-one point two seven | Two hundred and eighty-one point six one | Two hundred and thirty point three three | Three hundred and sixty-five point one three | Four hundred and ten point six nine |
| 现金和现金等价物 | Four hundred and eighty point six seven | Five hundred and eight point six five | Four hundred and forty-three point seven | Three hundred and sixty-one point two nine | Three hundred and forty-six point eight six |
| 短期贷款和预付款 | Twenty-four point six seven | Four point three nine | Eight point five one | Eighty-four point three eight | Seventy-five point one |
| 其他流动资产 | Three hundred and forty-one point one one | Two hundred and eighty-four point nine seven | Two hundred and eighty-two point zero nine | Twenty-three point one three | Twenty-three point nine two |
| 流动资产总额 | One thousand two hundred and fifty-four point three six | One thousand two hundred and thirty-one point three two | One thousand and eighty-four point three nine | Nine hundred and sixty-four point zero three | Nine hundred and ninety-eight point two nine |
| 总资产 | One thousand eight hundred and fifty-one point eight five | One thousand seven hundred and ninety-three point five two | One thousand five hundred and ninety-two point nine one | One thousand four hundred and forty-nine point five six | One thousand four hundred and thirty-eight point four |
| 其他附加信息 |   |   |   |   |
| 或有负债、承付款 |   |   |   |   |
| 或有债务 | Two hundred and eleven point zero six | Two hundred and thirteen point one five | Fifty-four point four five | Two hundred and fourteen point three two | Three hundred and twenty-six point seven four |
| 进口到岸价格 |   |   |   |   |
| 原材料 | Sixteen point five one | Fourteen point two seven | Thirty-six point eight two | Eighty-four point six four | Forty-two point eight three |
| 库存、备件和松散工具 | One point three six | One point two three | One point five two | Zero point two five | Zero point one eight |
| 贸易/其他商品 | Zero point seven five | Zero | Zero | Zero | Zero |
| 资本货物 | One point two four | Zero point one nine | Zero point one two | Zero point one one | Forty-two point three three |
| 外汇支出 |   |   |   |   |
| 外币支出 | One hundred and seventy-two point two nine | One hundred and seventy-three point four five | One hundred and seventy-two point six four | One hundred and seventy-eight point two five | One hundred and six point six nine |
| 股息外汇汇款 |   |   |   |   |
| 外币股息汇款 | - | - | - | - | - |
| 外汇收入 |   |   |   |   |
| 货物的离岸价 | Nineteen point two seven | Eleven point two | One hundred and four point six four | Thirteen point five | Fifteen |
| 其他收入 | Eighty-one point five six | Eighty-four point nine two | - | One hundred and twelve point two four | Twenty-three point seven eight |
| 奖金详情 |   |   |   |   |
| 红利股本 | One hundred and four point four nine | One hundred and four point four nine | Eighteen point nine nine | Eighteen point nine nine | Eighteen point nine nine |
| 非流动投资 |   |   |   |   |
| 非流动投资报价市值 | - | - | - | Zero | Zero |
| 非流动投资未上市账面价值 | One hundred and thirty-eight point four one | Eighty-seven point three eight | Fifty-seven point four | Fifty-seven point four | Fifty-seven point three nine |
| 当前投资 |   |   |   |   |
| 当前投资报价市值 | - | - | - | - | - |
| 当前投资的未上市账面价值 | - | - | - | - | - |

来源:MoneyControl.comhttps://www.moneycontrol.com/financials/balmerlawriecompany/balance-sheetVI/BLC#BLC

问题 5

我将让读者来构建基于 Python 的模型。然而,鉴于我已经与你分享了将有助于你获得检测欺诈所需公式的研究论文,你应该不难创建一个。我还与你分享了一个财务报表的样本格式,你将需要建立这样一个数据集。

我以此结束本书的最后一个案例研究。我希望你喜欢它,就像我喜欢与你分享客户在金融领域的业务中面临的一些实际问题一样。

尾注

再见了,约翰。"财务报表欺诈检测:统计和机器学习算法分析."审计实务杂志&理论。2010;30:2.

Meenatkshi R .和 Sivaranjani K. 《利用数据挖掘技术进行财务报表舞弊检测的比较研究,摘自 https://www.ijcsmc.com/docs/papers/July2016/V5I7201659.pdf

十七、金融领域机器学习要避免的陷阱

这一章是关于一个组织在金融领域使用机器学习技术时可能遇到的陷阱。在整个财务部分,我们已经了解了该部门面临的一些挑战;然而,在这一章中,我们将探讨任何想要为其财务运营实现机器学习的组织都可以避免的两个陷阱。这两个陷阱对这个部门来说是非常重要的,我调查的金融专家也含糊其辞地确定这些陷阱是一个组织为了成功应该避免的主要陷阱。这两个陷阱是:

  • 监管陷阱

  • 数据隐私陷阱

现在让我们详细看看这些陷阱如何影响金融领域中任何新技术的实现,以及我们可以避免它们的一些方法。

监管陷阱

与医疗保健和零售不同,金融业是经济的支柱,也是整个经济运行的润滑剂。医疗保健、零售和能源等其他部门的运营都依赖于金融部门。由于这一部门无所不包,没有它就不可能有任何商业或个人交易,因此它必须拥有政府所能提供的最大限度的监管。

一系列法律和行政手段影响外汇融资(以及更广泛的货币相关管理):主要的基本方向(或大规模审慎控制),包括一系列措施,旨在区分和减轻对货币和金融框架整体稳定性的威胁;审慎控制(或小规模审慎指导)包括担心单个货币相关组织可靠性的措施;以及涵盖与货币有关的管理控制的其他部分的非审慎控制。

例如,巴塞尔委员会制定的关于保持货币监管的巴塞尔协议 III 是一个基本或宏观审慎方向的案例,以金融框架的稳定性为首要目标。尽管它在很大程度上是一部“微妙的法律”,但《巴塞尔协议 III》对全球金融方向产生了巨大影响。此外,它在全球后台承担了一项重要工作。然而,从各方面来看,它并不是唯一的载体。

例如,欧元区金融部门正面临着来自各方面的挑战,包括新的创新、新的市场参与者以及政府的新指导方针。鉴于这些困难会引发竞争和发展,它们是合理的。它们是运转良好的商业部门经济运转的手段。

更加严厉地反对逃税和反洗钱政府更加严厉地反对逃税和反制造恐慌的金融控制措施扩大的审慎欺诈检测和反洗钱法规正在建立直接的控制措施;以及对金融管理机构的升级要求条件,包括通过金融和外汇制裁,改变了在与货币有关的管理机构安排中由政府主导的调解局面。管理账户系统的报告人的变化不仅影响交易所的融资流,而且还影响“交易所的运营管理”,或围绕结算、分期付款和积累的整个管理结构。任何新技术的引入都需要通过这些新的规则、条例和法律的审查,这些规则、条例和法律是快速立法的结果。

首先,我们需要有创意的新方法,包括利用创新来改变外汇基金的投资。非银行融资安排,以及推动无纸化交易、推进在线交易报告管理和推进不同进展(例如,适当的记录创新)的模式,可以改变换回业务的领导方式,同时限制 CBR 撤销的影响。现在,在利用传统的银行中介回购工具方面,正逐步转向组织间模式和生产网络资金。

此外,随着各机构对其交易同谋者越来越放心,它们对风险支持的需求可能会减少,它们对外汇基金工具的利用可能会变得更加特别。数字化的方法同样容易促使市场做出新的选择,并促使银行中介基金以更精明、更直接的方式运作。与传统银行融资相比,非银行货币管理机构同样可以提供选择,使中小企业和不同合作伙伴更少需要去真正必要的货币管理机构,并加入第四次工业革命。

应该注意的是,在任何国家,无论是美国、欧洲、亚洲还是任何其他地区,都应该有可能在国家层面上加强附近(受访)银行的管理和适当稳定性限制,包括其识别、筛选、缓解和抵消与金钱有关的不法行为的能力,以及以经济高效的方式遵循新的审慎方向。对于一个新的科技创业公司来说,这是极其重要的。

在欧盟,监管框架由 MiFID 2004/39/EC 指令组成,该指令为证券提供了一个绑定在一起的系统:它包括投机公司、多边交易所(MTF)、受控市场(即交易)和预算工具(可转让证券、现金展示工具、合计投机单位和子公司,不包括债券和证券化债券)。

该命令被间接称为“1 级”,因为它的选择方法是由欧盟议会和理事会共同制定的标准。应该是换位了。它由包含执行措施的“二级”文件补充。这些著作已被不包括欧盟议会在内的部分国家所接受:应被移植的第 2006/73/EC 号指令,以及适用于未被移植的部分国家的第 1287/2006 号委员会指令。

与美国相关的是,MiFID 赋予受控交易的规则制定权受到更多限制,这些权力集中于安排更合理、更有条理的交易,确认交易的预算工具,以及进入受控交易(MiFID 指令第 39、40 和 42 条)。EU-管理的交易没有任何力量来控制作为其成员的投机公司的行为,无论是在面向客户的领域(如最佳执行、信息或投机指导)还是面向市场的领域(如交易外执行的订单的直接性)。定向交易甚至对其担保人也有限制权力,这些担保人通过向他们的主管记录他们的计划,得到了在定向市场上进行交易的乏味想法。

美国证券方向和监督分为三个独特的层次,在下一节描述。

政府法律和一个行政管理者,证券交易委员会(SEC)

证券交易委员会(SEC)负责确保金融专家和维持证券市场的可信度。一些政府法令直接管理证券,真实的模式是将控制权从州转移到联邦一级。美国证券交易委员会可以发布解释国会通过的证券法的规则(例如,选择性交易框架的注册 ATS,价值市场的注册 NMS)。此外,SEC 审核自律组织(sro)提出的任何原则,并对这些规则是否符合 1934 年的证券交易法拥有最终决定权。无论如何,证交会的监督是有限制的:证交会不指导基本的政府证券广告(因为政府证券、国库和强化监督免除了证券登记),但它不在辅助市场这样做;它并不控制产品命运和替代品(商品命运交换委员会监督),它只是限制了对场外次级市场的监督。公民债券由证券交易委员会监督下的自律组织管理。此外,证券交易委员会不控制商业银行发行证券(管理账户控制者的监督);商业银行可以以证券商和商人的身份开展业务,而不必根据《金融服务法案》(GLBAct)允许的限制除外条款向 SEC 登记。

州法律和控制器

在美国,各州登记并指导未在证券交易委员会登记的代理商和投机向导,包括监管少于 2500 万美元的风险向导。它们被证券交易委员会的规则(贸易法第 15(h)节)扣押,并且必须依赖于这些规则。他们倾向于围绕打击他们边缘的虚假陈述,他们跟踪投诉。州法律当局可以寻求刑事起诉,而美国证券交易委员会被限制在普通和监管活动,并暗示刑事事项的公平部门。因此,单一国家经常与 SEC 和自律组织合作,控制国家边缘的证券业。

自律组织

自律组织(sro)为其个人设定标准并管理商业贷款。他们的原则补充了证券交易委员会的原则和政府法律,尽管事实上他们可能有独特的细节和强调。自律组织采用的任何法律都必须经过审查,在某些情况下,还必须得到证交会的批准,证交会对这些法律拥有极大的权威。自律组织的先例包括全国性交易(如纽约证券交易所、芝加哥大气交易、纳斯达克股票市场)和全国性证券附属机构(目前的一个,货币行业管理专家 FINRA 于 2007 年成立,是全国证券商关系[NASD]与纽约证券交易所的控制、执行和酌情处理要素合并的结果)。对于城市证券,一个被称为大都会证券规则制定委员会的特殊 SRO 负责采纳投机者安全规则,并监督担保、交换和提供费用除外证券、学校储备基金、设计和不同种类的民事证券的代表性商人和银行。

查看世界上两个最主要的经济体欧盟和美国的一些法规的目的,并不是为了让你对机器学习的实现感到害怕或困惑。它的目的是让你意识到金融法规是非常复杂和详细的,在这个领域做任何事情都需要对这些规则和法规有适当的了解。

最近出现了一种不受监管的货币,这种货币被称为加密货币。这些货币是美国和欧盟等国家以及许多其他国家的法定货币。然而,它们在印度、玻利维亚等国家仍然被禁止。允许使用这些不受监管的货币的技术是区块链,其工作原理是对货币交易进行认证的点对点网络。如果你希望实现加密货币的机器学习,那么你需要了解该国是否全面禁止或仅用于银行目的的法规。更多更新信息请访问本网站:[1; https://en.wikipedia.org/wiki/Legality_of_bitcoin_by_country_or_territory 。然而,在未来几年,人们对加密货币的态度将会发生变化,届时流行的信念会让人们有信心在这些系统中进行交易。

数据隐私陷阱

现在让我们进入下一个陷阱——数据隐私。数据隐私法是由欧盟首创的。该法规被称为 GDPR(全球数据隐私法规)法案。

数据隐私,按计划和理所当然地,意味着处理个人信息的业务程序必须概述,并记住标准和屏蔽,以确保信息得到保护(例如,在适当的情况下使用假名或完全匿名)。当然,企业应该利用最令人震惊的可想象的保护设置,因此在没有明确、有根据的同意的情况下,信息是不能公开访问的,并且在没有独立获得额外数据的情况下,不能用于区分主题。不得准备任何个人信息,除非是在指示所指的合法前提下进行,或者除非信息控制者或处理者已从信息主体处获得明确和个性化的同意证明。信息主体有权在任何时候拒绝这种同意。

美国用户的信息安全受国家和州级法律的控制。美国没有单一的主要信息安全法规。政府法令对于特定的部门来说基本上消失了,正如下面更完整地描述的那样,而州法令更集中于确保个体购物者的安全特权。安全特权是一项基于先例的权利,已被纳入许多州的州宪法以及州和联邦两级的法律。保护信息和购买者的法律依赖于这样一条规则,即一个人有安全的愿望,除非这种愿望已经被法令或启示减少或免除。美国的信息安全和安全法规旨在确保生活在美国或其某个州的人们的隐私。从各方面考虑,政府法律适用于确保居住者受到保护。州法律旨在保护其居民。

到目前为止,我们已经了解了世界各地的金融法规和数据隐私法。现在让我们来看看机器学习的一些应用,这些应用需要在这些服务推出之前遵守这些法律。

使用面部识别向走进银行的客户提供金融产品是高尚的;然而,它提出了伦理问题——主要是相同的技术可以被用来监视人。例如,是否允许一个组织在走进其场所的人不知情的情况下捕获面部数据并对其进行分析以获得优势?组织内部谁确保为客户收集的数据不会用于收集数据之外的任何其他目的?作为一个组织,你将如何确保你的应用程序没有针对此类优惠的种族歧视?从长远来看,所有这些都需要清晰,这样的应用程序才能成功。

作为一个组织,您创建了一个应用程序,该应用程序根据机器学习对买卖货币的最佳时间的预测来进行加密货币交易。作为支付系统的看门人,您将如何确保通过您的系统进行的支付不会被用于洗钱?您如何确保没有恐怖活动资金通过您的系统发生?如果您不能肯定地回答这些问题,那么您很可能会遇到我们之前讨论过的法规,并且很可能会因为不遵守法律而被搁置。

你设计了一个应用程序,使用人们的社交媒体账户来创建财务档案。这款应用程序可以获取社交媒体更新,并扫描它们以寻找任何金融交易的线索,如付款、购物、从银行贷款、使用小额信贷设施等。你如何确保用户的个人资料将被用于道德目的而不是不道德的目的?你可能会争辩说这是公共数据,但根据法律,如果你知道某人进行了金融交易,你就不能勒索或威胁他。这是不道德和非法的。你如何确保你的应用程序收集的数据不会像黑客一样落入坏人之手?

您的移动应用程序使用视网膜虹膜扫描来验证金融交易。如果客户丢失了手机,您将如何确保存储在应用程序中的客户生物特征数据不会落入他人之手?。

您的金融应用程序根据客户档案提供保险、信用卡和贷款等金融服务产品,并使用机器学习进行分析,以预测客户现在需要哪种服务。但是,您存储的这些客户信息会通过各种保险公司的服务器、信用卡公司的网络和贷款处理公司的数据库。您将如何确保遵守数据隐私法,并确保参与此交易的所有各方都为数据违规承担责任?

您有一个小额信贷应用程序,它向几个国家的用户发放小额贷款。在某个特定的国家,数据被黑客窃取并泄露到了暗网上。你知道为了遵守数据隐私和保护法你需要做什么吗?您是通知该国发生违规的所有人,还是通知所有使用该系统的人?当您构建、创建和运行这样一个服务时,您需要准备处理这些问题。

你的应用程序将个人的财务资料存储在一个中央数据库中。该配置文件对用户不可见。您的应用程序中也没有访问它的规定。但是,客户要求查看您围绕他们建立的财务档案。您的应用程序是否符合数据保护和隐私法?GDPR 禁止此类应用及其使用,并对此类恶意使用实现严厉制裁和罚款。在构建这样的应用程序时,你需要意识到所有这些。你还需要告知用户你对他们的财务状况做了什么,比如你使用机器学习算法来预测他们未来的财务需求。为了遵守数据隐私和保护法,您需要让您的用户知道这一点。

您的财务应用程序存储股票市场交易数据,并使用它通过机器学习算法来分析下一个最佳举措,并为客户推荐股票。您的客户明天决定分道扬镳,不再与您和您的应用程序做生意。换句话说,他们想终止你的服务。在这种情况下,在终止服务时,您会让他们选择删除他们的数据还是将数据保留在您这里?如果您不给他们这个选项,您可能会面临不遵守数据隐私和保护法的风险。

这些是我向您展示的一些场景,以便您可以了解金融技术实现的世界有多复杂,因为世界上几乎所有国家都有各种各样的法律法规。

就这样,我们到了这一章的结尾。我很喜欢展示这些案例研究和应用程序,这些案例研究和应用程序是我多年来从与各种顾客和客户的互动中收集的,我注意不要透露真实世界的数据,但在每个案例中提供的虚构数据中保持商业精神的活力。如果你能够应用至少一种机器学习的应用并从中获益,这本书就达到了它的目的。我敦促您在应用程序的基础上,使用您自己的专业知识来扩展业务利益相关者所需的技术的实现。

尾注

  1. 比特币按领土的合法性,en . Wikipedia . org/wiki/合法性 _ of _ 比特币 _by_country_or_territory

十八、金融机器学习货币化

在这一章中,我将提出一些创新的想法,这些想法可以在金融世界中使用机器学习来货币化。我还将向您展示一些使用类似方法并取得成功的例子。对他们中的一些人来说,现在可能没有榜样,因为他们更有远见。

货币化的三个领域如下:

  • 关联银行

  • 飞入金融市场

  • 金融资产交易所

在某种程度上,正如我将进一步解释的那样,互联零售店和互联仓库的概念是相互联系的。但是,我们将分别研究它们,以便更详细地理解它们,然后看看它们如何协同工作。

关联银行

为了让我们理解我所说的互联银行的含义,就像我们对互联零售店所做的那样,让我们首先理解什么是互联银行。

  • 互联银行不仅仅是将数字功能扩展到您现有的实体银行。

  • 互联银行网络不仅仅是让客户使用银行的数字产品技术。

  • 互联银行网络不仅仅拥有客户的数字档案。

  • 互联银行网络不仅仅是对现有银行客户数据使用机器学习,并向他们提供银行的产品。

在了解了什么是联网银行网络之后,现在让我们看看什么是联网银行网络,以及我们是否有任何可以效仿或学习的例子。让我们看一下图 18-1 中的图表,该图显示了任何国家当前连接的银行网络。

img/464968_1_En_18_Fig1_HTML.jpg

图 18-1

当前连接的银行网络图

在当前互联银行的示例图中,我们看到每个客户都通过数字网络或实体网络与银行相连。这里要注意的关键点是,银行 A、银行 B、银行 C、银行 D 和银行 E 与它们的客户紧密相连,进行交易,如信用卡、储蓄、银行账户、贷款、保险和其他支付。但是,这些银行无法访问另一家银行的客户数据。例如,如果 E 银行有一个客户,该银行客户想在 A 银行开户,那么该客户也必须向新银行提供所有信息、文件和其他此类了解客户的要求。这对每个银行来说都是一项开销,因为它们必须独立地验证和存储客户信息。这些银行彼此不交谈,因此它们不知道关于客户的历史信息或其他银行网络。例如,银行 D 的客户可能拥有信用卡账户,而他们可能拥有银行 B 的贷款账户。银行 B 将无法访问客户的历史付款信息,这些信息存储在银行 D 的网络中。本质上,银行是在暗中与客户打交道,不知道他们的金融历史。例如,如果一个人经常拖欠 D 银行的信用卡,那么 B 银行的贷款人可以将此人标记为屡次违约者,并采取纠正措施。在当前网络中不可能这样做。银行网络各自为政,基本上互不交流。你可能会说,有信用分析机构提供一个人的信用档案——然而,这不仅仅是关于信用分析,还包括获得数据,从而洞察一个人的储蓄习惯或购买周期等。通过拥有这样的文件加载网络,银行失去了关键信息,这些信息可以通过预测客户的需求(如贷款、保险等)来帮助他们更好地与客户互动。

这就是为什么该银行当前的数字网络不足以满足其客户的所有需求,也不足以服务他们。通过创建一个互联的银行网络,他们可以共享有关个人银行和公司银行客户的信息,并应用数据挖掘找出客户的任何隐藏模式,等待客户信贷等。

让我们在图 18-2 中看看我们连接的银行网络将如何工作。在这个例子中,我们看到,银行业务对客户来说是一样的,每个客户都与他们自己的银行有联系,以满足他们自己的金融需求;然而,现在每个银行都有另一个中央客户档案数据库,该中央客户档案数据库允许银行在获得客户许可后访问客户的档案。让我们看看在这个超连接环境中交易将如何发生。

img/464968_1_En_18_Fig2_HTML.jpg

图 18-2

真正连接的银行网络

让我们看一下 C 银行的一位客户,他在过去 15 年里一直是这家银行的住房贷款客户。然而,客户从银行 A 得到了一份关于续保保单的要约,其中银行 A 基于其客户简档数据库向该客户提供了更好的要约,在该数据库中,银行 A 可以看到该客户在另一家银行有一份保单。虽然银行之间存在竞争,但客户也获得了更好的优惠,如果他们喜欢新的优惠,他们可以将产品从一家银行转移到另一家银行。这种独特的场景只有在我们拥有这种超连接客户档案数据库的情况下才会发生,这种数据库由一个机构集中控制,比如一个国家的中央银行。它不仅可以有个人客户,也可以有在其他银行有大额金融贷款和商业账户的公司客户。在这种超关联场景中,对于将要向另一个公司客户提供贷款的潜在银行来说,该公司客户的财务历史不再是秘密。通过创建这个集中控制的数据库,不仅可以访问支付历史,还可以访问所有的金融交易,包括贷款偿还信贷服务等。尽管银行因分享竞争力方面的信息而遭受损失,但这对于在整个银行体系中引入透明度大有裨益。金融交易的透明度给银行家带来了巨大的好处,让他们能够分辨出哪些是好客户,哪些是坏客户。在这个超连接的世界中,客户通过跨银行共享数据而受益,因为他们不必一次又一次地提供相同的数据或不同的数据,然后在超连接的银行网络中获得集中的身份。实现这种超互联银行业务的最大挑战涉及数据隐私,在这种情况下,个人客户的财务资料在不同的网络上共享。在实现这种系统之前,客户同意分享他们的个人或公司财务状况是绝对必要的。这种集中式系统的安全性也非常重要。

在实现这种超连接系统时可能面临的另一个障碍是建立个人或公司的身份。发行唯一的身份号码或使用现有的身份文件,如社会安全号码、国民身份证号码或税务身份证号码,对于在国与国之间实现它来说肯定是一个挑战。这当然是一个不小的挑战,因为没有多少国家为其公民和公司提供国家身份证号码。然而,在美国或印度这样的国家,这应该不会成为大问题,因为个人和企业的国家身份已经确立。

飞入金融市场

这也是一个未来主义的创新理念;然而,金融业应该现在就开始准备,以便利用最近发生的技术发展。在这个创新的用例中,银行的主要格言变成了“来找你!”这个用例类似于飞进零售店;然而,飞入银行的功能是完全不同的。银行飞向客户,因为客户面临严重的交通堵塞和日程工作超负荷,因此没有时间去银行。从在偏远地区分发现金到使用无人机将信用卡或借记卡等金融产品送到客户家门口,再到为亚马逊的客户提供保险损失索赔服务,这一创新充满了希望。在这些远程操作中,替换人类是不可避免的。

可以通过使用社交媒体平台来调查生活在特定社区或地区的个人的需求并获取反馈,从而独立启动飞入式金融服务市场。从地理上来说,这种标记调查,然后创建基于社区的金融,然后创建正确的报价给两户人,人们事先购买 UV 的广告,并让他们知道他们所在地区的金融服务活动,这在未来将非常普遍。银行家们越来越倾向于通过这种方式接触那些已经忙于生活的客户。所以银行决定来找你,根据你的需求为你提供金融产品和服务。像这样一个由人类或信息技术建立的飞行银行的安全性是这个国家和他们计划瞄准的社区需要回答的问题。图 18-3 描绘了这样一个场景。

img/464968_1_En_18_Fig3_HTML.jpg

图 18-3

飞入金融市场

在图 18-3 中,我们可以看到城市中有四个假想的地点,在将金融市场放入社区位置之前,金融市场会在一个地点上空盘旋。让金融机构参与组织这种活动对于组织这种活动的公司来说是昂贵的事情,因此他们希望有来自各种金融公司如银行和其他金融机构的赞助商,这些赞助商希望向潜在的客户销售他们的产品并与特定的社区或地方交谈。这种线下金融市场的地域划分和地理分布将随着服务的推出而不断发展。组织此类活动的公司最终将瞄准表现更好的社区,而不是那些在金融服务销售方面表现不佳的社区。金融机构将能够拥有自己的飞行自主车辆,这些车辆将具有机器学习能力,通过为用户服务并在组织此类活动之前测量他们的名字来产生此类活动。从组织活动到了解客户需求,再到创造合适的产品,整个过程将完全自动化。在某些领域可能需要人工干预,这就是机器学习模型将从人类那里获取输入,以便微调向其潜在客户提供的最终产品。

金融资产交易所

这是一个我觉得时机已经到来的概念。为了充分理解这一点,我们需要了解基于金融资产的交易在当今时代是如何发生的。一项资产[1; https://fbs.com/glossary/financial-asset-29 】通常是对个人有价值的东西。与金钱相关的资源是难以捉摸的流动资源,例如,银行商店、证券和股票,其费用是从它们所涉及的具有法律约束力的案件中获得的,与财产或项目相反,它们不是与记录纸张分离的明确无误的物理资源。

正常的货币相关资源包括认证、证券、股票和银行存储。

存储遗嘱(CD)是金融专家和银行之间的一种协议,其中投机者同意在银行保留一定数量的现金,以换取有保证的贷款成本。银行可能会提供更高的保费分期付款,因为现金将在一段时间内保持完美。投机者在协议期限结束前收回 CD 的可能性极小,他或她将错过阴谋分期付款,并可能受到货币处罚。

另一种众所周知的货币资源是证券,通常由组织或政府出售,记住最终目标是使储备能够在此时此地扩展。证券是一个权威的档案,说明金融专家借给借款人多少现金,何时应该偿还(除了溢价)以及债券的开发日期。

股票是一种主要的与金钱相关的资源,没有固定的到期日。将资源投入股票为贡献者提供了对组织的责任,并提供了组织的利益和不幸。股票可以保留任意一段时间,直到投资者选择把它卖给另一个金融专家。尽管财务记录和银行账户暗示了流动资源,但它们的利润率更受限制。与此同时,大额存单和货币展示账户在相当长的时间或几年内限制提款。当融资成本下降时,可赎回 CDs 就会被频繁赎回,投机者就会面临转移资金以压低工资的风险。

将你的部分现金分散到各种风险投资中可能会获利,因为其中一些风险投资没有合适的资产。每种资产都有其潜在的回报和风险。

金融资产的当前环境在很大程度上是无形的,并且它们没有物理存在,例如证明某人对该类型资产的所有权的文件。这种金融资产分类存在缺陷,我们现在来看看其中的一些。

表 18-1

资产类别的分类

|

资产类

|

类型

|
| --- | --- |
| 无形的 | 股票、债券、存款、货币。版权、专利 |
| 有形的 | 土地、房屋、车辆、建筑、高端手机、高端电子设备、机器人、无人机、机械。 |

在表 18-1 中,我们可以看到无形和有形两种类型。有形资产是我们作为人类可以触摸和感受到的资产。可变类型的资产是那些不能用感官触摸或感觉的资产。这是一个简单的分类,很容易理解。对于拥有股票和债券、存款或加密货币等资产的人来说,不存在单一的资产交易所,他们不仅可以在无形资产之间进行交易,还可以与有形资产进行交易。

让我们看一个例子,它将清楚地表明我想说的关于我们正在谈论的资产交换的内容。假设一个人持有一项专利,他们想把它转换成现金。这样一个他们可以出售专利并获得现金回报的机构并不存在。同样,也没有这样的交易所,人们可以去提供他们的现金存款,并通过从拥有版权的特定人那里购买版权来进行转换。让我们来看第二类有形资产,我们看到一个人在使用一部高端手机,他们想用手机兑换一部电子设备作为回报。资产类别从移动电话、无人机或机器等设备发生变化,客户希望将其换成土地或房屋。这种类型的资产交换是非常创新的,肯定是世界上任何地方都不存在的。

甚至在今天,也不存在购买和销售无形资产中的发动机。这里的概念是消除金融资产在无形和有形价值方面的差异,我将给你一个例子,其中可以使用区块链技术和机器学习来建立这样的交易所,以评估属于任何资产类别的资产的当前市场价格。让我们看一个例子。如果保罗价值 200 万美元,并想在某个特定的城市买一栋房子,那么在当前的情况下,他需要首先在股票交易所出售股票,然后通过去那个特定的城市寻找房子来购买房子。然而,在最好的新的创新金融资产交换系统发挥作用的情况下,想要购买房子的人直接去金融资产交易所,并提供在城市内特定地点或社区的房子。就金融交易而言,这样的资产交换将使人们的生活变得极其快捷。同样,一个拥有机器或机器人的人可以用他们的东西来交换物品或现金存款。我将称这种金融服务体系为资产交易所的诞生。

虽然金融资产交易所看起来操作非常简单,但它们是任何国家金融监管中最大的障碍或路障。没有时间去各个市场买卖产品的消费者有一种强烈的需求,他们希望有一个简单的资产交易平台,为他们处理所有这些转换。金融监管机构需要理解这个名称,并出台严格的监管措施,在洗钱和欺诈交易利用这种通用资产交易所发生时,对其进行检查。

为每个有形和无形资产建立市场价值的能力需要输入到机器学习系统中的消息数据集,然后该机器学习系统将使用预测模型来预测与现在相比资产价值的未来增长。这将有助于决策者或购买者通过查看其内在价值、当前提供的市场价值和该金融资产的预测市场价值来避免不适当的决策。这种交易的独特销售主张将是使用机器学习来预测这种有形和无形资产的未来价格。因此,我们已经看到了最后一个创新的概念,它提供了改变金融资产在未来被评估、购买和出售的方式。首先,公司可以在易于交换的无形资产之间创建一个资产交换,并为有形产品创建另一个金融资产交换。然后,在满足所有法规遵从性之后,它可以创建并合并这两个金融资产交易所。

尾注

  1. 金融资产, https://fbs.com/glossary/financial-asset-29
posted @   绝不原创的飞龙  阅读(115)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示