《Hands-On Machine Learning》学习笔记-1.3 机器学习的类型

机器学习概述

机器学习的类型

基于以下角度,可以把机器学习分为不同的类型,进而进行更细致的分类:

  • 训练过程中是否有人工的监督(有监督学习,无监督学习,半监督学习,强化学习)
  • 能否即时的持续学习(在线学习VS批量学习)
  • 工作方式是简单的比较新数据点和已知数据点,还是检测训练集中的模型进而建立起预测模型(基于例子的学习VS基于模型的学习)

这些分类不是互斥的,你可以任意组合。例如,一个垃圾邮件和正常邮件的样例训练的,最先进的能够即时更新的深度神经网络模型,它是一个在线的,基于模型的,有监督学习系统。

接下来更细致的介绍每种类型的机器学习算法。

有监督/无监督学习

机器学习系统根据训练过程中所受到的监督的类型和数量,可分为4类:有监督学习、无监督学习、半监督学习和强化学习。

有监督学习

在有监督学习中,提供给算法的训练数据中包含“标签”(图1-5)
在这里插入图片描述

图1-5 有监督学习中带标签的训练集

典型的有监督学习任务是分类。垃圾邮件分类器就是个很好的例子:它由许多带标签(垃圾邮件/正常邮件)的样例邮件集训练而来,能够对新邮件进行分类。

另一个典型的任务是预测目标值,比如给定一些特征(里程、车龄、品牌等等)来预测汽车的价格,这类任务被称为回归(图1-6)。

注:在机器学习中,“attribute(属性)”是一个数据类型,比如“里程“,“feature(特征)”往往根据上下文有不同的意思,不过通常指属性加值,比如”里程=15000”。但是也有许多人往往将"feature"和"attribute"混用。
在这里插入图片描述

图1-6 回归

需要注意的是,回归算法也可以用于分类,反之亦然。例如,逻辑回归通常用于分类,因为他通常给出一个属于某个分类的可能性。

下面是一些最重要的有监督学习算法:

  • KNN(K最近邻算法)
  • 线性回归
  • 逻辑回归
  • 支持向量机(SVMs)
  • 决策树和随机森林
  • 神经网络
无监督学习

在无监督学习中,训练集数据是无标签的(图1-7)。
在这里插入图片描述图1-7 无监督学习的无标签训练集

下面是最重要的一些无监督学习的算法:

  • 聚类
    • k均值聚类算法(k-Means)
    • 分层聚类分析(HCA)
    • 期望最大化(Expectation Maximization )
  • 数据可视化和降维
    • 主成分分析(PCA)
    • Kernel PCA
    • 局部线性嵌入(LLE)
    • t-SNE
  • 关联规则学习
    • Apriori
    • Eclat

例如,你有你博客访客的大量数据,你想运行一个聚类算法来找出相似的访客(图1-8)。你不可能告诉算法每个访客属于哪个类,它完全自己找出其中的关系。例如,它会发现40%的访客是男性,喜欢漫画书,通常在上午阅读你的博客,20%的访客是年轻的科幻爱好者,往往在周末访问你的博客,如此种种。如果你使用分层聚类算法,它还能将每个类细分为更小的子类。这将有助于你对每个群体推送不同的内容。
在这里插入图片描述图1-7 聚类

数据可视化也是无监督学习的良好示例:你提供给它许多复杂的,无标签的数据,它可以输出2D或者3D的数据展示,易于绘制(图1-9)。算法会尝试保留尽可能多的结构,从而帮助你理解数据是如何组织的,甚至能够发现意料之外的模型(特征)
在这里插入图片描述图1-9 t-SNE可视化语义高亮聚类

与之相关的工作则是数据降维,其目标是在不损失太多信息的情况下简化数据。其中一个手段是将数个有关联的特征合并为一个特征。例如,一辆车的里程与其车龄往往密切相关,降维算法就会将这两个特征合并。这被称为特征提取

注意:在将数据提供给机器学习算法之前,最好先使用降维算法对其进行降维,这样能够使算法运行的更快,占用的磁盘和内存空间更小,往往算法表现也会提升。

另一个重要的无监督学习任务是异常检测,例如检测信用卡的异常交易,发现制造缺陷,或者自动移除数据集中的异常值。系统使用正常值样例进行训练,当它接收到一个新样例时,它能够区分这个新样例更像是正常值还是异常值。(图1-10)
在这里插入图片描述图1-10 异常检测

最后一个常见的无监督学习的例子是关联规则学习(association rule learning ),其目标是挖掘大量数据以发现其属性间的关系。例如,假设你拥有一个超市,通过对销售数据进行关联规则学习,你也许会发现买烧烤酱和番茄片的人往往也会买牛扒,这样一来,你可能就会把这几样东西摆在一起。

半监督学习

有些算法能够处理部分标记的数据,通常是大部分数据未标记,小部分数据有标记。这被称为半监督学习。(图1-11)

一些照片托管服务,例如Google Photos就是个很好的例子。一旦你上传了你家庭照片,它能够自动识别A在照片1、5、11中出现,B在照片2、5、7中出现。这是算法的无监督部分(聚类)。你告诉系统这些人(A和B)到底是谁,每人一个标签,系统就能够识别给每张照片中的每个人,这在进行照片搜索的时候非常有用。
在这里插入图片描述图1-11 半监督学习

大多数半监督学习算法是有监督学习和无监督学习的组合。例如深度置信网络(deep belief networks ,DBNs)就是由无监督学习的组件restricted Boltzmann machines (RBMs) 堆叠在一起的。RBMs按照无监督学习的方式顺序训练,整个DBNs系统则利用有监督学习的技术进行微调。

强化学习

强化学习系统,往往被称作代理,能够观察环境,做出选择或做出动作,然后得到奖励或惩罚。它自主学习最佳的策略以得到最多的奖励。策略决定了代理在特定形势下如何做出选择。
在这里插入图片描述图1-12 强化学习

例如,许多机器人使用加强学习算法来学习如何走路。DeepMind 的AlphaGo 也是使用的加强学习算法:通过学习上百万场对局,它学习到了赢的策略,然后再自己跟自己下棋。值得注意的是,在跟李世石下棋的时候,学习进程是关闭的,它仅仅在使用已经学习到的策略。

批量学习和在线学习

另一个分类角度是根据机器学习系统是否能够通过输入的数据流逐步学习进步。

批量学习

在批量学习中,系统无法“进步”:必须使用所有可用的数据进行训练,这需要大量的时间和计算资源,通常离线进行。系统训练完成后上线,并不会在运行时持续学习,持续改进,它仅仅是将已经学习到的规则应用到新的数据上,这被称为离线学习

如果你希望一个批量学习系统能够识别新的数据,那你需要在包含新、旧数据的数据及上从头训练一个新版本,然后替代旧版本。

幸运的是,训练、评价、上线一个机器学习系统很容易实现自动化,因此即使是批量学习系统,也能够适应变化。仅仅更新数据,然后根据需要训练一个新版本即可。

这种解决方案简单,往往效果不错,但是在整个数据集上进行训练往往需要数大量的时间。如果系统需要适应快速变化的数据,那么就需要一个能够更具反应性的系统

同样的,在整个数据集上进行训练也需要大量的计算资源,如果你有许多数据,而你的系统每天自动从头开始训练,那么它最终将花掉你很多钱。如果数据集很庞大的话,甚至都无法适用批量学习。

最后,如果你的系统需要自动学习而且计算资源又有限,那么携带大量的数据而且每天用掉大量的时间、资源进行训练就很扯。

幸好,在这些情况下,更好的选择是使用一种能够逐步学习的算法

在线学习

在线学习模式下,通过给系统顺序提供数据样例可以逐步训练系统。数据可以一个一个提供,也可以小批量提供。每个学习步骤都很快而且很经济(指资源消耗低),所以当有新数据到来,系统能够即时学习(图1-13)。
在这里插入图片描述
图1-13 在线学习

在线学习非常适用于需要接受连续数据流(比如股票价格)而且需要快速或自动适应变化的系统。当你的计算资源有限的时候,在线学习也是个不错的选择:一旦在线学习已经学过了新的数据实例,就不再需要这些例子了,因此可以丢弃掉这些数据(除非你想能回滚到前一个状态再重新学习这个数据),从而节约大量的空间。

当系统数据量庞大,无法一次全部加载进机器内存时,在线学习同样适用。算法加载一部分数据并执行训练步骤,然后重复上述操作直至训练完所有的数据。

警告:这种情况下,整个学习过程其实是离线的,因此”在线学习“这个名字容易混淆,就把它想象成是持续学习吧。
在这里插入图片描述图1-14 在大数据集上进行在线学习

在线学习系统的一个重要参数是学习率,它代表了系统适应变化数据的速度。如果设置了较高的学习率,则系统将会很快的适应新的数据,但是也会很快的忘记旧的数据(你不希望你的邮件分类器只标记最新类型的垃圾邮件吧)。相反的,如果学习率设置的过低,则系统的惯性就会很大,也就意味着它学的比较慢,但是这样的话,它同样对新数据中的噪声或者不具有代表性的数据序列不敏感。

在线学习系统面临的一个巨大挑战是如果系统接收了坏数据,系统的表现会逐渐降低。对于一个实时系统而言,客户就会有所察觉。坏数据可能来自于机器人上不正常工作的传感器,或者因为有人向搜索引擎发送垃圾邮件以使得搜索排名靠前。为了降低这种风险,你就需要仔细监控你的系统,当你发现系统的表现有所下降的时候关闭学习系统。这时候你就应该监控输入的数据并对错误数据做出响应。

基于实例的学习和基于模型的学习

对机器学习进行分类的另一种标准是它们如何归纳/泛化(genaralize)的。大多数的机器学习任务是关于预测的,这意味着给定一定数量的训练样本,系统应该能够泛化至它从来没见过的样本。在训练集上表现出色当然很好,但是却远远不够,真正的目标是要在新样本上表现出色。

有两种泛化的方式:基于实例的和基于模型的。

基于实例的学习

最简单的学习方式也是就是死记硬背了(learn by heart)。如果你通过这种方式编写垃圾邮件分类器,那么他会记住所有已经被用户标记为垃圾邮件的邮件,然后将于这些已经标记的垃圾邮件相同的邮件标记为垃圾,这种解决方式也许不是最坏的,但肯定不是最好的。

我们要做的不仅仅是要标记与已知的垃圾邮件相同的邮件,我们更应该能够标记那些与已知的垃圾邮件相似的邮件,那么如果度量这个相似度呢?一种最基本的相似度度量的方法是统计两封邮件拥有的相同单词的数量。系统将会将一封邮件标记为垃圾如果它和已知的垃圾邮件有许多系统的单词。

这就叫做基于实例的学习:系统记住所有的实例,然后通过一个相似度量泛化至新的实例。
在这里插入图片描述图1-15 基于实例的学习

基于模型的学习

另一种从样例集进行泛化的方式是建立起这些实例的模型,然后运用这个模型进行预测。这就是基于模型的学习(图1-16)。
在这里插入图片描述图1-16 基于模型的学习

例如,假设你想知道金钱能否使人开心,于是你从OECD 的网站上下载了幸福生活指数的数据,再从IMF 的网站上下载了人均GDP的数据。将这两份数据结合起来,再按照人均GDP进行排序,结果如表1-1所示。

表1-1 金钱使人快乐么?

CountyGDP per capita(USD)Life satisfaction
Hungary12,2404.9
Korea27,1955.8
France37,6756.5
Australia50,9627.3
United States55,8057.2

我们随机挑选一些国家进行绘图(图1-17)。
在这里插入图片描述图1-17 你能够看出趋势么

看起来似乎真的有一个趋势!尽管数据中含有噪声,但是看起来随着国家的人均GDP的升高,生活满意度或多或少的呈现出与之线性正相关的关系。于是你决定将生活幸福指数建模为人均GDP的线性函数。这一过程被称为模型选择:你使用了唯一参数-人均GDP-的线性函数作为生活幸福指数的表征函数。(公式1-1)

公式1-1 一个简单的线性模型

l i f e _ s a t i s f a c t i o n = θ 0 + θ 1 × G D P _ p e r _ c a p i t a life\_satisfaction = \theta_0 +\theta_1\times GDP\_per\_capita life_satisfaction=θ0+θ1×GDP_per_capita

该模型有两个模型参数, θ 0 \theta_0 θ0 θ 1 \theta_1 θ1 。通过调整这些参数,你可以是你的模型表示任何线性函数,如图1-18所示。
在这里插入图片描述图1-18 一些可能的线性模型

在使用你的模型之前,你需要定义参数 θ 0 \theta_0 θ0 θ 1 \theta_1 θ1 的值。你怎么知道应该设什么值才能使模型表现的更好?为了回答这个问题,你需要指定一个性能度量函数。你要么定义一个拟合度函数来衡量你的模型表现的有多好,要么定义一个损失函数来衡量它表现的有多差。对于线性回归问题,人们一般定义一个损失函数用于计算模型预测值与实际值之间的距离,目标是最小化这个距离。

线性回归算法的用武之地:将训练实例提供给模型,它计算出使得线性模型拟合度最高的参数。这就是训练模型。在这个例子中,算法最终计算得到的最优的参数值为 θ 0 = 4.85 \theta_0=4.85 θ0=4.85以及 θ 1 = 4.91 × 1 0 − 5 \theta_1=4.91\times 10^{-5} θ1=4.91×105

现在,这个线性模型尽可能的拟合训练数据,如图1-19。
在这里插入图片描述图1-19 拟合训练集的线性模型

你已经准备好去运行你的模型来进行预测了。例如,你想知道塞浦路斯人的幸福指数是怎样的,但是OECD的数据中没有现成的值,于是你使用了你的模型进行了预测:你发现塞浦路斯的人均GDP为$22,587,于是运用模型计算,发现生活幸福指数大约是 4.85 + 22 , 587 × 4.91 × 1 0 − 5 = 5.96 4.85+22,587\times4.91\times10^{-5}= 5.96 4.85+22,587×4.91×105=5.96

为了激起你的胃口,例1-1列出了加载数据、准备数据、创建可视化的散点图、训练线性模型和进行预测的Python代码。

例1-1 使用Scikit-Learn训练和运行一个线性模型

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
# Load the data
oecd_bli = pd.read_csv("oecd_bli_2015.csv", housands=',')
gdp_per_capita = pd.read_csv("gdp_per_capita.csv",thousands=',',delimiter='\t',
encoding='latin1', na_values="n/a")

# 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
lin_reg_model = sklearn.linear_model.LinearRegression()

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

# Make a prediction for Cyprus
X_new = [[22587]] # Cyprus' GDP per capita
print(lin_reg_model.predict(X_new)) # outputs [[ 5.96242338]]

注:如果你使用基于样例的学习算法,你会发现Slovenia和Cyprus的人均GDP最为接近,OECD的数据告诉我们Slovenia的幸福指数为5.7,你因此推测Cyprus的幸福指数也为5.7,如果把范围再扩大一点,与之人均GDP最接近的第二第三国家分别为Portugal and Spain ,他们的幸福指数各自为5.1和6.5。对这3个数求平均值,得到5.77,这与使用基于模型的学习得到的值很接近。这个简单的算法就是KNN(K最近邻),在此例中,k =3

只需要将代码中的该行进行替换,就能将上边代码中的线性回归模型替换为KNN。

clf = sklearn.linear_model.LinearRegression()替换为

clf = sklearn.neighbors.KNeighborsRegressor(n_neighbors=3)

如果一切顺利,模型将运转的很好,如若不然,你也许需要使用更多的属性、获得更多或者更好的训练数据或者选择一个更有效的模型。

总结来说:

  • 数据
  • 选择模型
  • 在训练集上训练模型
  • 将模型应用在新数据上进行预测,期望模型能够泛化的很好

这是一个典型的机器学习项目的流程,在第2章中,通过一个端到端的项目,你将亲历这个过程。

目前为止,我们已经涵盖了很多方面:你了解了机器学习是干啥的,为啥它很有用,机器学习系统的常见类别以及一个典型的机器学习工作流是怎样的。现在我们来看看有哪些坑会妨碍你做出正确的预测。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hands-On Data Science and Python Machine Learning by Frank Kane English | 31 July 2017 | ISBN: 1787280748 | ASIN: B072QBVXGH | 420 Pages | AZW3 | 7.21 MB Key Features Take your first steps in the world of data science by understanding the tools and techniques of data analysis Train efficient Machine Learning models in Python using the supervised and unsupervised learning methods Learn how to use Apache Spark for processing Big Data efficiently Book Description Join Frank Kane, who worked on Amazon and IMDb's machine learning algorithms, as he guides you on your first steps into the world of data science. Hands-On Data Science and Python Machine Learning gives you the tools that you need to understand and explore the core topics in the field, and the confidence and practice to build and analyze your own machine learning models. With the help of interesting and easy-to-follow practical examples, Frank Kane explains potentially complex topics such as Bayesian methods and K-means clustering in a way that anybody can understand them. Based on Frank's successful data science course, Hands-On Data Science and Python Machine Learning empowers you to conduct data analysis and perform efficient machine learning using Python. Let Frank help you unearth the value in your data using the various data mining and data analysis techniques available in Python, and to develop efficient predictive models to predict future results. You will also learn how to perform large-scale machine learning on Big Data using Apache Spark. The book covers preparing your data for analysis, training machine learning models, and visualizing the final data analysis. What you will learn Learn how to clean your data and ready it for analysis Implement the popular clustering and regression methods in Python Train efficient machine learning models using decision trees and random forests Visualize the results of your analysis using Python's Matplotlib library Use Apache Spark's MLlib package to perform
Hands-On Machine Learning with Scikit-Learn and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems by Aurélien Géron English | 2017 | ISBN: 1491962291 | 566 Pages | EPUB | 8.41 MB Through a series of recent breakthroughs, deep learning has boosted the entire field of machine learning. Now, even programmers who know close to nothing about this technology can use simple, efficient tools to implement programs capable of learning from data. This practical book shows you how. By using concrete examples, minimal theory, and two production-ready Python frameworks—scikit-learn and TensorFlow—author Aurélien Géron helps you gain an intuitive understanding of the concepts and tools for building intelligent systems. You’ll learn a range of techniques, starting with simple linear regression and progressing to deep neural networks. With exercises in each chapter to help you apply what you’ve learned, all you need is programming experience to get started. Explore the machine learning landscape, particularly neural nets Use scikit-learn to track an example machine-learning project end-to-end Explore several training models, including support vector machines, decision trees, random forests, and ensemble methods Use the TensorFlow library to build and train neural nets Dive into neural net architectures, including convolutional nets, recurrent nets, and deep reinforcement learning Learn techniques for training and scaling deep neural nets Apply practical code examples without acquiring excessive machine learning theory or algorithm details

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值