我使用了Keras中的顺序模型进行类别分类。
给定数据:
x_train = np.random.random((5000, 20))y_train = keras.utils.to_categorical(np.random.randint(10, size=(5000, 1)), num_classes=10)x_test = np.random.random((500, 20))y_test = keras.utils.to_categorical(np.random.randint(10, size=(500, 1)), num_classes=10)
特征缩放很重要:
scaler = StandardScaler()scaler.fit(x_train) x_train = scaler.transform(x_train) x_test = scaler.transform(x_test)
模型
model = Sequential()model.add(Dense(64, activation='relu', input_dim=20))model.add(Dropout(0.5))model.add(Dense(64, activation='relu'))model.add(Dropout(0.5))model.add(Dense(10, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])model.fit(x_train, y_train, epochs=100, batch_size=32)
待预测数据
z = np.random.random((9999000, 20))
我应该缩放这些数据吗?如何缩放这些数据?
predictions = model.predict_classes(z)
如你所见,与待预测数据(z
)相比,训练和测试样本的数量非常少。使用基于x_train
拟合的缩放器来重新缩放x_test
,似乎是可以的。然而,使用仅基于5000个样本拟合的同一缩放器来重新缩放z
(9999000个样本),似乎不太合理。在深度学习领域,有没有解决这个问题的最佳实践?
对于不敏感于特征缩放的分类器,如随机森林,不存在这个问题。然而,对于深度学习,这个问题确实存在。
这里展示的训练数据仅用于示例目的。在实际问题中,训练数据并非来自相同的(均匀)概率分布。标记数据是困难的,训练数据存在人类偏见,倾向于易于标记的样本。只有那些易于标记的样本被标记了。
回答:
然而,使用仅基于5000个样本拟合的同一缩放器来重新缩放
z
(9999000个样本),似乎不太合理。
不清楚你为什么这么认为。这正是标准做法,即使用基于训练数据拟合的缩放器,正如你对测试数据所做的那样:
z_scaled = scaler.transform(z) predictions = model.predict_classes(z_scaled)
样本数量(500或10^6)在这里没有任何区别;重要的是所有这些数据(x
和z
)都来自相同的概率分布。在实践中(对于可能仍在未来的数据),这只是一个假设(模型部署后需要注意的一件事正是这个假设是否不成立,或者在某段时间后不再正确)。但特别是在这里,你的模拟数据来自完全相同的(均匀)概率分布,这是完全正确的做法。