Preprocessing是Python scikit learn第六个模块,主要介绍了如何对于数据集的预处理。
以下内容包含了一些个人观点和理解,如有疏漏或错误,欢迎补充和指出。
首先,为什么要对数据进行预处理?Should I normalize/standardize/rescale the data文章中介绍了一些笔者的理解和感悟。我从中翻译和摘取了一些要点。我个人认为与怎么去利用函数包进行预处理数据相比,明白为什么要进行这样的预处理显得更加的重要和必要。
这篇文章数据处理的观点主要是建立在“向量空间”的基础上的,即向量每一个维度代表一个随机变量,它的值代表这个随机变量的数值或某种相关的属性。假定我们已经从海量数据中挖掘出了很多这样的随机变量组成了我们想要研究的向量序列。接下来每一个样本都可以表示为一个向量,我们要做的预处理也就是对这样的向量进行处理。对向量的数据进行所谓的处理,无非就是对里面的数值进行加减乘除的运算,那么为什么要对数据进行这样的处理呢?
通常处理数据的方式有以下几种方式:
1)把某段区间上的值如[0,1000]化到型如[0,1]、[-1,1]或者诸如此类的区间上。或者对一个向量进行L2、L1范数的标准化,也就是除以相应的向量范数。
2)把某段区间上的值减去它们的均值,再除以它们的标准差,这样就得到了以0为均值,1为标准差的类似标准正态分布的数据集。
那么我们对数据进行这样的处理对我们接下来的工作有什么好处吗?
处理数据可能就要减掉部分原始数据所包含的信息,如果这些信息是无关紧要的,那么减掉了也无妨,如果这些信息包含了重要的元素,那么这种处理将可能导致灾难性的后果。
Should I standardize the input variables?
这依赖于随机变量之间的网络关系,如我们要通过计算L2范数,然后把这个值传递到以后的层,作为后序的input,那么标准化就很重要。试想,如果把一个人的年龄(年)和身高(公分)放在一起计算范数,20岁的人可能有170cm的身高,20在数值上的作用显然和170是无法比拟的,更何况还要平方。所以这个时候进行标准化很必要,否则,如上年龄这个随机变量的值在计算范数的过程中所显现的作用将会被近似的忽略掉。因此,标准化对于为了让随机变量表现出自身的重要性是很关键的。在对数据缺乏先验知识的情况下,把数据划到同一个区间或者同一个标准差下是很常见的做法。If you know that some inputs are more important than others, it may help to scale the inputs such that the more important ones have larger variances and/or ranges.
如果随机变量是以序列的形式参与线性运算的,比如MLP(多参数线性规划),我们对数据的预处理并不是严格必要的,因为我们可以通过修改参数的权值和截距来获得同样的效果。但这种情况下,标准化仍能给我们带来很多便利,这些便利往往来自实践,它可以令training过程更快速,而且减小优化计算时得到局部极小值的机会。而且,如果利用标准化的数据,权值衰减weight decay(如利用L2norm约束权值向量的大小)和贝叶斯估计器将会更加的方便。
机器学习中在建立神经网络的过程中,我们需要计算每条转移路径上的权值,如基本的反向传播和梯度下降,但这些内容不是要在这里讨论的。在计算过程中,我们或多或少的利用到了Expectation Maximization Algorithm(EM算法)的思想,就是需要事先假定权值再去迭代计算它们,也就是初始化的过程。例如在NN中,通常需要得到若干超平面,在向量空间中,这些超平面由法方向(weights)和截距(bias)所确定,前者确定方向,后者主要确定在各个坐标轴上的位置。出于便于泛化和避免饱和的角度考虑,初始化的参数通常相对较小,一般都是来自标准正态分布。当截距较小时,我们知道,平面距离原点比较近。这意味着,如果数据集不是以原点为中心分布的话,这个平面很可能不会穿过数据云。基于此,可以认为,让数据分布在以0为中心的区间上可能更好些。但这个区间的大小,可以任意吗?试想,例如在一个二维平面上,有很多数据云,我们自然希望我们初始化的平面(在二维是一条直线)大部分能够穿过这些数据云,至少不希望大部分平面都在数据云的一侧,因为这样可以提高模型的训练速度和精准度。如果我们把区间设定在[-10,10]那么很容易就会出现上述情况,因为数据点都分布在离原点较远的地方,而大部分的平面都分布在原点附近,只有少量平面分布在数据云附近和区间的角落,而且这些平面大都保持着单一的方向,所以在这种情形下,我们可能要花费很多时间在初始化一些“很好的平面”上。反之,限定数据分布在[-1,1]、[-2,2]可以使情况大大改善,大部分平面都穿过了数据云,少量平面落在一旁,这样是很有利于我们训练模型的。但是限定数据在[-0.1,0.1]附近也是不好的,因为这跟[-10,10]其实没有什么太大的区别。就好比正负无穷其实是一个点一样,太过于极端。
Standardizing input variables has different effects on different training
algorithms for MLPs. For example:
o Steepest descent is very sensitive to scaling. The more ill-conditioned
the Hessian is, the slower the convergence. Hence, scaling is an
important consideration for gradient descent methods such as standard
backprop.
o Quasi-Newton and conjugate gradient methods begin with a steepest descent
step and therefore are scale sensitive. However, they accumulate
second-order information as training proceeds and hence are less scale
sensitive than pure gradient descent.
o Newton-Raphson and Gauss-Newton, if implemented correctly, are
theoretically invariant under scale changes as long as none of the
scaling is so extreme as to produce underflow or overflow.
o Levenberg-Marquardt is scale invariant as long as no ridging is required.
There are several different ways to implement ridging; some are scale
invariant and some are not. Performance under bad scaling will depend on
details of the implementation
Two of the most useful ways to standardize inputs are: o Mean 0 and standard deviation 1 o Midrange 0 and range 2 (i.e., minimum -1 and maximum 1) Note that statistics such as the mean and standard deviation are computed from the training data, not from the validation or test data. The validation and test data must be standardized using the statistics computed from the training data.后面就是说,如果我们决定对训练数据进行了某种标准化,那么我们也要对测试集数据进行同样的标准化。
下面给出基本的变换公式: