什么是机器学习

机器学习的定义有很多种,但是最准确的定义是:"A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E."

这个定义除了非常押韵之外,还体现了机器学习的几个关键点,即:"task", "experience" 和 "performance"。

task

task 指的是机器学习所需要完成的任务。机器学习能够完成的任务主要有:分类、回归、聚类

分类

假如现在有一些苹果、西瓜和香蕉的图片作为训练集(有标签),现在想要机器学习算法能够根据新的测试图片来分辨出该图片中的是苹果、西瓜还是香蕉。像这样的任务我们称为分类任务。

回归

假如现在有一些苹果的售价数据作为训练集(有标签),现在想要机器学习算法能够根据新的测试图片来分辨出该图片中的苹果能卖多少钱。像这样的任务我们称为回归任务。

聚类

假如现在有一些水果的图片作为训练集(无标签),现在想要机器学习算法能够根据训练集中的图片将这些图片进行归类,但是并不知道这些类别是什么。像这样的任务我们称为聚类任务。

细心的您可能注意到了,分类和回归问题的训练集中都是带有标签的。也就是说数据已经告诉了机器学习算法我这条数据的答案是这个,那条数据的答案是那个,就像有老师在监督学生做题目一样,一看到学生做错了就告诉他题目做错了,看到学生做对了就鼓励他。所以用来解决分类和回归问题的机器学习算法又称为监督学习。而像用来解决聚类问题的机器学习算法又称为无监督学习

experience

experience指的根据历史数据总结归纳出规律的过程,即学习过程,或模型的训练过程。模型这个词看上去很高大上,其实我们可以把他看成是一个函数。例如:现在想用机器学习来识别图片里的是香蕉还是苹果,那么机器学习所的事情就是得到一个比较好的函数,当我们输入一张香蕉图片时,能得到识别结果为香蕉的输出,当我们输入一张苹果图片时,能得到识别结果为苹果的输出。

至于这样一个函数(模型)里面长什么样子,这就与具体的机器学习算法有关了。对机器学学习算法感兴趣可以阅读常见机器学习算法章节。

performance

performance指的是模型的性能。对于不同的任务,我们有不同的衡量模型性能的标准。例如分类时可能会根据模型的准确率精准率召回率AUC等指标来衡量模型的好坏,回归时会看看模型的MSERMSEr2 score等指标,回归时会以FM指数DB指数等指标来衡量聚类的效果怎么样。对各种性能指标感兴趣可以阅读模型评估指标章节。

机器学习常用术语

训练集,测试集,样本,特征

假设我们收集了一份西瓜数据:

色泽 纹理 声音 甜不甜
青绿 清晰 清脆 不甜
青绿 模糊 浑浊
乌黑 清晰 清脆 不甜
乌黑 模糊 浑浊

并假设现在已经使用机器学习算法根据这份数据的特点训练出了一个很厉害的模型,成为了一个挑瓜好手,只需告诉它这个西瓜的色泽,纹理和声音就能告诉你这个西瓜甜不甜。

我们通常将这种喂给机器学习算法来训练模型的数据称为训练集,用来让机器学习算法预测的数据称为测试集

训练集中的所有行称为样本。由于我们的挑瓜好手需要的西瓜信息是色泽、纹理和声音,所以此训练集中每个样本的前3列称为特征。挑瓜好手给出的结果是甜或不甜,所以最后1列称为标签

因此,这份数据是一个有4样本3特征训练集,训练集的标签是“甜不甜”。

欠拟合与过拟合

最好的情况下,我们的模型应该不管在训练集上还是测试集上,它的性能都不错。但是有的时候,我们的模型在训练集上的性能比较差,那么这种情况我们称为欠拟合。那如果我们的模型在训练集上的性能好到爆炸,但在测试集上的性能却不尽人意,那么这种情况我们称为过拟合

其实欠拟合与过拟合的区别和我们生活中学生考试的例子很像。如果一个学生在平时的练习中题目的正确率都不高,那么说明这个学生可能基础不牢或者心思没花在学习上,所以这位学生可能欠缺基础知识或者智商可能不太高或者其他种种原因,像这种情况可以看成是欠拟合。那如果这位学生平时练习的正确率非常高,但是他不怎么灵光,喜欢死记硬背,只会做已经做过的题,一碰到没见过的新题就不知所措了。像这种情况可以看成时是过拟合

那么是什么原因导致了欠拟合和过拟合呢?

当我们的模型过于简单,很可能会导致欠拟合。如果模型过于复杂,就很可能会导致过拟合。

验证集与交叉验证

在真实业务中,我们可能没有真正意义上的测试集,或者说不知道测试集中的数据长什么样子。那么我们怎样在没有测试集的情况下来验证我们的模型好还是不好呢?这个时候就需要验证集了。

那么验证集从何而来,很明显,我们可以从训练集中抽取一小部分的数据作为验证集,用来验证我们模型的性能。

但如果仅仅是从训练集中抽取一小部分作为验证集的话,有可能会让我们对模型的性能有一种偏见或者误解。

比如我们现在要对手写数字进行识别,那么我就可能会训练一个分类模型。但可能模型对于数字 1 的识别准确率比较低 ,而验证集中没多少个数字为 1 的样本,然后用验证集测试完后得到的准确率为 0.96 。然后您可能觉得哎呀,我的模型很厉害了,但其实并不然,因为这样的验证集让您的模型的性能有了误解。那有没有更加公正的验证算法性能的方法呢?有,那就是k-折交叉验证

K-折交叉验证中,我们把原始训练数据集分割成 K 个不重合的⼦数据集,然后我们做 K 次模型训练和验证。每⼀次,我们使⽤⼀个⼦数据集验证模型,并使⽤其它 K−1 个⼦数据集来训练模型。在这 K 次训练和验证中,每次⽤来验证模型的⼦数据集都不同。最后,我们对这 K 次在验证集上的性能求平均。

K 的值由我们自己来指定,如以下为 5 折交叉验证。

results matching ""

    No results matching ""