《机器学习:算法视角(原书第2版)》 —3.4.5 数据预处理
3.4.5 数据预处理
如果在训练网络之前准备好分析输入和目标,机器学习算法往往会更有效地学习。作为最基本的例子,我们使用的神经元给出0和1的输出,因此如果目标值不是0和1,那么它们应该被转换为0和1。事实上,无论使用何种激活函数输出层神经元,将目标缩放到0到1之间都是正常的。这有助于防止权重不必要地变得太大。缩放输入也有助于避免此问题。
缩放输入数据最常用的方法是独立处理每个数据维度,使每个维度具有零均值和单位方差,或者只是进行缩放以使最大值为1且最小值为-1。这两种缩放都有类似的效果,但第一种更好一点,因为它不允许异常值占主导地位。这些缩放通常被称为数据归一化(normalisation),或者有时称为标准化(standardisation)。虽然归一化对于每个算法都不是必不可少的,但它通常是有益的,而对于我们将看到的一些其他算法,归一化将是必不可少的。
NumPy可以通过np.mean()和np.var()很简单地做数据归一化。只需要明白每一个axis所代表的含义:axis=0表示对列求和,axis=1表示对行求和。注意到这里只有输入变量进行了归一化。这样做不一定总是正确,但是这里目标变量的值已经是0和1了,这是感知器可能的输出,所以我们不想改变。
这里有一件事需要小心,如果你用这种方法对训练集和测试集分别进行了归一化,那么同一个点在两个集合中就会有所不同,因为两个集合的均值和方差很可能是不一样的。基于这个原因,最好在把数据集分为训练集和测试集之前,对数据进行归一化。
可以在不事先了解数据集的情况下完成归一化。 但是,通常可以通过适当的方式来对数据进行预处理。比如说,第0列是每个人怀孕的次数(我提到过所有的实验对象都是女性吗?),第7列是每个人的年龄。先来看怀孕的变量,只有相当少的实验对象怀孕了8次或是8次以上,所以与其写明具体的数字,我们不如用统一用8来代替这些数字。同样,最好把年龄也量化成一系列的范围,如21~30、31~40等(数据集中的最小年龄为21)。这又可以通过使用np.where函数来实现,如同在以下代码段中一样。如果你对其他的值也进行这样的或是相似的处理,那么应该能让结果有大幅度的提高。
现在,我们能做的最后一件事就是进行基本的特征选择(feature selection)。我们每次去掉一个不同的特征,然后试着在所得的输入子集上训练分类器,看结果是否有所提高。如果去掉某一个特征能够使结果有所改进,我们就彻底去掉它,然后再尝试能否去掉其他特征。这是一个测试输出与每一个特征的相关性(correlation)的过于简单的方法。在2.4.2节讨论协方差时,有一种更好的方法。我们还可以考虑维度约简(dimensionality reduction),这种方法将用更少的维度来表示数据,同时不会损失相关信息。第6章将对维度约简进行详细讨论。
既然我们已经理解了在一个比逻辑函数更好的例子上如何使用感知器,接下来将要研究另一种线性方法,它来源于统计学而不是神经网络。
- 点赞
- 收藏
- 关注作者
评论(0)