机器学习项目实战五部曲
本文作者 黄佳 (节选自其著作《零基础学机器学习》)
李宏毅老师曾用大象装进冰箱来比喻机器学习。大象怎么装进冰箱?3个步骤:打开冰箱门、放进去、关门。机器学习也就是个三部曲:选择函数模型,评估函数的优劣,确定最优的函数。
这个比喻非常精彩,但它主要聚焦于“建模”过程,未强调机器学习项目其他环节。机器学习项目的实际流程要更复杂一些。大致分为:
1. 问题的定义
2. 数据准备和特征工程
3. 模型(算法)的选择
4. 机器学习(训练机器的过程)
5. 评估和性能优化
这5个阶段。每一步的处理是否得当,都直接影响机器学习项目的成败。而且,如下图所示,这些步骤还需要再项目实战中以迭代的方式反复进行,以实现最优的效果。
本教程将通过五个简单的步骤说说机器学习项目中的每个具体环节都在做些什么,同时给出一个完整的机器学习小项目的具体实现(包括简单的代码)。
第一环:问题的构建和概念化
机器学习项目是相当直观的。换句话说,机器学习项目都是为了解决实际的问题而存在。
第一个环节是对问题的构建和理解。大家想象一下一个医生接到一个病人后,先不仔细研究病情,分析问题出在何处,就直接开药、动手术,后果会如何呢?在心理咨询领域,有一个名词叫作 “个案概念化“。意思是心理咨询师通过观察分析,先评估界定来访者的问题,以指导后续的咨询进程;否则,可能很多次的咨询、治疗,都是原地绕圈。
我们做机器学习项目,道理也很类似,如果每个团队成员都知道项目要解决的是什么问题,那么项目也许已经成功了一半,然而有很多人其实是不知道大方向的所在的。
因此,不是上来就开始建立模型,而是首先构建你的问题。反复问一问自己、问一问客户和其他项目干系人,目前的痛点是什么,要解决的问题是什么,目标是什么。对这些关键问题的回答可以说是相当重要,但是很奇怪的是在现实中最关键的内容反而最有可能被忽略。
举例来说,看一下下面这个问题的定义:
- 痛点:某商家准备推出一系列促销活动,目的是增加顾客黏性,降低流失率。但是如果促销活动的参与度不高,就不会有好的效果,力气也就白费。因此,只有设计出来的活动是顾客所感兴趣的,才会起到作用。
- 现状:已经收集了过去几年顾客的信息,以及其行为模式数据,如顾客所购买商品的价格、数量、频率等。
- 目标:根据已有的顾客行为模式数据,推断(学习)出最佳的商品和折扣项目,以确保设计出来的活动有较高的参与度。
这就是一个定义比较清楚,有可能起到效果的机器学习项目。再看一个:
- 痛点:股票市场的波动性大,难以预测。
- 现状:已经收集了股票市场过去10年的详细信息,例如每一只股票每天的收盘价、月报、季报等。
- 目标:通过学习历史数据,预测股市。
这个“预测股市”,看起来是也许是机器学习问题,实际上可能是一个伪机器学习问题。因为对目标的定义太不具体了。预测股市的什么内容?是某只股票的第二天的价格,还是未来一个月整体的走势?而且机器学习是否能在股市预测中发挥作用?似乎不大可能。可以运用这样一个简单的方法去评判机器学习是否会生效:即,如果机器学习无法预测历史,它也就无法预测未来。这是因为机器学习只能识别出它曾经见过的东西。要想在过去的数据的基础上预测未来,其实存在一个假设,就是未来的规律与过去相同。但对于股价而言,事实往往并非如此 。也就是说,即使用1998-2007年的全部数据去训练机器,机器也不能预测出2008年的金融危机,因此它也不大可能成功预测未来。
方才扯得有点远了,下面我们同步进行一个机器学习项目的实战。这里要向大家介绍MNIST 数据集,这个数据集相当于是机器学习领域的Hello World,非常的经典,里面包含60000 张训练图像和10000 张测试图像,都是28 像素×28 像素的灰度手写数字图像。
此处要解决的问题是:将手写数字灰度图像分类:0,1,2,3,4,5,6,7,8,9,共10 个类别。
上面就是这个机器学习的问题定义,在下一篇文章中,我们将导入这个数据集。
第二环:数据的收集、预处理、和特征工程
数据是机器学习的燃料。机器学习项目的成败,数据是关键。
下面要说一说:
- 原始数据的准备
- 数据的预处理
- 特征提取和特征工程
- 如何载入MNIST数据集
原始数据的准备
原始数据如何获得呢?有时是自有的数据(比如互联网公司拥有的大量的客户资料、购物行为历史信息);或者需要上网爬取数据;有时候去各种开源数据网站下载(ImageNet,Kaggle,Google Public Data Explorer,甚至Youtube和维基百科,都是机器学习的重要数据源);也可以购买别人的数据。
数据的预处理
从本机或者网络中载入原始数据之后,预处理工作包括:
- 可视化(visualization):要用Excel表和各种数据分析工具(比如前面说的Matplotlib或者Seaborn)从各种角度(如列表、直方图、散点图等)看一看数据。对数据有了基本的了解,才好进一步分析判断。
- 数据向量化(data vectorization): 把原始数据格式化、令其变得机器可以读取。例如:将原始图片转换为机器可以读取的像素矩阵;将文字转换为one-hot编码;将文本类别(如男/女)转换成0、1这样的数值。
- 处理坏数据和缺失值:一笔数据可不是全部都能用,要利用数据处理工具来把捣乱的垃圾数据(冗余数据、离群数据、错误数据)处理掉,把缺失的值补充上。
- 特征缩放(feature scaling),特征缩放方法很多,包括数据标准化(standardization)和规范化(normalization)等:
- 标准化,是对数据特征分布的转换,目标是使其符合正态分布(均值为0,方差为1)。因为如果数据特征不符合正态分布的话,就影响机器学习效率。在实践中,会去除特征的均值来转换数据,使其居中,然后除以特征的标准差来对其进行缩放。
- 标准化的一种变体是将特征压缩(scaling features to a range)到给定的最小值和最大值之间,通常在0和1之间,因此这种特征缩放方法也叫归一化。归一化不会改变数据的分布状态。
- 规范化,则是将样本缩放为具有单位范数的过程,然后再喂入机器学习模型,这个过程消除了数据中的离群值。
在Sklearn的preprocessing工具箱中可以找到很多特征缩放和书籍预处理的