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 - 对输入应用不同的缩放/归一化的主要内容,如果未能解决你的问题,请参考以下文章
在训练 LSTM NN 之前,我需要做哪些数据重新缩放预处理?