购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

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

除了模型评估外,在深入研究模型开发前,还必须解决另一个重要问题:如何准备输入数据和目标?下面介绍数据预处理的相关方法。

1.4.1 神经网络的数据预处理

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

1.向量化

向量化(vectorization)是指神经网络的所有输入和目标都必须是浮点数向量(特殊情况下可以是整数向量)。在处理所有数据前要先将数据转换为向量,无论处理什么数据(声音、图像还是文本),这一步称为数据向量化(data vectorization)。

2.标准化

如果输入的数据取值较大或是异常数据,则会让网络产生不安全现象,容易造成较大的梯度更新,导致网络无法收敛。所以,输入的数据应具有以下特征:

· 取值较小,应在0~1范围内;

· 同质性(homogenous),即所有特征值的取值范围大致相同。

此外,更严格的标准化方法应做到(对于数字分类问题就不需要这么做):

· 每个特征分别标准化,使其平均值为0;

· 每个特征分别标准化,使其标准差为1。

【例1-3】 数据标准化。

    import numpy as np
    from sklearn import preprocessing
    import matplotlib.pyplot as plt
    data=np.loadtxt("Iris.txt")
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif']=['SimHei']             #用来正常显示中文标签
    plt.rcParams['axes.unicode_minus']=False               #用来正常显示负号
          
    #Z-Score标准化
    zscore_scaler=preprocessing.StandardScaler()
    data_scaler_1=zscore_scaler.fit_transform(data)
    #Max Min标准化
    minmax_scaler=preprocessing.Min MaxScaler()
    data_scaler_2=minmax_scaler.fit_transform(data)
    #MaxAbs标准化
    maxabs_scaler=preprocessing.MaxAbsScaler()
    data_scaler_3=maxabs_scaler.fit_transform(data)
    #RobustScaler标准化
    robust_scaler=preprocessing.RobustScaler()
    data_scaler_4=robust_scaler.fit_transform(data)
          
    scaler_list=[15,10,15,10,15,10]                   #创建点尺寸列表
    color_list=['black','red','green','blue','orange']
    marker_list=['o',',','+','s','p']
    plt.figure(figsize=(15,8))
    for i,data_single in enumerate(data_list):
        plt.subplot(2,3,i+1)
        plt.scatter(data_single[:,0],data_single[:,-1]
                        ,s=scaler_list[i]
                        ,marker=marker_list[i]
                        ,c=color_list[i])
        plt.title=title_list[i]
    plt.suptitle("行数据和标准化数据")
    plt.show()

运行程序,效果如图1-13所示。

图1-13 数据标准化效果

3.处理缺失值

处理数据中可能会有缺失值。在神经网络中,一般设置为0(只要0不是一个有意义的值)。神经网络中把0当作缺失值,并忽略这个值。

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

4.特征提取

特征提取(feature extractor)是将一些原始的输入的数据维度减少或者将原始的特征进行重新组合以便于后续使用。简单来说有两个作用:减少数据维度和整理已有的数据特征。

1.4.2 特征工程

特征工程是将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征、提取特征及创造特征来实现。其中,创造特征又经常以降维算法的方式实现。在特征工程中可能面对的问题有:

· 特征之间有相关性;

· 特征和标签无关;

· 特征太多或太小;

· 无法表现出应有的数据现象或无法展示数据的真实面貌。

在深度学习出现之前,特征工程曾经非常重要,随机深度学习的出现,将数据呈现给算法的方式对解决问题至关重要。例如,卷积神经网络在MNIST数字分类问题上取得成功之前,其解决方法通常是基于硬编码的特征。

对于现代深度学习,大部分特征工程都是不需要的,因为神经网络能够从原始数据中自动提取有用的特征。这是否说明只要使用深度神经网络就无须担心特征工程呢?实际并不是这样的,原因有两点:

· 良好的特征可以使用更少的资源更优化地解决问题;

· 良好的特征可以使用更少的数据解决问题。 gNkbCXPKHSAIWApIw3PzFuKQ5hM9h0Wxm06SXSg2HXl/MLdPmRjme1brhZ657dTt

点击中间区域
呼出菜单
上一章
目录
下一章
×