零基础学习机器学习(二)机器学习的五个步骤

一个机器学习项目从开始到结束大致分为 5 步,分别是定义问题、收集数据和预处理、选择算法和确定模型、训练拟合模型、评估并优化模型性能。这 5 步是一个循环迭代的过程

定义问题

在定义问题这个环节中,我们要剖析业务场景,设定清晰的目标,同时还要明确当前问题属于哪一种机器学习类型。如果不搞清楚这些,我们后面就无法选择模型了。所以首先,我们先得来了解一下我们这个项目的业务场景。

假设你已经入职了“易速鲜花”的运营部,正在对微信公众号推广文案的运营效率进行分析。你收集了大量的软文数据,包括点赞数、转发数和浏览量等等

因为要估计浏览量,所以在这个数据集中:点赞数、转发数、热度指数、文章评级,这 4 个字段都是特征,浏览量就是标签。这里我们已经有要估计的标签了,所以这是一个监督学习问题。再加上我们的标签是连续性的数值,因此它是一个回归问题。

不难看出,在这个数据集中,特征和标签之间明显呈现出一种相关性:点赞数、转发数多的时候,往往浏览量也多。但是,这种相关性可以通过哪个具体的函数来描绘呢?目前我们还不知道,所以我们在这个项目中的任务就是找到这个函数。

收集数据和预处理

“数据的收集和预处理”在所有机器学习项目中都会出现,它的作用是为机器学习模型提供好的燃料。数据好,模型才跑得更带劲。这步骤看似只有一句话,其实里面包含了好几个小步骤,完整来讲有 6 步:

  1. 收集数据;
  2. 数据可视化;
  3. 数据清洗;
  4. 特征工程;
  5. 构建特征集和标签集;
  6. 拆分训练集、验证集和测试集。

收集数据

首先是收集数据,这一步又叫采集数据。

在现实中,收集数据通常很辛苦,要在运营环节做很多数据埋点、获取用户消费等行为信息和兴趣偏好信息,有时候还需要上网爬取数据。

有了数据集,接下来我们要做的是数据可视化的工作,也就是通过可视化去观察一下数据,为选择具体的机器学习模型找找感觉。

数据可视化

数据可视化是个万金油技能,能做的事非常多。比如说,可以看一看特征和标签之间可能存在的关系,也可以看看数据里有没有“脏数据”和“离群点”等。

不过在正式可视化之前,我们需要把收集到的数据导入运行环境。数据导入我们需要用到 Pandas 数据处理工具包。这个包可是操作数据的利器,我们未来每个项目中都会用到。

假设输出结果如下图所示:

图1

数据清洗

很多人都把数据清洗比作“炒菜”前的“洗菜”,也就是说数据越干净,模型的效果也就越好。清洗的数据一般分为 4 种情况:

第一种是处理缺失的数据。如果备份系统里面有缺了的数据,那我们尽量补录;如果没有,我们可以剔除掉残缺的数据,也可以用其他数据记录的平均值、随机值或者 0 值来补值。这个补值的过程叫数据修复。

第二个是处理重复的数据:如果是完全相同的重复数据处理,删掉就行了。可如果同一个主键出现两行不同的数据,比如同一个身份证号后面有两条不同的地址,我们就要看看有没有其他辅助的信息可以帮助我们判断(如时戳),要是无法判断的话,只能随机删除或者全部保留。

第三个是处理错误的数据:比如商品的销售量、销售金额出现负值,这时候就需要删除或者转成有意义的正值。再比如表示百分比或概率的字段,如果值大于 1,也属于逻辑错误数据。

第四个是处理不可用的数据:这指的是整理数据的格式,比如有些商品以人民币为单位,有些以美元为单位,就需要先统一。另一个常见例子是把“是”、“否”转换成“1”、“0”值再输入机器学习模型。

特征工程

特征工程是一个专门的机器学习子领域,而且我认为它是数据处理过程中最有创造力的环节,特征工程做得好不好,非常影响机器学习模型的效率。

我举个例子来解释下什么是特征工程。你知道什么是 BMI 指数吗?它等于体重除以身高的平方,这就是一个特征工程。

什么意思呢?就是说经过了这个过程,BMI 这一个指数就替代了原来的两个特征——体重和身高,而且完全能客观地描绘我们的身材情况。

因此,经过了这个特征工程,我们可以把 BMI 指数作为新特征,输入用于评估健康情况的机器学习模型。

你可能会问这样做的好处是什么?以 BMI 特征工程为例,它降低了特征数据集的维度。维度就是数据集特征的个数。要知道,在数据集中,每多一个特征,模型拟合时的特征空间就更大,运算量也就更大。所以,摒弃掉冗余的特征、降低特征的维度,能使机器学习模型训练得更快。

构建特征集和标签集

我们说过,特征就是所收集的各个数据点,是要输入机器学习模型的变量。而标签是要预测、判断或者分类的内容。对于所有监督学习算法,我们都需要向模型中输入“特征集”和“标签集”这两组数据。因此,在开始机器学习的模型搭建之前,我们需要先构建一个特征数据集和一个标签数据集。

具体的构建过程也很简单,我们只要从原始数据集删除我们不需要的数据就行了。在这个项目中,特征是点赞数、转发数、热度指数和文章评级,所以只需要从原始数据集中删除“浏览量”就行了。

拆分训练集、验证集和测试集

在拆分之前,我先说明一点,对于学习型项目来说,为了简化流程,经常会省略验证的环节。我们今天的项目比较简单,所以我们也省略了验证,只拆分训练集和测试集,而此时的测试集就肩负着验证和测试双重功能了。

拆分的时候,留作测试的数据比例一般是 20% 或 30%。不过如果你的数据量非常庞大,比如超过 1 百万的时候,那你也不一定非要留这么多。一般来说有上万条的测试数据就足够了。这里我会按照 80/20 的比例来拆分数据。具体的拆分,我们会用机器学习工具包 scikit-learn 里的数据集拆分工具 train_test_split 来完成:

选择算法并建立模型

在这一步中,我们需要先根据特征和标签之间的关系,选出一个合适的算法,并找到与之对应的合适的算法包,然后通过调用这个算法包来建立模型。

选算法的过程很考验数据科学家们的经验,不过,你也无需担心自己没有经验,在这个课程中,我会给你讲清楚每一个实战中所用的算法的原理,帮助你建立起选算法的直觉。

具体到我们这个项目里,在上一讲中我说过,我们这个数据集里的某些特征和标签之间,存在着近似线性的关系。而且,这个数据集的标签是连续变量,因此,适合用回归分析来寻找从特征到标签的预测函数。

所谓回归分析 (regression analysis),就是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析,说白了就是当自变量变化的时候,研究一下因变量是怎么跟着变化的,它可以用来预测客流量、降雨量、销售量等。

不过,回归分析的算法有很多种,比如说线性回归,多项式回归,贝叶斯回归等等,那具体该选哪个呢?其实,这是根据特征和标签之间的关系来决定的。我们在上一讲的可视化过程中,推测特征和标签可能存在线性关系,并且用下面这个散点图简单做了验证。

图1

所以这里,我们就选择用线性回归算法来建模。

线性回归算法是最简单、最基础的机器学习算法,它其实就是给每一个特征变量找参数的过程。

y=ax+by = a * x + b

对于一元线性回归来说,它的内部参数就是未知的斜率和截距。只不过在机器学习中,我们把斜率 a 叫做权重(weight),用英文字母 w 代表,把截距 b 叫做偏置(bias),用英文字母 b 代表。所以机器学习中一元线性回归的公式也写成:

y=wx+by = w * x + b

而在我们这个项目中,数据集中有 4 个特征,所以就是:

y=w1x1+w2x2+w3x3+w4x4+by = w_1 * x_1 + w_2 * x_2 + w_3 * x_3 + w_4 * x_4 + b

因此,我们的模型就会有 5 个内部参数,也就是 4 个特征的权重和一个偏置(截距)需要确定。不过这些公式的具体代码实现,都不用我们自己完成,它们全部封装在工具包里了。你只要对算法的原理有个印象就行了。

确定好算法后,我们接着来看一下调用什么样的算法包建立模型比较合适。对于机器学习来说,最常用的算法工具包是 scikit-learn,简称 sklearn,它是使用最广泛的开源 Python 机器学习库,堪称机器学习神器。

sklearn 提供了大量用于数据挖掘的机器学习工具,覆盖数据预处理、可视化、交叉验证和多种机器学习算法。

虽然我们已经选定使用线性回归算法,但是在 sklearn 中又有很多线性回归算法包,比如说基本的线性回归算法 LinearRegression,以及在它的基础上衍生出来的 Lasso 回归和 Ridge 回归等。

那哪一个才是适合我们这个项目的算法包呢?其实,我们一般选算法包的方法是从能够解决该问题的最简单的算法开始尝试,直到得到满意的结果为止。

训练模型

训练模型就是用训练集中的特征变量和已知标签,根据当前样本的损失大小来逐渐拟合函数,确定最优的内部参数,最后完成模型。虽然看起来挺复杂,但这些步骤,我们都通过调用 fit 方法来完成。

fit 方法是机器学习的核心环节,里面封装了很多具体的机器学习核心算法,我们只需要把特征训练数据集和标签训练数据集,同时作为参数传进 fit 方法就行了。

这样,我们就完成了对模型的训练。你可能会觉得很奇怪,既然训练模型是机器学习的核心环节,怎么只有一句代码?其实这就是我反复强调过的,由于优秀的机器学习库的存在,我们可以用一两行语句实现很强大的功能。

所以,不要小看上面那个简单的 fit 语句,这是模型进行自我学习的关键过程。在这个过程里,fit 的核心就是减少损失,使函数对特征到标签的模拟越来越贴切。那么它具体是怎么减少损失呢?这里我画了一张图片展示模型从很不靠谱到比较靠谱的过程。

图2

这个拟合的过程,同时也是机器学习算法优化其内部参数的过程。而优化参数的关键就是减小损失。那什么是损失呢?它其实是对糟糕预测的惩罚,同时也是对模型好坏的度量。损失也就是模型的误差,也称为成本或代价。

模型的评估和优化

我们刚才说,梯度下降是在用训练集拟合模型时最小化误差,这时候算法调整的是模型的内部参数。而在验证集或者测试集进行模型效果评估的过程中,我们则是通过最小化误差来实现超参数(模型外部参数)的优化。

对此,机器学习工具包(如 scikit-learn)中都会提供常用的工具和指标,对验证集和测试集进行评估,进而计算当前的误差。比如 R2 或者 MSE 均方误差指标,就可以用于评估回归分析模型的优劣。

不过呢,在开始评估模型之前,我想请你思考一下:在我们这 5 个实战步骤里面,并没有“使用模型预测浏览量”这个环节,这是为什么呢?其实这个环节已经包含在第 5 步“模型性能的评估和优化”之中了,并且是我们在第 5 步中首先要去实现的。

具体来说,在“模型的评估和优化”这一步中,当我们预测完测试集的浏览量后,我们要再拿这个预测结果去和测试集已有的真值去比较,这样才能够求出模型的性能。而这整个过程也同样是一个循环迭代的过程

本文内容全部来自于对极客时间《零基础实战机器学习》的摘抄,完整内容请购买课程