Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)

碎碎念

  • 从今天开始,博主开始学习Hands-on Machine Learning with Scikit-Learn,Keras & Tensorflow(2nd Edition,Tensorflow 2),这本书的第一版已经有大佬翻译过了,但第二版(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张图片
  • 1、首先你会去了解什么样的邮件是垃圾邮件。你可能会注意到,一些单词或短语(如“4U”、“信用卡”、“免费”和“惊人”等)往往会在经常的出现在垃圾邮件中。也许你还会注意到发件人的名字、电子邮件的正文等其他一些模式。
  • 2、你将为你注意到的每一个模式来写一个检测算法,并且如果大量的模式被检测到,你的程序将标记邮件为垃圾邮件。
  • 3、你将测试你的程序,并重复步骤1和2,直到它的性能足够好。
  • 由于这个问题并不简单,你的程序可能变成一系列复杂的规则-很难去维护。
  • 相比之下,基于机器学习技术的垃圾邮件过滤器通常检测垃圾邮件示例中与正常邮件示例相比异常频繁的单词模式来自动学习哪些单词和短语是垃圾邮件的良好预测器(Figure 1-2 机器学习方法)。这个程序更短、更容易去维护,而且很可能更准确。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第2张图片
  • 此外,如果垃圾邮件发送者注意到他们所有包含“4U”的店子邮件都被阻止,那么他们可能会开始写“For U”。使用传统编程技术的垃圾邮件过滤器需要去更新以此来标记“For U”的邮件。如果垃圾邮件发送者一直针对你的垃圾邮件过滤器,那么你将需要永远写新的规则。
  • 相反,基于机器学习技术的垃圾邮件过滤器自动的注意到在被用户标记的垃圾邮件中“For U”已经成为频繁词汇,同时在没有你干预的情况下标记它们为垃圾邮件(Figure 1-3 自动更新改变)。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第3张图片
  • 机器学习的另一个领域是针对传统方法过于复杂或没有已知算法的问题。例如,考虑语音识别(speech recognition):你想要去写一个程序来区分单词“one”以及“two”。你可能会注意到“two”一词以高音距声音(“T”)开头,因此你可以硬编码一种测量高英距声音强度的算法,并使用它来区分“one”和“two”。显然这种技术没法扩展到在嘈杂环境和数十种语言中,不同的人讲的数千个单词。最好的解决方案(至少在今天)是编写一个算法,让它在给定每个单词的许多示例记录的情况下自己学习。
  • 最后,机器学习能够帮助人类学习(Figure 1-4 机器学习能够帮助人类学习):可以对机器学习算法进行检查,以了解它们学到了什么(尽管对于某些算法来说,这可能是很棘手的)。例如,一般在足够多的垃圾邮件上对垃圾邮件过滤器进行了训练,就可以很容易的检查它,以揭示它认为是垃圾邮件的最好预测因素的单词和单词组合的列表。有时,这将揭示未被推测的关系或新的趋势,从而导致对于问题的更好理解。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第4张图片
  • 应用机器学习技术来挖掘大量的数据可以帮助发现不明显的模式。这就是所谓的数据挖掘(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(机器学习系统的类型)学习笔记(一)_第5张图片
  • 一个典型的监督学习任务是分类。邮件过滤器是监督学习的一个很好的例子:它接受了许多示例电子邮件及其类别(垃圾邮件或正常邮件)的训练,并且必须学习如何对新电子邮件进行分类。
  • 另一个典型的任务是预测数值目标,例如汽车的价格,给定一组称为预测变量的特征(里程、年龄、品牌等)。这种任务被称为回归(regression)(Figure 1-6 回归)。为了训练这个系统,你需要给定许多汽车的样本,这些样本包含特征以及标签(例如汽车的价格)。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第6张图片
  • 注意一些回归算法也能够被用于分类,反之亦然。例如,逻辑回归(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(机器学习系统的类型)学习笔记(一)_第7张图片
  • 以下是一些重要的非监督学习算法:(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(机器学习系统的类型)学习笔记(一)_第8张图片
  • 可视化算法也是非监督学习算法中一个很好的例子:你喂给算法许多复杂和未被标记的数据,接着它们为数据输出一个2D或3D的表示,以此来让数据能够容易的被展示(Figure 1-9 突出语义簇的t-SNE可视化示例)。这些算法尝试去保存尽可能多的结构(例如,在可视化中从重叠的输入空间中保持可分离的簇),以至于你能够理解数据如何被组织以及识别未被观测到的模式。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第9张图片
  • 一个相关的任务是降维,它的目标是在不损失太多信息的情况下简化数据。一种方法是融合多个相关的特征。例如,一辆汽车的里程可能与它的年龄非常相关,因此降维算法会将它们合并为代表汽车磨损的一个特征。这也就是所谓的特征抽取(feature extraction)。
  • 在喂数据到机器学习算法(例如一个监督学习算法)之前,使用降维算法减少数据的维度总会是一个很好的想法。机器学习算法将运行的更快、数据将占用更好的磁盘和内存空间、并且在大多数情况下性能也更好。
  • 另一个重要的非监督学习任务是异常检测-例如,检测异常的信用卡交易以防止欺诈,发现制造缺陷或在将数据集提供给另一种学习算法之前自动从数据集中删除异常值。这个系统的训练数据大多数都是正常的实例,因此,它学会去识别样本并且当看到一个新的实例时候,算法能够告诉实例是正常的还是异常的(Figure 1-10 异常检测)。一个非常相似的任务是新颖性检测:区别在于,新颖性检测算法期望在训练过程中只能看到正常数据,而异常检测算法通常可以容忍得多,即使在训练集中有少量异常值时,它们也通常可以表现良好。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第10张图片
  • 最好,另一个常见的非监督学习任务是关联规则学习,它的任务是去挖掘大量的数据并且发现属性之间有趣的联系。例如,假设你有一家超市。在您的销售日志上运行关联规则可能会表明购买烧烤酱和薯片的人也倾向于购买牛排。 因此,您可能需要将这些商品放得比较近。
半监督学习
  • 一些算法能够处理部分标记的训练数据,通常包含大量未标记的数据和少量标记数据。这些算法被称为半监督学习(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(机器学习系统的类型)学习笔记(一)_第11张图片
  • 大多数半监督学习算法是监督学习和非监督学习算法的联合。例如,深度信念网络(deep belief networks, DBNs)是基于受限玻尔兹曼机(restricted Boltzmann machines, RBMs)堆叠的给监督组件。RBMs以非监督的方式依次训练,接着整个系统使用监督学习技术微调。
强化学习
  • 强化学习是非常不同的一类算法。这个学习系统,也就是所谓的代理(agent),能够观察环境,选择执行的动作,并且获得回报(或者以负面奖励的形式得到惩罚,如图Figure 1-12)。它必须通过自己学习什么是最好的策略,也称为policty,以此来随着时间推移获得最大的回报。策略定义了代理在给定情况下应选择的操作。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第12张图片
  • 例如,许多机器人实现强化学习算法来学习如何行走。DeepMind的AlphaGo程序也是一个强化学习的例子:它在2017年5月在围棋中击败了世界冠军Ke Jie时成为头条新闻。通过分析数百万场比赛,然后与自己对战,他学会了制胜法宝。注意在与冠军的比赛中学习被关闭了。 AlphaGo只是在应用它学到的策略。
批量和在线学习
  • 用于对机器学习系统进行分类的另一个标准是系统是否可以从输入数据流中增量(incrementally)学习。
批量学习
  • 在批量学习中,系统是无法增量学习的:系统必须使用所有可获得的数据来训练。这通常需要大量的时间和计算资源,所以通常是离线完成的。系统首先被训练,接着投入生产,在运行过程中也不会在学习了。系统仅仅使用它已经学习的内容,这也就是所谓的离线学习(offline learning)。
  • 如果你希望批量学习系统了解新的数据(例如新类型的垃圾邮件),则需要在完整的数据集(不仅使新的数据,还需要旧的数据)上从头开始训练新版本的系统,然后停止旧的系统并将其替换为新的系统。
  • 幸运的是,训练、评估和启动一个机器学习系统这一系列过程是很容易自动化的(如图Figure 1-13 在线学习),因此批量学习系统也能够适应变化。仅仅需要更新数据并且训练新版本的系统。
  • 这个解决方案很简单,而且通常工作得很好。但是使用完整的数据集训练可能需要数十个小时,因此你通常可能每24小时或每周训练一个新系统。如果你的系统需要适应快速变化的数据(例如,预测股票的价格),那么你需要一个更敏感的解决方案。
  • 同时,在完整数据集上训练需要大量的计算资源(CPU、内存空间、磁盘空间、磁盘I/O、网络I/O等)。如果你有很多数据,并且你每天自动化地从头开始训练你的系统,那么它将花费你很多钱。如果数据量巨大,甚至可能无法使用批量学习算法。
  • 最后,如果你的系统需要去自动学习并且资源有限(例如,智能手机应用或火星上的漫游车),那么每天使用大量的数据、占据大量的资源来训练几个小时,这是一件大事情。
  • 幸运地是,在所有情况下,一个更好的选择使使用能够增量学习的算法。
在线学习
  • 在在线学习中,你通过连续的喂养数据实例来增量的训练系统,这些数据可能是单个样本也可能是小批量(mini-batches)的样本。每个学习步骤是快速和便宜的,因此系统能够在数据到来是即时学习(如图Figure 1-13 在线学习)。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第13张图片
  • 在线学习非常适合那些连续不断地接收数据(例如股票价格)并且需要适应快速或自主变化的系统。如果你计算资源有限,那么在线学习也是一个很好的选择:一个在线学习系统一旦了解了新数据,它就不再需要它们,因此你能够丢失这些数据(除非你想要能够回滚到先前状态和“重播”数据)。这种作法能够节省大量的空间。
  • 在线学习也能够在一台计算机主存空间中没法容纳的巨大数据集上训练系统(这也被称为核外(out-of-core)学习)。在线学习算法加载部分数据,在这些数据上训练,重复这些步骤知道所有的数据都训练完(如图Figure 1-14 使用在线学习处理大规模数据集)。
  • 核外学习通常是离线的(例如,没有一个在线系统),因此在线学习可能是一个疑惑的名字,尝试使用增量学习。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第14张图片
  • 在线学习系统一个重要的参数就是它们应该多快速的适应数据的改变:也就是所谓的学习率(learning rate)。如果你设定一个高的学习率,那么你的系统可能迅速的适应新数据,同时它也快速的忘记了老数据(你并不希望垃圾邮件过滤器只标记显示最新类型的垃圾邮件)。相反,如果你设定一个小的学习率,系统将会有更多惯性;也就是说,它讲学习的更慢,但它对新数据中的噪声或非代表性数据点(离群点)也不太敏感。
  • 在线系统的一大挑战是:如果坏的数据被喂到系统,这个系统的性能将逐渐降低。如果我们谈论一个在线系统,你的客户会注意到。例如,坏数据可能来自于机器人的故障传感器,或者一些人向搜索引擎发送垃圾邮件来让搜索结果的排名高。为了减少这种风险,如果你检测到西能下降,你需要密集的监控你的系统并迅速关闭学习开关(并可能恢复到以前的工作状态)。你还可能希望监控输入数据并对异常数据作出反应(例如,使用异常检测算法)。
基于实例和基于模型的学习
  • 分类机器学习系统的另一种方法是通过他们怎么样泛化(generalize)。大多数机器学习任务是关于如何做预测。这意味着,给定一些训练样本,系统需要泛化那些之前没有见过的样本。在训练数据上有一个好的性能度量是好的,但也是不足够的;真正的目标是在新实例上执行的很好。
  • 泛化主要有两种方法:基于实例的学习和基于模型的学习。
基于实例的学习
  • 可能最普通的学习形式就是简单的通过“心”来学习(simply to learn by heart)。如果你用这种方式创建垃圾邮件过滤器,它将标记与用户标记的垃圾邮件一样的邮件为垃圾邮件-这不是最糟糕的学习方式,但肯定也不是最好的。
  • 处理仅仅标记那些与已知垃圾邮件完全一样的邮件,你的垃圾邮件过滤器可能还能够被编程来标记那些与已知垃圾邮件相似的邮件。这需要度量两封邮件之间的相似性(measure of similarity)。一个(非常基本)度量两封邮件之间的相似性的方法可能是统计它们公有的单词数目。这个系统将标记邮件那些与已知垃圾邮件存在许多公有单词的邮件为垃圾邮件。
  • 这也就是所谓的基于实例的学习(instance-based learning):这个系统认真学习样本,急着使用一个相似性度量与被学习的样本(或一个样本集)进行对比来泛化到新样本。例如,在Figure 1-15中这个新的实例将被分类为一个三角形,因为它最相似的实例都是三角形。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第15张图片
基于模型的学习
  • 另一个从一系列样本中去泛化的方式是在这些样本上构建一个模型,然后使用这个模型去做预测。这也就是所谓的基于模型的学习(Figure 1-16 基于模型的学习)。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第16张图片
  • 例如,假设你想要知道钱是否能使人开心,因此你从OECD’s 网站下载了Better Life Index数据和IMF网站上有关人均GDP的统计数据。然后,你创造一个表格并按人均GDP进行排序。Table 1-1 展示了部分数据。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第17张图片
  • 接着我们绘制一些随机国家或地区的数据(Figure 1-17)
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第18张图片
  • 很容易看到他们的趋势。尽管这些数据是有噪音的(例如,部分数据),生活满意度似乎随着该国人均GDP的增加而呈线性增长。因此你觉得建模生活满意度为人均GDP的线性函数。这个步骤也称为模型选择:你选择了一个生活满意度的线性模型,这个模型只有一个人均GDP属性(Equation 1-1)。
    在这里插入图片描述
  • 这个模型具有两个参数: θ 0 \theta_0 θ0 θ 1 \theta_1 θ1。通调整这些参数,你能够使你的模型表示任何线性函数,如图Figure 1-18。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第19张图片
  • 在你能够使用你的模型之前,你需要去定义参数 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1的值。你如何知道哪些值将使你的模型表现最佳?为了回答这个问题,你需要一个确定一个性能度量。你可以定义衡量模型有多好的效用函数(utility function)(或适应性函数,fitness function),也可以定义衡量模型有多坏的代价函数(cost function)。对于线性回归问题,人们通常使用一个代价函数来度量线性模型的预测和训练样本值之间的距离。模型的目标是去最小化这个距离。
  • 线性回归算法:你将样本输入算法,算法将找到最适合你数据的线性模型参数。这也就是所谓的训练模型。在我们的案例中,算法发现最优的参数值是: θ 0 = 4.85 \theta_0 = 4.85 θ0=4.85 θ 1 = 4.91 ∗ e − 5 \theta_1 = 4.91*e^{-5} θ1=4.91e5
  • 现在这个模型尽可能的你和训练数据(对于一个线性模型),如同你在Figure 1-19中所看到的。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow(机器学习系统的类型)学习笔记(一)_第20张图片
  • 你终于可以运行模型进行预测了。例如,假设你想知道塞浦路斯人有多幸福,而经合组织的数据没有答案。幸运的是,你能够使用你的模型去做一个好的预测:你寻找塞浦路斯的人均GDP,发现是22587美元。接着应用你的模型,并且发现这个地方的生活满意度可能是: 4.85 + 22587 ∗ 4.91 ∗ e − 5 = 5.96 4.85 + 22587 * 4.91 * e^{-5} = 5.96 4.85+225874.91e5=5.96
  • Example 1-1 展示了Python代码和加载数据,创建了一个可视化的散点图,接着训练了一个线性模型和做预测。
# Example 1-1 Training and running a linear model using Scikit-Learn

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn.linear_model

# Load the data
oecd_bli = pd.read_csv("./data/oecd_bli_2015.csv", thousands=',')
gdp_per_capita = pd.read_csv("./data/gdp_per_capita.csv", thousands=',', delimiter='\t', encoding='latin1', na_values='n/a')

def prepare_country_stats(oecd_bli, gdp_per_capita):
    oecd_bli = oecd_bli[oecd_bli["INEQUALITY"] == "TOT"]
    oecd_bli = oecd_bli.pivot(index="Country", columns="Indicator", values="Value")
    gdp_per_capita.rename(columns={"2015": "GDP per capita"}, inplace=True)
    gdp_per_capita.set_index("Country", inplace=True)

    full_country_stats = pd.merge(left=oecd_bli, right=gdp_per_capita, left_index=True, right_index=True)
    full_country_stats.sort_values(by="GDP per capita", inplace=True)
    remove_indices = [0, 1, 6, 8, 33, 34, 35]
    keep_indices = list(set(range(36)) - set(remove_indices))

    return full_country_stats[["GDP per capita", 'Life satisfaction']].iloc[keep_indices]
# Prepare the data
country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)

X = np.c_[country_stats["GDP per capita"]]
y = np.c_[country_stats['Life satisfaction']]

# Visualize the data
country_stats.plot(kind='scatter', x='GDP per capita', y='Life satisfaction')
plt.show()

# Select a linear model
model = sklearn.linear_model.LinearRegression()

# Train the model
model.fit(X, y)

# Make a prediction for Cyprus
X_new = [[22587]] # Cyprus' GDP per capita
print(model.predict(X_new))
  • 如果你使用一个基于实例的学习算法,你可能发现Slovenia具有与Cyprus接近的GDP,同时因为OECD的数据告诉我们Slovenians的生活满意度为5.7,你可能预测Cyprus的生活满意度也是5.7。如果您稍微看一下下两个最接近的国家,您会发现葡萄牙和西班牙的生活满意度分别为5.1和6.5。平均这三个值,你将得到5.77,这是一个非常接近基于模型预测的值。这个简单的算法也被称为k-近邻(k-Nearest Neighbors)回归(在这个例子中,k=3)。
  • 使用kNN来取代LR,仅仅替换下述两行。
import sklearn.linear_model
model = sklearn.linear_model.LinearRegression()

# with these two:
import sklear.neighbors
model = sklearn.neighbors.KNeighborsRegressor(n_neighbors=3)
  • 如果一切顺利,你的模型将会作出准确的预测。如果没有,你可能需要使用更多的属性(就业率、健康、空气污染等),得到更多或更好的训练数据或者选择一个更强大的模型(例如,一个多项式回归模型,Polynomial Regression model)。
  • 总之:(1)你研究数据;(2)你选择一个模型;(3)你在训练数据上训练模型(即,学习算法搜索模型的参数值来最小化损失函数);(4)最后,你在新数据上应用这个模型做预测(也就是所谓的推断),期望模型具有良好的泛化能力。
  • 这就是典型机器学习项目的样子。在第2章中,你将通过端到端的项目来亲身体验这一过程。
  • 到目前为止,我们已经涵盖了很多领域:你现在知道了机器学习的真正含义,为何有用,什么是ML系统的一些最常见类别以及典型的项目工作流程是什么样的。现在,让我们看一下学习中可能出什么问题并阻止您做出准确的预测。

你可能感兴趣的:(机器学习,机器学习,算法)