Keras / NN - 对输入应用不同的缩放/归一化

Posted

技术标签:

【中文标题】Keras / NN - 对输入应用不同的缩放/归一化【英文标题】:Keras / NN - Applying different scaling/normalization on inputs 【发布时间】:2019-09-20 08:52:26 【问题描述】:

在我学习 ML 的过程中,我正在测试一些 NN,我发现我的输出似乎没有考虑到我的 3 个非常重要的输入之一。

我的数据集由 4 列 (csv) 组成:

3 是介于 1 000 之间的数字(包括输出),最高可达 150 000 000

1 是一个介于 0 到 100 之间的数字,这是我的 NN 未考虑的数字

我使用 scikit-learn 中的 MinMaxScaler 以这种方式扩展我的数据集:

df = pd.read_csv('rawData.csv')
dataset = df.values

min_max_scaler = preprocessing.MinMaxScaler()
dataset = min_max_scaler.fit_transform(dataset)

X = dataset[:,0:3] # input
Y = dataset[:,3]   # output

我还使用另一种方式来扩展我的数据(当我想测试我的模型时):

min_test = np.min(runset)
max_test = np.max(runset)

normalized = (runset - min_test) / (max_test - min_test)

test = model.predict(normalized)

result = test * (max_test - min_test) + min_test

所以我的问题是:是否可以并建议对不同的输入使用不同的比例?如果可以,我该怎么做?

【问题讨论】:

Y 代表什么? @sentence Y 代表我的 csv 文件的第三列,这是我的输出(如我在帖子中所说的大数字) 那么,为什么要缩放输出?有什么原因吗? 不,你说得对,我不应该缩放输出,甚至没有注意到我改变了它。但一开始我并没有缩放 Y,问题已经出现了。 @Halt 您还应该缩放输出,因为您的输出在 1 000 到 150 000 000 的范围内。这是通过梯度操作的变化很大的值,因此它可能会从 1 000 变为下一次迭代中的 100 000 可以在非常高的起伏中改变梯度,并且您的损失也可能存在巨大差异。为了避免这种情况,我更喜欢对输出使用归一化以及均值和标准差,这样模型可以很容易地收敛。当您预测结果时,使用相同的平均值和标准差值(您已用于标准化)来检索数据。 【参考方案1】:

对您的问题的简短回答是另一个问题:对于表征我的数据集的特征的重要性,我是否有先验知识

如果是,我可能缩放我的数据,使更重要的特征具有更大的方差/范围。 如果不是,我应该以特征具有均值 0 和标准差 1 的方式缩放我的数据。为什么?主要是为了改善数值条件,消除初始权重的尺度依赖性问题,加快训练过程,降低陷入局部最优的风险。

不要低估梯度下降法对缩放的敏感性。

最后,请记住使用训练集的统计数据(均值和标准差)来标准化验证/测试集。

【讨论】:

以上是关于Keras / NN - 对输入应用不同的缩放/归一化的主要内容,如果未能解决你的问题,请参考以下文章

使用 Keras 向 NN 输入时间序列数据

在训练 LSTM NN 之前,我需要做哪些数据重新缩放预处理?

matlab中NN输入的坐标归一化

如何格式化从keras转换的coreml中conv1d/lstm nn的输入数据

连接 Keras 中的屏蔽输入

2.1对 特征归一化 的一些理解