1.5 特征工程

特征工程是通过变换现有特征来创建新特征的过程。它在传统机器学习中非常重要,但在深度学习中则没那么重要。

传统上,数据科学家或研究人员将运用他们的领域知识,给出一个输入的巧妙表示,以突出相关特征并使预测任务更加准确。

例如,在深度学习出现之前,传统的计算机视觉需要定制的算法来提取最相关的特征,如边缘检测或尺度不变特征变换(Scale-Invariant Feature Transform,SIFT)。

为了理解这个概念,让我们看一个例子。这里有张原始照片(见图1-4)。

图 1-4

我们对它进行了一些特征工程(运行了边缘检测算法)后,得到如图1-5所示的结果。

图 1-5

使用深度学习的巨大优势之一是不需要手动创建这些特征,通过网络就可以完成(图1-6)。

图 1-6

深度学习是如何执行特征工程的

神经网络的理论优势在于它们是通用逼近器。万能近似定理指出,具有单个隐藏层、有限数量的神经元以及有关激活函数的一些假设的前馈网络就可以近似任何连续函数。但是,该定理未指明网络的参数在算法上是否可学习。

在实践中,层被添加到网络以增加近似函数的非线性,并且有大量的经验证据表明,网络越深,输入网络中的数据越多,结果将越好。而这一定律也有一些限制条件,我们将在本书后面进行介绍。

尽管如此,仍有一些深度学习任务需要特征工程,例如自然语言处理(Natural Language Processing,NLP)。在这种情况下,特征工程可以是任何内容,从将文本分成称为n-gram的小子集,到使用例如词嵌入的向量化表示。

1.特征缩放

特征缩放是即使使用神经网络也必须执行的一项非常重要的工程技术。我们需要对数字输入进行缩放,以使所有特征都在相同的尺寸上。否则,网络将更加重视具有较大数值的特征。

一个非常简单的变换是将输入重新缩放到0~1之间,这也称为MinMax缩放。其他常见的操作还有标准化和零均值转换,这可以确保输入的标准差为1,平均值为0,这在scikit-learn库中用scale方法实现:

上述命令结果如下:

你可以在scikit-learn中找到许多其他可用的数值变换方法。其文档中的其他一些重要变换如下:

·PowerTransformer:此变换将幂变换应用于每个特征,以将数据变换为遵循类高斯分布。它将找到最佳的比例因子来稳定方差,同时最大限度地减少偏斜。scikit-learn的PowerTransformer变换将强制平均值为0并将方差强制为1。

·QuantileTransformer:此变换还有一个额外的output_distribution参数,该参数使我们可以对特征强制采用高斯分布,而不是均匀分布。它将为我们的输入极值引入饱和。

2.Keras特征工程

Keras提供了一个简单的接口来进行特征工程。本书中,我们将特别研究的任务是图像分类。为此,Keras提供了ImageDataGenerator类,由此我们可以轻松地预处理和扩充数据。

我们将要执行的扩充旨在使用一些随机变换(例如缩放、翻转、剪切和移位)生成更多图像。这些变换有助于防止过拟合,并使模型对不同的图像条件(例如亮度)更加健壮。

首先,我们将看下代码,然后解释它的作用。根据Keras的文档(https://keras.io/),可以使用以下代码针对上述图像变换创建一个生成器:

对于生成器,可以设置一些参数:

·rotation_range参数表示以度(0~180)为单位的值,该值用于随机找到一个值来旋转输入的图像。

·width_shift和height_shift是范围(总宽度或高度的占比),在该范围内它会随机地垂直或水平变换图片。

·sale是用于重新缩放原始图像的常用操作。在本例中,我们有RGB图像,其中每个像素由0~255之间的值表示。因此,我们使用1/255的缩放因子,现在的值将在0~1之间。这样做是因为考虑到典型的学习率(网络的参数之一),否则值会过高。

·shear_range用于随机应用剪切变换。

·zoom_range用于通过随机缩放图片内部来创建其他图片。

·horizontal_flip是一个布尔值,用于通过水平随机翻转图像的一半来创建其他图片。当没有水平不对称的假设时,这很有用。

·fill_model是用于填充新组件的策略。

这样,我们可以从一张图像创建许多图像以供模型使用。注意,到目前为止,我们只初始化了该对象,因此没有执行指令,因为生成器仅在被调用时才执行动作。