赞
踩
每当我教授深度学习时,学生都会发现它的数据预处理有点复杂,但这是可以理解的。与传统的机器学习模型不同,深度学习算法通常要求数据采用非常特定的格式。例如,卷积神经网络(CNN)需要图像数据,而像长短期记忆(LSTM)这样的递归神经网络(RNN)需要顺序数据。
将原始数据转换为这些特定形式的过程涉及许多步骤,其中一些步骤更熟悉,而另一些则不那么熟悉。我在另一篇文章中写过关于处理阶级失衡的文章。没有“最佳”方法来预处理数据,它因任务、数据性质和模型而异。因此,这些额外的步骤增加了另一层复杂性。出于这些原因,我决定创建一个列表,其中包含每个深度学习学生应该知道的前 10 个预处理步骤。最后,我分享了一些额外的资源,以便您可以进一步探索。我希望你喜欢。
这是什么?标签编码是将分类标签转换为数值的过程。
为什么它很重要?神经网络对数字而不是文本进行操作。因此,分类标签(如红色、绿色和蓝色)必须先转换为数字形式,然后才能在机器学习算法中使用。
从 sklearn.preprocessing 导入 LabelEncoder# 实例化编码器编码器 = LabelEncoder()# 转换标签
y = encoder.fit_transform(y)
这是什么?独热编码是转换分类数据变量的过程,以便将它们提供给机器学习算法以改进预测。
为什么它很重要?使用 One-Hot,我们将每个分类值转换为新的分类值,并分配一个二进制值 1 或 0。每个整数值都表示为二进制向量。这对于处理机器学习算法的分类数据至关重要。
从 sklearn.preprocessing 导入 OneHotEncoder# 实例化编码器编码器 = OneHotEncoder()# 转换分类变量
X = encoder.fit_transform(X)
这是什么?特征缩放是一种用于标准化数据自变量或特征范围的方法。
为什么它很重要?当数值输入变量缩放到标准范围时,许多机器学习算法的性能更好。这包括使用输入加权和的算法(如线性回归)和使用距离度量的算法(如 K 最近邻)。
从 sklearn.preprocessing 导入 StandardScaler# 实例化缩放器 = StandardScaler()# 缩放功能
X = scaler.fit_transform(X)
这是什么?这涉及将数据重塑为机器学习模型可以接受的格式,在这种情况下,特别是时间序列模型,如 LSTM。
为什么它很重要?例如,LSTM 模型期望以特定的 3D 格式输入样本、时间步长和特征。因此,相应地重塑我们的数据集至关重要。因为它稍微更烦人,所以我创建了一个简短的例子。
假设我们有一个股票价格数据集,其中我们有 100 天的数据(100 个样本),并且每天我们记录了开盘价、最高价、最低价和收盘价(4 个特征)。数据最初可能采用 100 x 4 的 2D 数组形状。
如果我们想使用过去 10 天的数据序列来预测第二天的收盘价怎么办?LSTM 模型需要形状的 3D 数组中的数据(样本数、时间步长、特征数)。在这种情况下,我们的时间步长将是 10(过去几天),特征数量将是 4(开盘价、最高价、最低价和收盘价)。
这是基本的 重塑
LSTM 的函数:
# 重塑 LSTM 的特征
X = X.reshape((X.shape[0], X.shape[1], 1))
然而, 重塑()
函数通常用于可以轻松映射整形操作的情况,例如从 1D 数组到 2D 数组。
在我们的例子中,我们需要为 LSTM 模型创建时间序列数据序列,这有点不同,因为我们不仅对数据进行重新排序,而且还将其分组为重叠序列。此操作通常不是由简单的 重塑()
.
导入 numpy 作为 nptime_steps = 10 n_features = 4 个样本 = data.shape[0] - time_steps # 在这种情况下,样本数为 100 - 10 = 90X = np.zeros((samples, time_steps, n_features)) # 初始化输入的 3D 数组 datay = np.zeros((samples,)) # 为目标变量初始化一个 1D 数组 i 在范围(samples): X[i] = 数据[i:i+time_steps] # 每个样本都是一系列 'time_steps' 数据 y[i] = data[i+time_steps, -1] # 每个对应的标签是第二天的收盘价
这是什么?标记化是将文本拆分为单个单词或术语的过程,称为 标记 .
为什么它很重要?这是准备用于机器学习算法的文本数据的第一步。通过将文本分解为单个单词,我们可以分析每个单词的频率和重要性,从而使算法能够理解文本并从中学习。
from tensorflow.keras.preprocessing.text import Tokenizer# 实例化 tokenizer Tokenizer = Tokenizer(num_words=1000)# 标记文本
X = tokenizer.texts_to_sequences(X)
这是什么?填充是通过添加 0
值到较短的序列。
为什么它很重要?处理文本数据时,文本的长度可能会有很大差异。但是,许多机器学习算法要求输入具有相同的长度。填充有助于标准化序列长度。
从 tensorflow.keras.preprocessing.sequence import pad_sequences# 填充序列
X = pad_sequences(X, maxlen=100)
这是什么?图像重新缩放是更改像素值比例的过程,通常在 0 到 1 之间。归一化可确保平等对待所有输入特征(在本例中为像素值),从而加快训练速度并提高整体模型性能。
为什么它很重要?对于图像,像素值范围为 0 到 255,其中 0 表示纯黑色,255 表示纯白色。神经网络使用较小的权重值处理输入,而具有较大整数值的输入可能会中断或减慢学习过程。因此,最好对像素值进行规范化。
from tensorflow.keras.preprocessing.image import ImageDataGenerator# 实例化 ImageDataGenerator
data_gen = 图像数据生成器(重缩放=1.0/255.0)
这是什么?图像增强是一种策略,它允许从业者显着增加可用于训练模型的图像的多样性,而无需实际收集新数据。这涉及旋转、缩放、移动和翻转等技术。
为什么它很重要?图像增强技术可以创建图像的变体,从而提高拟合模型将所学知识推广到新图像的能力。
data_gen = 图像数据生成器(重缩放=1.0/255.0, rotation_range=20, zoom_range=0.15, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.15, horizontal_flip=真,
fill_mode=“最近”)
这是什么?词嵌入是一种单词表示形式,它允许具有相似含义的单词具有相似的表示形式。
为什么它很重要?它们是文本的分布式表示,这可能是深度学习方法在具有挑战性的自然语言处理问题上令人印象深刻的性能的关键突破之一。
从gensim.models导入Word2Vec#在句子上适合Word2Vec模型
模型 = 单词2Vec(句子)
这是什么?这涉及创建要由递归神经网络 (RNN) 处理的序列批次。
为什么它很重要?RNN 按顺序处理输入,每个输入的长度必须相同。但并非所有序列的长度都相同(如文本中的句子),因此我们需要将这些序列批处理在一起,并确保批处理中的每个序列的长度相同。
从 torch.nn.utils.rnn 导入 pad_sequence# 填充序列
X = pad_sequence([torch.tensor(seq) for seq in sequences], batch_first=True)
我们在这里介绍了很多内容,关于深度学习的数据预处理,还有更多内容需要学习。然而,这些步骤对于任何深度学习项目来说都是一个良好的开端。所以,如果你像我一样,是自学成才的学生,你可能会发现这本书非常有用:
但是,如果您更喜欢一门课程,您可能想尝试 Codecademy 上的深度学习 .无论如何,重要的是继续学习。因此,请随时写评论并在此处留下您的想法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。