您的位置:首页 > 其它

数据预处理、特征工程和特征学习

2019-02-28 20:40 246 查看
版权声明:本文为博主原创文章,未经博主允许不得转载,如有问题,欢迎指正。 https://blog.csdn.net/qq_36035111/article/details/87955317
  • 神经网络的数据预处理

数据预处理的目的是使原始数据更适于用神经网络处理,包括向量化、标准化、处理缺失值和特征提取。

1.向量化

       神经网络的所有输入和目标都必须是浮点数张量(特定情况下为整数张量)。无论处理什么数据,都必须先将其转换为张量。这一步叫做数据向量化。无论是路透社的数据集还是IMDB的数据集,都是文本分类的例子,开始时文本都为整数列表,然后使用了one-hot编码将其转换为float32格式的张量。而在手写数字分类和预测房价的例子中,数据已经是向量形式了。

2.值标准化

       在手写数字分类的例子中,开始时图像数据被编码为0-255范围内的整数。将这一数据输入网络之前,需要将其转换为float32格式并除以255,这样就得到了0-1范围内的浮点数、同样预测房价时开始时特征有各种不同的取值,所以将这一数据输入网络之前,需要对每个特征分别做标准化,使其均值为0,标准差为1。

       一般,若将取值相对较大的数据或异质(比如数据的一个特征在0-1范围内,另一个特征在100-200范围内)输入到神经网络中是不安全的。若将异质数据输入到神经网络中可能导致较大的梯度更新,进而导致网络无法收敛。所以输入数据应该具有以下特征

       ①取值较小,大部分值都应该在0-1范围内

       ②同质性:所有特征的取值都应该在大致相同的范围内

        如将每个特征分别标准化,使其平均值为0,标准差为1。这种标准化方法也很常见。

3.处理缺失值

       数据中有时会有缺失值,一般对于神经网络而言,将缺失值设为0是安全的,只要0不是一个有意义的值。网络就可以从数据中学到0意味着缺失数据,并且会忽略这个值。

       如果测试数据中可能有缺失值,而网络是在没有缺失值的数据上训练的,那么网络不可能学会忽略缺失值。所以在这种情况下应该人为生成一些有缺失项的训练样本:多次复制一些训练样本,然后删除测试数据中可能缺失的某些特征。

  • 特征工程

       特征工程是指将数据输入模型之前,利用自己关于数据和机器学习算法的知识对数据进行硬编码的变换(而这并不是模型学到的),以改善模型的效果。大多数情况下,一个机器学习模型无法从完全任意的数据中进行学习,呈现给模型的数据应该便于模型进行学习。

  • 过拟合和欠拟合

       机器学习的根本问题是优化与泛化的对立。优化是指调节模型以在训练数据上得到最佳性能,而泛化是指训练好的模型在前所未见的数据上的性能好坏,机器学习的目的是得到良好的泛化,但泛化是无法控制的,所以只能基于训练数据调节模型。

       训练开始时,优化和泛化是相关的,训练数据上的损失越小,测试数据上的损失也越小。这时的模型是欠拟合的,即还有改进的空间,因为网络还没有对训练数据中的所有的相关模式建模。但是训练数据上迭代一定次数之后,泛化不再提高,验证指标先是不变,再开始变差,即模型开始过拟合。这时模型开始学习仅和训练数据有关的模式,但这种模式对新数据来说是无关紧要的。

      为了防止模型从训练数据中学到错误或无关紧要的模式,最有解决方法是获取更多的训练数据。模型的训练数据越多,泛化能力自然就越好。如果无法获得更多的数据,次优解可以是调节模型允许存储的信息量,或对模型允许存储的信息加以约束。如果一个网络只能记住几个模式,那么优化过程会迫使模型集中学习最重要的模式。这样可能会得到更良好的泛化。

      这种降低过拟合的方法叫做正则化。

1.减小网络大小

       减小模型的大小是防止过拟合的一种很简单的方法,即减小模型中可学习参数的个数(可由每层的层数和每层的单元格数所决定)。在深度学习中,模型中可学习参数的个数被称为模型的容量(capacity)。参数更多的模型拥有更大的记忆容量,因此能够在训练样本和目标之间轻松地学会完美的字典式映射,但是这种映射没有任何的泛化能力。但是如果网络的资源有限,就难以学会这种映射。但模型又应该有足够的参数,防止欠拟合的发生,即模型应该避免容量不足。

2.添加权重正则化

       还有一种常见的降低的过拟合的方法就是强制让模型权重只能取较小的值,从而限制模型的复杂度,这使得权重值的分布更加规则,这种方法叫做权重正则化,实现方法是向网络损失函数中添加与较大权重值相关的成本。这个成本有两种形式:

       ①L1正则化(L1 regularization):添加的成本与权重系数的绝对值(权重的L1范数)成正比。

       ②L2正则化(L2 regularization):添加的成本与权重系数的平方(权重的L2范数)成正比。

[code]#向模型添加L2权重正则化
from keras import regularizer

model = models.Sequential()
#l2(0.001)意思为该层权重矩阵的每个系数都会使网络总损失增加0.001×weight_coefficient_value。而这个惩罚只在训练时增加,所以这个网络的训练损失会比测试损失大很多
model.add(layers.Dense(16,kernel_regularizer=regularizersgularizers.l2(0.001),activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16,kernel_regularizer=regularizersgularizers.l2(0.001), activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

#也可同时做l1和l2正则化
regularizers.l1_l2(l1=0.001,l2=0.002)

3.添加dropout正则化

       dropout也是神经网络最有效的正则化方法之一。对某一层使用dropout,就是在训练过程中随机将该层的一些输出特征舍弃(设置为0)。假设在训练过程中,某一层对给定样本的返回值应该是向量[0.2,0.5,0.7,1.3,1.8],使用dropout后,这个向量会有几个随机的元素变成0,如[0.2,0,0.7,0,1.8]。dropout比率是被设为0的特征所占的比例,通常在0.2-0.5之间

[code]model = models.Sequential()

model.add(layers.Dense(16,activation='relu', input_shape=(10000,)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16,activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))

总结,防止过拟合的常用方法:

1.获取更多的训练数据

2.减小网络容量

3.添加权重正则化

4.添加dropout

 

 

 

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: