Java 机器学习实践指南(一)
一、简介
第一章为这本书奠定了基础。
它描述了这本书将实现什么,这本书的目标读者是谁,为什么机器学习(ML)很重要,为什么 Java 有意义,以及如何部署 Java ML 解决方案。
The chapter includes the following:
-
回顾人工智能及其子领域的所有术语,包括机器学习
-
为什么 ML 很重要,为什么 Java 是实现的好选择
-
最流行的开发环境的设置说明
-
ML-Gates 介绍,一种 ML 开发方法
-
ML 和货币化策略的商业案例
-
为什么这本书没有涵盖深度学习,为什么这是一件好事
-
何时以及为什么你可能需要深度学习
-
探索 ML 解决方案时如何创造性地思考
-
重要的洗钱调查结果概述
1.1 术语
随着人工智能和机器学习越来越受欢迎,相关术语也出现了很多混乱。似乎每个人使用这些术语的方式都不同且不一致。
Some quick definitions for some of the abbreviations used in the book:
-
人工智能(AI):任何假装聪明的东西。
-
机器学习(ML):一个通用术语,包括深度学习(DL)和经典机器学习(CML)的子领域。
-
深度学习(DL):一类利用神经网络的机器学习算法。
-
强化学习(RL):一种接受反馈的监督学习方式,但不一定针对每个输入。
-
神经网络(NN):模仿人脑和神经系统的计算机系统。
-
经典机器学习(CML):一个更狭义地定义 ML 算法集的术语,不包括深度学习算法。
-
数据挖掘(DM):寻找数据中隐藏的模式,这是一项通常由人来完成的任务。
-
机器学习门(MLG):这本书将介绍一种叫做 ML-Gates 的开发方法。门号从 ML-Gate 5 开始,到 ML-Gate 0 结束。例如,MLG3 是该方法的 ML-Gate 3 的缩写。
-
随机森林(RF)算法:一种用于分类、回归和其他任务的学习方法,通过在训练时构建决策树来运行。
-
朴素贝叶斯(NB)算法:一个“概率分类器”家族,基于应用贝叶斯定理,在特征之间具有强(朴素)独立性假设。
-
k-最近邻(KNN)算法:一种用于分类和回归的非参数方法,其中输入由特征空间中 k 个最近的训练示例组成。
-
支持向量机(SVM)算法:一种带有相关学习算法的监督学习模型,用于分析用于分类和回归的数据。
大部分混乱源自使用这些术语的不同派别或“领域”。在许多情况下,他们创造了这些术语,并在其领域内使用了几十年。
Table 1-1 shows the domains that have historically claimed ownership to each of the terms. The terms are not new. Artificial intelligence is a general term. AI first appeared back in the 1970s.Table 1-1
人工智能定义和领域
|学期
|
定义
|
领域
| | --- | --- | --- | | 统计数字 | 量化数据。DM,ML,DL 都是用统计学来做决策的。 | 数学系 | | 人工智能 | 关于如何创造智能代理的研究。任何假装聪明的事情。我们给计算机编了一个程序,让它像智能代理一样工作。它不需要学习或归纳。 | 历史、营销、趋势。 | | 数据挖掘 | 解释和识别有意义的模式。无人监管的方法。发现你的数据中隐藏的模式,这些模式可以被的人用来做决策。一个完整的商业流程,通常在大型数据集(大数据)上。 | 商业世界,商业智能 | | 机器学习 | 人工智能的一个大分支,我们在其中建立模型来预测结果。使用算法并有明确的目标。我们把现有的知识归纳成新的数据。而是学习一个模型来对物体进行分类。 | 学术部门 | | 深度学习 | 将神经网络应用于 ML。模式识别是一项重要的任务。 | 趋势 |
表 1-1 中的定义代表了我在阅读大量研究并与行业专家交谈后的综合理解。你可以在网上找到大量支持或反驳这些定义的哲学辩论。
Do not get hung up on the terminology. Usage of the terms often comes down to domain perspective of the entity involved. A mathematics major who is doing research on DL algorithms will describe things differently than a developer who is trying to solve a problem by writing application software. The following is a key distinction from the definitions:
数据挖掘 都是关于 人类 发现数据中隐藏的模式,而 机器学习 自动化这个过程,并允许 计算机 通过使用算法来执行这项工作。
It is helpful to think about each of these terms in context of “infrastructure” and “algorithms.” Figure 1-1 shows a graphical representation of these relationships. Notice that statistics are the underlying foundation, while “artificial intelligence” on the right-hand side includes everything within each of the additional subfields of DM, ML, and DL.
机器学习就是对 选择 和 将算法 应用于我们的数据的实践。
I will discuss algorithms in detail in Chapter 3. The algorithms are the secret sauce that enables the machine to find the hidden patterns in our data. Figure 1-1
人工智能子领域关系
1.2 历史
The term “artificial intelligence” is hardly new. It has actually been in use since the 1970s. A quick scan of reference books will provide a variety of definitions that have in fact changed over the decades. Figure 1-2 shows a representation of 1970s AI, a robot named Shakey, alongside a representation of what it might look like today. Figure 1-2
艾,过去和现在
Most historians agree that there have been a couple of “AI winters.” They represent periods of time when AI fell out of favor for various reasons, something akin to a technological “ice age.” They are characterized by a trend that begins with pessimism in the research community, followed by pessimisms in the media, and finally followed by severe cutbacks in funding. These periods, along with some historical context, are summarized in Table 1-2.Table 1-2
艾的历史与“冬天”时期
|时期
|
语境
| | --- | --- | | One thousand nine hundred and seventy-four | 英国议会发表研究称,人工智能算法将在“现实世界”问题上陷入停滞。这一挫折引发了包括 DARPA 在内的全球资金削减。这场危机被归咎于“不切实际的预测”和对技术的“日益夸大”。 | | One thousand nine hundred and seventy-seven | AI WINTER 1 | | 1984-1987 | 对人工智能的热情在 20 世纪 80 年代失去了控制,导致了价值数十亿美元的人工智能产业的又一次崩溃。 | | One thousand nine hundred and ninety | 人工智能冬天 2 当人工智能再次到达一个低水位标志。 | | Two thousand and two | 人工智能研究员罗德尼·布鲁克斯抱怨说,“有一个愚蠢的神话,人工智能已经失败了。” | | Two thousand and five | 雷·库兹韦尔宣称,“许多观察家仍然认为人工智能冬天是故事的结尾...然而今天,成千上万的应用程序已经深深嵌入到每个行业的基础设施中。” | | Two thousand and ten | 人工智能再次得到广泛应用和资金支持。机器学习越来越重要。 |
理解为什么会发生这些 AI 冬天是很重要的。如果我们打算投资学习和部署人工智能解决方案,我们希望确定另一个人工智能冬天不会迫在眉睫。
Is another AI winter on the horizon? Some people believe so, and they raise three possibilities:
-
归咎于统计数据:人工智能正走向错误的方向,因为它严重依赖统计技术。回想一下图 1-1 中,统计是人工智能和人工智能的基础。
-
机器疯狂运转:顶级研究人员认为另一个人工智能冬天可能会发生,因为滥用这项技术将导致它的灭亡。2015 年,埃隆·马斯克(Elon Musk)、史蒂文·霍金(Steven Hawking)、史蒂夫·沃兹尼亚克(Steve Wozniak)和 3000 名人工智能和机器人研究人员签署了一封禁止开发和使用自主武器的公开信。
-
假数据:数据是机器学习的燃料(在第二章中有更多关于这方面的内容)。这一论点的支持者认为,不断增加的熵将继续降低全球数据完整性,直到 ML 算法变得无效和无价值。这是 2018 年的一个相关论点。我将在第二章中讨论多种类型的数据。
看起来,另一个人工智能冬天不太可能在不久的将来到来,因为 ML 是如此有前途,因为我们可以利用高质量的数据来推动它。
今天,我们现有的大部分数据质量不高,但我们可以通过保持对模型所依赖的源数据的控制来降低这种风险。
政府资金的削减导致了之前的 AI 寒冬。今天,私营部门的资金是巨大的。只要看看人工智能初创公司正在筹集的一些风投资金就知道了。未来政府支持的类似削减将不再产生重大影响。对曼梯·里来说,这一次这匹马似乎永远离开了马厩。
1.3 机器学习商业案例
无论您是自由开发人员,还是为拥有大量可用资源的大型组织工作,在开始将有价值的资源应用于 ML 部署之前,您都必须考虑业务案例。
机器学习炒作
ML 当然也不能幸免于炒作。这本书的序言列举了媒体最近的一些炒作。这本书的目标是帮助你克服宣传和实现真正的问题解决方案。
ML and DL are not the only recent technology developments that suffer from excessive hype. Each of the following technologies has seen some recent degree of hype:
-
虚拟现实
-
增强现实
-
比特币
-
区块链
-
互联家庭
-
虚拟助手
-
物联网
-
3D 电影
-
4K 电视台
-
机器学习
-
深度学习
一些技术变得广泛和普遍使用,而另一些技术则逐渐消失。回想一下,就在短短几年前,3D 电影有望在影院上映时完全取代传统电影。这并没有发生。
对我们来说,继续密切关注 ML 和 DL 技术非常重要。事情将如何发展还有待观察,但最终,我们可以通过实验、构建和部署我们自己的应用程序来说服自己相信这些技术的可行性。
挑战和关切
表 1-3 列出了 IT 主管在考虑 ML 和 DL 计划时最担心什么时强调的一些主要挑战和顾虑。与任何 it 计划一样,实现 IT 计划都有机会成本,并且从计划中获得的收益必须大于机会成本,即通过进行 AI/ML 而放弃另一个潜在机会的成本。
Fortunately, there are mitigation strategies available for each of the concerns. These strategies, summarized below, are even available to small organization and individual freelance developers.Table 1-3
机器学习问题和缓解策略
|ML 关注
|
缓解策略
| | --- | --- | | IT 基础设施的成本 | 利用云服务提供商,如谷歌 GCP、亚马逊 AWS、微软 Azure | | 没有足够的有经验的员工 | 即使我们不能雇佣数据科学家,ML 也要求开发人员开始像数据科学家一样思考。这并不意味着我们突然需要数学博士。组织可以从采用数据优先的方法开始,如本章后面介绍的 ML-Gates。 | | 数据或分析平台的成本 | 有很多非常昂贵的数据科学平台;然而,我们可以从使用免费开源软件的经典 ML 开始,并取得令人印象深刻的结果。 | | 数据质量不足 | 存在大量低质量的数据。我们可以通过减少对“社会”数据的依赖,转而关注我们自己创造的数据来减轻这种影响。我们还可以利用来自传感器的数据,这些数据应该没有这种偏差。 | | 数据量不足 | 通过控制采样间隔,可以以更高的规模产生自生数据或传感器数据。在早期阶段将数据集成到项目中应该是 ML 方法的一部分。 |
使用上述缓解策略,开发人员可以用最小的学习曲线投资产生一些潜在的突破性 ML 软件解决方案。这是一个软件开发人员的大好时机。
接下来,我将进一步了解 ML 数据科学平台。这种平台可以帮助我们实现将我们的机器学习投资货币化的目标。货币化战略可以进一步缓解这些挑战和担忧。
数据科学平台
If you ask business leaders about their top ML objectives, you will hear variations of the following:
-
提高组织效率
-
对未来情景或结果做出预测
-
利用人工智能/人工智能获得竞争优势
-
将 AI/ML 货币化
Regardless of whether you are an individual or freelance developer, monetization is one of the most important objectives.
无论组织规模如何,货币化 ML 解决方案都需要两个构建模块:部署一个 数据科学平台 ,并遵循一个 ML 开发方法论 。
When it comes to the data science platforms, there are myriad options. It is helpful to think about them by considering a “build vs. buy” decision process. Table 1-4 shows some of the typical questions you should ask when making the decision. The decisions shown are merely guidelines.Table 1-4
数据科学平台:构建还是购买决策
|构建与购买问题
|
决定
| | --- | --- | | 有没有一个软件包可以完全解决你的问题? | 是:购买 | | 有没有解决你很多需求的包?这是常见的情况,没有简单的答案。 | 未确定的 | | 有没有可以考虑的开源包? | 是:构建 | | 是不是套餐太难实现了? | 是:购买 | | 你定义好的问题需要深度学习吗? | 不:也许建造 | | 分析是您业务的关键优势吗? | 是:也许建造 | | 你的分析场景独特吗? | 是:构建 | | 有新的数据吗? | 是:构建 | | 你的领域需要你敏捷吗? | 是:构建 | | 您是否能够获得您的问题所需的数据科学人才?不要低估你自己或你的员工;许多开发人员很快掌握了数据科学技能。 | 否:购买 |
那么“购买”一个数据科学平台实际上意味着什么呢?让我们考虑一个例子。
You wish to create a recommendation engine for visitors to your website. You would like to use machine learning to build and train a model using historical product description data and customer purchase activity on your website. You would then like to use the model to make real-time recommendations for your site visitors. This is a common ML use case. You can find offerings from all of the major vendors to help you implement this solution. Even though you will be “building” your own model using the chosen vendor’s product, you are actually “buying” the solution from the provider. Table 1-5 shows how the pricing might break down for this project for several of the cloud ML providers.Table 1-5
示例 ML 云提供商定价cloud.google.com/ml-engine/docs/pricing、aws.amazon.com/aml/pricing/、azure . Microsoft . com/en-us/Pricing/details/machine-learning-studio/
供应者
|
功能
|
定价
| | --- | --- | --- | | 谷歌云 ML 引擎 | 建模费用批量预测实时预测 | 每小时 0.27 美元(标准机器)每节点小时 0.09 美元每节点小时 0.30 美元 | | 亚马逊机器学习(AML) | 建模费用批量预测实时预测 | 每小时 0.42 美元,每 1000 次预测 0.10 美元,每次预测 0.0001 美元 | | Microsoft Azure ML Studio | 建模费用批量预测实时预测 | 每月 10 美元,每小时 1 美元(标准)每月 100 美元包括 100,000 次交易(API) |
在本例中,由于构建模型需要计算时间,因此您应计成本。随着非常大的数据集和深度学习模型的构建,这些成本变得很大。
另一个“购买”ML 解决方案的常见例子是使用发布的 API 访问预先构建的模型。您可以将这种方法用于图像检测或自然语言处理,其中存在庞大的模型,您可以简单地通过使用您的输入细节调用 API(通常使用 JSON)来利用这些模型。在本书的后面,您将看到如何实现这个简单的例子。在这种情况下,大多数服务提供商按照给定时间段内的 API 调用次数收费。
那么“建立”一个数据科学平台意味着什么呢?在这种情况下,构建是指获得一个软件包,该软件包将提供实现您自己的 AI 或 ML 解决方案所需的构建块。
The following list shows some of the popular data science platforms:
-
MathWorks :传奇的 MATLAB 软件包的创造者,MathWorks 是业界的老玩家。
-
SAP :大型数据库玩家拥有完整的大数据服务和咨询业务。
-
IBM : IBM 提供 Watson Studio 和 IBM 数据科学平台产品。
-
微软:微软 Azure 提供全方位的数据和分析服务及资源。
-
KNIME analytics 是一个基于 Java 的、开放的、直观的、综合的数据科学平台。
-
RapidMiner:一个基于 Java 的商业解决方案。
-
H2O.ai :流行的开源数据科学和 ML 平台。
-
Dataku:一个协作数据科学平台,允许用户进行原型设计、部署和大规模运行。
-
Weka :基于 Java 的解决方案,您将在本书中深入探讨。
该列表包括许多流行的数据科学平台,其中大多数是商业数据科学平台。关键词是商业。由于 Rapidminer 是基于 Java 的,所以在本书的后面,您将会更仔细地了解它。其他商业解决方案功能齐全,有从基于许可到基于订阅的一系列定价选项。
好消息是,您不必为了构建数据科学平台而进行资本支出,因为有一些开源替代方案可用。你将在第三章仔细查看 Weka 包。无论您决定构建还是购买,像 Weka 这样的开源替代方案都是非常有用的入门方式,因为它们允许您在学习的同时构建自己的解决方案,而不会将您束缚在昂贵的技术解决方案中。
ML 货币化
One of the best reasons to add ML into your projects is increased potential to monetize. You can monetize ML in two ways: directly and indirectly.
-
间接货币化:让 ML 成为你产品或服务的一部分。
-
直接货币化:向客户销售人工智能能力,客户反过来应用这些能力来解决特定问题或创造自己的产品或服务。
Table 1-6 highlights some of the ways you can monetize ML.Table 1-6
ML 货币化方法
|战略
|
类型
|
描述
| | --- | --- | --- | | 架构 | 直接的 | AI 即服务,比如 Salesforce Einstein 或者 IBM Watson。 | | MLaaS | 直接的 | ML 即服务,如表 1-5 中的 Google、Amazon 或 Microsoft 示例。 | | 模型 API | 间接的 | 例如,您可以创建模型,然后发布一个 API,允许其他人使用您的模型进行自己的预测。 | | 纳普拉斯 | 直接的 | NLP 即服务。苹果 Siri、微软 Cortana 或亚马逊 Echo/Alexa 等聊天机器人。Nuance Communications、Speechamatics 和 Vocapia 等公司。 | | 集成 ML | 间接的 | 您可以创建一个模型来帮助解决您的问题,并将该模型集成到您的项目或应用程序中。 |
许多直接策略采用了 DL 方法。在本书中,重点主要放在间接 ML 策略上。在本书的后面,您将实现几个集成的 ML 应用程序。这种策略是间接的,因为 ML 功能对最终用户是不可见的。
客户不会因为你在申请中加入 ML 就多付钱。然而,如果你能解决一个新问题,或者为他们提供以前没有的能力,你就大大增加了赚钱的机会。
There is not much debate about the rapid growth of AI and ML. Table 1-7 shows estimates from Bank of America Merrill Lynch and Transparency Market Research. Both firms show a double-digit cumulative annual growth rate, or CAGR. This impressive CAGR is consistent with all the hype previously discussed.Table 1-7
AI 和 ML 爆发式增长
|公司
|
领域
|
增长
|
CAGR
| | --- | --- | --- | --- | | 美银美林 | 人工智能 | 2015 年 580 亿美元,2020 年 1530 亿美元 | 27% | | 透明度市场研究 | 机器语言(Machine Language) | 2106 年 10.7 亿美元,2025 年 198.6 亿美元 | 38% |
这些复合年增长率代表了令人印象深刻的增长。一些增长归因于 DL;但是,您不应该忽视 CML 为您提供的可能机会,尤其是在移动设备方面。
手机上的经典机器学习案例
经典机器学习不是一个很常用的术语。我将使用该术语来表示我们正在排除深度学习。图 1-3 显示了这种关系。这两种方法使用不同的算法,我将在第四章中讨论它们。
This book is about implementing CML for widely available computing devices using Java. In a sense, we are going after the “low-hanging fruit.” CML is much easier to implement than DL, but many of the functions we can achieve are no less astounding. Figure 1-3
经典机器学习关系图
There is a case for mastering the tools of CML before attempting to create DL solutions. Table 1-8 highlights some of the key differences between development and deployment of CML and DL solutions.Table 1-8
经典机器学习和深度学习的比较
|经典机器学习
|
深度学习
| | --- | --- | | 算法 | | 算法大都商品化了。你不需要花很多时间去选择最好的算法或者调整算法。算法更容易解读和理解。 | 神经网络算法背后有很多新的研究。这涉及到大量的理论,并且需要大量的调整来为您的应用找到最佳的算法。 | | 数据要求 | | 需要适量的数据。您可以在某些应用程序中生成自己的数据。 | 训练 DL 模型需要大量的数据。大多数实体缺乏足够的数据来创建自己的 DL 模型。 | | 性能 | | 为许多移动、web 应用或嵌入式设备环境提供足够的性能。 | 深度学习神经网络算法最近的增长很大程度上是因为它们的性能优于 CML 算法。 | | 语言 | | 许多 Java 工具都是可用的,既有开源的也有商业的。 | 大多数 DL 库和工具都是基于 Python 或 C++的,只有基于 Java 的 DL4J 例外。一些流行的 C++ DL 引擎通常有 Java 包装器。 | | 模型创建 | | 模型大小可以适中。可以在桌面环境下创建模型。易于嵌入移动设备或嵌入式设备。 | 模型尺寸可能很大。难以将模型嵌入到移动应用中。创建模型需要大量 CPU/GPU 资源。 | | 典型用例 | | 回归聚类分类数据的特定用例 | 图像分类语音计算机视觉玩游戏自动驾驶汽车模式识别声音合成艺术创作照片分类异常(欺诈)检测行为分析推荐引擎翻译自然语言处理面部识别 | | 货币化 | | 间接 ML | 模型 APIsMLaaS |
对于移动设备和嵌入式设备,CML 很有意义。对于较小的数据集,CML 优于 DL,如图 1-7 中图表的左侧所示。
用一个现代的 CPU 在合理的时间内创建 CML 模型是可能的。CML 在桌面上启动。它不需要大量的计算资源,例如多个 CPU/GPU,而这在构建 DL 解决方案时是常见的。
The interesting opportunity arises when you build your models on the desktop and then deploy them to the mobile device either directly or through API interface. Figure 1-4 shows a breakdown of funding by AI category according to Venture Scanning. Figure 1-4
按人工智能类别拨款
数据显示,移动应用的 ML 的资金大约是第二大领域 NLP 的三倍。所包含的类别表明,许多常见的 DL 领域,如计算机视觉、NLP、语音和视频识别,已经作为一个特定的类别包含在内。这让我们可以假设 ML 应用类别的很大一部分是经典的机器学习。
1.4 深度学习
I will not cover deep learning in this book because we can accomplish so much more easily with CML. However, in this short section I will cover a few key points of DL to help identify when CML might not be sufficient to solve an ML problem. Figure 1-5
机器学习红色药丸/蓝色药丸隐喻
Morpheus described the dilemma we face when pursuing ML in the motion picture “The Matrix” (see also Figure 1-5):
“你服下蓝色药丸,故事结束;你在床上醒来,相信你想相信的一切。你吃了红色药丸,你就呆在仙境里,我让你看看兔子洞有多深。”
深度学习是一种仙境。这是我们今天在这个领域大肆宣传的原因。然而,它有一个很好的理由来达到炒作的目的。
You will often hear it stated the DL operates at scale. What does this mean exactly? It is a performance argument, and performance is obviously very important. Figure 1-6 shows a relationship between performance and data set size for CML and DL. Figure 1-6
深度学习规模化运营
图表显示,对于较小的数据集,CML 的性能略优于 DL。问题是,多小才算小?当我们设计 ML 应用程序时,我们需要考虑数据集大小位于拐点的哪一边。没有简单的答案。如果有,我们会将实际数字放在 x 轴刻度上。这取决于您的具体情况,您需要在设计解决方案时决定使用哪种方法。
幸运的是,我们有工具来定义 CML 模型的性能。在第 4 和 5 章中,您将了解如何使用 Weka workbench 向您展示增加数据集大小是否真的会提高模型的性能。
识别 DL 应用程序
深度学习已经在许多特定领域展示了优于 CML 的结果,包括语音、自然语言处理、计算机视觉、玩游戏、自动驾驶汽车、模式识别、声音合成、艺术创作、照片分类、不规则(欺诈)检测、推荐引擎、行为分析、翻译等等。
随着你获得 ML 的经验,你开始对一个项目什么时候适合 DL 有一种感觉。
Deep networks work well when
-
更简单的 CML 模型达不到你想要的精度。
-
你有复杂的模式匹配需求。
-
你的数据(序列)中有时间维度。
If you do decide to pursue a DL solution, you can consider the following deep network architectures:
-
无监督预训练网络(UPN ),包括深度信念网络(DBN)和生成对抗网络(GAN)
-
卷积神经网络(CNN)
-
包括长短期记忆(LSTM)的循环神经网络(RNN)
-
循环神经网络
我会在第四章多讲算法。在设计 CML 解决方案的时候,可以从确定你所追求的 CML 的算法类开始,比如分类或者聚类。然后,您可以很容易地在类中试验算法,以找到最佳解决方案。在 DL 中,就没有这么简单了。您需要将您的数据与特定的网络架构相匹配,这个主题超出了本书的范围。
While building deep networks is more complicated and resource intensive, as described in Table 1-8, tuning deep networks is equally challenging. This is because, regardless of the DL architecture you choose, you define deep learning networks using neural networks that are comprised of a large number of parameters, layers, and weights. There are many methods used to tune these networks including the methods in Table 1-9.Table 1-9
DL 网络的调谐方法
|DL 神经网络的调谐方法
| | --- | | 反向传播 | 随机梯度下降 | | 学习率衰减 | 拒绝传统社会的人 | | 最大池化 | 批量标准化 | | 长短期记忆 | Skipgram | | 连续的单词袋 | 迁移学习 |
如表所示,DL 很复杂。可用于 DL 的 AI 引擎试图简化这个过程。表 1-10 显示了许多包含 DL 库的流行 AI 引擎。在本书中,您将关注面向 Java 开发人员的 CML 解决方案。
When you create DL solutions there are not as many Java tools and libraries available. DL4J and Spark ML are the two most common Java-based packages that can handle DL. DL4J is built from the ground up with DL in mind, whereas the popular Spark open source project has recently added some basic DL capabilities. Some of the excellent C++ libraries do provide Java wrappers, such as Apache MXNet and OpenCV.Table 1-10
具有深度学习库的人工智能引擎
|包裹
|
描述
|
语言
| | --- | --- | --- | | 提亚诺 | 数学编程的强大通用工具。旨在促进深度学习。用于 GPU 的高级语言和编译器。 | 计算机编程语言 | | 张量流 | 与深度学习相关的所有类型的数值计算的库。深受 Theano 的启发。数据流图表示多维数组(张量)的通信方式。(谷歌) | C++和 Python | | CNT(消歧义) | 计算网络工具包。由微软研究院在许可许可下发布。 | C++ | | 框架 | 简洁和可扩展的设计。基于赢得 2012 年 ImageNet 挑战赛的 AlexNet。(脸书支持) | C++和 Python | | DL4J 系列 | 基于 Java 的开源深度学习库(Apache 2.0 许可证)。使用带有线性代数和矩阵操作的多维数组类。(Skymind) | 爪哇 | | 火炬 | 开源的科学计算框架,优化用于 GPU。 | C | | Spark MLlib(消歧义) | 大规模分布式数据处理的快速通用引擎。MLlib 是机器学习库。庞大的用户群。DL 支持正在增长。 | 爪哇 | | Apache MXNet | 开源 Apache 项目。由 AWS 使用。美国有线电视新闻网和 LSTM。可扩展。由华盛顿大学和卡内基梅隆大学创办。 | C++Java 包装器 | | 硬 | 用于开发和评估 DL 模型的功能强大、易于使用的库。最棒的张量流。 | 计算机编程语言 | | 开放计算机视觉 | 可以为 Android 集成的开源计算机视觉库。 | C++Java 包装器 |
While it is entirely possibly that DL can solve your unique problem, this book wants to encourage you to think about solving your problem, at least initially, by using CML. The bottom line before we move onto ML methodology and some of the technical setup topics is the following:
深度学习令人惊叹,但在本书中,我们抵制诱惑,青睐经典的机器学习,只是因为它可以以少得多的麻烦完成如此多同样令人惊叹的事情。
在本书的其余部分,我们将选择蓝色药丸,并留在舒适的模拟现实的矩阵与 CML。
1.5 毫升-盖茨方法
Perhaps the biggest challenge of producing ML applications is training yourself to think differently about the design and architecture of the project. You need a new data-driven methodology. Figure 1-7 introduces the ML-Gates. The methodology uses these six gates to help organize CML and DL development projects. Each project begins with ML-Gate 6 and proceeds to completion at ML-Gate 0. The ML-Gates proceed in a decreasing order. Think of them as leading to the eventual launch or deployment of the ML project. Figure 1-7
ML-Gates,一种机器学习开发方法
作为开发人员,我们编写大量代码。当我们接受新项目时,我们通常只是开始编码,直到我们得到可交付的产品。使用这种方法,我们通常会得到大量编码的应用程序。
对于 ML,我们想彻底改变这种方法。相反,我们试图用最少的代码实现数据密集型应用。最小编码的应用程序更容易支持。
ML-Gate 6:识别明确定义的问题
这一切都始于一个定义明确的问题。在这个阶段,你需要比从事传统的非 ML 项目时考虑得更狭隘一些。这可能导致创建集成到更大系统中的 ML 模块。
为了说明这一点,让我们考虑一个具有客户需求的示例项目。
For the project, you map the client requirements to well-defined ML solutions. Table 1-11 shows the original client requirements mapped to the ML models.Table 1-11
将需求映射到 ML 解决方案
|初始客户要求
|
定义明确的 ML 解决方案
| | --- | --- | | R1:创建一个购物应用程序,这样实体店的顾客将会有更好的用户体验。 | 您发现需要一个基于位置的店内解决方案来让这款应用变得有用。您可以使用一种巧妙的 CML 方法来实现这一点。第六章的最后有更多关于实现的内容。 | | R2:对使用该应用程序帮助增加销售额的购物者实现忠诚度计划。 | 忠诚度计划都是关于保存和召回客户数据。您可以使用产品库存数据和客户购买历史数据来构建 ML 模型,以便向客户推荐产品,从而增强用户体验。 |
在这个例子中,客户想要一个店内购物应用程序。这些是完全有效的需求,但是这些高层次的需求并不代表定义良好的 ML 问题。您的客户“表达了”提供“增强用户体验”的需求这到底意味着什么?要创建一个 ML 解决方案,你需要考虑客户未表达或潜在的需求。
右栏显示了如何将表达的需求映射到定义良好的 ML 解决方案。在这种情况下,您将构建两个独立的 ML 模型。您将需要这些模型的数据,这将引导您进入 ML-Gate 5。
ML-Gate 5:获取足够的数据
Data is the key to any successful ML app. In MLG5, you need to acquire the data. Notice this is happening well before you write any code. There are several approaches for acquiring data. You have several options and I will discuss the following in detail in Chapter 2:
-
从第三方购买数据。
-
使用公开可用的数据集。
-
使用你自己的数据集。
-
自己生成新的静态数据。
-
来自实时源的流数据。
ML-Gate 4:处理/清理/可视化数据
一旦有了明确的问题和足够的数据,就该设计解决方案了。接下来的三个门涵盖此活动。在 MLG4 中,您需要处理、清理并可视化您的数据。
MLG4 就是为模型构建准备数据。您需要考虑缺失值、规范化、相关性、格式、数据类型和数据量等技术。
可视化是一个重要的方面,因为你努力对你的数据负责。对数据应用 CML 或 DL 算法时,未正确预处理的数据可能会导致错误。正因如此,MLG4 非常重要。俗话说垃圾进,垃圾出,这是你必须避免的。
ML-Gate 3:生成模型
准备好数据后,MLG3 就是您实际创建模型的地方。在 MLG3,您将初步决定使用哪种算法。
在第四章中,我将介绍可以生成模型的基于 Java 的 CML 环境。我将介绍如何创建模型以及如何测量模型的性能。
这是一种强大的设计模式,您将使用它来离线构建模型,以供以后在 Java 项目中使用。第五章将涵盖“预制”模型的进口和出口。
在 MLG3,您还必须考虑您的模型的版本控制和更新方法。管理模型的这一方面与管理非 ML 软件开发中的代码更新一样重要。
ML-Gate 2:测试/改进模型
创建初始模型后,MLG2 允许您测试和优化模型。正是在这里,您要检查模型的性能,以确认它将满足您的预测要求。
推理是使用模型进行预测的过程。在此过程中,您可能会发现需要调整或优化所选的算法。你可能会发现你需要改变你最初选择的算法。您甚至可能发现 CML 没有提供想要的结果,您需要考虑 DL 方法。
通过 ML-Gate 2 表示模型已经准备好了,是时候进入 MLG1 来集成模型了。
ML-Gate 1:整合模型
在 MLG1,是时候编写实际的生产代码了。请注意,在方法论中,您已经将实际的代码编写向前推进了多远。好消息是,您不必像平时那样编写大量代码,因为您创建的训练有素的模型将完成大部分繁重的工作。
您需要在 MLG1 编写的大部分代码处理模型的“打包”。在这一章的后面,我将讨论潜在的目标环境,这些环境也会影响模型需要如何被打包。
通常,使用训练数据在 MLG3/4 上创建 CML 模型,然后利用该模型进行预测。在 MLG1 中,您可能需要编写额外的代码来获取新的实时数据,并将其输入到模型中以输出预测。在第六章中,您将看到如何从设备中收集传感器数据并输入到模型中。
MLG1 是您认识到编码时间节省的地方。通常只需要几行代码就可以打开一个预构建模型并进行新的预测。
方法的这一阶段还包括解决方案的系统测试。
ML-Gate 0:部署
At MLG0, it is time for deployment of the completed ML solution. You have several options to deploy your solution because of the cross-platform nature of Java, including
-
通过 Google Play 等应用商店发布移动应用。
-
向您的客户端发送独立软件包。
-
通过网络浏览器访问在线提供软件。
-
提供对您的解决方案的 API 访问。
无论您如何部署您的 ML 解决方案,在 MLG0 要记住的重要一点是,“发货后就忘了”是错误的。
当我们创建模型时,我们必须认识到它们不应该成为永远不变的静态实体。我们需要一种机制来更新它们并保持它们的相关性。ML 模型帮助我们避免代码繁重的应用程序的缺点,但是我们必须有效地管理我们创建的模型,这样它们才不会过时。
方法总结
现在,您已经了解了 CML 的必要背景,并且有了可以用来创建 CML 应用程序的方法。
你可能听说过这样一句话:“当你是一把锤子时,一切看起来都像钉子。”在精通 CML 并采用数据驱动的方法后,您很快就会发现大多数问题至少在某个方面有一个优雅的 ML 解决方案。
接下来,您将看到书中 Java 项目所需的设置,以及 ML 成功的最后一个关键因素:创造性思维。
1.6 Java 的案例
关于哪种编程语言是最好的,你应该学习哪种语言,什么语言最适合孩子们开始编写代码,哪些语言正在消亡,哪些新语言代表了编程的未来,等等,总是有激烈的争论。
Java 无疑是这些争论的一个重要部分。有许多人质疑 Java 满足现代开发人员需求的能力。每种编程语言都有自己的优点和缺点。
Christina Videira Lopes 的 编程风格的练习 很有趣,因为作者解决了大量不同语言中的一个常见编程问题,同时强调了每种风格的优点和缺点。这本书阐明了我们可以使用任何语言来解决给定的问题。作为程序员,我们需要找到给定所选语言约束的最佳方法。Java 当然有它的优点和缺点,接下来我将回顾一下 Java 适合 CML 解决方案的一些原因。
Java 市场
Java has been around since 1995 when it was first released by Sun Microsystems, which was later acquired by Oracle. One of the benefits of this longevity is the market penetration it has achieved. The Java market share (Figure 1-8) is the single biggest reason to target the Java language for CML applications. Figure 1-8
Java 市场
Java 应用程序编译成字节码,可以在任何 Java 虚拟机(JVM)上运行,而不管计算机架构如何。它是拥有数百万开发人员的最受欢迎的语言之一,尤其是对于客户机-服务器 web 应用程序。
When you install Java, Oracle is quick to point out that three billion devices run Java. It is an impressive claim. If we drill down deeper into the numbers, they do seem to be justified. Table 1-12 shows some more granular detail of the device breakdown.Table 1-12
运行 Java 的设备
|设备
|
数数
| | --- | --- | | 运行 Java 的台式机 | 11 亿 | | JRE 每年的下载量 | 9.3 亿 | | 运行 Java 的手机 | 30 亿 | | 蓝光播放器 | 100%运行 Java | | Java 卡 | 每年生产 14 亿个 | | 专有盒子 | 未知数量的设备,包括机顶盒、打印机、网络摄像头、游戏控制台、汽车导航系统、彩票终端、停车计时器、VOIP 电话、电表、工业控制等。 |
The explosion of Android development and the release of Java 8 helped Java to gain some of its market dominance.
Java 的巨大规模是我选择它作为 CML 解决方案语言的主要原因。开发人员只需要掌握一种语言,就可以产生有效的 CML 解决方案,并将其部署到大量的目标受众中。
For your target environments, the focus will be on the following three areas that make up the majority of installed Java devices:
-
运行 Java 的台式机:这一类别包括可以运行独立 Java 程序的个人电脑,或者可以运行 Java 小程序的电脑上的浏览器。
-
运行 Java 的手机 : Android 移动设备在这一类中占了很大一部分,其中也包括低价功能手机。ML 的一个关键发现是数据的重要性,手机可以说是有史以来最伟大的数据收集设备。
-
Java 卡:这个类别代表最小的 Java 平台。Java 卡允许 Java 小程序在嵌入式设备上运行。设备制造商负责集成嵌入式 Java,消费者不能下载或安装。
Java 版本
Oracle supplies the Java programming language for end users and for developers:
-
JRE (Java 运行时环境)是为希望安装 Java 以便运行 Java 应用程序的最终用户准备的。
-
JDK (Java SE Developer Kit)包括 JRE 以及用于开发、调试和监控 Java 应用程序的附加工具。
There are four platforms of the Java programming language:
-
Java 平台,标准版(Java SE)
-
Java Platform,Enterprise Edition (Java EE)构建在 Java SE 之上,包括用于构建网络应用程序的工具,如 JSON、Java Servlet、JavaMail 和 WebSocket。Java EE 是在 Java 社区过程下开发和发布的。
-
Java Platform,Micro Edition (Java ME)是一个小型虚拟机,用于在小型设备上运行应用程序。
-
Java FX 用于使用轻量级 API 创建富互联网应用程序。
所有的 Java 平台都由一个 Java 虚拟机(JVM)和一个应用编程接口(API)组成。
Table 1-13 summarizes the current Java releases.Table 1-13
最新支持的 Java 版本
|释放;排放;发布
|
描述
| | --- | --- | | Java 8 SE 内部版本号 171 | 目前支持的长期支持(LTS)版本。引入 lambda 表达式 | | Java 10 SE 10.0.1 | 当前支持的快速发布版本。2018 年 3 月 20 日发布。包括 12 项新的主要功能。最新更新是 171。 | | Android SDK | 用于开发 Android 应用程序的替代 Java 软件平台。包括自己的 GUI 扩展系统和移动设备库。Android 不提供完整的 Java SE 标准库。Android SDK 支持 Java 6 和部分 Java 7 特性。 |
Java 的最新版本解决了该语言落后于一些更新、更流行的语言的一些领域。值得注意的是,Java 8 包括了一个意义深远的特性,称为λ表达式 ,以及一个新的运算符(- >)和一个新的语法元素。Lambda 表达式增加了函数式编程特性,有助于简化和减少创建某些结构所需的代码量。
在本书中,你不会用到 lambda 表达式,也不会用到 Java 10 语言中的任何新特性。尽管如此,最好运行 Java 8 长期支持版本或当前支持的 Java 10 快速版本的最新更新。
如果你正在寻找一本全面的 Java 书籍, Java,甲骨文 第十版完整参考,超过 1300 页,是一个极好的选择。它涵盖了 Java 的所有内容。谈到 Java 性能调优,Charlie Hunt 和 John Binu 的《Java 性能是一本 720 页的权威指南,旨在最大限度地提高 Java 性能。
安装 Java
在安装 Java 之前,您应该首先从系统中卸载所有旧版本的 Java。在您的系统上保留旧版本的 Java 存在安全风险。卸载旧版本可确保 Java 应用程序在最新的安全和性能环境下运行。
所有平台下载的主 Java 页面和链接可从以下 URL 获得:
Java . com/en/download/manual . JSP
Java 可用于您需要的任何平台。一旦你决定了你需要哪一个加载,继续下载和安装。对于本书中的项目,建议安装 Java 8 SE 的最新稳定版。对于 Android 项目,允许 Android Studio 管理您的 Java 版本。Android Studio 通常会使用 Java 7 的最新稳定版本,直到 Android 团队添加了对 Java 8 的支持。
图 1-9 显示了主 Java 下载页面。
图 1-10 显示了 Java 的安装。
Figure 1-11 shows the completion of the installation. Figure 1-9
下载 Java
Figure 1-10
安装 Java
Figure 1-11
成功安装 Java SE
Java 性能
史蒂夫·乔布斯曾经说过一句关于 Java 的名言:“它是一个巨大的、重量级的球和链条。”当然,苹果从来都不喜欢这种语言。Java 经久不衰的原因之一是多年来对该语言的支持和改进。Java 的最新版本比早期版本提供了更多的功能和性能。
开发人员犹豫选择 Java 作为 ML 解决方案的原因之一是担心性能。
询问哪种语言“更快”或提供更好的性能并不是一个真正有用的问题。当然,这要视情况而定。语言的性能取决于它的运行时、操作系统和实际代码。当开发人员问,“哪种语言为机器学习提供了最好的性能?”我们真的应该问,“我应该使用哪个平台来最快速、最轻松地完成机器学习模型的训练和构建?”
使用算法创建 ML 模型是 CPU 密集型的,尤其是对于 DL 应用程序。这本书是关于 Java 的,但是如果你研究 ML,你会知道 Python 和 C++也是非常流行的 ML 语言。为 ML 创建三种语言的公平比较并不容易,但是许多研究人员已经尝试这样做了,你可以从他们的发现中学习。由于 ML 是基于算法的,所以他们经常试图选择一个标准算法,然后在其他变量相同的情况下进行比较,例如 CPU 和操作系统。
Java 性能是语言中最难衡量的,因为有几个因素,包括未优化的代码、Java 的 JIT 编译方法和著名的 Java 垃圾收集。此外,请记住,Java 和 Python 可能依赖 C++库的包装器来完成实际的繁重工作。
Table 1-14 shows a high-level summary of the performance for a mathematical algorithm implemented in three different languages on the same CPU and operating system. To learn more about the underlying research used in the summary, refer to these sources:
-
程序速度,维基百科,
en.wikipedia.org/wiki/Java_performance -
Google 的一篇研究论文比较了 C++、Java、Scala 和 Go 编程语言的性能:
days 2011 . Scala-lang . org/sites/days 2011/files/ws3-1-hundt . pdf -
六种程序设计语言的比较研究:
-
伊万扎赫里耶夫的博客:
blog . fam zah . net/2016/02/09/CPP-vs-python-vs-perl-vs-PHP-performance-benchmark-2016/
Table 1-14
语言表现比较-数学算法
|语言
|
比 C++慢%
|
注意
| | --- | --- | --- | | C++ | - | C++编译成 native,所以是第一。 | | Java 8 | 15% | Java 为平台独立性产生字节码。Java 的“软肋”是它的垃圾收集(GC)开销。这些年来,对 Java GC 算法进行了许多改进。 | | 我的锅 | 15+% | Kotlin 还生产 Java 虚拟机(JVM)字节码。通常,Kotlin 和 Java 一样快。 | | 计算机编程语言 | 55% | Python 有高级数据类型和动态类型,所以运行时要比 Java 辛苦。 |
表 1-14 当然不是详尽的性能指标评测,但确实提供了一些关于相对性能的见解,以及对差异的可能解释。
当您为 ML 解决方案创建预构建模型时,关注数据质量和算法选择比编程语言更重要。你应该使用最容易、最准确的编程语言来表达你试图解决的问题。
Java 怀疑论者经常问:“Java 是实现深度学习的合适编程语言吗?”简短的回答是:当然!它有足够的性能,所有需要的数学和统计库都可用。在本章的前面,我将 DL4J 列为完全用 Java 编写的主要 Java 包。DL4J 是一个神奇的软件包,它的能力可以与 DL 中的所有大型玩家相媲美。一句话:借助云中的多节点计算,我们可以轻松地为计算密集型操作添加更多资源。可伸缩性是基于云的平台提供的巨大优势之一,我将在第二章中讨论。
1.7 开发环境
There are many IDEs available to Java developers. Table 1-15 shows the most popular choices for running Java on the desktop or device. There are also some online browser-based cloud Java IDEs such as Codenvy, Eclipse Che, and Koding, which I will not cover.Table 1-15
Java IDE 摘要
|IDE 名称
|
特征
| | --- | --- | | Android Studio | 来自 Google 的 Android 专用开发环境。它已经成为 Android 事实上的 IDE。提供了大量有用的开发和调试工具。 | | 智能理念 | 功能齐全的专业 IDE。年费。许多开发人员喜欢 IntelliJ。Android Studio 是基于 IntelliJ 的。 | | 黯然失色 | 免费开源 IDE。Eclipse 公共许可证。支持 Git。大量可用的插件。 | | BlueJ | 轻量级开发环境。附带树莓派。 | | 开发工具 | 免费的开源 IDE,Eclipse 的替代品。开源项目正在转移到 Apache,这应该会增加它的受欢迎程度。 |
The book uses two development environments for the projects depending on the target platform:
-
谷歌的 Android Studio 帮助开发者为运行 Android 的移动设备创建应用。
-
不针对 Android 移动设备的 Java 项目的 Eclipse IDE。这包括面向桌面、浏览器或非 Android 设备(如 Raspberry Pi)的 Java 程序。
Android Studio
谷歌让 Android Studio 轻松入门。最新的稳定发布版本是 2018 年 4 月发布的版本 3.1.2。下载页面是developer.android.com/studio/。
Figure 1-12 shows the available platforms. Note that the files and disk requirements are large. The download for 64-bit Windows is over 700MB. Figure 1-12
Android Studio 下载
Android Studio has really been improving the last couple of years. The full featured development environment for Android includes
-
Kotlin 版本 1.2.30
-
绩效工具
-
实时网络分析器
-
可视化 GUI 布局编辑器
-
瞬间奔跑
-
快速仿真器
-
灵活的分级构建系统
-
智能代码编辑器
Figure 1-13 shows the show the Android Studio installation setup. Figure 1-13
Android Studio 安装
Figure 1-14 shows the shows the Android Studio opening banner including the current version 3.1.2. Figure 1-14
Android Studio 版本 3.1.2
Android Studio uses the SDK Manager to manage SDK packages. SDK packages are available for download. The SDK packages are required to compile and release your app for a specific Android version. The most recent SDK release is Android 8.1 (API level 27), also known as Oreo. Figure 1-15 shows the Android SDK Manager. Figure 1-15
Android Studio SDK 管理器
始终关注您使用的 Android Studio 和 SDK 平台的更新。Google 经常发布更新,您希望您的开发环境保持最新。
当终端用户不断购买最新设备时,这对于移动开发尤为重要。
黯然失色
Android 移动应用是我们 CML 战略的重要组成部分,但不是我们唯一的目标受众。对于非 Android 项目,我们需要一个更合适的开发环境。
Eclipse 是 Eclipse foundation 提供的多功能 IDE。下载页面是eclipse.org/downloads。Eclipse 适用于所有平台。最新的版本是 Oxygen.3a,版本是 4.7.3a。与 Android 类似,Eclipse 通过字母表使用收益,并且与 Android 一样,目前也处于“o”
Similar to the options available for the Java distributions, developers can choose either
-
面向 Java EE 开发人员的 Eclipse IDE(包括用于 web 应用程序的额外工具),或者
-
面向 Java 开发人员的 Eclipse IDE
The latter is sufficient for the projects in this book. Figure 1-16 shows the Eclipse IDE for Java Developers installation banner. Figure 1-16
Eclipse 安装
Eclipse makes it easy to get started with your Java projects. Once installed, you will have the option to
-
创建新项目。
-
从现有源代码导入项目。
-
从 Git 源代码控制系统中签出或克隆项目。
The Git checkout feature is very useful, and you can use that option to get started quickly with the book projects. Figure 1-17 shows the Eclipse IDE for Java Developers startup page with the various options. Figure 1-17
面向 Java 开发人员的 Eclipse IDE
One of the big advantages of Eclipse is the huge number of plugins available. There are plugins for almost every imaginable integration. Machine learning is no exception. Once you get a feel for the types of ML projects you are producing, you may find the Eclipse plugins in Table 1-16 to be useful. For the book projects, you will use a basic Eclipse installation without plugins.Table 1-16
Eclipse IDE 机器学习相关插件
|Eclipse ML 插件
|
描述
| | --- | --- | | AWS 工具包 | 帮助 Java 开发人员将 AWS 服务集成到他们的 Java 项目中。 | | 谷歌云工具 | 谷歌赞助的开源插件,支持谷歌云平台。Cloud Tools for Eclipse 使您能够在 Google cloud 中创建、导入、编辑、构建、运行和调试。 | | 微软 Azure 工具包 | Azure Toolkit for Eclipse 允许您创建、开发、配置、测试和部署轻量级、高可用性和可伸缩的 Java web 应用程序。 | | r 代表数据科学 | Eclipse 有几个插件支持 R 统计语言。 | | 物联网日食 | 80 个插件可用。 | | Eclipse 智能家居 | 47 个插件可用。 | | 定量组件 | 金融时间序列和算法交易的开源框架。 |
It is important to keep your Eclipse environment up to date. Figure 1-18 shows the Eclipse startup banner with the current version. Just as with your Java installation, Android Studio, and Android SDK platforms, always keep your Eclipse IDE up to date. Figure 1-18
面向 Java 开发人员的 Eclipse IDE
成开发环境
对于不想使用 Eclipse 的 Java 开发人员来说, Net Beans IDE 是一个替代选择。下载页面是 netbeans.org.downloads 的。
这些年来,Eclipse 获得了更多的用户,但是 NetBeans 仍然有它的支持者。最近,Oracle 宣布将 NetBeans 移交给 Apache 基金会以获得未来的支持。NetBeans 的粉丝认为这是一个积极的发展,因为现在 NetBeans 的长期支持者将能够继续其发展。
I will not be using NetBeans in the book, but you are free to do so. The projects should import easily. It is an IDE worth keeping an eye on in the future. Figure 1-19 shows the NetBeans main page. Figure 1-19
netbeans ide(netbeans ide)
1.8 竞争优势
在本章的前面,您开发了一个为基于 Java 的设备部署 CML 应用程序的策略。你还建立了一个方法论,数据驱动开发的 ML-Gates。目标是创造竞争优势,将您的 ML 解决方案货币化。实现这一目标需要的不仅仅是使用每个人都容易获得的开发工具。
This section will discuss two additional ingredients needed to help create a competitive advantage when designing ML solutions:
-
创造性思维
-
桥接域
尝试创建 ML 解决方案的关键成功因素之一是创造力。你需要跳出框框思考。这是老生常谈,但往往需要稍微不同的视角才能发现独特的 ML 解决方案。
站在巨人的肩膀上
如果你参观当地学院或大学的数学系、计算机系或物理系,你会发现走廊的墙上贴满了学术研究论文。细看之下,你会发现这些作品很多都是专注于机器学习的。如果你在网上搜索,你也会找到很多这样的论文。
PhD students in mathematics or statistics usually author these papers. They typically spend months or even years on the particular topic they are exploring. These papers are often difficult for developers to understand. Sometimes we may only grasp a fraction of the content. However, these papers are a very useful resource in our search for creative ideas.
学术研究论文可以为我们可以在机器学习应用中利用的内容和方法提供有价值的想法。
利用这些研究人员的发现可能会帮助您找到解决方案,或者为您节省大量时间。如果你找到一篇相关的研究论文,不要害怕联系作者。在大多数情况下,他们不是软件开发人员,你们可以建立有趣的合作关系。
桥接域
Everybody has access to the technologies in this book. How can we differentiate ourselves? Recall from Table 1-1 in the beginning of this chapter, ML terminology originates from different domains. Figure 1-20 shows a graphical view of the domains. As developers, we approach the problem from the technology domain. With our toolkits, we occupy a unique position, allowing us to produce Java ML solutions that lie at the intersection of the domains. Figure 1-20
域关系
企业有数据、要部署的资金(美元)和许多需要解决的问题。科学家有算法。作为 Java 开发人员,我们可以把自己定位在交叉点上,产生 ML 解决方案。最能理解业务问题,将问题与可用数据联系起来,并应用最合适的算法的开发人员将处于最有利的位置。
1.9 章节总结
在这一章中,我已经涉及了相当多的主题领域。以下是对主要发现的快速回顾。当你继续阅读这本书的其余部分时,请记住它们。
主要发现
-
采用数据驱动的方法。
-
“定了就算了”是不对的。您需要经常更新模型以反映基础数据的变化。
-
采用数据驱动的方法,如 ML-Gates。
-
总是从一个明确的问题开始。
-
不要求 DL 产生惊人的解决方案。您可以使用 CML 技术,对于许多现实场景来说,这种技术更容易构建和实现。
-
DL 可以规模化经营。您提供给模型的数据越多,它就变得越准确。
-
CML 对于较小的数据集表现更好。
-
创造性地思考以获得竞争优势。
-
科学研究论文可以提供极好的思想来源。
-
跨领域思考。弥合技术、商业和科学领域之间的差距。
二、数据:机器学习的燃料
-
回顾一下数据爆炸和使这场机器学习革命成为可能的三大趋势。
-
介绍数据的重要性,重新编程自己,像数据科学家一样思考。
-
查看不同类别的数据。
-
回顾各种格式的非结构化数据,包括 CSV、ARFF 和 JSON。
-
使用 OpenOffice Calc 程序准备 CSV 数据。
-
查找和使用公开可用的数据。
-
介绍创建您自己的数据的技术。
-
引入预处理技术以提高数据质量。
-
用 JavaScript 可视化数据(项目)。
-
为 Android 实现数据可视化(项目)。
2.1 大趋势
Why is the ML revolution happening now? It is not the first time. In Chapter 1, I reviewed the previous AI booms and subsequent winter periods. How do we know if this time it is for real? Three transformational megatrends are responsible for the movement.
三个 大趋势 为我们现在正在经历的机器学习革命铺平了道路:
1)数据爆炸
2)访问高度可扩展的计算资源
3)算法的进步
值得对这些大趋势进行更深入的探究。
数据爆炸
您可能已经看到过那些关于每天创建的数据量的疯狂统计。IBM 有一个被广泛引用的统计数据,表明今天互联网上 90%的数据是自 2016 年以来创建的。在 2016 年之前,大量数据肯定已经存在,所以这项研究证实了我们已经知道的事情:今天的人和设备正在以前所未有的速度产生大量数据。IBM 表示,每天产生超过 2.5 艾字节(25 亿吉字节)的数据。
How much data is actually out there, and what are the sources of the data? It is hard to know with any degree of certainty. The data can be broken down into the following categories :
-
互联网社交媒体
-
互联网非社交媒体
-
移动设备数据
-
传感器数据
-
公开日期
-
政府数据
-
私人数据
-
综合数据
Table 2-1 attempts to provide some insight into each category.Table 2-1
数据类别
|数据类别
|
观察
| | --- | --- | | 互联网数据 | 全球有 38 亿桌面互联网用户。 | | 2017 年,用户每分钟观看 400 万个 YouTube 视频。 | | 2017 年每天有 50 亿次谷歌搜索。 | | 社交媒体数据 | 每天有 6.55 亿条推文。 | | 每天有 100 万个新的社交媒体账户。 | | 有 20 亿活跃的脸书用户。 | | Instagram 帖子每天增加 6700 万条 | | 移动设备数据 | 2017 年每天发送 220 亿条短信。 | | 有 35 亿移动设备互联网用户。 | | 2017 年售出 4000 万台可穿戴设备。 | | 91%的人拥有移动设备。 | | 传感器数据 | 56%的人拥有智能设备。 | | 到 2020 年,将有 250 亿个物联网。 | | 到 2020 年,单个传感器的数量可能超过 1 万亿。 | | 物联网(IoT)市场完全是关于传感器的。物联网市场预计将从 2014 年的 3 万亿美元增长到 2020 年的 9 万亿美元,CAGR 为 20%。 | | 公开日期 | 研究机构提供大型数据集。比如加州大学尔湾分校(UCI)就有很多有用的数据集: | | GitHub 上牛逼的公开数据集:【https://github.com/awesomedata/awesome-public-datasets】?? | | CIA World Factbook 提供了 267 个国家的历史、人口、经济、政府、基础设施、军事等信息:【www.cia.gov/library/publications/the-world-factbook/】?? | | AWS 公共数据集是一个庞大的公共数据资源,包括 1000 基因组计划和 NASA 的地球卫星图像数据库:【https://aws.amazon.com/datasets】 | | 政府数据 | 人口普查数据。 | | 债务和融资数据。 | | 选举委员会数据。 | | 美国政府承诺在网上免费提供所有政府公共数据:【https://data.gov】 | | 私人数据 | 由于具有加速度计和 GPS 功能的低成本传感器设备和智能手机的可用性,个人越来越多地收集自己的数据。 | | 综合数据 | 模拟真实数据的计算机生成的数据。 |
As Table 2-1 suggests, there are many types of data. If you require a specific type of data for your ML project, a quick Google search will probably identify a dataset that can at least get you started on a proof of concept.
今天,我们几乎可以数字化任何东西。一旦数字化,数据就有资格进行机器学习。
You have heard the term “big data.” Similar to the terminology used in ML, the usage of this term is also inconsistent. Table 2-2 shows some guidelines for relative data sizes and the related architectures.Table 2-2
相对数据大小
|名字
|
大小
|
数据库ˌ资料库
|
体系结构
| | --- | --- | --- | --- | | 正常数据 | < 1GB | 平面/SQL | 当地的 | | 小数据 | 1GB - 100GB | NoSQL | 当地的 | | 中等数据 | 100GB - 1TB | NoSQL | 分布式的 | | 大数据 | 超过 1TB | hadoop spark | 分布式多集群 |
通常,大数据是指大于 1tb 的数据集。
您可能没有在项目中处理大数据规模的数据,但是在设计 ML 项目时考虑数据可伸缩性是很重要的。当今存在的大部分数据是非结构化的。这意味着它没有被标记或分类。它通常基于文本,并不真正遵循预定义的结构。我将在第三章讨论非结构化数据。
两章 2 和 3 都展示了帮助驯服数据爆炸的工具。
高度可扩展的计算资源
如果没有存储和处理数据的能力,数据爆炸是不可能的。第二个大趋势是我们今天拥有的高度可扩展的计算资源。
Cloud service providers have changed the game for practitioners of ML. They give us on-demand highly scalable access to storage and computing resources. These resources are useful for many ML functions, such as the following:
-
存储:我们可以使用云服务作为 ML 数据的存储库。
-
CPU 资源:通过配置具有大 CPU 容量的高可用性分布式计算集群,我们可以更快地创建 ML 模型。
-
托管:我们可以使用 API 或其他接口方法提供对数据或 ML 模型的托管访问。
-
工具:所有的云提供商都有一整套工具,我们可以用来创建 ML 解决方案。
第三章将详细介绍云提供商的潜在 ML 用例。
算法的进步
第三个大趋势是 ML 算法的进步。最大似然算法已经存在很长时间了。然而,一旦数据和 IaaS 提供商开始出现爆炸式增长,优化其性能的新努力就开始了。
DL 神经网络算法的进步是最重要的。然而,CML 算法也取得了进步。第四章将详细讲解算法。
2.2 像数据科学家一样思考
对于一个成功的 ML 项目来说,数据是唯一最重要的因素。你需要高质量的数据,而且你需要大量的数据。
数据挖掘就是处理你的数据,找出隐藏的模式。ML 采取了应用算法来处理数据的额外步骤。数据是每个学科的基本要素。在 DM 和 ML 中,您经常处理大型的、结构松散的数据集。
在构建能够有效处理数据的 ML 模型之前,您需要很好地理解您的数据。在 Nate Silver 的《信号与噪音》 中,作者鼓励我们对自己的数据拥有所有权。这真的是像数据科学家一样思考的本质。
作为软件工程师,我们习惯于思考代码。对我们来说,代码一直是最重要的。回想一下第一章,我颠倒了开发方法,将数据放在 ML-Gates 的前面,并将编码阶段保持到最后。
Mr. Silver summed it up perfectly:
数字本身无法说明问题。我们为他们说话。数据驱动的预测可以成功,也可以失败。当我们否认自己在这个过程中的角色时,失败的几率就会增加。在我们对数据提出更多要求之前,我们需要对自己提出更多要求。”
在今天的 ML 世界中,你必须从考虑数据如何影响你的解决方案开始,决定你有什么数据,你如何组织它,然后让数据驱动你的软件架构。
数据命名
A first step in taking ownership for your data is classifying the type of data itself. Before you can understand which algorithm is best suited for your well-defined ML problem, you need to understand the nature and type of the data you possess. Table 2-3 shows the two broad types of data.Table 2-3
常规数据类型摘要
|数据类型
|
描述
|
例子
| | --- | --- | --- | | 质量数据 | 观察结果分为不同的类别。数据是离散的,因为每个观察值可能属于有限数量的类别。 | 最喜欢的颜色:蓝色、绿色、棕色 | | 数据 | 当观察值是计数或测量值时,就会产生定量或数值数据。 | 人的身高 |
Qualitative data , classified as
-
如果类别之间没有自然顺序,则为名义上的(如眼睛颜色)。
-
如果存在排序,则为序数(如考试分数或班级排名)。
Quantitative data , classified as
-
离散,如果测量值是整数(如城市或国家的人口)。
-
连续的,如果测量值可以取任何值,通常在某个范围内(如一个人的身高或体重)。
定义数据
回想一下第一章,MLG5 要求您识别和定义您的数据。接下来,您将对一个数据集执行此任务,该数据集将用于本书后面的项目,即 Android Activity Tracker 应用程序。
表 2-4 中显示的数据来自 PAMAP2_Dataset,可从第一章中提到的加州大学欧文分校(UCI)机器学习库中获得。这是免费提供的数据,在用于研究目的时没有任何限制。您可以通过下面的链接下载数据集。由于数据集的大小,它不包括在图书资源中。这些文件很大,所以下载需要一些时间。
http://archive . ics . UCI . edu/ml/datasets/pamap 2+身体+活动+监控
To collect this data, the researchers asked subjects to wear sensors while performing various activities. The table shows each of the fields together with a data type assigned.Table 2-4
定义您的数据
|字段(列)
|
单位
|
例子
|
数据类型
| | --- | --- | --- | --- | | 时间戳 | 秒 | Three point three eight | 定量连续 | | 活动 ID | 1 躺 2 坐 3 站 4 走 5 跑 6 骑自行车 7 北欧 | Two | 定性名义 | | 心率 | 每分钟的节拍数 | One hundred and four | 定量离散 | | 传感器 1:温度 | 摄氏度 | Thirty | 定量离散 | | 传感器 1: 3D 加速度 | ms -2 | 2.37223 | 定量连续 | | 传感器 1: 3D 加速度 | ms -2 | 8.60074 | 定量连续 | | 传感器 1: 3D 陀螺仪 | 我喜欢 | 3.51058 | 定量连续 | | 传感器 1: 3D 磁力计 | 超声试验 | 2.43954 | 定量连续 | | 传感器 1:方向 | 拉德 | 8.76165 | 定量连续 |
当涉及到您的数据时,识别您拥有的数据类型是对自己要求更高的第一步。当您为数据构建分类器时,您将仔细查看第 7 章中的 PAMAP2_Dataset。
2.3 数据格式
Data format is a key consideration when building ML models. Table 2-5 shows the important file formats and their common file extensions.Table 2-5
常见数据文件类型
|文件格式
|
文件扩展名
| | --- | --- | | 文本文件 | . txt.dat | | 包括 MS Excel 和 OpenOffice Calc 在内的所有电子表格包都支持逗号分隔值(CSV) | 。战斗支援车 | | Weka 支持的属性关系文件格式 | 。飞机救援消防 | | 互联网上广泛使用的 JavaScript 对象符号(JSON)标准交换格式 | . json .txt 文件 |
当您为 ML 项目定位数据时,它可能是任何格式的。纯文本文件很常见。数据文件通常是。txt 或者。dat 文件,两者都是文本文件。表 2-1 中引用的加州大学欧文分校存储库中的许多数据文件是。dat 文本文件。
The first step in using text data files for ML is to open them and understand how they are structured. You can use any text editor. Figure 2-1 shows the subject101.dat file from the PAMAP2_Dataset. Figure 2-1
在文本编辑器中打开的 PAMAP2_Dataset 中的文件 subject101.dat
You can see that spaces separate the data fields. Each row contains 54 values or columns separated by a single space character. Note that Figure 2-1 does not show all of the columns. The easiest way to work with datasets for ML is to convert them to CSV. The first step is to make a copy of the .dat file and then rename it as .csv. Figure 2-2 shows the list of all files in the PAMAP2_Dataset, with the newly created .csv copy file. Figure 2-2
PAMAP2_Dataset。dat 文件到。战斗支援车
仅仅因为您将文件重命名为. csv 并不意味着它就是这样。你必须转换它。通过执行全局搜索并将空格替换为逗号,可以用您的文本编辑器执行转换,但是还有更好的方法。你将使用一个电子表格程序。
CSV 文件和 Apache OpenOffice
电子表格程序的优点是允许你对我们的数据做一些基本的编辑。它们还允许您轻松导入或导出 CSV 文件。
Microsoft Excel 可以完成这项工作,但 Apache 开源程序 OpenOffice 是更好的选择。OpenOffice 包含一个电子表格、文字处理器、演示包、数据库、矢量图形编辑器和数学公式编辑器。你对电子表格程序 Calc 感兴趣。您需要下载整个套件。
Calc has several advantages over Excel, including
-
Calc 是免费的开源软件,在 Apache 2.0 软件许可下获得许可。它是 OpenOffice 套件的一部分。
-
Calc 更擅长导入导出 CSV 文件。还有更多的选项可用,比如对引号(" ")中的文本字段进行转义。
-
Calc 支持数据字段的 UTF-8 编码。这一点很重要,尤其是当您的项目使用国际字符集或多字节字符集时。
-
Calc 支持 BOM 处理。BOM 代表字节顺序标记。Windows 系统使用 BOM 作为每个文件的第一个字符来通知应用程序字节顺序。在 Windows 中创建的包含 BOM 的文件在其他平台(如 Unix)上可能会有问题。当你在 Calc 中保存文件时,Calc 让你指定你想要如何处理 BOM(非常周到;谢谢阿帕奇)。
Figure 2-3 shows the installation screen for Apache OpenOffice. The OpenOffice download link is www.openoffice.org/download/ . Figure 2-3
安装 Apache OpenOffice
Once you have installed OpenOffice, launch Calc. If you are familiar with the Microsoft Office suite, you will notice that Calc looks similar. Open the subject101.csv file you copied earlier. Figure 2-4 shows that Calc recognizes it as a text file and give you some import options on the text import window. Figure 2-4
OpenOffice Calc 导入 CSV 文件
Calc 允许您为每个检测到的字段选择字符集、字段分隔符,甚至是列类型。该数据最重要的设置是选择空格作为分隔符。检查完空格后,您将看到文本导入窗口底部显示的字段中正确填充了数据。
After you click OK, Calc will import the data.
您将使用的 PAMAP2_Dataset 很大。仅单个文件subject 101 . dat**就包含 54 列和 376417 行。这是一个很大的电子表格,所以给 Calc 一些时间来导入或导出文件。
Figure 2-5 shows the file after importing into Calc. Figure 2-5
导入 OpenOffice Calc 的 subject101.dat 文件
The advantage of using Calc over a text editor is that once Calc completes the import, it is easy to view and manipulate the data. Some common operations for manipulating ML data in Calc are as follows:
-
您可以搜索缺少的值。这个文件中的数据相对干净。缩写“NaN”代表“不是数字”,代表缺失值。列 C 主要包含 NaN 值。
-
添加或删除列很容易。如果您希望删除某列,只需突出显示该列,右键单击并删除即可。移除不需要的列减小了大小,因此减少了导入、导出和训练 ML 模型所需的时间和存储空间。
-
宏可以根据条件(如单元格的值)删除行或列。例如,如果您想要删除数据中所有缺少的值行,这将非常有用。Calc 可以使用 Excel 宏。它还允许你记录击键。
-
您可以使用“,”作为分隔符,以真正的 CSV 格式导出文件。
Figure 2-6 shows the save dialog box for the CSV file export. Click the “Keep Current Format” box to save a CSV file. Figure 2-6
保存 CSV 文件
大多数 ML 环境都允许直接导入 CSV 文件,Apache OpenOffice Calc 是准备此类文件的最佳方式。CSV 是您可以用于 ML 的最简单的数据格式。接下来,您将看到更复杂的其他方法。
ARFF 档案
ARFF is an abbreviation for Attribute-Relation File Format. It is an extension of the CSV file format. The Weka machine learning environment uses ARFF files to load data. Weka comes with many sample datasets. The iris flower dataset is one of the most famous in machine learning. The following code block shows a partial view of the iris.arff dataset included with the environment:001 @relation iris-weka.filters.unsupervised.attribute.Remove-R1-2 002 % Iris.arff file available with the Weka distribution (partial file) 003 004 @attribute petallength numeric 005 @attribute petalwidth numeric 006 @attribute class {Iris-setosa,Iris-versicolor,Iris-virginica} 007 008 @data 009 1.4,0.2,Iris-setosa 010 1.4,0.2,Iris-setosa 011 1.3,0.2,Iris-setosa 012 1.7,0.2,Iris-setosa 013 1.5,0.4,Iris-setosa 014 1,0.2,Iris-setosa 015 1.7,0.5,Iris-setosa 016 1.9,0.2,Iris-setosa 017 1.5,0.2,Iris-setosa 018 1.4,0.2,Iris-setosa 019 4.7,1.4,Iris-versicolor 020 4.5,1.5,Iris-versicolor 021 4.9,1.5,Iris-versicolor 022 4,1.3,Iris-versicolor 023 3.3,1,Iris-versicolor 024 4.2,1.3,Iris-versicolor 025 6.6,2.1,Iris-virginica 026 5.4,2.3,Iris-virginica 027 5.1,1.8,Iris-virginica Note that the familiar CSV data follows the @data directive at the bottom of the file. In ARFF files, an additional header at the top provides metadata about the data and labels. The following describes the differences between CSV and ARFF file formats:
-
注释从注释行前面的百分号%开始。
-
@relation 指令启动文件并允许您指定数据集的名称。
-
@attribute 指令定义了数据集中每个属性的名称和数据类型。
-
ARFF 文件的头段(在 @data 指令上面)可以包含空行。
-
名义数据,比如***@属性类*** ,后面是它们可以采用的一组值,用花括号括起来。
-
CSV 数据遵循 @data 指令。
-
数据集中未知或缺失的值用问号“?”表示。。
Weka 包括将 CSV 数据转换为 ARFF 格式的转换工具。一旦生成了初始的 ARFF 文件,就没有必要再进行转换了。
数据
CSV 和 ARFF 文件非常有用。然而,CSV 数据的平面结构没有提供太多的灵活性。您的工具箱中需要一个额外的工具来帮助您表示更复杂的数据结构。
作为 Java 或 Android 开发人员,您可能对 JSON 很熟悉。JSON 代表 JavaScript 对象符号。它是一种非常轻量级的、基于文本的、灵活的交换格式。JSON 是一种广泛用于服务器和客户端设备之间的数据交换格式。
你可以在json.org了解更多关于 JSON 如何工作的信息,并找到所有平台的下载。
JSON has several important properties that have helped to make it hugely popular across the Internet and especially for mobile app development:
-
JSON 对于我们来说很容易读写,对于机器来说也很容易解析和生成。
-
几乎每个平台和语言都有一个 JSON 库。
-
JSON 基于 JavaScript 编程语言的子集,因此得名。
-
JSON 是一种文本格式,与语言无关。
-
JSON 使用 C 语言系列的程序员熟悉的约定。
JSON 使用简单但功能强大的 数组 和 对象 集合来表示数据。名称/值对通常表示对象中的数据。这使得 JSON 在整个互联网上非常流行。JSON 的灵活结构使它能够表示非常复杂的数据关系。
In JSON, the placement of parenthesis and brackets to represent arrays and objects is very important. Figure 2-7 shows valid construction rules for JSON structures. Figure 2-7
JSON 结构定义
注意(左括号)和和{(左括号)和}(右括号)在 JSON 中作为标识符的用法。
JSON 由两个原语组成,对象和数组,以及可以是字符串、数字、对象、数组或布尔值的值。JSON 出奇的简单,如图 2-7 所示。
Using only the following two primitives, you can construct complex structures to represent almost any type of data relationship:
-
JSONObject:名称/值对的无序集合或集合
-
JSONArray:值的有序列表
Both JSON objects and JSON arrays contain values. A value can be any of the following:
-
双引号中的字符串
-
一个数字
-
真实的
-
错误的
-
空
-
另一个 JSON 对象
-
另一个 JSON 数组
Notice that values can also be JSON objects or JSON arrays. This feature of JSON provides the secret that makes it so powerful:
JSON 是一种强大的表示结构的方式,因为它允许 JSON 对象和 JSON 数组结构的嵌套。
Recall the iris.arff file discussed in the last section. You can also represent this data using JSON, as shown in part in Listing 2-1. Note that just like the ARFF file, the JSON representation also contains a header and a data section.001 { 002 "header" : { 003 "relation" : "iris", 004 "attributes" : [ 005 { 006 "name" : "sepallength", 007 "type" : "numeric", 008 "class" : false, 009 "weight" : 1.0 010 }, 011 { 012 "name" : "sepalwidth", 013 "type" : "numeric", 014 "class" : false, 015 "weight" : 1.0 016 }, 017 { 018 "name" : "petallength", 019 "type" : "numeric", 020 "class" : false, 021 "weight" : 1.0 022 }, 023 { 024 "name" : "petalwidth", 025 "type" : "numeric", 026 "class" : false, 027 "weight" : 1.0 028 }, 029 { 030 "name" : "class", 031 "type" : "nominal", 032 "class" : true, 033 "weight" : 1.0, 034 "labels" : [ 035 "Iris-setosa", 036 "Iris-versicolor", 037 "Iris-virginica" 038 ] 039 } 040 ] 041 }, 042 "data" : [ 043 { 044 "sparse" : false, 045 "weight" : 1.0, 046 "values" : [ 047 "5.1", 048 "3.5", 049 "1.4", 050 "0.2", 051 "Iris-setosa" 052 ] 053 }, 054 { 055 "sparse" : false, 056 "weight" : 1.0, 057 "values" : [ 058 "4.9", 059 "3", 060 "1.4", 061 "0.2", 062 "Iris-setosa" 063 ] 064 }, 065 { 066 "sparse" : false, 067 "weight" : 1.0, 068 "values" : [ 069 "5.9", 070 "3", 071 "5.1", 072 "1.8", 073 "Iris-virginica" 074 ] 075 } 076 ] 077 } Listing 2-1
iris.json,iris.arff 数据集的 json 表示
如果您想尝试 json 格式的 iris 数据集,可以在参考资料一书中找到文件 iris.json 。
You might be asking why we need JSON for data files when we already have CSV and ARFF that are perfectly capable of representing data for ML. There are two reasons you may want to consider using JSON:
-
JSON 是网络数据交换的理想选择。如果您需要将数据发送到联网设备,使用 JSON 和 HTTP 是一项简单的任务,但是使用 CSV 和 ARFF 就不那么简单了。
-
许多 NoSQL 数据库使用 JSON 文件作为数据的对象存储。我将在第三章进一步讨论这些数据库。这种数据库架构解决了大量数据带来的可伸缩性问题。
JSON 文件总是比 CSV 或 ARFF 版本大,因为它们包含缩进的结构和空间。文件大小的增加是对 JSON 提供的额外灵活性的公平权衡。
Weka 桌面环境使得 ARFF 和 JSON 之间的转换变得很容易。你将在第四章中探索 Weka。
2.4 JSON 集成
JSON 是 ML 解决方案的重要组成部分。JSON 的优势之一是几乎每个开发平台都有库。它是真正的跨平台。因为您关注的是 Java,所以接下来您将研究如何集成 JSON for Android 和 Java JDK。
带有 Android SDK 的 JSON
JSON has been included in Android since the earliest release of the SDK. Table 2-6 shows a list of the Android JSON classes including the exception handler.Table 2-6
Android SDK 中包含的 JSON 类
|班级
|
描述
| | --- | --- | | JSONArray | 密集的索引值序列 | | 【jsonobject】 | 一组可修改的名称/值映射 | | 【jsconstraint inger】 | 实现了JSON object . tostring()和JSON array . tostring() | | 【jsontokener】 | 将 JSON 编码的字符串解析为相应的对象 | | JSONException | 抛出表示 JSON API 有问题 |
The JSONArray and JSONObject objects are all you need to manage your JSON encoding and decoding. The following code shows how to define JSON objects and JSON arrays in Android:001 // Define a new JSON Object 002 // Remember that JSON Objects start with { (left brace) and end with } (right brace) 003 004 JSONObject jsonObject = new JSONObject(myJsonDataString); 005 006 // Define a new JSON Array 007 // Remember that JSON Arrays start with [ (left bracket) and end with ] (right bracket) 008 009 JSONArray jsonArray = new JSONArray(myJsonDataString);
有效使用 JSON 的诀窍在于使用 JSON 对象和 JSON 数组原语定义 JSON 数据结构来表示您的数据。你将在本章的后面探索如何实现这一点。
带有 Java JDK 的 JSON
虽然 JSON 类从一开始就包含在 Android SDK 中,但 Java JDK 却不是这样。要在 Java 中使用 JSON,必须包含 JSON 库。
There are many JSON libraries available for Java. Table 2-7 shows two common sources for Java JDK JSON libraries.Table 2-7
Java JDK 的 JSON 库
|JSON 源代码
|
环
| | --- | --- | | 谷歌 JSON 简单 | 【https://code.google.com/archive/p/json-simple/】 | | Maven JSON 存储库 | 【https://mvnrepository.com/artifact/org.json/json】 |
Maven 存储库很有用,因为它允许您下载 Eclipse 的 jar 文件。Maven 资源库中有许多版本的 JSON。20171018 版本运行良好,可从以下链接获得:
【https://mvnrepository.com/artifact/org.json/json/20171018】
Figure 2-8 shows the download page for this version of Java JSON. The page contains instructions for many different types of build environments, including Maven, Gradle, SBT, Ivy, and others. The Java build environment you use will determine how you include the JSON library. Figure 2-8
Java JSON 的 Maven 仓库
如果您希望下载 Eclipse 的 jar 文件,请选择“JSON Libraries”并下载 jar zip 文件。然后,您可以直接将 jar 文件库添加到 Eclipse Java 构建路径中。
Figure 2-9 shows the json-20171018.jar file added to the Eclipse Java build path. Figure 2-9
JSON jar 库的 Eclipse IDE Java 构建路径
将 JSON 添加到 Java JDK 之后,您现在可以利用 JSON 的强大功能来满足您所有的 ML 数据结构需求。无论您是使用 Eclipse 的外部 Java JSON 库还是 Android Studio 中的内置 Android JSON 库,您编写的用于 JSON 对象和数组的 Java 应用程序代码都是相同的。
2.5 数据预处理
One of the key activities for ML-Gate 5 is data preprocessing . There are many potential actions you can take in this area to improve the quality of your data. This section does not include an exhaustive list. Nor does it provide a deep dive into the mathematical or statistical principles behind each technique.
了解您的数据是无可替代的。这是一项耗时的手工练习。提前投入时间分析数据以提高数据的质量和完整性,在 ML 项目的后期总是有回报的。
请将以下部分视为一个清单。在选择 ML 算法、构建 ML 模型或编写任何代码之前,您可以使用清单来探索数据的各个方面。随着时间的推移,数据清理会有回报。
实例、属性、标签和特征
At the top of the checklist is the identification of instances, attributes, labels, and features. ML-Gate 6 requires you to have a well-defined problem. This directly relates to understanding the structure of your data. Some important definitions:
-
实例:一行数据。实例是机器学习方案的输入。CSV 文件可以将实例表示为独立的列表,而 JSON 可以表示数据中的关系。
-
属性:一列数据。属性可以有不同的数据类型,如实数、整数、名义值或字符串。对于监督学习,存在属性、要素和标注的类型。
-
特性:描述性属性。
-
标签:你试图预测或预报的东西。
例如,如果您回顾表 2-3 中的数据,该表显示了 PAMAP2 数据集的属性(或列)。回想一下,在这个数据集中有 54 个属性(或列)。在这个数据集中, 活动 Id 是标签,其余属性是特征。
Checklist questions to ask:
-
所有实例的结构是否一致?
-
有多少实例?
-
有多少属性?
-
数据集的格式和原始文件大小是什么?
-
属性包含标签还是所有属性都是特征?
-
是否所有标签都包含合规值?
-
以后可以添加新属性吗?
-
如果添加一个新属性,如何更新新属性的现有实例?
最后两个问题特别重要,因为数据集会随着时间的推移而增长和发展。当您添加新的属性时,实际上在更改之前的每个实例中都缺少该属性的值。在下一节关于缺失值和重复值的内容中,我将讨论一些处理这种情况的技术。
数据类型识别
Table 2-2 summarized the data types for ML datasets. Define the data type of each attribute in your dataset. The data types can be either
-
定性数据(名义数据或序数数据)
-
定量数据(离散或连续)
一些公司为他们所有的软件项目维护一个数据字典。数据字典表示所有数据资产的正式记录,包括每个属性的数据类型。这是最佳实践。维护数据字典会产生开销,但是正如数据清理随着时间的推移会有回报一样,数据组织知识也会有回报。
Checklist questions to ask:
-
数据集中的每个属性都有定义的数据类型吗?
-
在项目生命周期中,当做出影响数据设计的更改时,数据类型是否会更新?
缺失值和重复值
缺失值和重复值是数据预处理的一个重要方面。
缺失值可以采用空白、破折号或 NaN 的形式,如您在 PAMAP2_Dataset 中所见。
Missing values are not hard to find. The difficulty lies with what action you should take when you find them. Missing values tend to fall into two categories:
-
MCAR(完全随机失踪)
-
系统性缺失:价值缺失是有原因的。
值丢失并不能说明值丢失的原因。当您发现缺少值时,您必须仔细考虑解决方案。大多数最大似然算法不重视缺失值。用生成的值替换丢失的值有时可以提高整体数据的完整性。这完全取决于数据的上下文。
There are multiple approaches you can consider when handling missing values. When you have familiarity with the data and the collection methodology, you can make an informed judgement and select one of the following approaches:
-
不要采取行动。保留丢失的值。
-
将该值替换为“未测试”或“不适用”指示器。在这种情况下,您添加了细节并提高了数据完整性,因为您主动知道某个值不应该出现。
-
如果标签包含缺少的值,您应该考虑删除整个实例,因为它不会为您定型的模型增加值。
-
如果数据类型为定量和范围限制,则为缺失值分配范围下限或范围上限。有时,您有一个范围内的规范化值,分配一个最小值或最大值可以使算法更有效。
-
为缺失值估算一个值。估算是指在研究其他属性的基础上用新值替换该值。
重复并不总是容易找到的。一旦找到,它们就相对容易处理。它们可以被删除,或者如果可行的话,如果不是所有属性都重复,它们可以与其他实例组合。
Checklist questions to ask:
-
数据集有重复的值吗?如何找到重复的值?存在重复项时,如果数据集完整性增强,请删除该实例。
-
数据集是否有缺失值?如何解决缺失值以最大化数据集完整性?
错误值和异常值
发现数据中的错误和异常值比识别缺失值和重复值更困难。
Let’s start with an example. The dataset shown in Figure 2-10 is a time series containing 24 data points. The graph shows data released by the Belgium Ministry of Economy. It represents international phone calls made during a 23-year period. Figure 2-10
24 个点的时间序列数据集
很明显,在七年的时间里,这些数据包含了几个异常值。知道了这些数据的来龙去脉,有些事情就说不通了。我们可以想象这样一个场景,这样一个数据集是有意义的。例如,如果我们查看一家钢铁厂的生产量,并且我们知道有一个多年的时期,战争导致需求激增,会怎么样?这样的图表可能有意义。
然而,在这种情况下,数据没有意义。我们应该忽略异常值吗?
事实证明这个数据是错误的。在 1963 年至 1970 年期间,该部使用了不同的记录方法。受影响期间,数据代表的总分钟数,而不是 的总通话数 。哎呀。
**即使我们不知道是什么导致了错误,我们仍然应该删除异常值,因为它们在数据的上下文中没有意义。我们可能不会注意到 1963 年和 1970 年的轻微影响,但保留它们不会产生剧烈的影响。
图表包括两条回归线。回归是一种简单的预测方法。在这种情况下,最小二乘法不是很准确,因为它很容易受到异常值的影响。最小中值平方回归方法在忽略异常值方面做得更好。
在这种情况下得到的教训是,我们需要评估异常值,然后选择一种 ML 方法,尽可能减少异常值的影响。
讽刺的是,机器学习可以检测异常值。一类学习是 ML 用于这个任务的特殊类。
Checklist questions to ask:
-
数据的可视化会显示异常值吗?
-
异常值在数据环境中有意义吗?如果是这样,考虑删除离群值。
-
如果异常值持续存在,考虑一种可以合理容忍噪声数据的方法。
用 OpenOffice Calc 进行宏处理
在第三章,我会介绍 Weka ML 环境。Weka 使用其基于 Java 的工具具有许多预处理数据的能力。但是,您也可以使用 OpenOffice Calc 的宏处理功能来预处理您的数据。
学习使用 Calc 电子表格宏是一个非常强大的 ML 工具。宏允许您根据特定条件对数据文件进行批量更改。它们允许你自动化重复的任务。对于大型数据集,这可以节省您大量的时间和精力。Calc 就像 Microsoft Excel 一样,使用 Visual Basic 来处理宏。
与 Microsoft Excel 一样,Calc 对宏使用 Visual Basic 编程语言。不难掌握。Calc 宏可以自动执行您可以手动执行的任何电子表格操作。Calc 允许你记录击键来构建宏。Calc 还允许您手动输入宏代码。
OpenOffice 文档的第 12 章包含对 Calc 宏的精彩介绍:
www . open office . org/documentation/manuals/user guide 3/0312 cg3-calc macros . pdf
OpenOffice wiki 页面上提供了 Calc 宏的其他文档:
The following code shows a useful macro for iterating through all rows in a Calc spreadsheet and displaying non-empty cells. Calc and the Visual Basic language contain a huge library of functions and the possibilities are endless.001 Sub TraverseRows 002 Dim oRange 'The primary range 003 Dim oSheet 'Sheet object 004 Dim oRows 'Rows object 005 Dim oRow 'A single row 006 Dim oRowEnum 'Enumerator for the rows 007 Dim s As String 'General String Variable 008 009 oSheet = ThisComponent.Sheets(3) 010 oRange = oSheet.getCellRangeByName("B6:C9") 011 012 oRows = oRange.getRows() 013 014 oRowEnum = oRows.createEnumeration() 015 Do While oRowEnum.hasMoreElements() 016 oRow = oRowEnum.nextElement() 017 s = s & NonEmptyCellsInRange(oRow, " ") & CHR$(10) 018 Loop 019 MsgBox s, 0, "Non-Empty Cells In Rows" 020 End Sub
如果您正在努力寻找对数据进行必要清理的方法,Calc 宏是一个很好的解决方案,尤其是对于 CSV 数据。
If you have huge spreadsheets, Calc macros might not offer the best performance for data cleaning and manipulation. The limitations of Apache OpenOffice Calc are
-
最大行数:1,048,576
-
最大列数:1,024
-
最大张数:256
JSON 验证
如果使用 JSON 作为数据格式,需要在创建后验证 JSON。有许多在线工具可以执行 JSON 验证。它们中的许多都是开源的或者是用脚本语言创建的,所以如果您愿意,您可以在本地运行验证。
Figure 2-11 shows the JSON validation of the file you created earlier in the chapter by the online tool available at https://jsonlint.com . Figure 2-11
JSON 验证
运行您创建的任何 JSON 总是一个好主意,特别是如果您通过 JSON 验证手动创建它。
Checklist question to ask:
-
用 JSON 表示数据吗?在建模之前验证所有 JSON 文件。
2.6 创建您自己的数据
在本章的前面,我将私有数据和合成数据列为潜在的数据源。我们生成这两类数据。合成数据代表由计算机创建的数据。我们都携带着有史以来最伟大的数据收集设备:智能手机。您可以利用其数据创建能力来解决第一章中提出的问题,即表 1-11 中所示的室内位置跟踪要求(R1)。接下来,您将探索这一需求的潜在解决方案。
Wifi 聚集
我们的移动设备能够扫描 Wifi 和蓝牙网络。当你使用这些 Wifi 扫描应用程序时,你会注意到有许多 Wifi 信号分布在可用的频道上。当你在空间中移动时,这些信号代表数据。
Figure 2-12 shows a typical room that has three different Wifi access points (AP) visible to a device. The signal strength received by the device depends on many factors, such as proximity to the AP and obstructions within the space. The combined strength of these signals throughout the space can allow you to locate the device. Figure 2-12
使用 Wifi 信号强度进行室内定位
两种度量单位 dBm 和 RSSI 代表信号强度。RSSI 是一个相对指数,而 dBm 是一个绝对数字。对于 dBm,越接近 0 dBm,信号越好。Android 设备返回的相关 RSSI 在-100(最弱)到-55(最强)之间。
您将使用 AndroidWifi manager从所有可见的 Wifi 接入点(AP)收集信号强度信息。移动电话用户熟悉设备状态栏中显示的四栏 Wifi 信号强度图标。Android 提供了一个名为wifi manager . calculate signal level的静态方法,在 0-4 的范围内计算信号电平。Android 使用这个值来生成信号强度图标。该方法还可以提供图 2-12 所示的 归一化 值。
As an example, let’s consider the simple code required to gather the Wifi signal strength data and save it in JSON format as the Android device moves around a room. Listing 2-2 shows the key Android code. This code is not a complete Android project, but the code excerpt file, WifiCollect.java is available in the book resources if you wish to leverage it when building your own project.001 private WifiManager wifi; 002 private JSONObject wifiResults = new JSONObject(); 003 004 @Override 005 public void onCreate() { 006 wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); 007 008 // register wifi intent filter 009 IntentFilter intentFilter = new IntentFilter(); 010 intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 011 registerReceiver(mWifiScanReceiver, intentFilter); 012 013 wifiResults = new JSONObject(); 014 } 015 016 private final BroadcastReceiver mWifiScanReceiver = new BroadcastReceiver() { 017 @Override 018 public void onReceive(Context c, Intent intent) { 019 if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 020 List wifiScanList = wifi.getScanResults(); 021 for (int i = 0; i < wifiScanList.size(); i++) { 022 String name = wifiScanList.get(i).BSSID.toLowerCase(); 023 int rssi = wifiScanList.get(i).level; 024 Log.v(TAG, "wifi-ssid: " + name + " => " + rssi + "dBm"); 025 try { 026 wifiResults.put(name, rssi); 027 } catch (Exception e) { 028 Log.e(TAG, e.toString()); 029 } 030 } 031 saveData(); 032 } 033 } 034 }; Listing 2-2
WifiCollect.java-用于 Wifi 数据采集的示例 Android 代码
To summarize the key code in Listing 2-2:
-
您在 002 行定义了一个 JSONObject 。该对象将保存设备在扫描过程中识别的所有 Wifi 网络的名称(SSID)和信号强度。
-
在 onCreate() 方法中,使用 Androidwifi manager创建一个 intent 并注册一个broadcast receiver。
-
因为你用的是 Wifi,记得在清单文件中包含SCAN _ Wifi _ NETWORKS和ACCESS _ Wifi _ STATE的权限。
-
你在 016 行定义了**。Android 在检测到新的 Wifi 网络时会通知 广播接收器 。**
*** 第 022 行和第 023 行显示了从 Wifi 扫描中检索到的网络名称和信号水平。这些值存储在 JSON 对象的第 026 行。JSON 对象随着 广播接收器 接收新网络而增长。
* 第 031 行显示了对 ***saveData()*** 函数的调用。这个函数将保存 JSON 对象以供处理。您可能希望通过网络将它发送到服务器,添加到 NoSQL 数据库,或者在内部使用它在设备上建立模型。**
**This approach to determining indoor location is very accurate and can operate with very low latency. To achieve the result requires a two-step process:
-
使用清单 2-2 中所示的代码绘制出您的空间并收集 Wifi 数据样本。对于您采集的每个样本,将其分配到一个标签上,以标识设备在空间中的位置。例如,您可能希望将目标空间划分为一个正方形网格,并为网格位置指定编号。
-
一旦您收集了该空间的所有数据,就可以使用它来构建 ML 模型。然后,您可以使用该模型来预测您在房间中的位置。
使用 ML 进行室内定位是创建您自己的数据来解决 ML 问题的一个强大示例。为了使解决方案更加健壮,您可以对蓝牙信号实现相同的方法。
虽然这个例子说明了在设备附近收集和使用射频数据,但智能手机还擅长产生另一种类型的数据:传感器数据。我会在最后一章详细讨论传感器数据,包括 Java 设备和 Android 智能手机的 ML 传感器数据实现。
2.7 可视化
能够可视化您的数据非常重要。可视化使您能够轻松洞察数据。数据可视化是最好的工具之一,您可以将它添加到您的工具包中,以便对自己的数据提出更高的要求。
实现数据可视化的最佳方法之一是将第三方开源图形库与 web 浏览器或 Android WebView 结合使用。应用这种方法,你可以用最少的代码生成惊人的可视化效果。
JavaScript 可视化库
Table 2-8 shows a partial list of visualization libraries available. JavaScript is the language of choice for most of these libraries because it provides the following benefits:
-
所有现代浏览器都支持 JavaScript,包括 Android 的 WebView 控件。这意味着您创建的任何可视化都可以跨平台广泛使用。
-
JavaScript 擅长交互式功能。这使得你的可视化比静态图像更引人注目。
Table 2-8
JavaScript 可视化库
|库/链接
|
描述
| | --- | --- | | D3 加 d3plus.org | D3 加 2.0 版本。惊人的例子和可视化设置。 | | 传单 leafletjs.com | 一个面向移动友好的交互式地图的开源 JavaScript 库。 | | 时间线 JS timeline.knightlab.com | 开源工具,使任何人都能构建视觉丰富的交互式时间线。 | | highcharts.com 排行榜 | 广泛使用的库。简单而强大的制图 API。需要许可证。 | | fusioncharts.com 融合 | 网络和移动 JavaScript 图表。包括 90 多张图表和 1000 多张地图。免费。 | | dygraphs.com dygraphs | 快速、灵活、开源的 JavaScript 图表库。允许用户探索和解释密集的数据集。 | | Plotly plot.ly | 通过 Web 撰写、编辑和共享交互式数据可视化。 | | Raw rawgraphs.io | 电子表格和数据可视化之间缺失的环节。 | | chartjs.org 图表 | 简单、灵活的 JavaScript 图表。开源。不错的过渡和动画。 | | Datawrapper datawrapper.de | 从数据到漂亮的图表。被很多记者使用。包月模式。 | | chartblocks chartblocks . com . cn 上的信息 | 在线图表制作工具。包月模式。 | | 谷歌图表 developers.google.com/chart | 简单易用,丰富的交互式图表库。免费。 | | tableau . com 表格 | 拥有许多大客户的大型商业解决方案。纽交所上市。 | | Infogram infogr.am | 提供完整产品的大型企业供应商。 |
表 2-8 中的库都非常有能力帮助你可视化你的数据。当您探索它们时,您可能会发现其中一个最符合您的要求。Highcharts 和 D3 Plus 是两个最流行的库。
D3 加
D3 代表数据驱动文档。D3 是一个 JavaScript 可视化包。它很轻。D3 Plus 是 D3 的扩展。D3 Plus 目前支持的版本是 2.0 版。
You will explore D3 Plus in more detail for the following reasons:
-
D3 是一个基于 JavaScript 的,提供流畅的交互用户体验。
-
所有的现代浏览器都可以呈现 JavaScript,所以这对于 Java 和 Android 应用程序来说都是一个很好的解决方案。
-
D3 Plus 使得创建和显示 CSV 和 JSON 可视化变得非常简单。
-
免费开源。
D3 库、D3 Plus 和综合图表库的下载链接位于
github . com/D3/D3/wiki/gallery
接下来,您将在 D3 可视化项目中使用树状图表类。树形图是一种显示层次结构的树形图。D3 图库页面链接到位于bl.ocks.org/mbostock/4063570的树突图示例。
2.8 项目:D3 可视化
你在本章前面已经看到 CSV 和 JSON 是 ML 的有用数据格式。在这个项目中,您将为桌面浏览器实现 D3 可视化。
树形图对显示层次结构很有用。该项目将探索各种树状结构来可视化 CSV 和 JSON 数据。
Table 2-9 shows the project file summary. The book resources contain the zip file, d3_visualization.zip, which includes all the project files.Table 2-9
D3 可视化项目文件摘要
|项目名称:D3 可视化 来源:D3 _ Visualization . zip类型:桌面浏览器
| | --- | |
文件
|
描述
| | --- | --- | | d3.min.js | D3 库 | | flare . CSV | CSV 数据文件 | | flare . JSON | JSON 数据文件 | | dendo-CSV . html??] | 使用 csv 数据的树状图示例 | | 树-dendo-CSV . html??] | 使用 csv 数据的树形图示例 | | 径向 dendo-CSV . html??] | 使用 csv 数据的径向树树状图示例 | | collapse-tree-json.html | 使用 JSON 数据的可折叠树形图示例 | | 丛集 dendo-json.html | 使用 json 数据的聚类树状图示例 |
可视化就是选择最好的图形样式来表示数据。树形图非常适合 JSON 可视化,因为它们显示了层次结构。
在这个项目中,你有两个数据文件源, flare.csv 和 flare.json 。它们代表相同数据的不同文件格式。D3 能够将每个版本渲染成几个有趣的树状结构。如果您希望呈现另一种图表类型,代码可能与示例非常相似;只需查看 D3 图库中您想要的图表的代码示例。
要在浏览器中查看可视化,您必须设置一个 web 服务器来托管表 2-9 中所示的文件。如果您希望在您的桌面上本地查看它们,您可以安装本地 web 服务器,这取决于您的桌面平台。
If you need to install a web server, refer to the following platform-specific instructions:
-
Windows: IIS 是 Windows 上最流行的 web 服务器,但默认情况下不启用。要启用它,请遵循以下说明:
https://msdn . Microsoft . com/en-us/library/ms 181052(v = vs . 80)。aspx
-
Windows:您也可以在 windows 上安装 WAMP 软件。WAMP 代表视窗,阿帕奇网络服务器,MySQL,PHP。要安装 WAMP Windows 版,请按照以下说明操作:
-
Mac:苹果电脑预装了 Apache web server。
一旦你设置好你的网络服务器,只需将你的浏览器指向五个 HTML 文件中的一个。对于所选的数据格式类型,每个文件呈现的树形图略有不同。
D3 可视化需要最少的 JavaScript 代码。JavaScript 代码包含在 HTML 文件中。清单 2-3 展示了一个从 CSV 数据中呈现树状结构的***【dendo-csv.html】***文件的例子。
There are two key parts in the structure of any D3 based visualizations:
-
需要包含对 D3 库文件的引用。您可以使用库的本地副本或在线存储库。将库引用包含在 <脚本> 标签内(第 014 行)。
-
使用 d3.csv 赋值语句(第 025 行)指定要为可视化加载的 CSV 文件。
Note that Listing 2-3 includes the JavaScript code (lines 016-053) and the CSS style code (lines 004-010) used to format the visualization.001 002 003 004 005 .node circle {fill: #999;} 006 .node text {font: 10px sans-serif;} 007 .node--internal circle {fill: #555;} 008 .node--internal text {text-shadow: 0 1px 0 #fff, 0 -1px 0 #fff, 1px 0 0 #fff, -1px 0 0 #fff;} 009 .link {fill: none; stroke: #555; stroke-opacity: 0.4; stroke-width: 1.5px;} 010 011 012 013 014 015 016 Listing 2-3
dendo-csv.html
A dendogram aligns each of the lower-level leaf nodes, so the visualization appears right justified. Figure 2-13 shows the dendogram visualization of the CSV file that D3 generates when you open the dendo-csv.html file in your browser. Figure 2-13
由 dendo-csv.html 生成的树突图可视化
树突可视化显然比原始 CSV 文件更容易阅读。
如果你想改变树形图的样式,你可以在 HTML 文件的 004-010 行修改 CSS 元素。CSS 代表级联样式表。它是网页布局设计和样式的通用语言。它可以控制布局的所有方面,如字体、字体大小、边距、填充、间距、对齐等。
如果您希望更改呈现的树状结构的布局结构,可以修改构造树状结构的 JavaScript 代码。例如,线 045-046 控制所画的代表每个节点的圆的半径。
还有许多其他相关的可视化工具可用于描述 ML 数据。树形可视化是树形图的一种变体。可以把它想象成一个左对齐的树形图,其中节点随着树深度的增加而向右延伸。
Figure 2-14 shows the f lare.csv data file visualized as a tree. The tree display differs from the dendogram because of the way the JavaScript code renders the nodes. The tree-dendo-csv.html file actually gives you the choice to select whether you want the CSV data rendered as a dendogram or a tree. Figure 2-14
树木可视化渲染,tree-dendo-csv.html
您将使用 D3 生成的最终 CSV 可视化是放射树突图。一张图片胜过千言万语,放射树图可能是最艺术和最有用的可视化。对于大型数据集,树状图和树可能会变得很长,需要滚动才能查看整个可视化。放射状的树突充满了一个圆,所以它往往更紧凑,更容易看到。
Figure 2-15 shows a radial dendogram produced by radial-dendo-csv.html. Even though the font may be small and there are many labels in the dataset, the radial dendogram gives you a good feel for the structure of your data. With practice, you can take a quick glance at a radial dendogram of your data and identify problems or irregularities. Figure 2-15
放射树状可视化,radial-dendo-csv.html
项目中最后两个可视化将使用 JSON 数据作为它们的来源。文件 f lare.json 是前三个可视化中使用的 f lare.csv 文件的 json 版本。
The cluster-dendo-json.html file structure is similar to the approach used with CSV data. The following code block assigns the JSON file in D3 at line 008:001 002 003 004 Note that when loading JSON into D3, there are some requirements for the JSON structure. The JSON needs to be compatible with D3’s hierarchy rules. If you examine the f lare.json file, you will see that it is comprised of “name” and “children” nodes.001 { 002 "name": "flare", 003 "children": [ 004 { 005 "name": "analytics", 006 "children": [ 007 { 008 "name": "cluster", 009 "children": [ 010 011 ...
如果您的 JSON 数据不符合这种结构,您可能需要转换它,以便 D3 可以正确地解析和显示它。有一些工具可以处理这种转换。D3 包括一个名为 d3.nest() 的函数,还有一个名为 下划线. nest() 的外部函数。这些函数的文档和下载链接可以在
【https://github . com/D3/D3 集合】【https://github . com/iros/undercore . nest】
一旦 JSON 数据格式正确,D3 就可以呈现它了。
Figure 2-16 shows the cluster dendogram visualization of the JSON file as rendered by cluster-dendo-json.html. Figure 2-16
cluster-dendo-json.html 聚类树状可视化
Flare.json is a large file with many nodes. D3 uses this file for many of its visualization examples. If you look inside the HTML file, you will see the following line of code:
这会将渲染窗口的高度设置为 2200 像素。这可能比你的显示器大,这意味着你必须滚动才能看到整个可视化。如果您降低高度以匹配您的显示大小,例如 1200 像素,您将看到可视化变得如此压缩以至于不再可读。
A solution to this problem is the collapsible tree. Remember, JavaScript is interactive. The collapsible tree visualization allows you to click on nodes to expand or contract them. Figure 2-17 shows the much cleaner collapsible tree visualization as rendered by collapse-tree-json.html. Figure 2-17
collapse-tree-json.html 可折叠树
The collapsible tree is useful because it allows you to click on individual node to expand them. It does not leave your entire screen cluttered with the whole visualization. It is a much easier way to explore the data interactively. The collapse-tree-json.html file is larger than the other versions because it contains JavaScript code, such as the following function, to manage the interactive node navigation:001 // Toggle children on click. 002 function click(d) { 003 if (d.children) { 004 d._children = d.children; 005 d.children = null; 006 } else { 007 d.children = d._children; 008 d._children = null; 009 } 010 update(d); 011 } In this project, you covered five different data visualizations from the dendogram family: three with CSV source data and two with JSON source data.
JavaScript 能产生出色的可视化效果。如果您浏览 D3 图库,您会发现适合您的数据的可视化,以及帮助实现可视化的示例 JavaScript 代码。
拥有一个可视化数据的 JavaScript 解决方案可以让您看到数据的样子。这些可视化可以很美,可视化的力量显而易见。与原始数据文件相比,可视化可以让您更好地感受数据的结构。这是理解数据并能够识别数据中隐藏模式的第一步。
随着 CSV 和 JSON 可视化在您的工具箱中,您已经开始 对自己的 数据提出更多要求。
2.9 项目:Android 数据可视化
这个项目将把你在桌面上用 D3 可视化所做的工作扩展到 Android 移动设备上。显示可视化可能不是你的 Android 应用的核心功能,但有时它可能对你的用户很有帮助。
Table 2-10 shows the project file summary.Table 2-10
项目文件摘要- Android 数据可视化
|项目名称:Android Data visualization source:Android _ Data _ vis . zip类型:Android
| | --- | |
文件
|
描述
| | --- | --- | | 【app】>【src】>【mainandorsanifest . XML】 | 配置文件。 | | 【app】>【src】>【main】>【RES】>【layout activity _ main . XML】 | 用于显示 WebView 的布局文件。 | | 【应用】>【src】>【main】>【asset SD 3min . jsflare . csvradial-dendo-CSV . html | 资产,如果您决定使用资产的本地副本构建应用程序。如果从 web 服务器加载资产,则不需要。 | | app->src->main->javaMainActivity.java | 加载和显示 D3 可视化的主 Java 源代码。 |
您已经看到 D3 可视化在桌面浏览器上工作,所以为 Android 设置它很简单。
你不用把一个可视化或者图表库导入到你的应用程序中,你可以走捷径,使用 Android 的 WebView 类来显示 D3 可视化。 WebView 是一个由 Chrome 驱动的系统组件,允许 Android 应用程序直接在应用程序中显示来自网络的内容。该类为您的应用程序提供了干净、集成的用户体验。和任何好的网络浏览器一样, WebView 支持 JavaScript,所以对于 D3 内容很好用。
Figure 2-18 shows the Android Data Visualization project in Android Studio. Figure 2-18
Android Studio 中的项目 Android 数据可视化
There are two methods to handle the D3 integration with WebView , depending on how you decide to manage access to the required files:
-
内部:将所需文件放在 app assets 文件夹中。
-
外部:从远程 web 服务器加载资产。
The following code from MainActivity.java shows how to set up a full screen WebView layout. A progressDialog provides an indication to the user that network content is loading, which is especially useful if the resources are loaded from external server. Lines 067-068 show the radial-dendo-csv.html file reference, depending on whether you choose the internal or external approach.001 package android.wickham.com.datavis; 002 003 import android.annotation.SuppressLint; 004 import android.app.Activity; 005 import android.app.ProgressDialog; 006 import android.content.DialogInterface; 007 import android.graphics.Color; 008 import android.os.Bundle; 009 import android.webkit.WebChromeClient; 010 import android.webkit.WebView; 011 012 public class MainActivity extends Activity { 013 014 private WebView webView; 015 016 @SuppressLint("SetJavaScriptEnabled") 017 @Override 018 protected void onCreate(Bundle savedInstanceState) { 019 super.onCreate(savedInstanceState); 020 setContentView(R.layout.activity_main); 021 022 webView = (WebView) findViewById(R.id.wb_webview); 023 024 //Scroll bars should not be hidden 025 webView.setScrollbarFadingEnabled(false); 026 webView.setHorizontalScrollBarEnabled(true); 027 webView.setVerticalScrollBarEnabled(true); 028 webView.setFitsSystemWindows(true); 029 030 //Enable JavaScript 031 webView.getSettings().setJavaScriptEnabled(true); 032 033 //Set the user agent 034 webView.getSettings().setUserAgentString("AndroidWebView"); 035 036 //Clear the cache 037 webView.clearCache(true); 038 webView.setBackgroundColor(Color.parseColor("#FFFFFF")); 039 webView.setFadingEdgeLength(10); 040 webView.getSettings().setBuiltInZoomControls(true); 041 webView.getSettings().setDisplayZoomControls(false); 042 043 final Activity activity = this; 044 final ProgressDialog progressDialog = new ProgressDialog(activity); 045 progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 046 progressDialog.setProgressStyle(ProgressDialog.THEME_HOLO_LIGHT); 047 progressDialog.setCancelable(true); 048 049 webView.setWebChromeClient(new WebChromeClient() { 050 public void onProgressChanged(WebView view, int progress) { 051 progressDialog.setCanceledOnTouchOutside(true); 052 progressDialog.setTitle("Loading visualization ..."); 053 progressDialog.setButton("Cancel", new DialogInterface.OnClickListener() { 054 public void onClick(DialogInterface dialog, int which) { 055 webView.destroy(); 056 finish(); 057 } }); 058 progressDialog.show(); 059 progressDialog.setProgress(0); 060 activity.setProgress(progress * 1000); 061 progressDialog.incrementProgressBy(progress); 062 if(progress == 100 && progressDialog.isShowing()) 063 progressDialog.dismiss(); 064 } 065 }); 066 // Uncomment one of the following two lines based on Internal or External loading 067 //webView.loadUrl("file:///android_asset/radial-dendo-csv.html"); 068 webView.loadUrl("www.yourwebserver.com/radial-dend…"); 069 } 070 } The following code shows the layout file, fullscreen.xml. It includes the Android WebView control that is contained within a FrameLayout .001 <FrameLayout xmlns:android="schemas.android.com/apk/res/and…" 002 xmlns:tools="schemas.android.com/tools" 001 android:layout_width="match_parent" 002 android:layout_height="match_parent" 003 tools:context="android.wickham.com.datavis.MainActivity"> 004 005 <WebView 006 android:id="@+id/wb_webview" 007 android:layout_width="fill_parent" 008 android:layout_height="fill_parent" /> 009 010 This Android app, when executed, downloads the HTML/JavaScript file and then displays the visualization on your device, as shown in Figure 2-19. Figure 2-19
安卓数据可视化 app 截图
WebView 包含许多控制可视化如何出现的配置参数,例如缩放、滚动等。请记住,这种方法可以显示任何 D3 可视化,而不仅仅是您关注的树状结构,因为它们对 ML 数据文件(如 CSV 和 JSON 文件)很有用。
2.10 摘要
This chapter was all about data. It certainly is the fuel for machine learning. In the subsequent chapters, you will be selecting algorithms, building models, and finally integrating those models. Without careful attention to the data in this early phase, you will not be able to achieve the desired results. Figure 2-20 shows how the data topics you learned in this chapter fit into the overall ML-Gates methodology introduced in Chapter 1. Figure 2-20
ML-Gates 方法的前三个门是数据驱动的
你的方法论的最初三个关口都以数据为中心,这并不奇怪。
如果没有在 ML-Gates 6/5/4 投入足够的时间来处理数据,通常会导致 ML-Gates 3 和 2 的结果不佳。到那时,回头去解决数据问题将变得非常昂贵。
下一节在转到基于云的 ML 实现之前,快速回顾关键章节的发现。
关键数据结果
You are on the path to becoming data scientist when you follow these best practices:
-
要开发 ML 应用程序,您必须采用数据驱动的方法。
-
要开发成功的 ML 应用程序,您必须对自己的数据有更高的要求。
-
你的大部分代码都是关于数据的争论。80/20 法则适用于:对于你承担的任何给定项目,你 80%的时间将用于处理数据。
-
对于一个明确定义的问题,高质量的相关数据是起点。
-
了解你有什么类型的数据。当您对第四章中的数据应用算法时,这将是必要的。
-
定义您的数据类型,并考虑将它们保存在数据字典中。
-
有许多来源可以用于您的 ML 应用程序数据:公共的、私有的、政府的、合成的等等。
-
您可以生成自己的数据。在本章中,您看到了一个使用 Android 的 Wifi 功能实现室内位置跟踪的示例。
-
您可以使用许多工具来操作数据,包括 Open Office Calc 电子表格程序。在第四章中,您将探索 ML 环境中可用的其他数据过滤工具。
-
JSON、CSV 和 ARFF 格式是 ML 的流行数据格式。对它们都感到舒适。
-
大多数实体没有足够的高质量数据用于 DL,而 CML 应用只需要合理的数据量就能成功。
-
智能手机是有史以来发明的最好的数据收集设备。
-
可视化是 ML 和理解数据的一个关键方面。
-
为了帮助您可视化您的数据,您可以利用第三方包,使在浏览器和 Android 设备上可视化数据变得容易。****