机器学习概述

在深入了解机器学习之前,首先来了解一下什么是机器学习,机器学习的具体过程是什么。

首先是机器学习的学习,这个学习主要就是体现在发掘数据的潜在规律,然后针对新数据作出有用的预测。比如给了一个股票历史数据,我们可以通过机器学习算法分析这些输入数据,得到股票变化的潜在规律,最后通过得到的模型做预测,假如我们用线性回归做预测,那么我们通过输入数据拟合得到的函数就是一个模型。所以机器学习的过程,大致上就是输入数据,分析数据,得到模型,改进模型,输出结果。

接下来先了解一些术语,我们要预测的事物称为标签,比如股价,我们的输入数据称为样本,分为两部分(假如是有监督学习),首先是特征,比如时间,另一部分就是我们要预测的股价,这种样本就是有标签样本,无监督学习的就是无标签样本咯。模型定义了特征和标签之间的关系。

一般来说,机器学习可分为两类模型:回归模型和分类模型,下面就以线性回归为例子,讲述一下机器学习的详细过程。

还是以用线性回归预测股价为例子,假如我们现在有一批数据,时间为特征股价为标签,初步分析得到了回归函数:
$$y=ax+b$$
这个式子的形式是怎么确定的?首先要说明的是我们对例子做了极大的简化,假设输入的数据就是呈线性关系的,而且股价只和时间有关,那么我们就得到了这样一个线性函数,可是怎么确定参数,事实上可以随便确定一个参数,得到一个初步的模型,然后再慢慢改进。

上面的描述是一种简化的说法,可是实际上机器学习也是类似的过程,先计算一个初步的模型,然后再慢慢改进,具体怎么改进,就是要确定一个损失函数,描述模型和数据之间的差异有多大,这里就用大名鼎鼎的均方误差(MSE)作为损失函数:
$$MSE = \frac{1}{N} \sum _{(x,y)\in D} (y-prediction(x))^2$$
算出了损失函数的数值,很明显这个误差肯定很大,所以需要调整参数,怎么调整,首先我们要知道,我们的目的就是让损失函数尽可能小,也就是求这个损失函数的极小值(最小值),最傻的方法,就是不断重复的随机取参数,尝试到一定次数之后,取能够让损失函数达到最小的那个参数,这个方法也可以,可是你不知道要迭代多久,最后的效果也不好,所以就有了梯度下降法(或许还有其他方法)。我们想象一下,针对现在这个损失函数,它只是一个很简单的二次函数,也就是一条曲线而已,那么它的参数有什么意义,事实上就是反映了在哪一个损失值的方向(导数的概念),所以如果我们能够利用参数,求梯度,往着梯度下降的方向改变参数,不就能使得损失函数不断减少了,这就是梯度下降法的思想了。梯度下降法还有很多细节和改进办法,这里暂时不细说。

通过上面的介绍,我们就可以对输入数据不断迭代得到一个很好的模型,如果迭代次数很多,这个模型就能最好地拟合输入数据,可是事实上,拟合得太好就会导致过拟合,所以为了避免过拟合我们就需要把输入数据分为训练集和测试集,但是我们也会发现,如果我们不断通过训练集训练数据调整参数,测试集检查模型好不好,再进行改进,其实也是换个角度让模型更好地拟合测试集,所以就又有人提出不如再搞多一个验证集,让我们用训练集训练模型,用验证集评估模型,不断改进得到最好的模型,再用测试集确定模型的泛化能力,很完美了。

我们划分了训练集验证集测试集,进行训练后又会发现一个新问题,那就是可能模型对训练集的训练损失逐渐减少,但是验证损失却最终增加了,这是为什么呢,其实也就是过拟合咯,上面我们划分了三个集合,只是避免模型对测试集过拟合,但是我们并没有真正解决过拟合这个问题。实际上,模型会过拟合就是因为它过分地拟合了训练数据,所以我们要做的就是避免这种情况,可是应该怎么去衡量什么程度才算过分拟合,这里就提出了正则化。

从理论上来说,模型会过拟合是因为它过于复杂,过分地拟合了数据,所以,我们把原来尽可能拟合数据的目标,改成了让模型在尽可能拟合数据和保持模型结构不要过于复杂之间做平衡,具体来说就是在损失函数中假如正则项,反映模型的复杂度。模型的复杂度与参数,或者说特征的权重有关,权重的绝对值越高,对模型复杂度贡献越大,L2正则化做的就是用权重平方和衡量模型的复杂度。这样,我们就在原来的损失函数基础上加上了一个系数的平方和,事实证明这样训练模型的效果更好。

上面是一个线性回归的简单例子,实际上肯定不可能那么简单,因为我们的特征就不可能只有一个,可能还需要考虑天气、考虑温度等等(虽然股价不可能和这些因素有关,但万一呢),这时候就有一个问题了,如果多几个特征,他们都是数值还好,可是天气不可能是数值嘛,所以我们就需要通过独热编码之类的方法,把这些特征转化为数值,处理特征的这个过程,称为特征工程,其实这部分就是数据预处理的内容了。

以上就是机器学习最最基本的内容了,简单来说,可以这样概括,我们从数据中选择了特征,通过特征工程对数据进行预处理,然后选择适合的机器学习算法,把特征分为训练集验证集测试集,定义适当的损失函数,训练模型,通过梯度下降调整参数,得到最优的模型后,再通过测试集检查模型的泛化能力。

>
参考资料:
[1]谷歌机器学习速成教程