Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)

碎碎念

  • 从今天开始,博主开始学习Hands-on Machine Learning with Scikit-Learn,Keras & Tensorflow(2nd Edition,Tensorflow 2),这本书的第一版是有大佬翻译过了,第二版好像没有。博主尝试阅读英文原著,并且也会在博客上记录和分享自己的学习笔记。

Chapter 1 机器学习概览

  • 当大多数人听到“机器学习”,他们会想象着一个机器人:这个机器人是一个可靠的管家或者是一个可怕的终结者,这个想象取决于你询问的是谁。但是机器学习并不仅仅是未来主义的幻想,它早已经存在。事实上,在特定的应用中机器学习早已经存在了几十年,例如光学字符识别(OCR)。但是第一个改善数亿人生活、“接管世界”、真正成为主流的机器学习应用是在20世纪90年代:它是一个垃圾邮件过滤器。这个应用不完全是一个自我意识的天网(Skynet),但它在技术上确实符合机器学习(它实际上被学习的很好,以至于你很少需要将电子邮件标记为垃圾邮件)。数百个机器学习应用程序正悄悄地为您定期使用的产品和功能提供服务,这些应用从推荐到语言搜索。
  • 机器学习从哪里开始,又从哪里结束?机器去学些一些东西到底意味着什么?如果我下载一份*,我的电脑真的“学到”了什么吗?是不是突然变聪明了?在本章中,我们将首先澄清什么是机器学习,以及为什么您可能想要使用它。
  • 然后,在我们开始探索机器学习领域之前,我们将看一下地图并了解主要的类别以及最著名的算法:监督与无监督学习、在线学习与批量学习、基于实例的学习与基于模型的学习。然后我们将研究机器学习项目的一般工作流程、讨论你可能面临的主要挑战、以及涵盖如何评估和微调(fine-tune)机器学习系统。
  • 本章介绍了许多基本概念(和行话),每个数据科学家都应该心知肚明。这将是一个高层次的概述(唯一没有太多代码的章节),所以这些都相当简单,但是在继续阅读这本书其余部分之前,你应该确保这一切对你来说都是清晰的。

什么是机器学习?

  • 机器学习是编程计算机的科学(和艺术),因此他们可以从数据中学习。
  • 这里有一个稍微笼统的定义:[机器学习是]研究领域,它使计算机能够在没有明确编程的情况下学习(Arthur Samuel, 1959)。
  • 以及一个更工程导向的定义:假设用 P P P来评估计算机程序在某任务类 T T T上的性能,若一个程序通过利用经验 E E E T T T中任务上获得了性能改善,则我们可以说关于 T T T P P P,该程序对 E E E进行了学习(Tom Mitchell, 1997)。
  • 例如,你的垃圾邮件过滤器是一个机器学习程序,它能够在给定垃圾邮件样本(例如,用户标记)和常规邮件样本(非垃圾邮件)情况下学习去标记垃圾邮件。系统用来学习的样本被称为训练集(training set)。每一个训练样本被称为一个训练实例(training instance)。在上述情况下,任务 T T T是标记新邮件为垃圾邮件,经验 E E E是训练数据(training data),以及性能度量 P P P需要被定义(例如,你能够使用正确分类邮件的比例来定义性能 P P P)。这个特殊的性能度量被称为准确率(accuracy),它在分类任务中经常被使用。
  • 如果你只是下载了一份*的副本,你的电脑有更多的数据,但它并不是突然更擅长任何任务。因此,这不是机器学习。

为什么使用机器学习?

  • 考虑下如何使用传统的编程技术来编写垃圾邮件过滤器(Figure 1-1 传统方法):
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 1、首先你会去了解什么样的邮件是垃圾邮件。你可能会注意到,一些单词或短语(如“4U”、“信用卡”、“免费”和“惊人”等)往往会在经常的出现在垃圾邮件中。也许你还会注意到发件人的名字、电子邮件的正文等其他一些模式。
  • 2、你将为你注意到的每一个模式来写一个检测算法,并且如果大量的模式被检测到,你的程序将标记邮件为垃圾邮件。
  • 3、你将测试你的程序,并重复步骤1和2,直到它的性能足够好。
  • 由于这个问题并不简单,你的程序可能变成一系列复杂的规则-很难去维护。
  • 相比之下,基于机器学习技术的垃圾邮件过滤器通常检测垃圾邮件示例中与正常邮件示例相比异常频繁的单词模式来自动学习哪些单词和短语是垃圾邮件的良好预测器(Figure 1-2 机器学习方法)。这个程序更短、更容易去维护,而且很可能更准确。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 此外,如果垃圾邮件发送者注意到他们所有包含“4U”的店子邮件都被阻止,那么他们可能会开始写“For U”。使用传统编程技术的垃圾邮件过滤器需要去更新以此来标记“For U”的邮件。如果垃圾邮件发送者一直针对你的垃圾邮件过滤器,那么你将需要永远写新的规则。
  • 相反,基于机器学习技术的垃圾邮件过滤器自动的注意到在被用户标记的垃圾邮件中“For U”已经成为频繁词汇,同时在没有你干预的情况下标记它们为垃圾邮件(Figure 1-3 自动更新改变)。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 机器学习的另一个领域是针对传统方法过于复杂或没有已知算法的问题。例如,考虑语音识别(speech recognition):你想要去写一个程序来区分单词“one”以及“two”。你可能会注意到“two”一词以高音距声音(“T”)开头,因此你可以硬编码一种测量高英距声音强度的算法,并使用它来区分“one”和“two”。显然这种技术没法扩展到在嘈杂环境和数十种语言中,不同的人讲的数千个单词。最好的解决方案(至少在今天)是编写一个算法,让它在给定每个单词的许多示例记录的情况下自己学习。
  • 最后,机器学习能够帮助人类学习(Figure 1-4 机器学习能够帮助人类学习):可以对机器学习算法进行检查,以了解它们学到了什么(尽管对于某些算法来说,这可能是很棘手的)。例如,一般在足够多的垃圾邮件上对垃圾邮件过滤器进行了训练,就可以很容易的检查它,以揭示它认为是垃圾邮件的最好预测因素的单词和单词组合的列表。有时,这将揭示未被推测的关系或新的趋势,从而导致对于问题的更好理解。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 应用机器学习技术来挖掘大量的数据可以帮助发现不明显的模式。这就是所谓的数据挖掘(data mining)。
  • 总而言之,机器学习是伟大的:(1)现有解决方案需要大量手工调整或一系列规则的问题:机器学习算法通常可以简化代码并执行的更好;(2)使用传统方法根本无法解决的复杂问题:最好的机器学习技术可以找到解决方案;(3)波动环境:机器学习系统可以适应新的数据;(4)获得关于复杂问题和大量数据的见解。

机器学习系统的类型

  • 机器学习系统有许多不同的类型,因此根据以下几个方面对它们进行分类是有用的:它们是否接受了人类监督信息的训练(监督、无监督、半监督、和强化学习)。
  • 它们是否可以在线递增学习(在线学习还是批量学习)。
  • 无论它们是通过简单地将新数据点与已知数据点进行比较来工作,还是通过检测训练数据中的模式并构建预测模型,就像科学家所做的那样(基于实例的学习与基于模型的学习)。
  • 这些标准并不是互相排斥的;你可以用你喜欢的任何方式组合它们。例如,最新的垃圾邮件过滤器可以使用深度神经网络模型动态学习,该模型是根据垃圾邮件和正常邮件的示例进行训练的;这使其成为一个基于模型的、在线的、监督的学习系统。
监督/非监督学习
  • 机器学习系统能够根据他们在训练过程中获得的监督信息的数量和类型进行分类。主要有四大类:监督学习(supervised learning)、非监督学习(unsupervised learning)、半监督学习(semisupervised learning)、以及强化学习(Reinforcement Learning)。
监督学习
  • 在监督学习中,喂给算法的训练数据已经包含了结果,这个结果也被称为标签(labels)(Figure 1-5 用于监督学习的标记训练集(例如,垃圾邮件分类))。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 一个典型的监督学习任务是分类。邮件过滤器是监督学习的一个很好的例子:它接受了许多示例电子邮件及其类别(垃圾邮件或正常邮件)的训练,并且必须学习如何对新电子邮件进行分类。
  • 另一个典型的任务是预测数值目标,例如汽车的价格,给定一组称为预测变量的特征(里程、年龄、品牌等)。这种任务被称为回归(regression)(Figure 1-6 回归)。为了训练这个系统,你需要给定许多汽车的样本,这些样本包含特征以及标签(例如汽车的价格)。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 注意一些回归算法也能够被用于分类,反之亦然。例如,逻辑回归(Logistic Regression)通常被用于分类,因为它能够输出属于给定类别的概率值(例如,20%的机会属于垃圾邮件)。
  • 以下是一些非常重要的监督学习算法:k-近邻(k-Nearest Neighbors)、线性回归(Linear Regression)、逻辑回归(Logistic Regression)、支持向量机(Support Vector Machines, SVMs)、决策树和随机森林(Decision Trees and Random Forests)、神经网络(Neural Network)。
非监督学习
  • 在监督学习中,这个训练数据是未被标记的(Figure 1-7 用于无监督学习的无标签数据集)。这些系统尝试在没有老师的条件下学习。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 以下是一些重要的非监督学习算法:(1)聚类(Clustering):K-Means、DBSCAN、Hierarchical Cluster Analysis(HCA);(2)异常检测和奇异值检测(Anomaly detection and novelty detection):One-class SVM、Isolation Forest;(3)可视化以及降维(Visualization and dimensionality reduction):Principal Component Analysis(PCA)、Kernel PCA、Locally-Linear Embedding(LLE)、t-distributed Stochastic Neighbor Embedding(t-SNE);(4)关联规则学习(Association rule learning):Apriori、Eclat
  • 例如,假设你有很多博客访问者的数据。你可能想要执行一个聚类算法来划分相似访问者(Figure 1-8 聚类)。你绝对不会告诉算法访问者属于哪个组:它会在没有你的帮助下发现哪些连系;例如,它可能会注意到您的访问者中有40%是男性,他们喜欢漫画并且通常在晚上阅读你的博客,而20%是年轻的科幻爱好者,他们在周末访问等等。如果使用分层聚类算法,则它也可能将每个组细分为较小的组。这可以帮助你针对每一个组来定位你的帖子。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 可视化算法也是非监督学习算法中一个很好的例子:你喂给算法许多复杂和未被标记的数据,接着它们为数据输出一个2D或3D的表示,以此来让数据能够容易的被展示(Figure 1-9 突出语义簇的t-SNE可视化示例)。这些算法尝试去保存尽可能多的结构(例如,在可视化中从重叠的输入空间中保持可分离的簇),以至于你能够理解数据如何被组织以及识别未被观测到的模式。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 一个相关的任务是降维,它的目标是在不损失太多信息的情况下简化数据。一种方法是融合多个相关的特征。例如,一辆汽车的里程可能与它的年龄非常相关,因此降维算法会将它们合并为代表汽车磨损的一个特征。这也就是所谓的特征抽取(feature extraction)。
  • 在喂数据到机器学习算法(例如一个监督学习算法)之前,使用降维算法减少数据的维度总会是一个很好的想法。机器学习算法将运行的更快、数据将占用更好的磁盘和内存空间、并且在大多数情况下性能也更好。
  • 另一个重要的非监督学习任务是异常检测-例如,检测异常的信用卡交易以防止欺诈,发现制造缺陷或在将数据集提供给另一种学习算法之前自动从数据集中删除异常值。这个系统的训练数据大多数都是正常的实例,因此,它学会去识别样本并且当看到一个新的实例时候,算法能够告诉实例是正常的还是异常的(Figure 1-10 异常检测)。一个非常相似的任务是新颖性检测:区别在于,新颖性检测算法期望在训练过程中只能看到正常数据,而异常检测算法通常可以容忍得多,即使在训练集中有少量异常值时,它们也通常可以表现良好。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 最好,另一个常见的非监督学习任务是关联规则学习,它的任务是去挖掘大量的数据并且发现属性之间有趣的联系。例如,假设你有一家超市。在您的销售日志上运行关联规则可能会表明购买烧烤酱和薯片的人也倾向于购买牛排。 因此,您可能需要将这些商品放得比较近。
半监督学习
  • 一些算法能够处理部分标记的训练数据,通常包含大量未标记的数据和少量标记数据。这些算法被称为半监督学习(semisupervised learning)(Figure 1-11 半监督学习)。
  • 一些照片托管服务(例如Google Photos)就是很好的例子。将所有家庭照片上传到服务后,它会自动识别出同一个人A出现在照片1、5和11中,而另一个人B出现在照片2、5和7中。这是算法非监督的部分(聚类)。现在这些系统需要你告诉他们是谁。每个人仅需要标记一次,接着算法就能够识别每张照片中的每个人,这对于相片搜索是非常有用的。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 大多数半监督学习算法是监督学习和非监督学习算法的联合。例如,深度信念网络(deep belief networks, DBNs)是基于受限玻尔兹曼机(restricted Boltzmann machines, RBMs)堆叠的给监督组件。RBMs以非监督的方式依次训练,接着整个系统使用监督学习技术微调。
强化学习
  • 强化学习是非常不同的一类算法。这个学习系统,也就是所谓的代理(agent),能够观察环境,选择执行的动作,并且获得回报(或者以负面奖励的形式得到惩罚,如图Figure 1-12)。它必须通过自己学习什么是最好的策略,也称为policty,以此来随着时间推移获得最大的回报。策略定义了代理在给定情况下应选择的操作。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习概览)学习笔记(一)
  • 例如,许多机器人实现强化学习算法来学习如何行走。DeepMind的AlphaGo程序也是一个强化学习的例子:它在2017年5月在围棋中击败了世界冠军Ke Jie时成为头条新闻。通过分析数百万场比赛,然后与自己对战,他学会了制胜法宝。注意在与冠军的比赛中学习被关闭了。 AlphaGo只是在应用它学到的策略。