1.1 机器学习简介
在正式学习机器学习之前,先了解什么是机器学习、机器学习三要素和核心、机器学习的开发流程、机器学习模型评价指标,以及机器学习项目开发步骤。
1.1.1 什么是机器学习
机器学习是人工智能的一个分支。人工智能的研究历史有着一条从以“推理”为重点,到以“知识”为重点,再到以“学习”为重点的自然、清晰的脉络。显然,机器学习是实现人工智能的一个途径,即以机器学习为手段解决人工智能中的问题。机器学习经过30多年发展,已经成为一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析(Convex Analysis)、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。因为学习算法中涉及大量的统计学理论,所以机器学习与推断统计学联系尤为密切,因此也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的、行之有效的学习算法。很多推论问题无程序可循,难度较大,所以部分机器学习的研究是开发容易处理的近似算法。
机器学习已广泛应用于数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊断、检测信用卡欺诈、证券市场分析、DNA序列测序、语音和手写识别、战略游戏和机器人等领域。
简单地说,机器学习是一门从数据中研究算法的科学学科,它根据已有的数据进行算法的选择,并基于算法和数据结构构建模型,最终对未来进行预测。它的实质是通过数据构建一个模型并用于预测未知属性。
1.1.2 机器学习三要素和核心
1.机器学习三要素
按照统计机器学习的观点,任何一个机器学习方法都是由模型(Model)、策略(Strategy)和算法(Algorithm)三个要素构成的。具体可理解为机器学习模型在一定的优化策略下,使用相应求解算法来达到最优目标的过程。
机器学习的第一个要素是模型。机器学习中的模型就是要学习的决策函数或者条件概率分布,一般用假设空间(Hypothesis Space)F来描述所有可能的决策函数或条件概率分布。
当模型是一个决策函数时,如线性模型的线性决策函数,F可以表示为若干决策函数的集合,F={f|Y=f(X)},其中X和Y为定义在输入空间和输出空间中的变量。
当模型是一个条件概率分布时,如决策树是定义在特征空间和类空间中的条件概率分布,F可以表示为条件概率分布的集合,F={P|P=Y|X },其中X和Y为定义在输入空间和输出空间中的随机变量。
机器学习的第二个要素是策略。简单来说,就是在假设空间的众多模型中,机器学习需要按照什么标准选择最优模型。对于给定模型,模型输出f(X)和真实输出Y之间的误差可以用一个损失函数(Loss Function),也就是L(Y,F(X))来度量。
不同的机器学习任务都有对应的损失函数,回归任务一般使用均方误差,分类任务一般使用对数损失函数或者交叉熵损失函数等。
机器学习的最后一个要素是算法。这里的算法有别于所谓的“机器学习算法”,在没有特别说明的情况下,“机器学习算法”实际上指的是模型。作为机器学习三要素之一的算法,指的是学习模型的具体优化方法。当机器学习的模型和损失函数确定时,机器学习就可以具体地形式化为一个最优化问题,可以通过常用的优化算法,例如随机梯度下降法(Stochastic Gradient Descent,SGD)、牛顿法、拟牛顿法等,进行模型参数的优化求解。
当一个机器学习问题的模型、策略和算法都确定了,相应的机器学习方法也就确定了,因而这三者也叫作“机器学习三要素”。
2.机器学习的核心
机器学习的目的在于训练模型,使其不仅能够对已知数据有很好的预测效果。而且能对未知数据有较好的预测能力。当模型对已知数据预测效果很好,但对未知数据预测效果很差的时候,就引出了机器学习的核心问题之一——过拟合(Over-Fitting)。
先来看一下监督机器学习的核心哲学。总的来说,所有监督机器学习都可以用如下公式来概括:
上面的公式就是监督机器学习中的损失函数计算公式,其中,第一项为针对训练集的经验误差项,即我们常说的训练误差;第二项为正则化项,也称为惩罚项,用于对模型复杂度进行约束和惩罚。
因此,所有监督机器学习的核心任务就是在正则化参数的同时最小化经验误差。多么简约的哲学啊!各类机器学习模型的差别无非就是变着方式改变经验误差项,即我们常说的损失函数。不信你看:当第一项是平方损失(Square Loss)时,机器学习模型便是线性回归;当第一项变成指数损失(Exponential Loss)时,模型则是著名的AdaBoost(一种集成学习树模型算法);而当损失函数为合页损失(Hinge Loss)时,便是大名鼎鼎的SVM了!
综上所述,第一项“经验误差项”很重要,它能变着法儿改变模型形式,我们在训练模型时要最大限度地把它变小。但在很多时候,决定机器学习模型质量的关键不是第一项,而是第二项“正则化项”。正则化项通过对模型参数施加约束和惩罚,让模型时时刻刻保持对过拟合的警惕。
我们再回到前面提到的监督机器学习的核心任务:正则化参数的同时最小化经验误差。通俗来讲,就是训练集误差小,测试集误差也小,模型有着较好的泛化能力;或者模型偏差小,方差也小。
但是很多时候模型的训练并不尽如人意。当你在机器学习领域摸爬滚打已久时,想必更能体会到模型训练的艰辛,要想训练集和测试集的性能表现高度一致实在太难了。很多时候,我们已把经验损失(即训练误差)降到极低,但模型一到测试集上,瞬间“天崩地裂”,表现得一塌糊涂。这种情况便是下面要谈的主题——过拟合。
所谓过拟合,指在机器学习模型训练的过程中,模型对训练数据学习过度,将数据中包含的噪声和误差也学习了,使得模型在训练集上表现很好,而在测试集上表现很差的一种现象。机器学习简单而言就是归纳学习数据中的普遍规律,这里一定得是普遍规律,像这种将数据中的噪声也一起学习了的,归纳出来的便不是普遍规律,而是过拟合。
欠拟合、正常拟合与过拟合的表现形式如图1-1所示。
鉴于过拟合十分普遍并且关乎模型的质量,因此在机器学习实践中,与过拟合长期坚持不懈地斗争是机器学习的核心。而机器学习的一些其他问题,诸如特征工程、扩大训练集数量、算法设计和超参数调优等,都是为防止过拟合这个核心问题而服务的。
图1-1 欠拟合、正常拟合、过拟合的表现形式
1.1.3 机器学习开发流程
机器学习开发流程在实际操作层面一共分为8步:需求分析、数据收集、数据预处理、数据分析与可视化、建模调优、特征工程、模型结果展示与分析报告、模型部署与上线反馈优化。如图1-2所示。
图1-2 机器学习开发流程
1.需求分析
很多算法工程师可能觉得需求分析没有技术含量,因而不太重视项目启动前的需求分析工作,这对于一个项目而言其实是非常危险的。
需求分析的主要目的是为项目确定方向和目标,为整个项目的顺利开展制订计划和设立里程碑。我们需要明确机器学习的目标输入是什么,目标输出是什么,是回归任务还是分类任务,关键性能指标都有哪些,是结构化的机器学习任务还是基于深度学习的图像和文本识别任务,市面上项目相关的产品都有哪些,对应的SOTA(State Of The Art)模型有哪些,相关领域的前沿研究和进展都到什么程度了,项目有哪些有利条件和风险。这些都需要在需求分析阶段认真考虑。
2.数据采集
一个机器学习项目要开展下去,最关键的资源就是数据。
在数据资源相对丰富的领域,例如电商、O2O、直播以及短视频等行业,企业一般会有自己的数据源,业务部门提出相关需求后,数据工程师可直接根据需求从数据库中提取数据。但对于本身数据资源就贫乏或者数据隐私性较强的行业,例如医疗行业,一般很难获得大量数据,并且医疗数据的标注也比较专业,因此高质量的标注数据尤为难得。对于这种情况,我们可以先获取一些公开数据集或者竞赛数据集进行算法开发。
还有一种情况是目标数据在网页端,例如我们想了解杭州二手房的价格信息,找出影响杭州二手房价格的关键因素,这时候可能需要使用爬虫一类的数据采集技术来获取相关数据。
(1)数据来源:
- 用户访问行为数据。
- 用户业务数据。
- 外部第三方数据(网络爬虫等)。
(2)数据存储:
- 需要存储的数据:原始数据、预处理后的数据、模型结果。
- 存储设施:MySQL、HDFS、HBase、Solr、Elasticsearch、Kafka、Redis等。
(3)数据收集方式:
- Flume。
- Kafka。
(4)机器学习可用的公开数据集:
在实际工作中,我们可以使用业务数据进行机器学习开发,但是在学习过程中没有业务数据,此时可以使用公开数据集进行开发。常用的公开数据集网址如下:
- http://archive.ics.uci.edu/ml/datasets.html
- https://aws.amazon.com/cn/public-datasets/
- https://www.kaggle.com/competitions
- http://www.kdnuggets.com/datasets/index.html
- http://www.sogou.com/labs/resource/list_pingce.php
- https://tianchi.aliyun.com/datalab/index.htm
- http://www.pkbigdata.com/common/cmptIndex.html
3.数据预处理
由于公开数据集和一些竞赛数据集非常“干净”,有的甚至可以直接用于模型训练,因此一些机器学习初学者认为只需专注于模型与算法设计就可以了,其实不然。在生产环境下,我们拿到的数据都会比较“脏”,以至于需要花大量时间去清洗数据,有些人甚至认为数据清洗和特征工程要占用项目70%以上的时间。
- 数据预处理是实际生产环境中机器学习比较耗时的一部分。
- 大部分的机器学习模型所处理的都是特征,特征通常是输入变量所对应的可用于模型的数值表示。
- 大部分情况下,收集得到的数据需要经过预处理后才能够为算法所用。
数据预处理的操作主要包括以下几个部分:
- 数据过滤。
- 处理数据缺失。
- 处理可能的异常、错误或者异常值。
- 合并多个数据源数据。
- 数据汇总。
4.数据分析与可视化
数据清洗完后,一般不建议直接对数据进行训练。这时候我们对于要训练的数据还是非常陌生的。数据都有哪些特征?是否有很多类别特征?目标变量分布如何?各自变量与目标变量的关系是否需要可视化展示?数据中各变量缺失值的情况如何?怎样处理缺失值?这些问题都需要在探索性数据分析(Exploratory Data Analysis,EDA)和数据可视化过程中找到答案。
5.建模调优与特征工程
数据初步分析完后,对数据会有一个整体的认识,一般就可以着手训练机器学习模型了。但建模通常不是一锤子买卖,训练完一个基线(Baseline)模型之后,需要花大量时间进行模型调参和优化。
有关模型评价指标的相关内容参见下一小节。
6.模型结果展示与分析报告
经过一定的特征工程和模型调优之后,一般会有一个阶段性的最优模型结果,模型对应的关键性能指标都会达到最优状态。这时候需要通过一定的方式呈现模型,并对模型的业务含义进行解释。如果需要给上级领导和业务部门作决策参考,一般还需要生成一份有价值的分析报告。
7.模型部署与上线反馈优化
给出一份分析报告不是一个机器学习项目的最终目的,将模型部署到生产环境并能切实产生收益,才是机器学习的最终价值所在。
如果新上线的推荐算法能让用户的广告点击率上升0.5%,为企业带来的收益也是巨大的。该阶段更多的是需要进行工程方面的一些考虑,是以Web接口的形式提供给开发部门,还是以脚本的形式嵌入软件中,后续如何收集反馈并提供产品迭代参考,这些都是需要在模型部署和上线之后考虑的。
1.1.4 机器学习模型评价指标
关于模型调优,结合业务的精细化特征工程工作比模型调参更能改善模型表现。建模调优与特征工程之间本身是个交互性的过程,在实际工作中我们可以一边进行调参,一边进行特征设计,交替进行,相互促进,共同改善模型表现。在调优过程中同时包括对模型的评估,即调优的模型是否更优秀。评估的指标主要有准确率、召回率、精确率、F1值、混淆矩阵、ROC曲线、ROC曲线下的面积等,如表1-1所示。
表1-1 评估指标
1.准确率
准确率是指分类正确的样本占总样本个数的比例,计算公式为:
准确率=提取出的正确样本数/总样本数
准确率具有局限性。准确率是分类问题中最简单也是最直观的评价指标,但存在明显的缺陷,当不同种类的样本比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素。例如:当负样本占99%时,即使分类器把所有样本都预测为负样本,也可以得到99%的准确率,换句话说,总体准确率高,并不代表类别比例小的准确率也高。
2.召回率与精确率
召回率是指正确分类的正样本个数占真正的正样本数的比例。精确率是指正确分类的正样本个数占分类器判定为正样本的样本个数的比例。
召回率=正确的正例样本数/样本中的正例样本数
精确率=正确的正例样本数/预测为正例的样本数
召回率和精确率是既矛盾又统一的两个指标,为了提高精确率的值,分类器需要尽量在“更有把握”时才把样本预测为正样本,但此时往往会因为过于保守而漏掉很多“没有把握”的正样本,导致召回率值降低。
3.F值
F值是精确率和召回率的谐波平均值,正常的平均值会平等对待所有的值,而谐波平均值会给予较低的值更高的权重。因此,只有当召回率和精确率都很高时,分类器才能得到较高的F值。
F值=精确率×召回率×2/(精确率+召回率)
这个公式即表示F值为精确率和召回率的调和平均值。F值对那些具有相近的精确率和召回率的分类器更为有利。但这并不一定能符合我们的期望,在某些情况下,我们更关心的是精确率,而另一些情况下,我们可能真正关心的是召回率。精确率与召回率的权衡将是很值得思考的问题。
真实值与预测值的关系如表1-2所示。
表1-2 真实值与预测值
表中A和D预测正确,B和C预测错误,测试计算结果为(其中#表示样本个数,如#(A)表示真正例个数):
4.ROC曲线
二值分类器是机器学习领域中最常见也是应用最广泛的分类器。评价二值分类器的指标很多,例如精确率、召回率、F1值、P-R曲线等,但这些指标或多或少只能反映模型在某一方面的性能。相比而言,ROC曲线则有很多优点,经常作为评估二值分类器最重要的指标之一。ROC曲线是Receiver Operating Characteristic Curve的简称,中文名为受试者工作特征曲线。
ROC曲线的横坐标为假阳率FPR,纵坐标为真阳率TPR,FPR和TPR的计算方法分别为:
P是真实的正样本数量,N是真实的负样本数量,TP是P个正样本中被分类器预测为正样本的个数,FP为N个负样本中被预测为正样本的个数。
下面来演示ROC曲线的绘制。首先,创建数据集:
【程序1.1】roc_data.py
然后,绘制ROC曲线:
【程序1.2】roc_plt.py
代码运行结果如图1-3所示。
图1-3 ROC曲线
AUC指ROC曲线下的面积大小,该值能够量化地反映基于ROC曲线衡量出的模型性能。AUC越大,说明分类器越可能把真正的正样本排在前面,分类性能越好。
ROC曲线相比P-R曲线来说,当正负样本的分布发生变化时,ROC曲线的形状能够基本保持不变,而P-R曲线的形状一般会发生激烈的变化。这个特点让ROC曲线能够尽量降低不同测试集带来的干扰,更加客观地衡量模型本身的性能。
1.1.5 机器学习项目开发步骤
假设我们有个机器学习任务,是通过酒精度和颜色来区分红酒和啤酒。下面以机器学习如何区分啤酒和红酒为例(见图1-4),详细介绍一下机器学习中每一个步骤是如何工作的。
图1-4 区分红酒和啤酒案例
1.数据收集与存储
我们先在超市买来一堆不同种类的啤酒和红酒,然后买来测量颜色的光谱仪和用于测量酒精度的设备,最后把买来的所有酒都标记出相应的颜色和酒精度,会形成下面这张表格(见表1-3)。
表1-3 选取数据特征
这一步非常重要,因为数据的数量和质量直接决定了预测模型的好坏。
2.数据预处理
在本例中,数据是很工整的,但是在实际情况中,我们收集到的数据会有很多问题,所以会涉及数据清洗等数据预处理工作,如图1-5所示。
图1-5 数据预处理
当数据本身没有什么问题后,我们将数据分成3个部分:训练集(60%)、验证集(20%)、测试集(20%),用于后面的验证和评估工作。
3.选择一个模型
研究人员和数据科学家创造了许多模型。我们可以根据不同的数据特征选择不同的模型,有些模型非常适合图像数据,有些非常适合序列(如文本或音乐),有些适合数字数据,有些适合文本数据。
在本例中,由于只有两个特征——颜色和酒精度,因此我们可以使用一个小的线性模型,这是一个相当简单的模型。
4.训练
大部分人都认为训练这一步是最重要的部分,其实并非如此,数据的数量、质量,以及模型的选择比训练本身更重要。将原始数据分为训练集和测试集(交叉验证),并利用训练集训练模型,这个过程不需要人来参与,机器可以独立完成,整个过程就像做算术题。因为机器学习的本质就是一个将现实问题转换为数学问题,然后解答数学题的过程。
5.模型评估
一旦训练完成,就可以评估模型是否有用。这是我们之前预留的验证集和测试集发挥作用的地方。这个过程可以让我们看到模型是如何预测的,即模型在现实世界中是如何表现的。
6.参数调整
完成模型评估后,我们可能希望了解是否可以使用任意方式进一步改进训练,这些可以通过调整参数来做到。当模型进行训练时,我们隐含地假设了一些参数,可以通过人为调整这些参数来让模型表现得更出色。
7.预测
前面的6个步骤都是围绕预测来服务的,这也是机器学习的价值。在这一步,当我们买来一瓶新的酒,只要告诉机器酒的颜色和酒精度,模型就会告诉我们这瓶酒是啤酒还是红酒了。