正如厨师在烹饪前精心准备食材一样,我们必须在将数据输入自编码器之前细致准备好数据。自编码器的表现和学习能力高度依赖于输入数据的质量和格式。本节详细介绍必要的预处理步骤,以确保你的自编码器能高效学习并提取有价值的特征。我们将涉及缺失值处理、数值特征缩放、类别数据编码以及为可靠模型训练和评估正确划分数据集的方法。数据准备对自编码器为何重要自编码器通过尝试重建输入来学习。如果输入数据杂乱、存在不一致或特征尺度不同,学习过程可能效率低下甚至产生误导。自编码器可能难以收敛,或者可能关注数据的表面特征而非我们希望它学习的潜在结构。准备得当的数据使得自编码器的优化过程更顺畅,并帮助网络专注于学习重要模式。以下图表概述了我们将讨论的数据准备的大致步骤:digraph G { rankdir=TB; graph [fontname="sans-serif"]; node [shape=box, style="rounded,filled", fillcolor="#e9ecef", fontname="sans-serif"]; edge [fontname="sans-serif"]; rawData [label="原始输入数据\n(表格、图像等)"]; handleMissing [label="处理缺失值\n(例如,填充)"]; scaleNumerical [label="数值特征缩放\n(例如,最小-最大缩放,标准化)"]; encodeCategorical [label="类别特征编码\n(例如,独热编码)"]; splitData [label="数据划分\n(训练集、验证集、测试集)"]; preprocessedData [label="预处理数据\n(可用于自编码器)", fillcolor="#b2f2bb"]; rawData -> handleMissing [label=" 初始步骤 "]; handleMissing -> scaleNumerical [label=" 针对数值数据 "]; scaleNumerical -> encodeCategorical [label=" 针对类别数据 "]; encodeCategorical -> splitData [label=" 训练前 "]; splitData -> preprocessedData [label=" 最终输入 "]; }训练自编码器前准备数据的典型工作流程。缺失值处理数据集经常包含缺失值。自编码器和大多数神经网络一样,需要完整的数值输入。因此,你需要一种方法来处理这些空缺。常见方法包括:删除:列表式删除(行删除):如果一行(样本)有一个或多个缺失值,则整行被移除。这种方法简单,但如果许多样本都有缺失值,可能会导致大量数据丢失。成对删除(列删除):如果一列(特征)有太多缺失值,你可能会决定删除整个特征。这种方法通常不太受欢迎,除非该特征大部分为空或被认为不重要。填充:用估计值补充缺失值。均值/中位数/众数填充:用该列的均值或中位数替换缺失的数值,用众数替换缺失的类别值。这是一个常见的起始方法。基于模型的填充:使用更复杂的方法,例如k近邻(KNN)填充或回归模型,根据其他特征预测缺失值。这些方法可能更准确,但计算量更大。对于自编码器而言,如果缺失数据不广泛,通常推荐使用填充而非删除,因为我们希望模型尽可能从原始数据结构中学习。请选择适合你特定数据集和特征的填充方法。数值特征缩放数据集中的特征可能具有不同的尺度和范围。例如,一个特征的范围可能是0到1,而另一个可能是10,000到1,000,000。包括自编码器在内的神经网络对此类差异可能很敏感。大的输入值会导致大的误差梯度,从而造成训练不稳定,或者使网络不成比例地侧重于数值较大的特征。将数值特征缩放到一致的范围有助于:提高收敛速度:当特征处于相似尺度时,梯度下降算法通常收敛更快。防止特征主导:确保所有特征更公平地贡献于学习过程和重建损失的计算。与特定激活函数良好配合:某些激活函数,如Sigmoid或tanh,在输入值处于特定范围(例如,[0, 1]或[-1, 1])时表现最佳。两种广泛使用的缩放技术是最小-最大缩放和标准化。最小-最大缩放(归一化)最小-最大缩放将特征转换到特定范围,通常是[0, 1]或[-1, 1]。这通过减去特征的最小值,然后除以其范围(最大值减去最小值)来实现。将数值缩放到[0, 1]范围的公式是: $$X_{scaled} = \frac{X - X_{min}}{X_{max} - X_{min}}$$此处:$X$ 是原始特征值。$X_{min}$ 是该特征在训练数据中的最小值。$X_{max}$ 是该特征在训练数据中的最大值。最小-最大缩放通常在以下情况适用:数据分布不是高斯分布或未知时。你的神经网络结构,特别是如果重建归一化输入,其输出层使用Sigmoid等激活函数(输出0到1之间的值)时。你需要将特征限定在严格区间内。图像像素强度通常范围从0到255,通常使用此方法缩放到[0, 1]范围。标准化(Z-分数归一化)标准化重新缩放特征,使其均值($\mu$)为0,标准差($\sigma$)为1。公式为: $$X_{scaled} = \frac{X - \mu}{\sigma}$$此处:$X$ 是原始特征值。$\mu$ 是该特征在训练数据中的均值。$\sigma$ 是该特征在训练数据中的标准差。标准化通常在以下情况更受青睐:数据中的特征近似高斯(正态)分布时。算法对异常值敏感,因为标准化不会将值限定在特定范围。你正在使用更深的网络结构或假定数据以零为中心的算法时。选择最小-最大缩放或标准化: 没有唯一的最佳答案;选择通常取决于你的数据和自编码器结构。通常的做法是尝试这两种方法,并查看哪种在验证集上产生更好的结果。对于图像数据,将最小-最大缩放到[0, 1]是一个非常常见的预处理步骤。对于其他类型的表格数据,标准化是默认选择。类别特征编码自编码器要求所有输入特征都是数值型的。如果你的数据集中包含类别特征(例如,“颜色”,其值可以是“红色”、“蓝色”、“绿色”;或“教育程度”,其值可以是“高中”、“本科”、“硕士”),你需要将它们转换为数值格式。独热编码对于名义类别特征(类别没有内在顺序),独热编码是标准方法。它为每个独特类别创建一个新的二元(0或1)特征。对于给定样本,与该样本类别对应的特征值将为1,而该原始属性的所有其他新二元特征都将为0。示例:如果特征“颜色”有类别{“红色”、“绿色”、“蓝色”},独热编码将创建三个新特征:“Color_Red”、“Color_Green”和“Color_Blue”。颜色为“红色”的样本将被表示为[1, 0, 0]。独热编码避免了对类别施加人为顺序。然而,如果一个类别特征有许多独特值(高基数),它会显著增加输入数据的维度。序数编码(标签编码)对于序数类别特征(类别具有有意义的顺序,例如“低”、“中”、“高”),你可以使用序数编码。这涉及根据其等级为每个类别分配一个数值(例如,低=0,中=1,高=2)。虽然更简单,但序数编码应谨慎使用。如果数值映射不能准确反映类别之间的关系,或者自编码器将这些整数视为具有等距间隔的连续值(这可能不真实),则可能导致误解。通常,对于大多数自编码器应用而言,独热编码是更稳妥的选择,除非序数性质很强且理解透彻。数据划分:可靠评估的根本所在在任何涉及从数据中学习参数的预处理(如计算标准化所需的均值/标准差或缩放所需的最小/最大值)之前,将数据集划分为训练集、验证集和(可选但强烈建议的)测试集是完全必要的。训练集:用于训练自编码器。模型从该集合中学习数据分布以及如何重建输入。预处理的所有学习参数(例如,$X_{min}$、$X_{max}$、$\mu$、$\sigma$或编码的类别映射)必须仅从此训练数据中得出。验证集:用于调整超参数(如潜在空间维度、层数、学习率)和早停。自编码器不在此数据上训练,但其在此集合上的表现会指导模型开发。从训练集学习到的预处理转换被应用于验证集。测试集:用于对训练好的自编码器在未见过的数据上的表现进行最终、无偏的评估。与验证集一样,从训练集学习到的预处理转换也应用于此处。为什么这个顺序很重要(防止数据泄露): 如果你在划分数据之前使用整个数据集计算缩放参数(如最小/最大值或均值/标准差),那么验证集和测试集的信息就会“泄露”到训练过程中。这会导致对验证/测试数据的性能估计过于乐观,因为模型在预处理阶段无意中看到了这些数据的一部分。始终只在训练数据上拟合你的缩放器和编码器,然后使用这些已拟合的转换器来转换训练集、验证集和测试集。将准备工作应用于不同数据类型让我们总结这些步骤如何适用于自编码器常见的几种数据类型。表格数据对于表格格式(如CSV文件)的数据集:处理缺失值:根据需要填充或移除。编码类别特征:对名义特征使用独热编码,对序数特征(谨慎地)使用序数编码。缩放数值特征:应用最小-最大缩放或标准化。划分数据:在拟合缩放器/编码器之前执行此步骤,然后应用转换。图像数据对于图像数据集:像素值缩放:图像像素值(例如,8位灰度或RGB图像的0-255)几乎总是需要缩放。常见做法是除以255将其归一化到[0, 1]范围。如果解码器的输出层用于重建像素强度,这与Sigmoid激活函数非常吻合。重塑(用于全连接自编码器):如果你使用基本的、全连接自编码器,图像(通常是2D或3D张量)需要展平为一维向量。例如,28x28像素的灰度图像会变成一个784个元素的向量。(卷积自编码器,稍后讨论,可以直接处理2D/3D图像数据)。灰度转换:如果颜色对你的特征提取任务不重要,将RGB图像转换为灰度图可以降低维度并简化模型。数据划分:与表格数据一样,将你的图像数据集划分为训练集、验证集和测试集。缩放(例如,除以255)是一个固定转换,不从数据中“学习”,因此可以在所有划分上一致应用。通过周全地准备数据,你为训练有效的自编码器打下了扎实的基础。这些步骤确保你的模型能够专注于学习数据中固有的结构和模式,从而从瓶颈层得到更有用、更有代表性的特征。在后续章节中,我们将使用这些预处理过的数据,开始设计和构建我们的自编码器结构。