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

文章代码来源:《deep learning on keras》,非常好的一本书,大家如果英语好,推荐直接阅读该书,如果时间不够,可以看看此系列文章。

神经网络数据预处理

向量化

全部的输入和目标必须是浮点数张量。无论你要处理的数据类型是什么,声音、图像、文本,你都必须将其转为张量,这一步叫做“数据向量化”。例如在之前的例子中,我们通过“one-hot encoding”将原来的整型列表转化成了float32的数据。

值归一化

太大了的话可能会导致不收敛的情况发生,所以一般来说都会进行归一化,接下来看一段小代码:

# Assuming x is a 2D data matrix of shape (samples, features)
x -= x.mean(axis=0)
x /= x.std(axis=0)

上面很简洁的给出了一个二维数组的归一化方法。

解决丢失值的问题

有的时候我们的数据可能会某几个特征的值丢掉了,我们直接把丢掉的赋值为0,模型在训练的时候就会忽略掉它,但是如果我们的训练集都没有丢,但是测试集丢了,那么我们不能够这么做。我们要通过复制很多训练集,然后丢掉其中的一部分特征,最后再训练。

特征工程

有的时候我们并不希望网络从任意的给定的数据中学得,这是就需要我们通过专业知识来设计特征,从而提高效率,接下来我们使用一个时钟识别的例子来说明,这个时钟输入图片,输出时间。

机器学习之数据预处理、特征工程和特征学习_第1张图片

时钟示意图

如果你选择将图像看成一个向量,那你就将问题弄成了一个复杂的问题,你将会需要卷积神经网络来解决这个问题,这样以来你就需要使用很多计算资源。
然而,如果你早已在更高级别上理解了这个问题,你就可以想出一个对于机器学习算法更好的特征:这很容易去写五行的python的脚本来读出中心点和指针尖端的坐标,然后就可以运用一个简单的机器学习算法来学习得到当天的大致时间。
更进一步,你可以用极坐标来表示,这样一来你的问题就被转化得足够简单,就不需要什么别的机器学习算法了。
这就是特征工程的本质:通过更简单的表示来让问题更加简单,但这往往需要对问题有着更深的理解。
在深度学习出现之前,特征工程相当的关键,因为经典的较浅的算法没有足够的假设空间去学习有用的特征。你送给算法的数据就显得很关键了。在卷积神经网络在MNIST分类问题上面成功之前, 解决方法都依赖于编码复杂的特征诸如数字图像的循环次数,图像高度和图像的灰度值等等。
有幸的是现代深度学习移除了特征工程的需要,因为神经网络能够自动从数据里面提取有用的特征。这意味着你不需要关注特征工程了吗?不是酱紫的,有两个原因:

  • 好的特征仍然能够让你在解决问题的时候更加优雅,同时使用更少的资源。比如说,用卷积神经网络来解决时钟问题就很滑稽了。
  • 好的特征能让你用更少的数据来解决问题。深度学习模型能够自动学习特征的能力来自于其大量的训练数据。如果只有少量的训练样本,那么特征的信息化就显得很重要了。

你可能感兴趣的:(机器学习,机器学习,学习,人工智能)