机器学习入门 4-8 scikit-learn中的scaler

  • 2019 年 11 月 13 日
  • 笔记

本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍在sklearn中使用数据归一化。

01

对测试进行归一化?

前面我们将数据集划分成训练集以及测试集。用训练集来训练模型,测试集来验证模型的性能。但是有时候,样本中的每个特征之间的量纲不同,训练模型时候可能会导致某些特征的权重比较大,因此我们引入了归一化操作。

比如此时使用的是均值方差归一化,在训练集上,我们得到了均值归一化所需要的样本均值mean_train以及样本方差std_train。由于模型是通过均值归一化后的训练集训练得到,所以要想更好的验证模型的性能,测试集上同样要使用归一化的操作。现在的问题就是对于测试集,如何进行归一化的处理呢?可能有下面两种可能处理方案:

  1. 对整个测试集,求出测试集的mean_test以及std_test;
  2. 使用训练集得到的mean_train以及std_train进行相应的归一化;

第一种方案是不对的,第二种方案才是正确的方案。也就是我们使用的归一化定义是(X_test – mean_train ) / std_train 来得到测试集的归一化结果。

为什么要这样做呢,有下面几个原因:

  1. 真实环境很有可能无法得到所有测试数据的均值和方差。我们从原始数据中划分一部分数据作为测试集,对于这一小部分测试集,可以很容易得到样本的均值以及方差。我们训练模型的目的是让模型应用在真实的环境中,可是很多时候在真实的环境中我们无法得到所有测试数据的均值和方差的。比如鸢尾花识别来说,虽然我们可以得到在测试集中得到鸢尾花的样本的均值和方差,但是在实际使用的时候,每次只来了一朵花,很显然一朵花没有办法计算均值和方差这些统计数据,因此,在实际中使用中,来了一朵鸢尾花,我们使用在训练集上得到的均值和方差来对这朵鸢尾花特征进行归一化的操作;
  2. 对数据进行归一化也是算法的一部分。可以理解成算法就包括对所有数据 – mean_train / std_train。针对后面来的数据,我们也使用同样的方式进行处理。然后来测试他的准确度,来得到真正的对应的算法得到的准确度;
  3. 还有一点就是测试集作为验证模型性能的好坏,为了方式信息泄露,我们应当避免使用测试集中的任何信息,这样模型在测试集上的准确度才能够泛化到真实的场景中去。

通过上面的介绍,可以看出,我们需要保存在训练集上计算的均值和方差。

02

Sklearn中的归一化

sklearn为我们封装好了归一化的操作。sklearn为了统一接口,将Scalar(归一化)这个类和机器学习算法这个类,他们整体的使用流程是一致的。下图就是sklearn封装Scalar这个类的使用流程:

当训练集传入Scaler中,这个Scaler也有一个fit,这个fit算法就是求出训练数据集对应的一些统计指标,比如,对于均值方差归一化来说,fit操作之后,就求出了训练集的均值和方差,之后Scaler中保存了关键的信息,如果再来其他样例之后,Scaler就可以非常简单的对输入样例进行transform得到相应的输出结果。

其实对比机器学习算法,只是将机器学习算法中的predict改成了transform。有了transform,我们就可以方便使用Scaler对后续的样本进行归一化,进而送入机器学习的算法中来训练预测处理。

具体使用sklearn进行数据归一化操作如下:

03

创建自己的归一化类