机器学习入门 4-3 训练数据集,测试数据

  • 2019 年 11 月 13 日
  • 笔记

本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍如何判断机器学习的性能,train_test_split方法。

判断机器学习算法的性能

对于一个机器学习算法,我们如何来判断机器学习算法的性能呢?

当前我们将全部数据集作为训练集,使用训练集训练得到一个模型。具体在kNN算法中,每当来了一个新数据的时候,新数据要和我们训练集中所有数据计算他们之间的距离,然后选出前k个距离小的训练集,然后统计这些被选出来的训练集对应标签,选择标签数最多的标签作为新数据的预测标签。

换句话我们用全部数据集作为训练集得到的模型来预测新的数据所属的类别,但是我们最终需要模型在真实的环境中使用,但是现在这样做有很大的问题:

  1. 我们使用全部的数据集作为训练集训练模型,得到的模型只能拿到真实的环境中使用,但是如果我们训练得到的模型很差的话,没有机会去调整他,这样带来真实的损失;
  2. 在很多真实的场景中,其实很难得到相应的label标签,因此即使直接拿到真实场景中使用,我们也没有办法知道我们的模型是好是坏;

综上,如果我们使用全部的数据集当做训练集训练的模型投入到真实的环境中,这样的做法是不可取的。解决这个问题最简单的办法,是将数据集划分为训练集和测试集。

全部数据集抽取70%或者80%当做训练集,剩下的数据集作为测试集,这样我们使用蓝色的训练集训练出模型(此时需要注意测试集不能够参与到训练过程中),得到模型后,将测试集放到训练好的模型中,让模型进行预测,此时由于我们的测试集本身包含了真实的label值,这样我们就可以通过将真实的label值与模型预测得到的label值进行比较,就可以知道模型的性能怎么样了。

因此,可以通过测试集来判断模型的好坏。此时如果模型在测试集上结果不够理想的话,说明模型不够好,如果将这样的模型放入真实环境中会带来真实的损失,所以我们需要继续改进我们的模型,想办法得到更好模型,直到模型在测试集上得到的结果相对较好,此时可以相对有信心说明此时模型是比较好的。

这样的方式叫做train_test_split。其实这种方式在判断机器学习算法性能的时候也会存在相应的问题,具体的后面会介绍。

代码实现

将train_test_split封装成一个函数,将文件命名为"model_selection.py",存放到playML这个包下(含有__init__.py)。

在jupyter中调用封装好的函数:

sklearn中的train_test_split