前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习入门 8-4 为什么要训练数据集与测试数据集

机器学习入门 8-4 为什么要训练数据集与测试数据集

作者头像
触摸壹缕阳光
发布2019-12-26 14:12:28
2.8K0
发布2019-12-26 14:12:28
举报

本系列是《玩转机器学习教程》一个整理的视频笔记。这一小节,主要介绍通过测试数据集来衡量模型的泛化能力,并得出训练数据集和测试数据集关于模型复杂度与模型精确度之间的趋势,最后通过一个简单的小例子来说明过拟合和欠拟合以加深理解。

01

测试集衡量模型泛化能力

上一小节中介绍了过拟合(Overfitting)和欠拟合(Underfitting)的概念,在后续的学习中,会慢慢的发现其实机器学习主要解决的问题是过拟合,对于这一点后续还会有更加具体的说明。

现在具体看一看上一小节当多项式阶数为100时候的过拟合曲线:

之所以将上面的拟合曲线称为过拟合,是因为如果使用这根曲线对所有样本进行预测的话,相应的误差一定是比较小的,但是如果使用这根曲线对一个新的样本进行预测的话,预测拟合的结果会很差。

比如对于下面紫色新的样本点,对应的样本特征大概是2.4,2.5左右:

蓝色样本点是我们之前的样本点,紫色样本点是我们需要通过模型预测的新的样本点,根据拟合曲线预测紫色新的样本点的y值结果大致是0.5左右,也就是上图紫色点的位置,这个预测结果看上去和之前蓝色的样本点不在一个趋势上(蓝色点呈现二次曲线的趋势),直观的感受这个预测值很有可能是错误的。

简单来说,在过拟合的场景下,虽然这根拟合曲线将原来的样本点(蓝色的样本点)拟合的非常好,整体计算的误差非常小,但是一旦来了新的样本点,这根过拟合的曲线就不能很好的进行预测了。在这种情况下,我们称此时得到的模型(在这里这个模型就是这条弯弯曲曲的拟合曲线)泛化能力非常的弱。

当然在之前小节中,我们知道训练机器学习模型的目的是通过已知的样本,学习已知样本的通用规律,来预测新的未知样本,训练机器学习的目的是为了能够更好的预测新的未知样本,也就是更好的泛化,而不是最大程度的拟合这些已知的样本。正因为如此,我们去衡量这个模型对于训练样本拟合程度有多好是没有意义的,我们真正需要的是能够衡量学习得到的这个模型的泛化能力的好坏。

那这种情况下该怎么处理呢?其实很简单,这个做法之前也一直在使用,就是所谓的Train_test_split(训练测试数据集的划分),也就是将原来的样本数据划分成训练数据集和测试数据集,用训练数据集学习获得这个模型,在这种情况下,测试数据集对于模型来说就是全新的数据:

  1. 泛化能力强。如果使用训练数据集获得的模型,在训练数据集上能够得到很好的结果,面对测试数据集也能够获得很好的结果的话,那么就说此时模型的泛化能力很强;
  2. 泛化能力弱。如果使用训练数据集获得的模型,在训练数据集上能够得到很好的结果,但是在面对测试数据集上的效果很差,此时的模型泛化能力很弱;

对于第2种情况,多半是出现了过拟合的问题,模型虽然能够很好的拟合训练数据集,但是面对新的数据也就是测试数据集,模型的拟合效果非常的差。因此衡量模型泛化能力就是将数据集额外划分测试数据集更大的意义。

接下来就通过具体的代码实验来观察一下,通过为多项式回归指定不同的degree值,然后通过训练数据集对这些取不同degree的值的模型进行学习,进而获得模型,之后对测试数据集计算相应的预测误差,看看预测误差是怎么变化的?

  • step1:首先还是先创建具有一个特征且生成的y与x之间是二次方关系的数据集。
  • step2:接下里通过Pipeline管道来封装多项式回归的函数,通过将degree参数设置为100来验证多项式回归函数的可行性。
  • step3:接下来就开始探索train_test_split的意义了,划分好训练集以及测试集,首先还是使用简单线性回归来对二次方分布的数据进行拟合,最后通过均方误差在测试集上衡量模型的泛化能力。

和之前小节的区别在于训练模型只用X_train以及y_train,而预测模型使用X_test,得到的y_predict预测的实际值与真实的y_test进行比较。预测的X_test数据集,是模型在训练过程中没有见到过的,这就是在测试模型的泛化能力。

  • step4:使用多项式回归方式,此时设置degree的值为2,同样类似上面线性回归模型的处理方式,在训练模型的过程中只使用X_train以及y_train,而在预测的模型的时候使用X_test,最后计算预测的实际值y_predict与真实值y_test的均方误差。

对比线性模型和degree为2的多项式回归的均方误差值,很显然在degree为2的时候模型在测试集上的效果要好于线性回归模型在测试集上的效果,换句话说,此时degree为2的多项式回归模型比线性回归模型的泛化能力要强很多。

  • step5:和上面degree为2类似,使用多项式为10阶的模型进行训练:

在上一小节中,如果degree传入10的话,最终得到的模型在训练数据集上拟合的程度比degree为2的模型要高很多。这一小节,将模型在训练过程中没有看到过的测试数据集上计算误差,通过degree为2和degree为10两个不同模型在相同测试集上的均方误差结果来看,测试集上的误差degree为10的模型比degree为2模型要高,这就说明当degree传入10的时候,虽然他能够更好的拟合训练数据集,但是面对新的数据集(测试集)的时候误差提高了,换句话说,相比于degree为2的多项式回归模型,degree为10的模型泛化能力变差了。

  • step6:类似的当degree设置100的话:

均方误差很大了,这个结果和上面绘制degree为100是的绘制曲线时一致的:

在两侧的时候,拟合曲线非常的陡峭,这个结果显然不是数据的趋势,如果测试数据集在两端有点的话,相应的就会得到非常大的误差,也就是说当degree为100的话,对训练集的拟合比degree为10和2都要好的多,但是当面对新的数据的时候,他的预测结果是极差的,正因为如此,放入生产环境中使用的模型绝对不可能是degree为100这样的模型,通过测试数据集来衡量模型的泛化能力,可以更好的选择适合实际生产的模型。

02

训练集与测试集关于模型复杂度与模型精度趋势

前面在notebook中做的实验,其实是在实验模型的复杂度,对于多项式回归来说,相当于degree,也就是多项式回归的阶数越高,模型就会越复杂。

一般情况下,机器学习算法都有这种关系趋势,横轴表示模型的复杂度,当然此时模型的复杂度对于不同的算法来说表达不同的意思:

  1. 对于多项式回归算法来说,阶数越高相应的模型越复杂;
  2. 对于kNN算法来说,超参数k值越小,模型越复杂,k值越大模型越简单:
    1. 当k值取最大,也就是等于样本总个数的时候,这个模型是最简单的,只需要统计样本中那种样本最多就行了;
    2. 当k等于1的时候,这是kNN中最复杂的模型,因为对于每一个点,我们都需要找到离他最近的那个点;

后续还会学习很多算法,这些算法对于模型复杂度的定义是不一样的,但是每一个机器学习模型都可以通过参数的调整,使模型从简单变复杂,而另外一个维度,也就是模型的准确率,也就是模型能够多么好的预测数据,这种情况下,通常会有训练集和测试集两根对应的曲线。

对于训练数据集来说,随着模型越来越复杂,模型准确率对于训练数据集来说将会越来越高,这也非常好了解,因为我们的模型越复杂对训练数据的拟合程度越好,相应的对于训练数据模型的准确率也就越高。

但是对于测试数据集来说,通常会呈现山谷一样的曲线,也就是说模型最简单的时候测试集上的准确率会比较低,随着模型逐渐变复杂,测试数据集的准确率再逐渐的提升,提升一定程度以后,如果模型继续复杂,对测试数据集的准确率会开始下降。

其实这个过程正是从欠拟合 → 正合适 → 过拟合

当然上面的图为一个示意图,把数据放进来,对于不同的算法得到的图像是不一样的,但整体是这样的一个趋势,在后面介绍决策树的时候会具体的绘制这样的示意图。由于多项式回归和kNN的模型复杂度和模型准确率的趋势不够明显,因此这里不具体的使用代码进行绘制。

总的来说,当模型复杂度逐渐提高,训练集的准确率会呈现逐渐递增的趋势,而测试集的准确率先逐渐增高之后到达某一临界点之后,开始之间降低,而我们需要找的就是模型在测试集上准确率的最高的临界点。

接下来,回过头来具体的看一看,欠拟合与过拟合:

欠拟合其实很好理解,如果此时样本数据明明是二阶的关系,用一根直线是不能够完整表达数据关系的。

其实我们真实采集到的数据,通常含有噪音,当进行拟合的时候,很有可能把这些噪声也当做了特征进行了训练,所以就产生了过拟合的结果,当来一个新的数据的时候,拟合的曲线在预测的时候实际上加入了很多学习过程中的噪音,而这些噪音并不是我们真实想要的。

3

举个例子

为了让大家更好的理解过拟合和欠拟合,举一个并不恰当的例子:

假设此时的机器学习系统是要对图片识别是猫还是狗,对于这样的机器学习系统,如果管有眼睛的动物都叫做猫或者都叫做狗,很显然这就是一个欠拟合的模型,因为此时寻找到的特征太普遍了太一般了,不仅猫和狗,很多动物都是有眼睛的,所以这个特征不能够完整的表达所要识别的猫和狗。

从另外一方面,如果机器学习算法判定,毛发为黄色的才是狗,此时就是过拟合的情况,这是因为可能只有这只狗毛发是黄色的,机器学习算法只针对训练数据集进行学习,其实学习到的可能是噪音,在这里狗的毛发是黄色只是给出的训练集中的一只狗的特征,这个特征不是能够判定为狗的一般性特征,有很多狗的毛发是白色、黑色、斑点等等,在这种情况下,又找到了一个太细节的特征作为预测标准,这就成为了过拟合。

在以后进行具体的机器学习工作,过拟合是一直要解决的重点。

其实我们真正要找的就是泛化能力最好的地方,换句话说,对于测试数据集来说,模型准确率最高的地方。其实前面的网格搜索,一直都是这样做的,一直都是把数据集划分为训练数据集和测试数据集,将训练数据集用于训练模型,然后对于不同参数训练出的模型去寻找使得测试数据集最好的对应的那组参数,这组模型参数就作为最终模型的参数,虽然使用这样的方式能够很好的衡量模型的泛化能力,但是这还不是最好的方法,后面还会介绍更好的方法。

在下一小节,从另外一个角度"学习曲线"再来看看过拟合和欠拟合的概念,在数据训练的过程中会有怎样的表现,更加深刻的理解这两个非常重要的机器学习算法的概念。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档